1 commit 000f227a4cfdb019575e889638f9e0e5a53bbb0b
2 Author: Olivier Houchard <cognet@ci0.org>
3 Date: Mon Dec 30 18:15:40 2019 +0100
5 BUG/MEDIUM: connections: Hold the lock when wanting to kill a connection.
7 In connect_server(), when we decide we want to kill the connection of
8 another thread because there are too many idle connections, hold the
9 toremove_lock of the corresponding thread, othervise, there's a small race
10 condition where we could try to add the connection to the toremove_connections
11 list while it has already been free'd.
13 This should be backported to 2.0 and 2.1.
15 (cherry picked from commit 140237471e408736bb7162e68c572c710a66a526)
16 Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
18 diff --git a/src/backend.c b/src/backend.c
19 index ebc5050cb..be081a5e1 100644
22 @@ -1295,6 +1295,7 @@ int connect_server(struct stream *s)
23 // see it possibly larger.
26 + HA_SPIN_LOCK(OTHER_LOCK, &toremove_lock[tid]);
27 tokill_conn = MT_LIST_POP(&srv->idle_orphan_conns[i],
28 struct connection *, list);
30 @@ -1305,6 +1306,7 @@ int connect_server(struct stream *s)
31 task_wakeup(idle_conn_cleanup[i], TASK_WOKEN_OTHER);
34 + HA_SPIN_UNLOCK(OTHER_LOCK, &toremove_lock[tid]);