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;