Improve agent shutdown (#19980)
* Join threads * Do not precompile statement * Switch to INFO message * Add dbengine_shutdown() function / join dbengine thread
Stelios Fragkakis committed
Mar 27, 2025 at 16:59 UTC
9c3ca6e7a3774acce90bf5785b8d54b556fc5bb8
6 files changed
+31
-11
src/daemon/daemon-shutdown.c
+1
-1
@@ -285,7 +285,7 @@ static void netdata_cleanup_and_exit(EXIT_REASON reason, bool abnormal, bool exi
285
for (size_t tier = 0; tier < nd_profile.storage_tiers; tier++)
286
nd_thread_join(th[tier]);
287
288
- rrdeng_enq_cmd(NULL, RRDENG_OPCODE_SHUTDOWN_EVLOOP, NULL, NULL, STORAGE_PRIORITY_INTERNAL_DBENGINE, NULL, NULL);
288
+ dbengine_shutdown();
289
watcher_step_complete(WATCHER_STEP_ID_STOP_DBENGINE_TIERS);
290
}
291
else {
src/database/engine/rrdengine.c
+11
@@ -2097,3 +2097,14 @@ void dbengine_event_loop(void* arg) {
2097
(void) uv_loop_close(&main->loop);
2098
worker_unregister();
2099
}
2100
+
2101
+void dbengine_shutdown()
2102
+{
2103
+ rrdeng_enq_cmd(NULL, RRDENG_OPCODE_SHUTDOWN_EVLOOP, NULL, NULL, STORAGE_PRIORITY_INTERNAL_DBENGINE, NULL, NULL);
2104
+
2105
+ int rc = uv_thread_join(&rrdeng_main.thread);
2106
+ if (rc)
2107
+ nd_log_daemon(NDLP_ERR, "DBENGINE: Failed to join thread, error %s", uv_err_name(rc));
2108
+ else
2109
+ nd_log_daemon(NDLP_INFO, "DBENGINE: thread shutdown completed");
2110
+}
src/database/engine/rrdengine.h
+1
@@ -549,5 +549,6 @@ static inline int journal_metric_uuid_compare(const void *key, const void *metri
549
uint64_t rrdeng_get_used_disk_space(struct rrdengine_instance *ctx);
550
void rrdeng_calculate_tier_disk_space_percentage(void);
551
uint64_t rrdeng_get_directory_free_bytes_space(struct rrdengine_instance *ctx);
552
+void dbengine_shutdown();
553
554
#endif /* NETDATA_RRDENGINE_H */
src/database/sqlite/sqlite_aclk.c
+5
-1
@@ -1020,7 +1020,11 @@ void aclk_synchronization_shutdown(void)
1020
1021
completion_wait_for(&aclk_sync_config.start_stop_complete);
1022
completion_destroy(&aclk_sync_config.start_stop_complete);
1023
- nd_log_daemon(NDLP_INFO, "ACLK sync shutdown completed");
1023
+ int rc = uv_thread_join(&aclk_sync_config.thread);
1024
+ if (rc)
1025
+ nd_log_daemon(NDLP_ERR, "ACLK: Failed to join synchronization thread, error %s", uv_err_name(rc));
1026
+ else
1027
+ nd_log_daemon(NDLP_INFO, "ACLK: synchronization thread shutdown completed");
1028
}
1029
1030
// Public
src/database/sqlite/sqlite_context.c
+3
-3
@@ -155,9 +155,9 @@ done:
155
156
void ctx_get_label_list(nd_uuid_t *chart_uuid, void (*dict_cb)(SQL_CLABEL_DATA *, void *), void *data)
157
{
158
- static __thread sqlite3_stmt *res = NULL;
158
+ sqlite3_stmt *res = NULL;
159
160
- if (!PREPARE_COMPILED_STATEMENT(db_context_meta, CTX_GET_LABEL_LIST, &res))
160
+ if (!PREPARE_STATEMENT(db_context_meta, CTX_GET_LABEL_LIST, &res))
161
return;
162
163
int param = 0;
@@ -175,7 +175,7 @@ void ctx_get_label_list(nd_uuid_t *chart_uuid, void (*dict_cb)(SQL_CLABEL_DATA *
175
176
done:
177
REPORT_BIND_FAIL(res, param);
178
- SQLITE_RESET(res);
178
+ SQLITE_FINALIZE(res);
179
}
180
181
// CONTEXT LIST
src/database/sqlite/sqlite_metadata.c
+10
-6
@@ -968,10 +968,10 @@ done:
968
969
static void delete_dimension_uuid(nd_uuid_t *dimension_uuid, sqlite3_stmt **action_res __maybe_unused, bool flag __maybe_unused)
970
{
971
- static __thread sqlite3_stmt *res = NULL;
971
+ sqlite3_stmt *res = NULL;
972
int rc;
973
974
- if (!PREPARE_COMPILED_STATEMENT(db_meta, DELETE_DIMENSION_UUID, &res))
974
+ if (!PREPARE_STATEMENT(db_meta, DELETE_DIMENSION_UUID, &res))
975
return;
976
977
int param = 0;
@@ -984,7 +984,7 @@ static void delete_dimension_uuid(nd_uuid_t *dimension_uuid, sqlite3_stmt **acti
984
985
done:
986
REPORT_BIND_FAIL(res, param);
987
- SQLITE_RESET(res);
987
+ SQLITE_FINALIZE(res);
988
}
989
990
//
@@ -2697,15 +2697,19 @@ void metadata_sync_shutdown(void)
2697
2698
struct metadata_cmd cmd;
2699
memset(&cmd, 0, sizeof(cmd));
2700
- nd_log(NDLS_DAEMON, NDLP_DEBUG, "METADATA: Sending a shutdown command");
2700
+ nd_log_daemon(NDLP_DEBUG, "METADATA: Sending a shutdown command");
2701
cmd.opcode = METADATA_SYNC_SHUTDOWN;
2702
metadata_enq_cmd(&metasync_worker, &cmd);
2703
2704
/* wait for metadata thread to shut down */
2705
- nd_log(NDLS_DAEMON, NDLP_DEBUG, "METADATA: Waiting for shutdown ACK");
2705
+ nd_log_daemon(NDLP_DEBUG, "METADATA: Waiting for shutdown ACK");
2706
completion_wait_for(&metasync_worker.start_stop_complete);
2707
completion_destroy(&metasync_worker.start_stop_complete);
2708
- nd_log(NDLS_DAEMON, NDLP_DEBUG, "METADATA: Shutdown complete");
2708
+ int rc = uv_thread_join(&metasync_worker.thread);
2709
+ if (rc)
2710
+ nd_log_daemon(NDLP_ERR, "METADATA: Failed to join synchronization thread, error %s", uv_err_name(rc));
2711
+ else
2712
+ nd_log_daemon(NDLP_INFO, "METADATA: synchronization thread shutdown completed");
2713
}
2714
2715
void metadata_sync_shutdown_prepare(void)