From: Willy Tarreau Date: Thu, 24 Jun 2021 05:26:59 +0000 (+0200) Subject: Revert "MINOR: queue: update proxy->served once out of the loop" X-Git-Tag: v2.5-dev1~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d83c98eb14817048f4d13524b8215a18eb0b6365;p=thirdparty%2Fhaproxy.git Revert "MINOR: queue: update proxy->served once out of the loop" This reverts commit 3e92a31783b545dd58c4be6c588808763e0042bc. The recent changes since 5304669e1 MEDIUM: queue: make pendconn_process_next_strm() only return the pendconn opened a tiny race condition between stream_free() and process_srv_queue(), as the pendconn is accessed outside of the lock, possibly while it's being freed. A different approach is required. --- diff --git a/src/queue.c b/src/queue.c index d8e73b2181..60b16a0661 100644 --- a/src/queue.c +++ b/src/queue.c @@ -351,9 +351,10 @@ void process_srv_queue(struct server *s, int server_locked) if (!pc) break; - done++; + done = 1; _HA_ATOMIC_INC(&s->served); + _HA_ATOMIC_INC(&p->served); stream_add_srv_conn(pc->strm, s); task_wakeup(pc->strm->task, TASK_WOKEN_RES); @@ -362,8 +363,6 @@ void process_srv_queue(struct server *s, int server_locked) if (!server_locked) HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock); - _HA_ATOMIC_ADD(&p->served, done); - if (done && p->lbprm.server_take_conn) p->lbprm.server_take_conn(s); }