Revert "MEDIUM: queue: refine the locking in process_srv_queue()"
This reverts commit 1b648c857bb9e0fb857e86838bcca0c9ed01e2bd.
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 c9134af..d8e73b2 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -340,29 +340,27 @@
int done = 0;
int maxconn;
+ if (!server_locked)
+ HA_SPIN_LOCK(SERVER_LOCK, &s->lock);
+ HA_RWLOCK_WRLOCK(PROXY_LOCK, &p->lock);
maxconn = srv_dynamic_maxconn(s);
while (s->served < maxconn) {
struct pendconn *pc;
- if (!server_locked)
- HA_SPIN_LOCK(SERVER_LOCK, &s->lock);
- HA_RWLOCK_WRLOCK(PROXY_LOCK, &p->lock);
-
pc = pendconn_process_next_strm(s, p);
-
- HA_RWLOCK_WRUNLOCK(PROXY_LOCK, &p->lock);
- if (!server_locked)
- HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
-
if (!pc)
break;
done++;
_HA_ATOMIC_INC(&s->served);
+
stream_add_srv_conn(pc->strm, s);
task_wakeup(pc->strm->task, TASK_WOKEN_RES);
}
+ HA_RWLOCK_WRUNLOCK(PROXY_LOCK, &p->lock);
+ if (!server_locked)
+ HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
_HA_ATOMIC_ADD(&p->served, done);