@cryptotaxi247 / netdata / commits / 050632f73

Metadata worker should respect shutdown request (#20598)

Stelios Fragkakis committed Jun 30, 2025 at 20:01 UTC 050632f73966ee540abd24678991a217dd1a822b
1 file changed +17 -12
src/database/sqlite/sqlite_metadata.c
+17 -12
@@ -2014,7 +2014,7 @@ size_t populate_metrics_from_database(void *mrg, void (*populate_cb)(void *mrg,
2014 }
2015 #endif
2016
2017 -static void metadata_scan_host(RRDHOST *host, BUFFER *work_buffer, bool is_worker)
2017 +static void metadata_scan_host(struct meta_config_s *config, RRDHOST *host, BUFFER *work_buffer, bool is_worker)
2018 {
2019 static bool skip_models = false;
2020 RRDSET *st;
@@ -2031,6 +2031,9 @@ static void metadata_scan_host(RRDHOST *host, BUFFER *work_buffer, bool is_worke
2031
2032 rrdset_foreach_reentrant(st, host) {
2033
2034 + if (SHUTDOWN_REQUESTED(config))
2035 + break;
2036 +
2037 if(rrdset_flag_check(st, RRDSET_FLAG_METADATA_UPDATE)) {
2038
2039 rrdset_flag_clear(st, RRDSET_FLAG_METADATA_UPDATE);
@@ -2362,7 +2365,7 @@ void store_host_info_and_metadata(RRDHOST *host, BUFFER *work_buffer)
2365 store_host_and_system_info(host);
2366 }
2367
2365 -static void store_hosts_metadata(BUFFER *work_buffer, bool is_worker)
2368 +static void store_hosts_metadata(struct meta_config_s *config, BUFFER *work_buffer, bool is_worker)
2369 {
2370 RRDHOST *host;
2371 size_t host_count = 0;
@@ -2384,15 +2387,20 @@ static void store_hosts_metadata(BUFFER *work_buffer, bool is_worker)
2387 continue;
2388
2389 rrdhost_flag_clear(host, RRDHOST_FLAG_METADATA_UPDATE);
2390 +
2391 + if (SHUTDOWN_REQUESTED(config))
2392 + break;
2393 +
2394 if (is_worker)
2395 worker_is_busy(UV_EVENT_STORE_HOST);
2396
2397 // store labels, claim_id, host and system info (if needed)
2398 store_host_info_and_metadata(host, work_buffer);
2399 +
2400 if (is_worker)
2401 worker_is_idle();
2402
2395 - metadata_scan_host(host, work_buffer, is_worker);
2403 + metadata_scan_host(config, host, work_buffer, is_worker);
2404
2405 if (!is_worker)
2406 nd_log_daemon(NDLP_INFO, "METADATA: Progress of metadata storage: %6.2f%% completed", (100.0 * count / host_count));
@@ -2429,7 +2437,7 @@ static void start_metadata_hosts(uv_work_t *req)
2437
2438 worker_is_busy(UV_EVENT_METADATA_STORE);
2439
2432 - store_hosts_metadata(work_buffer, true);
2440 + store_hosts_metadata(config, work_buffer, true);
2441
2442 COMPUTE_DURATION(report_duration, "us", all_started_ut, now_monotonic_usec());
2443 nd_log_daemon(NDLP_DEBUG, "Checking all hosts completed in %s", report_duration);
@@ -2489,10 +2497,11 @@ static void *metadata_event_loop(void *arg)
2497 struct judy_list_t *pending_sql_statement = NULL;
2498
2499 config->initialized = true;
2500 + __atomic_store_n(&config->shutdown_requested, false, __ATOMIC_RELAXED);
2501 nd_log_daemon(NDLP_INFO, "METADATA: Synchronization thread is up and running");
2502 completion_mark_complete(&config->start_stop_complete);
2503
2495 - while (likely(config->shutdown_requested == false)) {
2504 + while (likely(__atomic_load_n(&config->shutdown_requested, __ATOMIC_RELAXED) == false)) {
2505 nd_uuid_t *uuid;
2506 RRDHOST *host = NULL;
2507 ALARM_ENTRY *ae = NULL;
@@ -2633,7 +2642,7 @@ static void *metadata_event_loop(void *arg)
2642 }
2643 break;
2644 case METADATA_SYNC_SHUTDOWN:
2636 - config->shutdown_requested = true;
2645 + __atomic_store_n(&config->shutdown_requested, true, __ATOMIC_RELAXED);
2646 break;
2647 case METADATA_UNITTEST:;
2648 struct thread_unittest *tu = (struct thread_unittest *)cmd.param[0];
@@ -2668,12 +2677,8 @@ static void *metadata_event_loop(void *arg)
2677
2678 (void)uv_loop_close(loop);
2679
2671 - // If we are still waiting for callbacks we timed out, don't run these
2672 - if (!callbacks_pending)
2673 - store_hosts_metadata(work_buffer, false);
2674 -
2675 - store_alert_transitions(pending_alert_list, false, callbacks_pending);
2676 - store_sql_statements(pending_sql_statement, false, callbacks_pending);
2680 + store_alert_transitions(pending_alert_list, false, true);
2681 + store_sql_statements(pending_sql_statement, false, true);
2682
2683 if (pending_ctx_cleanup_list) {
2684 Word_t Index = 0;