From 672972604f1407e221a52d96b77d1a7a01063baf Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 13 Jul 2022 08:59:39 +0200 Subject: [PATCH] BUG/MEDIUM: debug: fix possible hang when multiple threads dump at once A bug in the thread dumper was introduced by commit 00c27b50c ("MEDIUM: debug: make the thread dumper not rely on a thread mask anymore"). If two or more threads try to trigger a thread dump exactly at the same time, the second one may loop indefinitely trying to set the value to 1 while the other ones will wait for it to finish dumping before leaving. This is a consequence of a logic change using thread numbers instead of a thread mask, as threads do not need to see all other ones there anymore. No backport is needed, this is only for 2.7. --- src/debug.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/debug.c b/src/debug.c index 8d6210828f..b793e3ec03 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1313,12 +1313,11 @@ void ha_thread_dump_all_to_trash() { unsigned int old; - while (1) { - old = 0; - if (HA_ATOMIC_CAS(&thread_dump_state, &old, 1)) - break; - ha_thread_relax(); - } + /* initiate a dump starting from first thread. Use a CAS + * so that we don't wait if we're not the first one. + */ + old = 0; + HA_ATOMIC_CAS(&thread_dump_state, &old, 1); thread_dump_buffer = &trash; thread_dump_tid = tid; -- 2.39.5