From: Willy Tarreau Date: Wed, 13 Jul 2022 06:59:39 +0000 (+0200) Subject: BUG/MEDIUM: debug: fix possible hang when multiple threads dump at once X-Git-Tag: v2.7-dev2~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=672972604;p=thirdparty%2Fhaproxy.git 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. --- 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;