diff options
author | Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> | 2023-09-01 17:39:57 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-01 17:39:57 +0300 |
commit | a608d3e9139a5dfc2e5423d47407372f41b6f86e (patch) | |
tree | 93f30509bfc2e117fdf89858cf5099248932a681 | |
parent | 0ba3827c53b753c493fed561be3a700e61751fa9 (diff) |
Improve shutdown of the metadata thread (#15901)
Improve shutdown when submitting a final "metadata host scan"
-rw-r--r-- | database/sqlite/sqlite_metadata.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/database/sqlite/sqlite_metadata.c b/database/sqlite/sqlite_metadata.c index be46026b76..71e444db3c 100644 --- a/database/sqlite/sqlite_metadata.c +++ b/database/sqlite/sqlite_metadata.c @@ -107,6 +107,7 @@ struct metadata_wc { volatile unsigned queue_size; METADATA_FLAG flags; struct completion init_complete; + struct completion *scan_complete; /* FIFO command queue */ uv_mutex_t cmd_mutex; uv_cond_t cmd_cond; @@ -1173,7 +1174,6 @@ void run_metadata_cleanup(struct metadata_wc *wc) struct scan_metadata_payload { uv_work_t request; struct metadata_wc *wc; - struct completion *completion; BUFFER *work_buffer; uint32_t max_count; }; @@ -1301,8 +1301,8 @@ static void after_metadata_hosts(uv_work_t *req, int status __maybe_unused) metadata_flag_clear(wc, METADATA_FLAG_PROCESSING); internal_error(true, "METADATA: scanning hosts complete"); - if (unlikely(data->completion)) { - completion_mark_complete(data->completion); + if (unlikely(wc->scan_complete)) { + completion_mark_complete(wc->scan_complete); internal_error(true, "METADATA: Sending completion done"); } freez(data); @@ -1610,7 +1610,6 @@ static void metadata_event_loop(void *arg) data = mallocz(sizeof(*data)); data->request.data = data; data->wc = wc; - data->completion = cmd.completion; // Completion by the worker data->work_buffer = work_buffer; if (unlikely(cmd.completion)) { @@ -1626,7 +1625,7 @@ static void metadata_event_loop(void *arg) start_metadata_hosts, after_metadata_hosts))) { // Failed to launch worker -- let the event loop handle completion - cmd.completion = data->completion; + cmd.completion = wc->scan_complete; freez(data); metadata_flag_clear(wc, METADATA_FLAG_PROCESSING); } @@ -1674,6 +1673,8 @@ static void metadata_event_loop(void *arg) netdata_log_info("METADATA: Shutting down event loop"); completion_mark_complete(&wc->init_complete); + completion_destroy(wc->scan_complete); + freez(wc->scan_complete); return; error_after_timer_init: @@ -1712,8 +1713,11 @@ void metadata_sync_shutdown_prepare(void) struct metadata_cmd cmd; memset(&cmd, 0, sizeof(cmd)); - struct completion compl; - completion_init(&compl); + struct metadata_wc *wc = &metasync_worker; + + struct completion *compl = mallocz(sizeof(*compl)); + completion_init(compl); + __atomic_store_n(&wc->scan_complete, compl, __ATOMIC_RELAXED); netdata_log_info("METADATA: Sending a scan host command"); uint32_t max_wait_iterations = 2000; @@ -1724,12 +1728,10 @@ void metadata_sync_shutdown_prepare(void) } cmd.opcode = METADATA_SCAN_HOSTS; - cmd.completion = &compl; metadata_enq_cmd(&metasync_worker, &cmd); netdata_log_info("METADATA: Waiting for host scan completion"); - completion_wait_for(&compl); - completion_destroy(&compl); + completion_wait_for(wc->scan_complete); netdata_log_info("METADATA: Host scan complete; can continue with shutdown"); } |