@cryptotaxi247 / netdata-1 / commits / 240cf9837

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 }