Example #1
0
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
}
Example #3
0
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;
}
Example #4
0
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);
}