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.
This commit is contained in:
Willy Tarreau 2019-05-05 06:54:22 +02:00
parent 223995e8ca
commit 4fc49a9aab

View File

@ -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.
*/