mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 14:21:25 +02:00
BUG: backend: stop looking for queued connections once there's no more
Commit ae0b12ee0 ("MEDIUM: queue: use a trylock on the server's queue") introduced a hard to trigger bug that's more visible with a single thread: if a server dequeues a connection and finds another free slot with no connection to place there, process_srv_queue() will never break out of the loop. In multi-thread it almost does not happen because other threads bring new connections. No backport is needed as it's only in -dev.
This commit is contained in:
parent
d03adce575
commit
19c5581b43
@ -330,6 +330,7 @@ void process_srv_queue(struct server *s)
|
||||
struct server *ref = s->track ? s->track : s;
|
||||
struct proxy *p = s->proxy;
|
||||
int maxconn;
|
||||
int stop = 0;
|
||||
int done = 0;
|
||||
int px_ok;
|
||||
|
||||
@ -345,13 +346,13 @@ void process_srv_queue(struct server *s)
|
||||
* for the same server will give up, knowing that at least one of
|
||||
* them will check the conditions again before quitting.
|
||||
*/
|
||||
while (s->served < (maxconn = srv_dynamic_maxconn(s))) {
|
||||
while (!stop && s->served < (maxconn = srv_dynamic_maxconn(s))) {
|
||||
if (HA_SPIN_TRYLOCK(SERVER_LOCK, &s->queue.lock) != 0)
|
||||
break;
|
||||
|
||||
while (s->served < maxconn) {
|
||||
int ret = pendconn_process_next_strm(s, p, px_ok);
|
||||
if (!ret)
|
||||
stop = !pendconn_process_next_strm(s, p, px_ok);
|
||||
if (stop)
|
||||
break;
|
||||
_HA_ATOMIC_INC(&s->served);
|
||||
done++;
|
||||
|
Loading…
x
Reference in New Issue
Block a user