@cryptotaxi247 / netdata-1 / commits / 9c3ca6e7a

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)