TEST_F(LoggingTests, BasicDeleteTest) { auto recovery_table = ExecutorTestsUtil::CreateTable(1024); auto &manager = catalog::Manager::GetInstance(); storage::Database db(DEFAULT_DB_ID); manager.AddDatabase(&db); db.AddTable(recovery_table); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 1); logging::WriteAheadFrontendLogger fel(true); cid_t test_commit_id = 10; auto curr_rec = new logging::TupleRecord( LOGRECORD_TYPE_TUPLE_UPDATE, test_commit_id, recovery_table->GetOid(), INVALID_ITEMPOINTER, ItemPointer(100, 4), nullptr, DEFAULT_DB_ID); fel.DeleteTuple(curr_rec); delete curr_rec; auto tg_header = recovery_table->GetTileGroupById(100)->GetHeader(); EXPECT_EQ(tg_header->GetEndCommitId(4), test_commit_id); // EXPECT_EQ(recovery_table->GetNumberOfTuples(), 1); EXPECT_EQ(recovery_table->GetTileGroupCount(), 2); }
oid_t DataTable::GetAllActiveTupleCount() { oid_t count = 0; for (auto tile_group_id : tile_groups_) { auto tile_group = GetTileGroupById(tile_group_id); auto tile_group_header = tile_group->GetHeader(); count += tile_group_header->GetActiveTupleCount(); } return count; }
std::shared_ptr<storage::TileGroup> DataTable::GetTileGroup( const std::size_t &tile_group_offset) const { PL_ASSERT(tile_group_offset < GetTileGroupCount()); auto tile_group_id = tile_groups_.FindValid(tile_group_offset, invalid_tile_group_id); return GetTileGroupById(tile_group_id); }
TEST_F(LoggingTests, BasicUpdateTest) { auto recovery_table = ExecutorTestsUtil::CreateTable(1024); auto &manager = catalog::Manager::GetInstance(); storage::Database db(DEFAULT_DB_ID); manager.AddDatabase(&db); db.AddTable(recovery_table); auto tuples = BuildLoggingTuples(recovery_table, 1, false, false); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 1); EXPECT_EQ(tuples.size(), 1); logging::WriteAheadFrontendLogger fel(true); // auto bel = logging::WriteAheadBackendLogger::GetInstance(); cid_t test_commit_id = 10; Value val0 = tuples[0]->GetValue(0); Value val1 = tuples[0]->GetValue(1); Value val2 = tuples[0]->GetValue(2); Value val3 = tuples[0]->GetValue(3); auto curr_rec = new logging::TupleRecord( LOGRECORD_TYPE_TUPLE_UPDATE, test_commit_id, recovery_table->GetOid(), ItemPointer(100, 5), ItemPointer(100, 4), tuples[0], DEFAULT_DB_ID); curr_rec->SetTuple(tuples[0]); fel.UpdateTuple(curr_rec); delete curr_rec; auto tg_header = recovery_table->GetTileGroupById(100)->GetHeader(); EXPECT_TRUE(tg_header->GetBeginCommitId(5) <= test_commit_id); EXPECT_EQ(tg_header->GetEndCommitId(5), MAX_CID); EXPECT_EQ(tg_header->GetEndCommitId(4), test_commit_id); EXPECT_TRUE( val0.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 0)) == 0); EXPECT_TRUE( val1.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 1)) == 0); EXPECT_TRUE( val2.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 2)) == 0); EXPECT_TRUE( val3.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 3)) == 0); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 2); }
std::shared_ptr<storage::TileGroup> DataTable::GetTileGroup( const oid_t &tile_group_offset) const { assert(tile_group_offset < GetTileGroupCount()); tile_group_lock_.ReadLock(); auto tile_group_id = tile_groups_.at(tile_group_offset); tile_group_lock_.Unlock(); return GetTileGroupById(tile_group_id); }
TEST_F(LoggingTests, OutOfOrderCommitTest) { auto recovery_table = ExecutorTestsUtil::CreateTable(1024); auto &manager = catalog::Manager::GetInstance(); storage::Database db(DEFAULT_DB_ID); manager.AddDatabase(&db); db.AddTable(recovery_table); auto tuples = BuildLoggingTuples(recovery_table, 1, false, false); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 1); EXPECT_EQ(tuples.size(), 1); logging::WriteAheadFrontendLogger fel(true); // auto bel = logging::WriteAheadBackendLogger::GetInstance(); cid_t test_commit_id = 10; auto curr_rec = new logging::TupleRecord( LOGRECORD_TYPE_TUPLE_UPDATE, test_commit_id + 1, recovery_table->GetOid(), INVALID_ITEMPOINTER, ItemPointer(100, 5), nullptr, DEFAULT_DB_ID); fel.DeleteTuple(curr_rec); delete curr_rec; EXPECT_EQ(recovery_table->GetTileGroupCount(), 2); curr_rec = new logging::TupleRecord( LOGRECORD_TYPE_TUPLE_INSERT, test_commit_id, recovery_table->GetOid(), ItemPointer(100, 5), INVALID_ITEMPOINTER, tuples[0], DEFAULT_DB_ID); curr_rec->SetTuple(tuples[0]); fel.InsertTuple(curr_rec); delete curr_rec; auto tg_header = recovery_table->GetTileGroupById(100)->GetHeader(); EXPECT_EQ(tg_header->GetEndCommitId(5), test_commit_id + 1); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 2); }