bool gbDB_WAL_Checkpoint_ReusingDB(sqlite3* database) { bool retVal = true; int status; const int kSQLiteCheckpointMode = SQLITE_CHECKPOINT_PASSIVE; status = sqlite3_wal_checkpoint_v2(database, NULL, kSQLiteCheckpointMode, NULL, NULL); if (status != SQLITE_OK) { printf("gbDB_Meta_PRAGMA_Journal_WAL_ReusingDB: [ERR] Checkpoint failed, msg: %s ... status: %d\n", sqlite3_errmsg(database), status); uint32_t currentSleepMS = 0; const uint32_t kSleepIntervalMS = 100; // 100ms const uint32_t kSleepIntervalUS = kSleepIntervalMS * 1000; // 100ms -> us const uint32_t kMaxSleepMS = 60 * 1000; // 60s -> ms while (status != SQLITE_OK) { if ( (status != SQLITE_BUSY && status != SQLITE_LOCKED) || currentSleepMS >= kMaxSleepMS) { break; }//if status = sqlite3_wal_checkpoint_v2(database, NULL, kSQLiteCheckpointMode, NULL, NULL); usleep(kSleepIntervalUS); currentSleepMS += kSleepIntervalMS; }//while if (currentSleepMS >= kMaxSleepMS) { printf("gbDB_Meta_PRAGMA_Journal_WAL_ReusingDB: [ERR] Timeout while DB was busy.\n"); }//if if (status != SQLITE_OK) { printf("gbDB_Meta_PRAGMA_Journal_WAL_ReusingDB: [ERR] Checkpoint failed, msg: %s ... status: %d\n", sqlite3_errmsg(database), status); retVal = false;; }//if }//if return retVal; }//gbDB_Meta_PRAGMA_Journal_WAL_ReusingDB
ikptr ik_sqlite3_wal_checkpoint_v2 (ikptr s_conn, ikptr s_database_name, ikptr s_checkpoint_mode, ikpcb * pcb) { #ifdef HAVE_SQLITE3_WAL_CHECKPOINT_V2 sqlite3 * conn = IK_SQLITE_CONNECTION(s_conn); char * database_name = \ IK_CHARP_FROM_BYTEVECTOR_OR_POINTER_OR_MBLOCK_OR_FALSE(s_database_name); int checkpoint_mode = ik_integer_to_int(s_checkpoint_mode); int size_of_wal_log; int number_of_checkpointed_frames; int rv; rv = sqlite3_wal_checkpoint_v2(conn, database_name, checkpoint_mode, &size_of_wal_log, &number_of_checkpointed_frames); if (SQLITE_OK == rv) { ikptr s_vec = ika_vector_alloc_and_init(pcb, 3); pcb->root0 = &s_vec; { IK_ASS(IK_ITEM(s_vec, 0), ika_integer_from_sqlite_errcode(pcb, rv)); IK_ASS(IK_ITEM(s_vec, 1), ika_integer_from_int(pcb, size_of_wal_log)); IK_ASS(IK_ITEM(s_vec, 2), ika_integer_from_int(pcb, number_of_checkpointed_frames)); } pcb->root0 = NULL; return s_vec; } else return ika_integer_from_sqlite_errcode(pcb, rv); #else feature_failure(__func__); #endif }
gboolean rspamd_sqlite3_sync (sqlite3 *db, gint *wal_frames, gint *wal_checkpoints) { gint wf = 0, wc = 0, mode; #ifdef SQLITE_OPEN_WAL #ifdef SQLITE_CHECKPOINT_TRUNCATE mode = SQLITE_CHECKPOINT_TRUNCATE; #elif defined(SQLITE_CHECKPOINT_RESTART) mode = SQLITE_CHECKPOINT_RESTART; #elif defined(SQLITE_CHECKPOINT_FULL) mode = SQLITE_CHECKPOINT_FULL; #endif /* Perform wal checkpoint (might be long) */ if (sqlite3_wal_checkpoint_v2 (db, NULL, mode, &wf, &wc) != SQLITE_OK) { return FALSE; } #endif if (wal_frames) { *wal_frames = wf; } if (wal_checkpoints) { *wal_checkpoints = wc; } return TRUE; }
static int checkpoint_starvation_walhook( void *pCtx, sqlite3 *db, const char *zDb, int nFrame ){ CheckpointStarvationCtx *p = (CheckpointStarvationCtx *)pCtx; if( nFrame>p->nMaxFrame ){ p->nMaxFrame = nFrame; } if( nFrame>=CHECKPOINT_STARVATION_FRAMELIMIT ){ sqlite3_wal_checkpoint_v2(db, zDb, p->eMode, 0, 0); } return SQLITE_OK; }
void SqliteDatabase::runWal () { int log = 0, ckpt = 0; int ret = sqlite3_wal_checkpoint_v2 (mConnection, nullptr, SQLITE_CHECKPOINT_PASSIVE, &log, &ckpt); if (ret != SQLITE_OK) { WriteLog ((ret == SQLITE_LOCKED) ? lsTRACE : lsWARNING, SqliteDatabase) << "WAL(" << sqlite3_db_filename (mConnection, "main") << "): error " << ret; } else WriteLog (lsTRACE, SqliteDatabase) << "WAL(" << sqlite3_db_filename (mConnection, "main") << "): frames=" << log << ", written=" << ckpt; { ScopedLockType sl (m_walMutex); walRunning = false; } }
void SqliteDatabaseBackend::checkpointFullWalLog() { int resultCode = sqlite3_wal_checkpoint_v2(sqliteDatabaseHandle(), nullptr, SQLITE_CHECKPOINT_FULL, nullptr, nullptr); checkIfLogCouldBeCheckpointed(resultCode); }