From: Willy Tarreau Date: Sun, 5 May 2019 04:54:22 +0000 (+0200) Subject: BUG/MEDIUM: checks: make sure the warmup task takes the server lock X-Git-Tag: v2.0-dev3~123 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4fc49a9aabacc8028877e2dcbdb54d8a19c398c4;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: checks: make sure the warmup task takes the server lock The server warmup task is used when a server uses the "slowstart" parameter. This task affects the server's weight and maxconn, and may dequeue pending connections from the queue. This must be done under the server's lock, which was not the case. This must be backported to 1.9 and 1.8. --- diff --git a/src/checks.c b/src/checks.c index 76bd8e3df4..aeb3b79b66 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1488,12 +1488,16 @@ static struct task *server_warmup(struct task *t, void *context, unsigned short (s->next_state != SRV_ST_STARTING)) return t; + HA_SPIN_LOCK(SERVER_LOCK, &s->lock); + /* recalculate the weights and update the state */ server_recalc_eweight(s, 1); /* probably that we can refill this server with a bit more connections */ pendconn_grab_from_px(s); + HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock); + /* get back there in 1 second or 1/20th of the slowstart interval, * whichever is greater, resulting in small 5% steps. */