From f0c756518e9bfabfb317d22aa3416bc84eb543ba Mon Sep 17 00:00:00 2001
From: Olivier Houchard <ohouchard@haproxy.com>
Date: Fri, 13 Dec 2024 17:11:05 +0000
Subject: [PATCH] BUG/MEDIUM: queues: Make sure we call process_srv_queue()
 when leaving

In stream_free(), make sure we call process_srv_queue() each time we
call sess_change_server(), otherwise a server may end up not dequeuing
any stream when it could do so. In some extreme cases it could lead to
an infinite loop, as the server would appear to be available, as its
"served" parameter would be < maxconn, but would end up not being used,
as there are elements still in its queue.

This should be backported up to 2.6.

(cherry picked from commit dc9ce9c26469e00ab71fe6387dbd13010d4930f0)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 1385e4ca16b3797b0091a959b626935cd7f29b38)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 2de073ef00ee7d87aa82064dd2977645ec694730)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

Conflict:NA
Reference:https://git.haproxy.org/?p=haproxy-2.9.git;a=patch;h=f0c756518e9bfabfb317d22aa3416bc84eb543ba
---
 src/stream.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/stream.c b/src/stream.c
index f4a3298..c42cf95 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -625,11 +625,14 @@ void stream_free(struct stream *s)
 	}
 
 	if (unlikely(s->srv_conn)) {
+		struct server *oldsrv = s->srv_conn;
 		/* the stream still has a reserved slot on a server, but
 		 * it should normally be only the same as the one above,
 		 * so this should not happen in fact.
 		 */
 		sess_change_server(s, NULL);
+		if (may_dequeue_tasks(oldsrv, s->be))
+			process_srv_queue(oldsrv);
 	}
 
 	/* We may still be present in the buffer wait queue */
-- 
1.7.10.4

