attempt to save status file from the signal handler (#19718)
Costa Tsaousis committed
Feb 26, 2025 at 15:27 UTC
4df24b169996afffe7a2b0bea3ff5224de844f19
3 files changed
+19
-5
src/daemon/daemon-status-file.c
+7
-1
@@ -476,7 +476,6 @@ static bool save_status_file(const char *directory, const char *content, size_t
476
fclose(fp);
477
478
if (!ok) {
479
- unlink(filename);
479
unlink(temp_filename);
480
return false;
481
}
@@ -537,6 +536,13 @@ void daemon_status_file_update_status(DAEMON_STATUS status) {
536
daemon_status_file_save(&session_status);
537
}
538
539
+void daemon_status_file_exit_reason_save(EXIT_REASON reason) {
540
+ spinlock_lock(&dsf_spinlock);
541
+ session_status.exit_reason |= reason;
542
+ spinlock_unlock(&dsf_spinlock);
543
+ daemon_status_file_save(&session_status);
544
+}
545
+
546
// --------------------------------------------------------------------------------------------------------------------
547
// POST the last status to agent-events
548
src/daemon/daemon-status-file.h
+1
@@ -80,6 +80,7 @@ DAEMON_STATUS_FILE daemon_status_file_load(void);
80
81
// saves the current status
82
void daemon_status_file_update_status(DAEMON_STATUS status);
83
+void daemon_status_file_exit_reason_save(EXIT_REASON reason);
84
85
// check for a crash
86
void daemon_status_file_check_crash(void);
src/daemon/signals.c
+11
-4
@@ -35,7 +35,12 @@ static struct {
35
};
36
37
static void signal_handler(int signo) {
38
- // find the entry in the list
38
+ static size_t recurse = 0;
39
+ if(__atomic_add_fetch(&recurse, 1, __ATOMIC_RELAXED) > 1) {
40
+ __atomic_sub_fetch(&recurse, 1, __ATOMIC_RELAXED);
41
+ return;
42
+ }
43
+
44
int i;
45
for(i = 0; signals_waiting[i].action != NETDATA_SIGNAL_END_OF_LIST ; i++) {
46
if(unlikely(signals_waiting[i].signo == signo)) {
@@ -48,11 +53,14 @@ static void signal_handler(int signo) {
53
// nothing to do - we cannot write but there is no way to complain about it
54
;
55
}
56
+ daemon_status_file_exit_reason_save(signals_waiting[i].reason);
57
}
58
53
- return;
59
+ break;
60
}
61
}
62
+
63
+ __atomic_sub_fetch(&recurse, 1, __ATOMIC_RELAXED);
64
}
65
66
// Mask all signals, to ensure they will only be unmasked at the threads that can handle them.
@@ -156,8 +164,7 @@ void nd_process_signals(void) {
164
165
case NETDATA_SIGNAL_FATAL:
166
nd_log_limits_unlimited();
159
- exit_initiated_set(signals_waiting[i].reason);
160
- daemon_status_file_update_status(DAEMON_STATUS_NONE);
167
+ daemon_status_file_exit_reason_save(signals_waiting[i].reason);
168
fatal("SIGNAL: Received %s. netdata now exits.", name);
169
break;
170