TEST_F(CheckpointTests, CheckpointIntegrationTest) { logging::LoggingUtil::RemoveDirectory("pl_checkpoint", false); auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance(); txn_manager.BeginTransaction(); // Create a table and wrap it in logical tile size_t tile_group_size = TESTS_TUPLES_PER_TILEGROUP; size_t table_tile_group_count = 3; oid_t default_table_oid = 13; // table has 3 tile groups storage::DataTable *target_table = ExecutorTestsUtil::CreateTable(tile_group_size, true, default_table_oid); ExecutorTestsUtil::PopulateTable(target_table, tile_group_size * table_tile_group_count, false, false, false); txn_manager.CommitTransaction(); // add table to catalog auto &catalog_manager = catalog::Manager::GetInstance(); storage::Database *db(new storage::Database(DEFAULT_DB_ID)); db->AddTable(target_table); catalog_manager.AddDatabase(db); // create checkpoint auto &checkpoint_manager = logging::CheckpointManager::GetInstance(); auto &log_manager = logging::LogManager::GetInstance(); log_manager.SetGlobalMaxFlushedCommitId(txn_manager.GetNextCommitId()); checkpoint_manager.Configure(CHECKPOINT_TYPE_NORMAL, false, 1); checkpoint_manager.DestroyCheckpointers(); checkpoint_manager.InitCheckpointers(); auto checkpointer = checkpoint_manager.GetCheckpointer(0); checkpointer->DoCheckpoint(); auto most_recent_checkpoint_cid = checkpointer->GetMostRecentCheckpointCid(); EXPECT_EQ(most_recent_checkpoint_cid != INVALID_CID, true); // destroy and restart checkpoint_manager.DestroyCheckpointers(); checkpoint_manager.InitCheckpointers(); // recovery from checkpoint log_manager.PrepareRecovery(); auto recovery_checkpointer = checkpoint_manager.GetCheckpointer(0); recovery_checkpointer->DoRecovery(); EXPECT_EQ(db->GetTableCount(), 1); EXPECT_EQ(db->GetTable(0)->GetNumberOfTuples(), tile_group_size * table_tile_group_count); catalog_manager.DropDatabaseWithOid(db->GetOid()); logging::LoggingUtil::RemoveDirectory("pl_checkpoint", false); }
// Init method needs to be called to initialize the resource manager before any work is done bool DTCResourceManager::Init() { HRESULT hr = S_OK; hr = RegisterWithMSDTC(); if( FAILED(hr) ) { std::cout << "The resource manager failed to Init. Error # " << std::hex << hr << std::endl; return false; } // recover any transactions that are not completed bool returnValue = DoRecovery(); return returnValue; }
/** * @brief MainLoop */ void FrontendLogger::MainLoop(void) { auto &log_manager = LogManager::GetInstance(); ///////////////////////////////////////////////////////////////////// // STANDBY MODE ///////////////////////////////////////////////////////////////////// LOG_TRACE("FrontendLogger Standby Mode"); // Standby before we need to do RECOVERY log_manager.WaitForModeTransition(LOGGING_STATUS_TYPE_STANDBY, false); // Do recovery if we can, otherwise terminate switch (log_manager.GetLoggingStatus()) { case LOGGING_STATUS_TYPE_RECOVERY: { LOG_TRACE("Frontendlogger Recovery Mode"); ///////////////////////////////////////////////////////////////////// // RECOVERY MODE ///////////////////////////////////////////////////////////////////// // First, do recovery if needed LOG_INFO("Invoking DoRecovery"); DoRecovery(); LOG_INFO("DoRecovery done"); // Now, enter LOGGING mode // log_manager.SetLoggingStatus(LOGGING_STATUS_TYPE_LOGGING); // Notify log manager that this frontend logger has completed recovery log_manager.NotifyRecoveryDone(); // Now wait until the other frontend loggers also complete their recovery log_manager.WaitForModeTransition(LOGGING_STATUS_TYPE_LOGGING, true); break; } case LOGGING_STATUS_TYPE_LOGGING: { LOG_TRACE("Frontendlogger Logging Mode"); } break; default: break; } ///////////////////////////////////////////////////////////////////// // LOGGING MODE ///////////////////////////////////////////////////////////////////// // Periodically, wake up and do logging while (log_manager.GetLoggingStatus() == LOGGING_STATUS_TYPE_LOGGING) { // Collect LogRecords from all backend loggers // LOG_INFO("Log manager: Invoking CollectLogRecordsFromBackendLoggers"); CollectLogRecordsFromBackendLoggers(); // Flush the data to the file // LOG_INFO("Log manager: Invoking FlushLogRecords"); FlushLogRecords(); // update the global max flushed ID (only distinguished logger does this) UpdateGlobalMaxFlushId(); } ///////////////////////////////////////////////////////////////////// // TERMINATE MODE ///////////////////////////////////////////////////////////////////// // flush any remaining log records CollectLogRecordsFromBackendLoggers(); FlushLogRecords(); ///////////////////////////////////////////////////////////////////// // SLEEP MODE ///////////////////////////////////////////////////////////////////// LOG_TRACE("Frontendlogger Sleep Mode"); // Setting frontend logger status to sleep log_manager.SetLoggingStatus(LOGGING_STATUS_TYPE_SLEEP); }