BUG/MINOR: server: don't always trust srv_check_health when loading a server state

When we load health values from a server state file, make sure what we assign
to srv->check.health actually matches the state we restore.

This should be backported as far as 1.6.
This commit is contained in:
Jrme Magnin 2019-01-20 11:27:40 +01:00 committed by Willy Tarreau
parent 1ba32032ef
commit f57afa453a

View File

@ -3039,16 +3039,37 @@ static void srv_update_state(struct server *srv, int version, char **params)
HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
/* recover operational state and apply it to this server /* recover operational state and apply it to this server
* and all servers tracking this one */ * and all servers tracking this one */
srv->check.health = srv_check_health;
switch (srv_op_state) { switch (srv_op_state) {
case SRV_ST_STOPPED: case SRV_ST_STOPPED:
srv->check.health = 0; srv->check.health = 0;
srv_set_stopped(srv, "changed from server-state after a reload", NULL); srv_set_stopped(srv, "changed from server-state after a reload", NULL);
break; break;
case SRV_ST_STARTING: case SRV_ST_STARTING:
/* If rise == 1 there is no STARTING state, let's switch to
* RUNNING
*/
if (srv->check.rise == 1) {
srv->check.health = srv->check.rise + srv->check.fall - 1;
srv_set_running(srv, "", NULL);
break;
}
if (srv->check.health < 1 || srv->check.health >= srv->check.rise)
srv->check.health = srv->check.rise - 1;
srv->next_state = srv_op_state; srv->next_state = srv_op_state;
break; break;
case SRV_ST_STOPPING: case SRV_ST_STOPPING:
srv->check.health = srv->check.rise + srv->check.fall - 1; /* If fall == 1 there is no STOPPING state, let's switch to
* STOPPED
*/
if (srv->check.fall == 1) {
srv->check.health = 0;
srv_set_stopped(srv, "changed from server-state after a reload", NULL);
break;
}
if (srv->check.health < srv->check.rise ||
srv->check.health > srv->check.rise + srv->check.fall - 2)
srv->check.health = srv->check.rise;
srv_set_stopping(srv, "changed from server-state after a reload", NULL); srv_set_stopping(srv, "changed from server-state after a reload", NULL);
break; break;
case SRV_ST_RUNNING: case SRV_ST_RUNNING:
@ -3102,7 +3123,6 @@ static void srv_update_state(struct server *srv, int version, char **params)
srv->last_change = date.tv_sec - srv_last_time_change; srv->last_change = date.tv_sec - srv_last_time_change;
srv->check.status = srv_check_status; srv->check.status = srv_check_status;
srv->check.result = srv_check_result; srv->check.result = srv_check_result;
srv->check.health = srv_check_health;
/* Only case we want to apply is removing ENABLED flag which could have been /* Only case we want to apply is removing ENABLED flag which could have been
* done by the "disable health" command over the stats socket * done by the "disable health" command over the stats socket