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 8d62108..b793e3e 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -1313,12 +1313,11 @@
{
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;