From: Krzysztof Piotr Oledzki Date: Thu, 29 Jan 2009 23:52:49 +0000 (+0100) Subject: [CRITICAL] fix server state tracking: it was O(n!) instead of O(n) X-Git-Tag: v1.3.15.8~8 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=121c80111c37ff291d04fde300d035dff313af57;p=haproxy.git [CRITICAL] fix server state tracking: it was O(n!) instead of O(n) 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. --- diff --git a/src/checks.c b/src/checks.c index 0b8756b8a..82de26037 100644 --- a/src/checks.c +++ b/src/checks.c @@ -164,7 +164,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); } @@ -229,7 +229,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); } @@ -280,7 +280,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); } @@ -320,7 +320,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); }