|
commit 445b2b7c52a13678241a190c4ff52e77a09ef0a6
|
|
Author: Willy Tarreau <w@1wt.eu>
|
|
Date: Wed Jul 31 19:20:39 2019 +0200
|
|
|
|
MINOR: wdt: also consider that waiting in the thread dumper is normal
|
|
|
|
It happens that upon looping threads the watchdog fires, starts a dump,
|
|
and other threads expire their budget while waiting for the other threads
|
|
to get dumped and trigger a watchdog event again, adding some confusion
|
|
to the traces. With this patch the situation becomes clearer as we export
|
|
the list of threads being dumped so that the watchdog can check it before
|
|
deciding to trigger. This way such threads in queue for being dumped are
|
|
not attempted to be reported in turn.
|
|
|
|
This should be backported to 2.0 as it helps understand stack traces.
|
|
|
|
(cherry picked from commit a37cb1880c81b1f038e575d88ba7210aea0b7b8f)
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
|
|
diff --git a/include/common/debug.h b/include/common/debug.h
|
|
index 333203dd..f43258e9 100644
|
|
--- a/include/common/debug.h
|
|
+++ b/include/common/debug.h
|
|
@@ -70,6 +70,7 @@
|
|
|
|
struct task;
|
|
struct buffer;
|
|
+extern volatile unsigned long threads_to_dump;
|
|
void ha_task_dump(struct buffer *buf, const struct task *task, const char *pfx);
|
|
void ha_thread_dump(struct buffer *buf, int thr, int calling_tid);
|
|
void ha_thread_dump_all_to_trash();
|
|
diff --git a/src/debug.c b/src/debug.c
|
|
index 07624ca5..3077e97c 100644
|
|
--- a/src/debug.c
|
|
+++ b/src/debug.c
|
|
@@ -29,6 +29,11 @@
|
|
#include <proto/stream_interface.h>
|
|
#include <proto/task.h>
|
|
|
|
+/* mask of threads still having to dump, used to respect ordering. Only used
|
|
+ * when USE_THREAD_DUMP is set.
|
|
+ */
|
|
+volatile unsigned long threads_to_dump = 0;
|
|
+
|
|
/* Dumps to the buffer some known information for the desired thread, and
|
|
* optionally extra info for the current thread. The dump will be appended to
|
|
* the buffer, so the caller is responsible for preliminary initializing it.
|
|
@@ -405,9 +410,6 @@ void ha_thread_dump_all_to_trash()
|
|
*/
|
|
#define DEBUGSIG SIGURG
|
|
|
|
-/* mask of threads still having to dump, used to respect ordering */
|
|
-static volatile unsigned long threads_to_dump;
|
|
-
|
|
/* ID of the thread requesting the dump */
|
|
static unsigned int thread_dump_tid;
|
|
|
|
diff --git a/src/wdt.c b/src/wdt.c
|
|
index 19d36c34..aa89fd44 100644
|
|
--- a/src/wdt.c
|
|
+++ b/src/wdt.c
|
|
@@ -75,7 +75,7 @@ void wdt_handler(int sig, siginfo_t *si, void *arg)
|
|
if (n - p < 1000000000UL)
|
|
goto update_and_leave;
|
|
|
|
- if ((threads_harmless_mask|sleeping_thread_mask) & (1UL << thr)) {
|
|
+ if ((threads_harmless_mask|sleeping_thread_mask|threads_to_dump) & (1UL << thr)) {
|
|
/* This thread is currently doing exactly nothing
|
|
* waiting in the poll loop (unlikely but possible),
|
|
* waiting for all other threads to join the rendez-vous
|