@cryptotaxi247 / netdata-1 / commits / 28ef0540e

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);