@cryptotaxi247 / netdata-1 / commits / a608d3e91

Improve shutdown of the metadata thread (#15901)

Improve shutdown when submitting a final "metadata host scan"

Stelios Fragkakis committed Sep 1, 2023 at 17:39 UTC a608d3e9139a5dfc2e5423d47407372f41b6f86e
1 file changed +12 -10
database/sqlite/sqlite_metadata.c
+12 -10
@@ -107,6 +107,7 @@ struct metadata_wc {
107 volatile unsigned queue_size;
108 METADATA_FLAG flags;
109 struct completion init_complete;
110 + struct completion *scan_complete;
111 /* FIFO command queue */
112 uv_mutex_t cmd_mutex;
113 uv_cond_t cmd_cond;
@@ -1173,7 +1174,6 @@ void run_metadata_cleanup(struct metadata_wc *wc)
1174 struct scan_metadata_payload {
1175 uv_work_t request;
1176 struct metadata_wc *wc;
1176 - struct completion *completion;
1177 BUFFER *work_buffer;
1178 uint32_t max_count;
1179 };
@@ -1301,8 +1301,8 @@ static void after_metadata_hosts(uv_work_t *req, int status __maybe_unused)
1301
1302 metadata_flag_clear(wc, METADATA_FLAG_PROCESSING);
1303 internal_error(true, "METADATA: scanning hosts complete");
1304 - if (unlikely(data->completion)) {
1305 - completion_mark_complete(data->completion);
1304 + if (unlikely(wc->scan_complete)) {
1305 + completion_mark_complete(wc->scan_complete);
1306 internal_error(true, "METADATA: Sending completion done");
1307 }
1308 freez(data);
@@ -1610,7 +1610,6 @@ static void metadata_event_loop(void *arg)
1610 data = mallocz(sizeof(*data));
1611 data->request.data = data;
1612 data->wc = wc;
1613 - data->completion = cmd.completion; // Completion by the worker
1613 data->work_buffer = work_buffer;
1614
1615 if (unlikely(cmd.completion)) {
@@ -1626,7 +1625,7 @@ static void metadata_event_loop(void *arg)
1625 start_metadata_hosts,
1626 after_metadata_hosts))) {
1627 // Failed to launch worker -- let the event loop handle completion
1629 - cmd.completion = data->completion;
1628 + cmd.completion = wc->scan_complete;
1629 freez(data);
1630 metadata_flag_clear(wc, METADATA_FLAG_PROCESSING);
1631 }
@@ -1674,6 +1673,8 @@ static void metadata_event_loop(void *arg)
1673
1674 netdata_log_info("METADATA: Shutting down event loop");
1675 completion_mark_complete(&wc->init_complete);
1676 + completion_destroy(wc->scan_complete);
1677 + freez(wc->scan_complete);
1678 return;
1679
1680 error_after_timer_init:
@@ -1712,8 +1713,11 @@ void metadata_sync_shutdown_prepare(void)
1713 struct metadata_cmd cmd;
1714 memset(&cmd, 0, sizeof(cmd));
1715
1715 - struct completion compl;
1716 - completion_init(&compl);
1716 + struct metadata_wc *wc = &metasync_worker;
1717 +
1718 + struct completion *compl = mallocz(sizeof(*compl));
1719 + completion_init(compl);
1720 + __atomic_store_n(&wc->scan_complete, compl, __ATOMIC_RELAXED);
1721
1722 netdata_log_info("METADATA: Sending a scan host command");
1723 uint32_t max_wait_iterations = 2000;
@@ -1724,12 +1728,10 @@ void metadata_sync_shutdown_prepare(void)
1728 }
1729
1730 cmd.opcode = METADATA_SCAN_HOSTS;
1727 - cmd.completion = &compl;
1731 metadata_enq_cmd(&metasync_worker, &cmd);
1732
1733 netdata_log_info("METADATA: Waiting for host scan completion");
1731 - completion_wait_for(&compl);
1732 - completion_destroy(&compl);
1734 + completion_wait_for(wc->scan_complete);
1735 netdata_log_info("METADATA: Host scan complete; can continue with shutdown");
1736 }
1737