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