osmith has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-hlr/+/39893?usp=email )
Change subject: db: flush after changing schema version ......................................................................
db: flush after changing schema version
Flush the cache after changing the version, to make the scenario less likely that after an unclean shutdown the DB gets restored with the right table layout but wrong version.
When that happens, osmo-hlr tries to upgrade the database layout again and fails with errors like "duplicate column name".
Related: SYS#7394 Change-Id: I5943a1cb3447c038c6e7972f68f9656b73a9248b (cherry picked from commit 1a71e73fdc40ba712ab61a299c9d4a048df539a2) --- M src/db.c 1 file changed, 9 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/93/39893/1
diff --git a/src/db.c b/src/db.c index 7b8a415..4ce5aa0 100644 --- a/src/db.c +++ b/src/db.c @@ -595,6 +595,7 @@ int rc; bool has_sqlite_config_sqllog = false; int version; + bool version_changed = false;
LOGP(DDB, LOGL_NOTICE, "using database: %s\n", fname); LOGP(DDB, LOGL_INFO, "Compiled against SQLite3 lib version %s\n", SQLITE_VERSION); @@ -672,6 +673,7 @@ goto out_free; } version = CURRENT_SCHEMA_VERSION; + version_changed = true; }
LOGP(DDB, LOGL_NOTICE, "Database '%s' has HLR DB schema version %d\n", dbc->fname, version); @@ -686,6 +688,7 @@ } LOGP(DDB, LOGL_NOTICE, "Database '%s' has been upgraded to HLR DB schema version %d\n", dbc->fname, version+1); + version_changed = true; }
if (version != CURRENT_SCHEMA_VERSION) { @@ -702,6 +705,12 @@ goto out_free; }
+ /* Flush the cache after changing the version, to make the scenario + * less likely that after an unclean shutdown the DB gets restored + * with the right table layout but wrong version (SYS#7394). */ + if (version_changed) + sqlite3_db_cacheflush(dbc->db); + /* prepare all SQL statements */ for (i = 0; i < ARRAY_SIZE(dbc->stmt); i++) { rc = sqlite3_prepare_v2(dbc->db, stmt_sql[i], -1,