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.
This commit is contained in:
Willy Tarreau 2022-07-13 08:59:39 +02:00
parent a5b5075211
commit 672972604f

View File

@ -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;