53 lines
2.2 KiB
Diff
53 lines
2.2 KiB
Diff
From 722b22cf7445748a6e78a7a6594237f60f9594c0 Mon Sep 17 00:00:00 2001
|
|
From: Valentine Krasnobaeva <vkrasnobaeva@haproxy.com>
|
|
Date: Mon, 6 May 2024 14:24:41 +0200
|
|
Subject: [PATCH] BUG/MINOR: haproxy: only tid 0 must not sleep if got signal
|
|
|
|
This patch fixes the commit eea152ee68
|
|
("BUG/MINOR: signals/poller: ensure wakeup from signals").
|
|
|
|
There is some probability that run_poll_loop() becomes inifinite, if
|
|
TH_FL_SLEEPING is withdrawn from all threads in the second signal_queue_len
|
|
check, when a signal has received just after the first one.
|
|
|
|
In such particular case, the 'wake' variable, which is used to terminate
|
|
thread's poll loop is never reset to 0. So, we never enter to the "stopping"
|
|
part of the run_poll_loop() and threads, except the one with id 0 (tid 0
|
|
handles signals), will continue to call _do_poll() eternally and will never
|
|
sleep, as its TH_FL_SLEEPING flag was unset.
|
|
|
|
This flag needs to be removed only for the tid 0, as it was done in the first
|
|
signal_queue_len check.
|
|
|
|
This fixes an issue #2537 "infinite loop when shutting down".
|
|
|
|
This fix must be backported in every stable version.
|
|
|
|
(cherry picked from commit 4a9e3e102e192b9efd17e3241a6cc659afb7e7dc)
|
|
Signed-off-by: Amaury Denoyelle <adenoyelle@haproxy.com>
|
|
(cherry picked from commit 02819d2e36611d2e19c3ca084f75199c8c215067)
|
|
Signed-off-by: Amaury Denoyelle <adenoyelle@haproxy.com>
|
|
(cherry picked from commit c58e4a48be4dd3c3efa2bee45d00dd0174274784)
|
|
[ad: context adjustment]
|
|
Signed-off-by: Amaury Denoyelle <adenoyelle@haproxy.com>
|
|
|
|
Conflict: NA
|
|
Reference: https://git.haproxy.org/?p=haproxy-2.6.git;a=commit;h=722b22cf7445748a6e78a7a6594237f60f9594c0
|
|
---
|
|
src/haproxy.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/src/haproxy.c b/src/haproxy.c
|
|
index 1259bfec4496..d83fb2757d92 100644
|
|
--- a/src/haproxy.c
|
|
+++ b/src/haproxy.c
|
|
@@ -2892,7 +2892,7 @@ void run_poll_loop()
|
|
if (thread_has_tasks()) {
|
|
activity[tid].wake_tasks++;
|
|
_HA_ATOMIC_AND(&sleeping_thread_mask, ~tid_bit);
|
|
- } else if (signal_queue_len) {
|
|
+ } else if (signal_queue_len && tid == 0) {
|
|
/* this check is required to avoid
|
|
* a race with wakeup on signals using wake_threads() */
|
|
_HA_ATOMIC_AND(&sleeping_thread_mask, ~tid_bit);
|