@cryptotaxi247 / netdata / commits / d830a5e4c

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;