]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[CRITICAL] fix server state tracking: it was O(n!) instead of O(n)
authorKrzysztof Piotr Oledzki <ole@ans.pl>
Thu, 29 Jan 2009 23:52:49 +0000 (00:52 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 4 Feb 2009 21:39:03 +0000 (22:39 +0100)
Using the wrong operator (&& instead of &) causes DOWN->UP
transition to take longer than it should and to produce a lot of
redundant logs. With typical "track" usage (1-6 tracking servers) it
shouldn't make a big difference but for heavily tracked servers
this bug leads to hang with 100% CPU usage and extremely big
log spam.

src/checks.c

index eb316cbb634f4fc958eba5e9419cebd298f8f356..1acff0d840199f52abfb7df0fec5a6ca3e7e7dda 100644 (file)
@@ -161,7 +161,7 @@ static void set_server_down(struct server *s)
 
                s->down_trans++;
 
-               if (s->state && SRV_CHECKED)
+               if (s->state & SRV_CHECKED)
                        for(srv = s->tracknext; srv; srv = srv->tracknext)
                                set_server_down(srv);
        }
@@ -226,7 +226,7 @@ static void set_server_up(struct server *s) {
                Warning("%s", trash);
                send_log(s->proxy, LOG_NOTICE, "%s", trash);
 
-               if (s->state && SRV_CHECKED)
+               if (s->state & SRV_CHECKED)
                        for(srv = s->tracknext; srv; srv = srv->tracknext)
                                set_server_up(srv);
        }
@@ -277,7 +277,7 @@ static void set_server_disabled(struct server *s) {
        if (!s->proxy->srv_bck && !s->proxy->srv_act)
                set_backend_down(s->proxy);
 
-       if (s->state && SRV_CHECKED)
+       if (s->state & SRV_CHECKED)
                for(srv = s->tracknext; srv; srv = srv->tracknext)
                        set_server_disabled(srv);
 }
@@ -317,7 +317,7 @@ static void set_server_enabled(struct server *s) {
        Warning("%s", trash);
        send_log(s->proxy, LOG_NOTICE, "%s", trash);
 
-       if (s->state && SRV_CHECKED)
+       if (s->state & SRV_CHECKED)
                for(srv = s->tracknext; srv; srv = srv->tracknext)
                        set_server_enabled(srv);
 }