Shutdown dbengine event loop properly (#16658)
* Shutdown dbengine event loop properly * Adjust messages
Stelios Fragkakis committed
Dec 27, 2023 at 10:53 UTC
28ef0540ed2cb049eb069adb4d6e020d52d0443a
5 files changed
+16
-13
daemon/main.c
+2
@@ -481,6 +481,8 @@ void netdata_cleanup_and_exit(int ret, const char *action, const char *action_re
481
delta_shutdown_time("stop dbengine tiers");
482
for (size_t tier = 0; tier < storage_tiers; tier++)
483
rrdeng_exit(multidb_ctx[tier]);
484
+
485
+ rrdeng_enq_cmd(NULL, RRDENG_OPCODE_SHUTDOWN_EVLOOP, NULL, NULL, STORAGE_PRIORITY_BEST_EFFORT, NULL, NULL);
486
}
487
#endif
488
}
daemon/unit_test.c
+2
@@ -2240,6 +2240,7 @@ int test_dbengine(void)
2240
rrdeng_prepare_exit((struct rrdengine_instance *)host->db[0].instance);
2241
rrdhost_delete_charts(host);
2242
rrdeng_exit((struct rrdengine_instance *)host->db[0].instance);
2243
+ rrdeng_enq_cmd(NULL, RRDENG_OPCODE_SHUTDOWN_EVLOOP, NULL, NULL, STORAGE_PRIORITY_BEST_EFFORT, NULL, NULL);
2244
rrd_unlock();
2245
2246
return errors + value_errors + time_errors;
@@ -2649,6 +2650,7 @@ void dbengine_stress_test(unsigned TEST_DURATION_SEC, unsigned DSET_CHARTS, unsi
2650
rrdeng_prepare_exit((struct rrdengine_instance *)host->db[0].instance);
2651
rrdhost_delete_charts(host);
2652
rrdeng_exit((struct rrdengine_instance *)host->db[0].instance);
2653
+ rrdeng_enq_cmd(NULL, RRDENG_OPCODE_SHUTDOWN_EVLOOP, NULL, NULL, STORAGE_PRIORITY_BEST_EFFORT, NULL, NULL);
2654
rrd_unlock();
2655
}
2656
database/engine/rrdengine.c
+10
-12
@@ -40,6 +40,7 @@ struct rrdeng_main {
40
uv_async_t async;
41
uv_timer_t timer;
42
pid_t tid;
43
+ bool shutdown;
44
45
size_t flushes_running;
46
size_t evictions_running;
@@ -1686,6 +1687,7 @@ void dbengine_event_loop(void* arg) {
1687
worker_register_job_name(RRDENG_OPCODE_EVICT_INIT, "evict init");
1688
worker_register_job_name(RRDENG_OPCODE_CTX_SHUTDOWN, "ctx shutdown");
1689
worker_register_job_name(RRDENG_OPCODE_CTX_QUIESCE, "ctx quiesce");
1690
+ worker_register_job_name(RRDENG_OPCODE_SHUTDOWN_EVLOOP, "dbengine shutdown");
1691
1692
worker_register_job_name(RRDENG_OPCODE_MAX, "get opcode");
1693
@@ -1827,6 +1829,13 @@ void dbengine_event_loop(void* arg) {
1829
break;
1830
}
1831
1832
+ case RRDENG_OPCODE_SHUTDOWN_EVLOOP: {
1833
+ uv_close((uv_handle_t *)&main->async, NULL);
1834
+ (void) uv_timer_stop(&main->timer);
1835
+ uv_close((uv_handle_t *)&main->timer, NULL);
1836
+ shutdown = true;
1837
+ }
1838
+
1839
case RRDENG_OPCODE_NOOP: {
1840
/* the command queue was empty, do nothing */
1841
break;
@@ -1843,18 +1852,7 @@ void dbengine_event_loop(void* arg) {
1852
} while (opcode != RRDENG_OPCODE_NOOP);
1853
}
1854
1846
- /* cleanup operations of the event loop */
1847
- netdata_log_info("DBENGINE: shutting down dbengine thread");
1848
-
1849
- /*
1850
- * uv_async_send after uv_close does not seem to crash in linux at the moment,
1851
- * it is however undocumented behaviour and we need to be aware if this becomes
1852
- * an issue in the future.
1853
- */
1854
- uv_close((uv_handle_t *)&main->async, NULL);
1855
- uv_timer_stop(&main->timer);
1856
- uv_close((uv_handle_t *)&main->timer, NULL);
1857
- uv_run(&main->loop, UV_RUN_DEFAULT);
1855
+ nd_log(NDLS_DAEMON, NDLP_DEBUG, "Shutting down dbengine thread");
1856
uv_loop_close(&main->loop);
1857
worker_unregister();
1858
}
database/engine/rrdengine.h
+1
@@ -247,6 +247,7 @@ enum rrdeng_opcode {
247
RRDENG_OPCODE_CTX_SHUTDOWN,
248
RRDENG_OPCODE_CTX_QUIESCE,
249
RRDENG_OPCODE_CTX_POPULATE_MRG,
250
+ RRDENG_OPCODE_SHUTDOWN_EVLOOP,
251
RRDENG_OPCODE_CLEANUP,
252
253
RRDENG_OPCODE_MAX
database/sqlite/sqlite_metadata.c
+1
-1
@@ -1756,7 +1756,7 @@ static void metadata_event_loop(void *arg)
1756
freez(loop);
1757
worker_unregister();
1758
1759
- nd_log(NDLS_DAEMON, NDLP_DEBUG, "Shutting down event loop");
1759
+ nd_log(NDLS_DAEMON, NDLP_DEBUG, "Shutting down metadata thread");
1760
completion_mark_complete(&wc->start_stop_complete);
1761
if (wc->scan_complete) {
1762
completion_destroy(wc->scan_complete);