[BUG] do not dequeue requests on a dead server
Kai Krueger reported a problem when a server goes down with active
connections. A lot of connections were drained by that server. Kai
did an amazing job at tracking this bug down to the dequeuing
mechanism which forgets to check the server state before allowing
a request to be sent to a server.
The problem occurs more often with long requests, which have a chance
to complete after the server is completely marked down, and to find
requests in the global queue which have not yet been fetched by other
servers.
The fix consists in ensuring that a server is up before sending it
any new request from the queue.
(cherry picked from commit 80b286a064
)
(cherry picked from commit 2e5e0d2853f059a1d09dc81fdbbad9fd03124a98)
This commit is contained in:
parent
fe651a50d6
commit
07dc95abf1
|
@ -64,10 +64,11 @@ static inline struct pendconn *pendconn_from_px(const struct proxy *px) {
|
|||
}
|
||||
|
||||
/* returns 0 if nothing has to be done for server <s> regarding queued connections,
|
||||
* and non-zero otherwise. Suited for and if/else usage.
|
||||
* and non-zero otherwise. If the server is down, we always return zero. Suited for
|
||||
* and if/else usage.
|
||||
*/
|
||||
static inline int may_dequeue_tasks(const struct server *s, const struct proxy *p) {
|
||||
return (s && (s->nbpend || p->nbpend) &&
|
||||
return (s && (s->state & SRV_RUNNING) && (s->nbpend || p->nbpend) &&
|
||||
(!s->maxconn || s->cur_sess < srv_dynamic_maxconn(s)));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue