]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: checks: servers must not start in slowstart mode
authorWilly Tarreau <w@1wt.eu>
Mon, 16 Dec 2013 17:08:36 +0000 (18:08 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 16 Dec 2013 17:08:36 +0000 (18:08 +0100)
In 1.5-dev20, commit bb9665e (BUG/MEDIUM: checks: ensure we can enable
a server after boot) tried to fix a side effect of having both regular
checks and agent checks condition the up state propagation to servers.

Unfortunately it was still not fine because after this fix, servers
which make use of slowstart start in this mode. We must not check
the agent's health if agent checks are not enabled, and likewise,
we must not check the regular check's health if they are not enabled.

Reading the code, it seems like we could avoid entering this function
at all if (s->state & SRV_RUNNING) is not satisfied. Let's reserve
this for a later patch if needed.

Thanks to Sander Klein for reporting this abnormal situation.

src/checks.c

index 8014a668b6a501ef24d24a417ccc728f1a8c4889..115cc855841b329bcb16ead99466a4699bf51e95 100644 (file)
@@ -480,8 +480,10 @@ void set_server_up(struct check *check) {
        }
 
        if (s->track ||
-           (s->check.health == s->check.rise && (s->agent.health >= s->agent.rise || !(s->agent.state & CHK_ST_ENABLED))) ||
-           (s->agent.health == s->agent.rise && (s->check.health >= s->check.rise || !(s->check.state & CHK_ST_ENABLED)))) {
+           ((s->check.state & CHK_ST_ENABLED) && (s->check.health == s->check.rise) &&
+            (s->agent.health >= s->agent.rise || !(s->agent.state & CHK_ST_ENABLED))) ||
+           ((s->agent.state & CHK_ST_ENABLED) && (s->agent.health == s->agent.rise) &&
+            (s->check.health >= s->check.rise || !(s->check.state & CHK_ST_ENABLED)))) {
                if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
                        if (s->proxy->last_change < now.tv_sec)         // ignore negative times
                                s->proxy->down_time += now.tv_sec - s->proxy->last_change;