Cleanup pending statements during shutdown (#20511)
Fix coverity issues 471886, 471887, 471888
Stelios Fragkakis committed
Jun 18, 2025 at 16:27 UTC
d830a5e4c2da583d7b2fce65ad890964b7d5226c
1 file changed
+27
-16
src/database/sqlite/sqlite_metadata.c
+27
-16
@@ -2203,11 +2203,14 @@ static void store_ctx_cleanup_list(struct meta_config_s *config, struct judy_lis
2203
worker_is_idle();
2204
}
2205
2206
-static void store_alert_transitions(struct judy_list_t *pending_alert_list, bool is_worker)
2206
+static void store_alert_transitions(struct judy_list_t *pending_alert_list, bool is_worker, bool cleanup_only)
2207
{
2208
if (!pending_alert_list)
2209
return;
2210
2211
+ if (cleanup_only)
2212
+ goto done;
2213
+
2214
if (is_worker)
2215
worker_is_busy(UV_EVENT_STORE_ALERT_TRANSITIONS);
2216
@@ -2228,8 +2231,6 @@ static void store_alert_transitions(struct judy_list_t *pending_alert_list, bool
2231
__atomic_add_fetch(&ae->pending_save_count, -1, __ATOMIC_RELAXED);
2232
__atomic_add_fetch(&host->health.pending_transitions, -1, __ATOMIC_RELAXED);
2233
}
2231
- (void) JudyLFreeArray(&pending_alert_list->JudyL, PJE0);
2232
- freez(pending_alert_list);
2234
2235
usec_t ended_ut = now_monotonic_usec(); (void)ended_ut;
2236
nd_log(
@@ -2241,23 +2242,33 @@ static void store_alert_transitions(struct judy_list_t *pending_alert_list, bool
2242
2243
if (is_worker)
2244
worker_is_idle();
2245
+
2246
+done:
2247
+ (void) JudyLFreeArray(&pending_alert_list->JudyL, PJE0);
2248
+ freez(pending_alert_list);
2249
}
2250
2246
-static int execute_statement(sqlite3_stmt *stmt)
2251
+static int execute_statement(sqlite3_stmt *stmt, bool only_finalize)
2252
{
2253
if (!stmt)
2254
return SQLITE_OK;
2255
2251
- int rc = sqlite3_step_monitored(stmt);
2256
+ int rc = SQLITE_OK;
2257
+
2258
+ if (unlikely(only_finalize))
2259
+ goto done;
2260
+
2261
+ rc = sqlite3_step_monitored(stmt);
2262
if (unlikely(rc != SQLITE_DONE))
2263
nd_log_daemon(NDLP_ERR, "Failed to execute sql statement, rc = %d", rc);
2264
2265
+done:
2266
SQLITE_FINALIZE(stmt);
2267
2257
- return rc;
2268
+ return rc == SQLITE_DONE ? SQLITE_OK : rc;
2269
}
2270
2260
-static void store_sql_statements(struct judy_list_t *pending_sql_statement, bool is_worker)
2271
+static void store_sql_statements(struct judy_list_t *pending_sql_statement, bool is_worker, bool only_finalize)
2272
{
2273
if (!pending_sql_statement)
2274
return;
@@ -2273,7 +2284,7 @@ static void store_sql_statements(struct judy_list_t *pending_sql_statement, bool
2284
Pvoid_t *Pvalue;
2285
while ((Pvalue = JudyLFirstThenNext(pending_sql_statement->JudyL, &Index, &first))) {
2286
sqlite3_stmt *stmt = *Pvalue;
2276
- execute_statement(stmt);
2287
+ execute_statement(stmt, only_finalize);
2288
}
2289
(void) JudyLFreeArray(&pending_sql_statement->JudyL, PJE0);
2290
freez(pending_sql_statement);
@@ -2400,9 +2411,9 @@ static void start_metadata_hosts(uv_work_t *req)
2411
BUFFER *work_buffer = worker->work_buffer;
2412
usec_t all_started_ut = now_monotonic_usec();
2413
2403
- store_sql_statements((struct judy_list_t *)worker->pending_sql_statement, true);
2414
+ store_sql_statements((struct judy_list_t *)worker->pending_sql_statement, true, false);
2415
2405
- store_alert_transitions((struct judy_list_t *)worker->pending_alert_list, true);
2416
+ store_alert_transitions((struct judy_list_t *)worker->pending_alert_list, true, false);
2417
2418
if (!SHUTDOWN_REQUESTED(config))
2419
store_ctx_cleanup_list(config, (struct judy_list_t *)worker->pending_ctx_cleanup_list);
@@ -2609,7 +2620,7 @@ static void *metadata_event_loop(void *arg)
2620
*Pvalue = (void *)stmt;
2621
else {
2622
// Fallback execute immediately
2612
- execute_statement(stmt);
2623
+ execute_statement(stmt, false);
2624
}
2625
break;
2626
case METADATA_SYNC_SHUTDOWN:
@@ -2648,12 +2659,12 @@ static void *metadata_event_loop(void *arg)
2659
2660
(void)uv_loop_close(loop);
2661
2651
- // If we are still waitinng for callbacks we timed out, don't run these
2652
- if (!callbacks_pending) {
2662
+ // If we are still waiting for callbacks we timed out, don't run these
2663
+ if (!callbacks_pending)
2664
store_hosts_metadata(work_buffer, false);
2654
- store_alert_transitions(pending_alert_list, false);
2655
- store_sql_statements(pending_sql_statement, false);
2656
- }
2665
+
2666
+ store_alert_transitions(pending_alert_list, false, callbacks_pending);
2667
+ store_sql_statements(pending_sql_statement, false, callbacks_pending);
2668
2669
if (pending_ctx_cleanup_list) {
2670
Word_t Index = 0;