コード例 #1
0
ファイル: checkpoint_test.cpp プロジェクト: aelroby/peloton
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);
}
コード例 #2
0
// 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;
}
コード例 #3
0
/**
 * @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);
}