@cryptotaxi247 / netdata-1 / commits / 4df24b169

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