Cleanup metadata event loop (#19447)
* Remove METADATA_ADD_HOST_INFO -- will be done when storing host data Add workers Schedule dimension cleanup in a worker * Remove commented code
Stelios Fragkakis committed
Jan 20, 2025 at 23:23 UTC
38f1ed617c76f68e9634ce4e94dfa891a751e356
5 files changed
+112
-31
src/daemon/libuv_workers.c
+7
@@ -55,6 +55,13 @@ void register_libuv_worker_jobs() {
55
worker_register_job_name(UV_EVENT_METADATA_STORE, "metadata store host");
56
worker_register_job_name(UV_EVENT_METADATA_CLEANUP, "metadata cleanup");
57
worker_register_job_name(UV_EVENT_METADATA_ML_LOAD, "metadata load ml models");
58
+ worker_register_job_name(UV_EVENT_CTX_CLEANUP_SCHEDULE, "metadata ctx cleanup schedule");
59
+ worker_register_job_name(UV_EVENT_CTX_CLEANUP, "metadata ctx cleanup");
60
+ worker_register_job_name(UV_EVENT_STORE_ALERT_TRANSITIONS, "metadata store alert transitions");
61
+ worker_register_job_name(UV_EVENT_CHART_LABEL_CLEANUP, "metadata chart label cleanup");
62
+ worker_register_job_name(UV_EVENT_UUID_DELETION, "metadata dimension deletion");
63
+ worker_register_job_name(UV_EVENT_DIMENSION_CLEANUP, "metadata dimension cleanup");
64
+ worker_register_job_name(UV_EVENT_CHART_CLEANUP, "metadata chart cleanup");
65
66
// aclk_sync
67
worker_register_job_name(UV_EVENT_ACLK_NODE_INFO, "aclk host node info");
src/daemon/libuv_workers.h
+7
@@ -47,6 +47,13 @@ enum event_loop_job {
47
UV_EVENT_METADATA_STORE,
48
UV_EVENT_METADATA_CLEANUP,
49
UV_EVENT_METADATA_ML_LOAD,
50
+ UV_EVENT_CTX_CLEANUP_SCHEDULE,
51
+ UV_EVENT_CTX_CLEANUP,
52
+ UV_EVENT_STORE_ALERT_TRANSITIONS,
53
+ UV_EVENT_CHART_LABEL_CLEANUP,
54
+ UV_EVENT_UUID_DELETION,
55
+ UV_EVENT_DIMENSION_CLEANUP,
56
+ UV_EVENT_CHART_CLEANUP,
57
58
// aclk_sync
59
UV_EVENT_ACLK_NODE_INFO,
src/database/rrdhost.c
+1
-2
@@ -498,9 +498,8 @@ RRDHOST *rrdhost_create(
498
);
499
500
if(!archived) {
501
- metaqueue_host_update_info(host);
501
+ rrdhost_flag_set(host, RRDHOST_FLAG_METADATA_INFO | RRDHOST_FLAG_METADATA_UPDATE);
502
rrdhost_load_rrdcontext_data(host);
503
-// rrdhost_flag_set(host, RRDHOST_FLAG_METADATA_INFO | RRDHOST_FLAG_METADATA_UPDATE);
503
ml_host_new(host);
504
} else
505
rrdhost_flag_set(host, RRDHOST_FLAG_PENDING_CONTEXT_LOAD | RRDHOST_FLAG_ARCHIVED | RRDHOST_FLAG_ORPHAN);
src/database/sqlite/sqlite_metadata.c
+97
-28
@@ -193,7 +193,6 @@ enum metadata_opcode {
193
METADATA_DATABASE_NOOP = 0,
194
METADATA_DEL_DIMENSION,
195
METADATA_STORE_CLAIM_ID,
196
- METADATA_ADD_HOST_INFO,
196
METADATA_SCAN_HOSTS,
197
METADATA_LOAD_HOST_CONTEXT,
198
METADATA_DELETE_HOST_CHART_LABELS,
@@ -1405,6 +1404,8 @@ static void check_dimension_metadata(struct metadata_wc *wc)
1404
1405
nd_log(NDLS_DAEMON, NDLP_DEBUG, "Checking dimensions starting after row %" PRIu64, last_row_id);
1406
1407
+ worker_is_busy(UV_EVENT_DIMENSION_CLEANUP);
1408
+
1409
bool more_to_do = run_cleanup_loop(
1410
res,
1411
wc,
@@ -1436,6 +1437,8 @@ static void check_dimension_metadata(struct metadata_wc *wc)
1437
(long long)(next_execution_t - now));
1438
1439
SQLITE_FINALIZE(res);
1440
+
1441
+ worker_is_idle();
1442
}
1443
1444
static void check_chart_metadata(struct metadata_wc *wc)
@@ -1525,6 +1528,8 @@ static void check_label_metadata(struct metadata_wc *wc)
1528
sqlite3_stmt *check_res = NULL;
1529
sqlite3_stmt *action_res = NULL;
1530
1531
+ worker_is_busy(UV_EVENT_CHART_LABEL_CLEANUP);
1532
+
1533
bool more_to_do = run_cleanup_loop(
1534
res,
1535
wc,
@@ -1559,6 +1564,8 @@ static void check_label_metadata(struct metadata_wc *wc)
1564
(long long)(next_execution_t - now));
1565
1566
SQLITE_FINALIZE(res);
1567
+
1568
+ worker_is_idle();
1569
}
1570
1571
@@ -1818,12 +1825,14 @@ void run_metadata_cleanup(struct metadata_wc *wc)
1825
1826
if (next_context_list_cleanup < now && sql_metadata_wal_size_acceptable()) {
1827
RRDHOST *host;
1828
+ worker_is_busy(UV_EVENT_CTX_CLEANUP);
1829
dfe_start_reentrant(rrdhost_root_index, host) {
1830
ctx_get_context_list_to_cleanup(&host->host_id.uuid, cleanup_host_context_metadata, host);
1831
if (metadata_flag_check(wc, METADATA_FLAG_SHUTDOWN) || false == sql_metadata_wal_size_acceptable())
1832
break;
1833
}
1834
dfe_done(host);
1835
+ worker_is_idle();
1836
next_context_list_cleanup = now_realtime_sec() + METADATA_MAINTENANCE_CTX_CLEAN_REPEAT;
1837
}
1838
@@ -1849,6 +1858,7 @@ struct scan_metadata_payload {
1858
void *chart_label_cleanup;
1859
void *pending_alert_list;
1860
void *pending_ctx_cleanup_list;
1861
+ void *pending_uuid_deletion;
1862
BUFFER *work_buffer;
1863
uint32_t max_count;
1864
};
@@ -2181,12 +2191,52 @@ struct judy_list_t {
2191
Word_t count;
2192
};
2193
2194
+static void do_pending_uuid_deletion(struct metadata_wc *wc, struct judy_list_t *pending_uuid_deletion)
2195
+{
2196
+ if (!pending_uuid_deletion)
2197
+ return;
2198
+
2199
+ worker_is_busy(UV_EVENT_UUID_DELETION);
2200
+
2201
+ usec_t started_ut = now_monotonic_usec(); (void)started_ut;
2202
+
2203
+ size_t entries = pending_uuid_deletion->count;
2204
+ Word_t Index = 0;
2205
+ bool first = true;
2206
+ Pvoid_t *PValue;
2207
+ while ((PValue = JudyLFirstThenNext(pending_uuid_deletion->JudyL, &Index, &first))) {
2208
+ if (!*PValue)
2209
+ continue;
2210
+
2211
+ if (metadata_flag_check(wc, METADATA_FLAG_SHUTDOWN))
2212
+ break;
2213
+
2214
+ nd_uuid_t *uuid = *PValue;
2215
+ if (dimension_can_be_deleted(uuid, NULL, false))
2216
+ delete_dimension_uuid(uuid, NULL, false);
2217
+
2218
+ freez(uuid);
2219
+ }
2220
+ (void) JudyLFreeArray(&pending_uuid_deletion->JudyL, PJE0);
2221
+ freez(pending_uuid_deletion);
2222
+
2223
+ usec_t ended_ut = now_monotonic_usec(); (void)ended_ut;
2224
+ nd_log_daemon(
2225
+ NDLP_DEBUG,
2226
+ "Processed %zu dimension delete items in %0.2f ms",
2227
+ entries,
2228
+ (double)(ended_ut - started_ut) / USEC_PER_MS);
2229
+
2230
+ worker_is_idle();
2231
+}
2232
2185
-static void store_ctx_cleanup_list(struct judy_list_t *pending_ctx_cleanup_list)
2233
+static void store_ctx_cleanup_list(struct metadata_wc *wc, struct judy_list_t *pending_ctx_cleanup_list)
2234
{
2235
if (!pending_ctx_cleanup_list)
2236
return;
2237
2238
+ worker_is_busy(UV_EVENT_CTX_CLEANUP_SCHEDULE);
2239
+
2240
usec_t started_ut = now_monotonic_usec(); (void)started_ut;
2241
2242
size_t entries = pending_ctx_cleanup_list->count;
@@ -2198,6 +2248,9 @@ static void store_ctx_cleanup_list(struct judy_list_t *pending_ctx_cleanup_list)
2248
if (!*PValue)
2249
continue;
2250
2251
+ if (metadata_flag_check(wc, METADATA_FLAG_SHUTDOWN))
2252
+ break;
2253
+
2254
struct host_ctx_cleanup_s *ctx_cleanup = *PValue;
2255
sql_schedule_host_ctx_cleanup(&res, &ctx_cleanup->host_uuid, string2str(ctx_cleanup->context));
2256
string_freez(ctx_cleanup->context);
@@ -2213,6 +2266,8 @@ static void store_ctx_cleanup_list(struct judy_list_t *pending_ctx_cleanup_list)
2266
"Stored %zu host context cleanup items in %0.2f ms",
2267
entries,
2268
(double)(ended_ut - started_ut) / USEC_PER_MS);
2269
+
2270
+ worker_is_idle();
2271
}
2272
2273
static void store_alert_transitions(struct judy_list_t *pending_alert_list)
@@ -2220,6 +2275,8 @@ static void store_alert_transitions(struct judy_list_t *pending_alert_list)
2275
if (!pending_alert_list)
2276
return;
2277
2278
+ worker_is_busy(UV_EVENT_STORE_ALERT_TRANSITIONS);
2279
+
2280
usec_t started_ut = now_monotonic_usec(); (void)started_ut;
2281
2282
size_t entries = pending_alert_list->count;
@@ -2247,19 +2304,26 @@ static void store_alert_transitions(struct judy_list_t *pending_alert_list)
2304
"Stored and processed %zu alert transitions in %0.2f ms",
2305
entries,
2306
(double)(ended_ut - started_ut) / USEC_PER_MS);
2307
+
2308
+ worker_is_idle();
2309
}
2310
2252
-static void do_chart_label_cleanup(struct judy_list_t *cl_cleanup_data)
2311
+static void do_chart_label_cleanup(struct metadata_wc *wc, struct judy_list_t *cl_cleanup_data)
2312
{
2313
if (!cl_cleanup_data)
2314
return;
2315
2316
+ worker_is_busy(UV_EVENT_CHART_LABEL_CLEANUP);
2317
+
2318
Word_t Index = 0;
2319
bool first = true;
2320
Pvoid_t *PValue;
2321
while ((PValue = JudyLFirstThenNext(cl_cleanup_data->JudyL, &Index, &first))) {
2322
char *machine_guid = *PValue;
2323
2324
+ if (metadata_flag_check(wc, METADATA_FLAG_SHUTDOWN))
2325
+ break;
2326
+
2327
RRDHOST *host = rrdhost_find_by_guid(machine_guid);
2328
if (likely(!host)) {
2329
nd_uuid_t host_uuid;
@@ -2271,6 +2335,8 @@ static void do_chart_label_cleanup(struct judy_list_t *cl_cleanup_data)
2335
}
2336
JudyLFreeArray(&cl_cleanup_data->JudyL, PJE0);
2337
freez(cl_cleanup_data);
2338
+
2339
+ worker_is_idle();
2340
}
2341
2342
// Worker thread to scan hosts for pending metadata to store
@@ -2289,9 +2355,9 @@ static void start_metadata_hosts(uv_work_t *req)
2355
nd_log(NDLS_DAEMON, NDLP_DEBUG, "Checking all hosts started");
2356
usec_t started_ut = now_monotonic_usec(); (void)started_ut;
2357
2292
- store_ctx_cleanup_list((struct judy_list_t *)data->pending_ctx_cleanup_list);
2358
store_alert_transitions((struct judy_list_t *)data->pending_alert_list);
2294
- do_chart_label_cleanup((struct judy_list_t *)data->chart_label_cleanup);
2359
+ store_ctx_cleanup_list(wc, (struct judy_list_t *)data->pending_ctx_cleanup_list);
2360
+ do_chart_label_cleanup(wc, (struct judy_list_t *)data->chart_label_cleanup);
2361
2362
bool run_again = false;
2363
worker_is_busy(UV_EVENT_METADATA_STORE);
@@ -2380,8 +2446,11 @@ static void start_metadata_hosts(uv_work_t *req)
2446
"Checking all hosts completed in %0.2f ms",
2447
(double)(all_ended_ut - all_started_ut) / USEC_PER_MS);
2448
2383
- if (likely(!run_again))
2449
+ do_pending_uuid_deletion(wc, (struct judy_list_t *)data->pending_uuid_deletion);
2450
+
2451
+ if (likely(!run_again)) {
2452
run_metadata_cleanup(wc);
2453
+ }
2454
2455
wc->metadata_check_after = now_realtime_sec() + METADATA_HOST_CHECK_INTERVAL;
2456
worker_is_idle();
@@ -2390,12 +2459,15 @@ static void start_metadata_hosts(uv_work_t *req)
2459
static void metadata_event_loop(void *arg)
2460
{
2461
worker_register("METASYNC");
2393
- worker_register_job_name(METADATA_DATABASE_NOOP, "noop");
2394
- worker_register_job_name(METADATA_DEL_DIMENSION, "delete dimension");
2395
- worker_register_job_name(METADATA_STORE_CLAIM_ID, "add claim id");
2396
- worker_register_job_name(METADATA_ADD_HOST_INFO, "add host info");
2397
- worker_register_job_name(METADATA_ADD_CTX_CLEANUP, "host ctx cleanup");
2398
- worker_register_job_name(METADATA_MAINTENANCE, "maintenance");
2462
+ worker_register_job_name(METADATA_DATABASE_NOOP, "noop");
2463
+ worker_register_job_name(METADATA_DEL_DIMENSION, "delete dimension");
2464
+ worker_register_job_name(METADATA_STORE_CLAIM_ID, "add claim id");
2465
+ worker_register_job_name(METADATA_ADD_CTX_CLEANUP, "host ctx cleanup");
2466
+ worker_register_job_name(METADATA_SCAN_HOSTS, "host metadata store");
2467
+ worker_register_job_name(METADATA_LOAD_HOST_CONTEXT, "host load context");
2468
+ worker_register_job_name(METADATA_DELETE_HOST_CHART_LABELS, "delete host labels");
2469
+ worker_register_job_name(METADATA_ADD_HOST_AE, "add host alert entry");
2470
+ worker_register_job_name(METADATA_DEL_HOST_AE, "delete host alert entry");
2471
2472
int ret;
2473
uv_loop_t *loop;
@@ -2445,6 +2517,7 @@ static void metadata_event_loop(void *arg)
2517
Pvoid_t *PValue;
2518
struct judy_list_t *pending_ae_list = NULL;
2519
struct judy_list_t *pending_ctx_cleanup_list = NULL;
2520
+ struct judy_list_t *pending_uuid_deletion = NULL;
2521
2522
while (shutdown == 0 || (wc->flags & METADATA_FLAG_PROCESSING)) {
2523
nd_uuid_t *uuid;
@@ -2478,19 +2551,18 @@ static void metadata_event_loop(void *arg)
2551
break;
2552
case METADATA_DEL_DIMENSION:
2553
uuid = (nd_uuid_t *) cmd.param[0];
2481
- if (likely(dimension_can_be_deleted(uuid, NULL, false)))
2482
- delete_dimension_uuid(uuid, NULL, false);
2483
- freez(uuid);
2554
+ if (!pending_uuid_deletion)
2555
+ pending_uuid_deletion = callocz(1, sizeof(*pending_uuid_deletion));
2556
+
2557
+ PValue = JudyLIns(&pending_uuid_deletion->JudyL, ++pending_uuid_deletion->count, PJE0);
2558
+ if (PValue)
2559
+ *PValue = uuid;
2560
break;
2561
case METADATA_STORE_CLAIM_ID:
2562
store_claim_id((nd_uuid_t *) cmd.param[0], (nd_uuid_t *) cmd.param[1]);
2563
freez((void *) cmd.param[0]);
2564
freez((void *) cmd.param[1]);
2565
break;
2490
- case METADATA_ADD_HOST_INFO:
2491
- host = (RRDHOST *) cmd.param[0];
2492
- store_host_and_system_info(host, NULL);
2493
- break;
2566
2567
case METADATA_ADD_CTX_CLEANUP:
2568
if (!pending_ctx_cleanup_list)
@@ -2513,10 +2585,13 @@ static void metadata_event_loop(void *arg)
2585
data->chart_label_cleanup = cl_cleanup_data;
2586
data->pending_alert_list = pending_ae_list;
2587
data->pending_ctx_cleanup_list = pending_ctx_cleanup_list;
2588
+ data->pending_uuid_deletion = pending_uuid_deletion;
2589
+
2590
data->work_buffer = work_buffer;
2591
cl_cleanup_data = NULL;
2592
pending_ae_list = NULL;
2593
pending_ctx_cleanup_list = NULL;
2594
+ pending_uuid_deletion = NULL;
2595
2596
if (unlikely(cmd.completion)) {
2597
data->max_count = 0; // 0 will process all pending updates
@@ -2532,11 +2607,12 @@ static void metadata_event_loop(void *arg)
2607
cl_cleanup_data = data->chart_label_cleanup;
2608
pending_ae_list = data->pending_alert_list;
2609
pending_ctx_cleanup_list = data->pending_ctx_cleanup_list;
2610
+ pending_uuid_deletion = data->pending_uuid_deletion;
2611
freez(data);
2612
metadata_flag_clear(wc, METADATA_FLAG_PROCESSING);
2613
}
2614
break;
2539
- case METADATA_LOAD_HOST_CONTEXT:;
2615
+ case METADATA_LOAD_HOST_CONTEXT:
2616
if (unittest_running)
2617
break;
2618
@@ -2571,7 +2647,7 @@ static void metadata_event_loop(void *arg)
2647
if (PValue)
2648
*PValue = (void *)ae;
2649
break;
2574
- case METADATA_DEL_HOST_AE:;
2650
+ case METADATA_DEL_HOST_AE:
2651
(void) JudyLIns(&wc->ae_DelJudyL, (Word_t) (void *) cmd.param[0], PJE0);
2652
break;
2653
case METADATA_UNITTEST:;
@@ -2777,13 +2853,6 @@ void metaqueue_store_claim_id(nd_uuid_t *host_uuid, nd_uuid_t *claim_uuid)
2853
queue_metadata_cmd(METADATA_STORE_CLAIM_ID, local_host_uuid, local_claim_uuid);
2854
}
2855
2780
-void metaqueue_host_update_info(RRDHOST *host)
2781
-{
2782
- if (unlikely(!metasync_worker.loop))
2783
- return;
2784
- queue_metadata_cmd(METADATA_ADD_HOST_INFO, host, NULL);
2785
-}
2786
-
2856
void metaqueue_ml_load_models(RRDDIM *rd)
2857
{
2858
rrddim_flag_set(rd, RRDDIM_FLAG_ML_MODEL_LOAD);
src/database/sqlite/sqlite_metadata.h
-1
@@ -40,7 +40,6 @@ void metadata_sync_shutdown_prepare(void);
40
41
void metaqueue_delete_dimension_uuid(nd_uuid_t *uuid);
42
void metaqueue_store_claim_id(nd_uuid_t *host_uuid, nd_uuid_t *claim_uuid);
43
-void metaqueue_host_update_info(RRDHOST *host);
43
void metaqueue_ml_load_models(RRDDIM *rd);
44
void detect_machine_guid_change(nd_uuid_t *host_uuid);
45
void metadata_queue_load_host_context(RRDHOST *host);