Better database corruption detention during runtime (#16343)
Detect database corruption doing query executing and schedule recovery on next restart
Stelios Fragkakis committed
Nov 7, 2023 at 09:30 UTC
240cf98375d7ed2102b52bce43c386b5471ea1a8
1 file changed
+13
-10
database/sqlite/sqlite_functions.c
+13
-10
@@ -514,22 +514,25 @@ int db_execute(sqlite3 *db, const char *cmd)
514
{
515
int rc;
516
int cnt = 0;
517
+
518
while (cnt < SQL_MAX_RETRY) {
519
char *err_msg;
520
rc = sqlite3_exec_monitored(db, cmd, 0, 0, &err_msg);
520
- if (rc != SQLITE_OK) {
521
- error_report("Failed to execute '%s', rc = %d (%s) -- attempt %d", cmd, rc, err_msg, cnt);
522
- sqlite3_free(err_msg);
523
- if (likely(rc == SQLITE_BUSY || rc == SQLITE_LOCKED)) {
524
- usleep(SQLITE_INSERT_DELAY * USEC_PER_MS);
525
- }
526
- else
527
- break;
528
- }
529
- else
521
+ if (likely(rc == SQLITE_OK))
522
break;
523
524
++cnt;
525
+ error_report("Failed to execute '%s', rc = %d (%s) -- attempt %d", cmd, rc, err_msg, cnt);
526
+ sqlite3_free(err_msg);
527
+
528
+ if (likely(rc == SQLITE_BUSY || rc == SQLITE_LOCKED)) {
529
+ usleep(SQLITE_INSERT_DELAY * USEC_PER_MS);
530
+ continue;
531
+ }
532
+
533
+ if (rc == SQLITE_CORRUPT)
534
+ mark_database_to_recover(NULL, db);
535
+ break;
536
}
537
return (rc != SQLITE_OK);
538
}