From 4fc49a9aabacc8028877e2dcbdb54d8a19c398c4 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 5 May 2019 06:54:22 +0200 Subject: [PATCH] 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. --- src/checks.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/checks.c b/src/checks.c index 76bd8e3df..aeb3b79b6 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. */