Improve SQLite library shutdown handling and initialization state (#20559)
Stelios Fragkakis committed
Jun 26, 2025 at 11:01 UTC
da205b61b8d1f9afd41aee813cb1c4cc392c5545
1 file changed
+10
-6
src/database/sqlite/sqlite_functions.c
+10
-6
@@ -20,7 +20,7 @@ long long def_journal_size_limit = 16777216;
20
21
SPINLOCK sqlite_spinlock = SPINLOCK_INITIALIZER;
22
23
-bool sqlite_online;
23
+bool sqlite_library_initialized;
24
25
SQLITE_API int sqlite3_exec_monitored(
26
sqlite3 *db, /* An open database */
@@ -429,6 +429,8 @@ extern sqlite3 *db_context_meta;
429
430
void sqlite_close_databases(void)
431
{
432
+ spinlock_lock(&sqlite_spinlock);
433
+
434
// In case we have statements in the main thread
435
finalize_self_prepared_sql_statements();
436
@@ -436,12 +438,9 @@ void sqlite_close_databases(void)
438
// to do it properly
439
finalize_all_prepared_sql_statements();
440
439
- spinlock_lock(&sqlite_spinlock);
440
- sqlite_online = false;
441
- spinlock_unlock(&sqlite_spinlock);
442
-
441
sql_close_database(db_context_meta, "CONTEXT");
442
sql_close_database(db_meta, "METADATA");
443
+ spinlock_unlock(&sqlite_spinlock);
444
}
445
446
uint64_t get_total_database_space(void)
@@ -485,7 +484,7 @@ int sqlite_library_init(void)
484
nd_log_daemon(
485
NDLP_INFO, "SQLITE: heap memory hard limit %s, soft limit %s", sqlite_hard_limit_mb, sqlite_soft_limit_mb);
486
}
488
- sqlite_online = true;
487
+ sqlite_library_initialized = true;
488
spinlock_unlock(&sqlite_spinlock);
489
490
return (SQLITE_OK != rc);
@@ -506,6 +505,11 @@ void sqlite_library_shutdown(void)
505
} while (bytes);
506
#endif
507
spinlock_lock(&sqlite_spinlock);
508
+ if (!sqlite_library_initialized) {
509
+ spinlock_unlock(&sqlite_spinlock);
510
+ return;
511
+ }
512
+ sqlite_library_initialized = false;
513
(void) sqlite3_shutdown();
514
spinlock_unlock(&sqlite_spinlock);
515
}