diff --git a/dbms/src/Storages/DeltaMerge/tests/gtest_segment.cpp b/dbms/src/Storages/DeltaMerge/tests/gtest_segment.cpp index 89ac1d15165..f21d572ee48 100644 --- a/dbms/src/Storages/DeltaMerge/tests/gtest_segment.cpp +++ b/dbms/src/Storages/DeltaMerge/tests/gtest_segment.cpp @@ -54,119 +54,6 @@ bool shouldCompactStableWithTooMuchDataOutOfSegmentRange(const DMContext & conte } namespace tests { -class SegmentFrameworkTest : public SegmentTestBasic -{ -}; - -TEST_F(SegmentFrameworkTest, PrepareWriteBlock) -try -{ - reloadWithOptions(SegmentTestOptions{.is_common_handle = false}); - - auto s1_id = splitSegmentAt(DELTA_MERGE_FIRST_SEGMENT_ID, 10); - ASSERT_TRUE(s1_id.has_value()); - auto s2_id = splitSegmentAt(*s1_id, 20); - ASSERT_TRUE(s2_id.has_value()); - - // s1 has range [10, 20) - { - auto [begin, end] = getSegmentKeyRange(*s1_id); - ASSERT_EQ(10, begin); - ASSERT_EQ(20, end); - } - - { - // write_rows == segment_rows, start_key not specified - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 10); - ASSERT_EQ(1, blocks.size()); - auto handle_column = blocks[0].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({10, 11, 12, 13, 14, 15, 16, 17, 18, 19}), handle_data); - } - { - // write_rows > segment_rows, start_key not specified - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 13); - ASSERT_EQ(2, blocks.size()); - { - auto handle_column = blocks[0].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({10, 11, 12, 13, 14, 15, 16, 17, 18, 19}), handle_data); - } - { - auto handle_column = blocks[1].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({10, 11, 12}), handle_data); - } - } - { - // start_key specified, end_key - start_key < write_rows - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 2, /* at */ 16); - ASSERT_EQ(1, blocks.size()); - const auto & handle_column = blocks[0].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({16, 17}), handle_data); - } - { - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 4, /* at */ 16); - ASSERT_EQ(1, blocks.size()); - const auto & handle_column = blocks[0].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({16, 17, 18, 19}), handle_data); - } - { - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 5, /* at */ 16); - ASSERT_EQ(2, blocks.size()); - { - const auto & handle_column = blocks[0].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({16, 17, 18, 19}), handle_data); - } - { - const auto & handle_column = blocks[1].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({16}), handle_data); - } - } - { - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 10, /* at */ 16); - ASSERT_EQ(3, blocks.size()); - { - const auto & handle_column = blocks[0].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({16, 17, 18, 19}), handle_data); - } - { - const auto & handle_column = blocks[1].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({16, 17, 18, 19}), handle_data); - } - { - const auto & handle_column = blocks[2].getByName(EXTRA_HANDLE_COLUMN_NAME).column; - const auto & handle_data = typeid_cast &>(*handle_column).getData(); - ASSERT_EQ(PaddedPODArray({16, 17}), handle_data); - } - } - { - // write rows < segment rows, start key not specified, should choose a random start. - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 3); - ASSERT_EQ(1, blocks.size()); - ASSERT_EQ(3, blocks[0].rows()); - } - { - // Let's check whether the generated handles will be starting from 12, for at least once. - auto start_from_12 = 0; - for (size_t i = 0; i < 100; i++) - { - auto blocks = prepareWriteBlocksInSegmentRange(*s1_id, 3); - if (blocks[0].getByName(EXTRA_HANDLE_COLUMN_NAME).column->getInt(0) == 12) - start_from_12++; - } - ASSERT_TRUE(start_from_12 > 0); // We should hit at least 1 times in 100 iters. - ASSERT_TRUE(start_from_12 < 50); // We should not hit 50 times in 100 iters :) - } -} -CATCH - class SegmentOperationTest : public SegmentTestBasic { @@ -525,12 +412,11 @@ CATCH TEST_F(SegmentOperationTest, SegmentLogicalSplit) try { - { - SegmentTestOptions options; - options.db_settings.dt_segment_stable_pack_rows = 100; - options.db_settings.dt_enable_logical_split = true; - reloadWithOptions(options); - } + reloadWithOptions( + {.db_settings = { + .dt_segment_stable_pack_rows = 100, + .dt_enable_logical_split = true, + }}); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 400, /* at */ 0); flushSegmentCache(DELTA_MERGE_FIRST_SEGMENT_ID); @@ -561,12 +447,8 @@ CATCH TEST_F(SegmentOperationTest, Issue5570) try { - { - SegmentTestOptions options; - // a smaller pack rows for logical split - options.db_settings.dt_segment_stable_pack_rows = 100; - reloadWithOptions(options); - } + // a smaller pack rows for logical split + reloadWithOptions({.db_settings = {.dt_segment_stable_pack_rows = 100}}); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 200); flushSegmentCache(DELTA_MERGE_FIRST_SEGMENT_ID); @@ -623,13 +505,12 @@ CATCH TEST_F(SegmentOperationTest, DeltaPagesAfterDeltaMerge) try { - { - SegmentTestOptions options; - // a smaller pack rows for logical split - options.db_settings.dt_segment_stable_pack_rows = 100; - options.db_settings.dt_enable_logical_split = true; - reloadWithOptions(options); - } + // a smaller pack rows for logical split + reloadWithOptions( + {.db_settings = { + .dt_segment_stable_pack_rows = 100, + .dt_enable_logical_split = true, + }}); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 100); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 100); @@ -717,10 +598,11 @@ class SegmentEnableLogicalSplitTest : public SegmentOperationTest void SetUp() override { SegmentOperationTest::SetUp(); - SegmentTestOptions options; - options.db_settings.dt_segment_stable_pack_rows = 100; - options.db_settings.dt_enable_logical_split = true; - reloadWithOptions(options); + reloadWithOptions( + {.db_settings = { + .dt_segment_stable_pack_rows = 100, + .dt_enable_logical_split = true, + }}); ASSERT_TRUE(dm_context->enable_logical_split); } }; @@ -793,9 +675,7 @@ class SegmentSplitTest : public SegmentTestBasic TEST_F(SegmentSplitTest, AutoModePhycialSplitByDefault) try { - SegmentTestOptions options; - options.db_settings.dt_segment_stable_pack_rows = 100; - reloadWithOptions(options); + reloadWithOptions({.db_settings = {.dt_segment_stable_pack_rows = 100}}); ASSERT_FALSE(dm_context->enable_logical_split); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 1000); @@ -812,11 +692,12 @@ CATCH TEST_F(SegmentSplitTest, PhysicalSplitMode) try { - SegmentTestOptions options; - options.db_settings.dt_segment_stable_pack_rows = 100; // Even if we explicitly set enable_logical_split, we will still do physical split in SplitMode::Physical. - options.db_settings.dt_enable_logical_split = true; - reloadWithOptions(options); + reloadWithOptions( + {.db_settings = { + .dt_segment_stable_pack_rows = 100, + .dt_enable_logical_split = true, + }}); ASSERT_TRUE(dm_context->enable_logical_split); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 1000); @@ -871,9 +752,7 @@ CATCH TEST_F(SegmentSplitTest, LogicalSplitModeDoesLogicalSplit) try { - SegmentTestOptions options; - options.db_settings.dt_segment_stable_pack_rows = 100; - reloadWithOptions(options); + reloadWithOptions({.db_settings = {.dt_segment_stable_pack_rows = 100}}); // Logical split will be performed if we use logical split mode, even when enable_logical_split is false. ASSERT_FALSE(dm_context->enable_logical_split); @@ -913,9 +792,7 @@ CATCH TEST_F(SegmentSplitTest, LogicalSplitModeOnePackInStable) try { - SegmentTestOptions options; - options.db_settings.dt_segment_stable_pack_rows = 100; - reloadWithOptions(options); + reloadWithOptions({.db_settings = {.dt_segment_stable_pack_rows = 100}}); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 50); flushSegmentCache(DELTA_MERGE_FIRST_SEGMENT_ID); @@ -933,9 +810,7 @@ CATCH TEST_F(SegmentSplitTest, LogicalSplitModeOnePackWithHoleInStable) try { - SegmentTestOptions options; - options.db_settings.dt_segment_stable_pack_rows = 100; - reloadWithOptions(options); + reloadWithOptions({.db_settings = {.dt_segment_stable_pack_rows = 100}}); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 10, /* at */ 0); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 10, /* at */ 90); @@ -1009,9 +884,7 @@ CATCH TEST_F(SegmentSplitAtTest, AutoModeEnableLogicalSplit) try { - SegmentTestOptions options; - options.db_settings.dt_enable_logical_split = true; - reloadWithOptions(options); + reloadWithOptions({.db_settings = {.dt_enable_logical_split = true}}); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 100, /* at */ 0); flushSegmentCache(DELTA_MERGE_FIRST_SEGMENT_ID); @@ -1048,9 +921,7 @@ CATCH TEST_F(SegmentSplitAtTest, PhysicalSplitMode) try { - SegmentTestOptions options; - options.db_settings.dt_enable_logical_split = true; - reloadWithOptions(options); + reloadWithOptions({.db_settings = {.dt_enable_logical_split = true}}); writeSegment(DELTA_MERGE_FIRST_SEGMENT_ID, 100, /* at */ 0); flushSegmentCache(DELTA_MERGE_FIRST_SEGMENT_ID); diff --git a/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.cpp b/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.cpp index 1e7c18af560..c5f9199f241 100644 --- a/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.cpp +++ b/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.cpp @@ -301,7 +301,34 @@ Block SegmentTestBasic::prepareWriteBlock(Int64 start_key, Int64 end_key, bool i is_deleted); } -std::vector SegmentTestBasic::prepareWriteBlocksInSegmentRange(PageId segment_id, UInt64 total_write_rows, std::optional write_start_key, bool is_deleted) +Block mergeBlocks(std::vector && blocks) +{ + auto accumulated_block = std::move(blocks[0]); + + for (size_t block_idx = 1; block_idx < blocks.size(); ++block_idx) + { + auto block = std::move(blocks[block_idx]); + + size_t columns = block.columns(); + size_t rows = block.rows(); + + for (size_t i = 0; i < columns; ++i) + { + MutableColumnPtr mutable_column = (*std::move(accumulated_block.getByPosition(i).column)).mutate(); + mutable_column->insertRangeFrom(*block.getByPosition(i).column, 0, rows); + accumulated_block.getByPosition(i).column = std::move(mutable_column); + } + } + + SortDescription sort; + sort.emplace_back(EXTRA_HANDLE_COLUMN_NAME, 1, 0); + sort.emplace_back(VERSION_COLUMN_NAME, 1, 0); + stableSortBlock(accumulated_block, sort); + + return accumulated_block; +} + +Block SegmentTestBasic::prepareWriteBlockInSegmentRange(PageId segment_id, UInt64 total_write_rows, std::optional write_start_key, bool is_deleted) { RUNTIME_CHECK(total_write_rows < std::numeric_limits::max()); @@ -364,7 +391,7 @@ std::vector SegmentTestBasic::prepareWriteBlocksInSegmentRange(PageId seg remaining_rows); } - return blocks; + return mergeBlocks(std::move(blocks)); } void SegmentTestBasic::writeSegment(PageId segment_id, UInt64 write_rows, std::optional start_at) @@ -380,11 +407,8 @@ void SegmentTestBasic::writeSegment(PageId segment_id, UInt64 write_rows, std::o auto [start_key, end_key] = getSegmentKeyRange(segment_id); LOG_DEBUG(logger, "write to segment, segment={} segment_rows={} start_key={} end_key={}", segment->info(), segment_row_num, start_key, end_key); - auto blocks = prepareWriteBlocksInSegmentRange(segment_id, write_rows, start_at, /* is_deleted */ false); - for (const auto & block : blocks) - { - segment->write(*dm_context, block, false); - } + auto block = prepareWriteBlockInSegmentRange(segment_id, write_rows, start_at, /* is_deleted */ false); + segment->write(*dm_context, block, false); EXPECT_EQ(getSegmentRowNumWithoutMVCC(segment_id), segment_row_num + write_rows); operation_statistics["write"]++; @@ -399,46 +423,35 @@ void SegmentTestBasic::ingestDTFileIntoSegment(PageId segment_id, UInt64 write_r RUNTIME_CHECK(segments.find(segment_id) != segments.end()); - auto ingest_data = [&](SegmentPtr segment, const Block & block) { + auto segment = segments[segment_id]; + size_t segment_row_num = getSegmentRowNumWithoutMVCC(segment_id); + auto [start_key, end_key] = getSegmentKeyRange(segment_id); + LOG_DEBUG(logger, "ingest to segment, segment={} segment_rows={} start_key={} end_key={}", segment->info(), segment_row_num, start_key, end_key); + + { + auto block = prepareWriteBlockInSegmentRange(segment_id, write_rows, start_at, /* is_deleted */ false); WriteBatches ingest_wbs(dm_context->storage_pool, dm_context->getWriteLimiter()); auto delegator = storage_path_pool->getStableDiskDelegator(); auto parent_path = delegator.choosePath(); auto file_id = storage_pool->newDataPageIdForDTFile(delegator, __PRETTY_FUNCTION__); auto input_stream = std::make_shared(block); DMFileBlockOutputStream::Flags flags; - auto dm_file = writeIntoNewDMFile( - *dm_context, - table_columns, - input_stream, - file_id, - parent_path, - flags); + auto dm_file = writeIntoNewDMFile(*dm_context, table_columns, input_stream, file_id, parent_path, flags); ingest_wbs.data.putExternal(file_id, /* tag */ 0); ingest_wbs.writeLogAndData(); delegator.addDTFile(file_id, dm_file->getBytesOnDisk(), parent_path); - { - WriteBatches wbs(dm_context->storage_pool, dm_context->getWriteLimiter()); - auto ref_id = storage_pool->newDataPageIdForDTFile(delegator, __PRETTY_FUNCTION__); - wbs.data.putRefPage(ref_id, dm_file->pageId()); - auto ref_file = DMFile::restore(dm_context->db_context.getFileProvider(), file_id, ref_id, parent_path, DMFile::ReadMetaMode::all()); - wbs.writeLogAndData(); - auto column_file = std::make_shared(*dm_context, ref_file, segment->getRowKeyRange()); - ColumnFiles column_files; - column_files.push_back(column_file); - ASSERT_TRUE(segment->ingestColumnFiles(*dm_context, segment->getRowKeyRange(), column_files, /* clear_data_in_range */ true)); - } - ingest_wbs.rollbackWrittenLogAndData(); - }; - auto segment = segments[segment_id]; - size_t segment_row_num = getSegmentRowNumWithoutMVCC(segment_id); - auto [start_key, end_key] = getSegmentKeyRange(segment_id); - LOG_DEBUG(logger, "ingest to segment, segment={} segment_rows={} start_key={} end_key={}", segment->info(), segment_row_num, start_key, end_key); + WriteBatches wbs(dm_context->storage_pool, dm_context->getWriteLimiter()); + auto ref_id = storage_pool->newDataPageIdForDTFile(delegator, __PRETTY_FUNCTION__); + wbs.data.putRefPage(ref_id, dm_file->pageId()); + auto ref_file = DMFile::restore(dm_context->db_context.getFileProvider(), file_id, ref_id, parent_path, DMFile::ReadMetaMode::all()); + wbs.writeLogAndData(); + auto column_file = std::make_shared(*dm_context, ref_file, segment->getRowKeyRange()); + ColumnFiles column_files; + column_files.push_back(column_file); + ASSERT_TRUE(segment->ingestColumnFiles(*dm_context, segment->getRowKeyRange(), column_files, /* clear_data_in_range */ true)); - auto blocks = prepareWriteBlocksInSegmentRange(segment_id, write_rows, start_at, /* is_deleted */ false); - for (const auto & block : blocks) - { - ingest_data(segment, block); + ingest_wbs.rollbackWrittenLogAndData(); } EXPECT_EQ(getSegmentRowNumWithoutMVCC(segment_id), segment_row_num + write_rows); @@ -458,11 +471,8 @@ void SegmentTestBasic::writeSegmentWithDeletedPack(PageId segment_id, UInt64 wri auto [start_key, end_key] = getSegmentKeyRange(segment_id); LOG_DEBUG(logger, "write deleted pack to segment, segment={} segment_rows={} start_key={} end_key={}", segment->info(), segment_row_num, start_key, end_key); - auto blocks = prepareWriteBlocksInSegmentRange(segment_id, write_rows, start_at, /* is_deleted */ true); - for (const auto & block : blocks) - { - segment->write(*dm_context, block, false); - } + auto block = prepareWriteBlockInSegmentRange(segment_id, write_rows, start_at, /* is_deleted */ true); + segment->write(*dm_context, block, false); EXPECT_EQ(getSegmentRowNumWithoutMVCC(segment_id), segment_row_num + write_rows); operation_statistics["writeDelete"]++; @@ -490,13 +500,7 @@ void SegmentTestBasic::replaceSegmentData(const std::vector & segments_i auto file_id = storage_pool->newDataPageIdForDTFile(delegator, __PRETTY_FUNCTION__); auto input_stream = std::make_shared(block); - auto dm_file = writeIntoNewDMFile( - *dm_context, - table_columns, - input_stream, - file_id, - parent_path, - {}); + auto dm_file = writeIntoNewDMFile(*dm_context, table_columns, input_stream, file_id, parent_path, {}); ingest_wbs.data.putExternal(file_id, /* tag */ 0); ingest_wbs.writeLogAndData(); @@ -592,6 +596,110 @@ void SegmentTestBasic::printFinishedOperations() const LOG_INFO(logger, "======= End Finished Operations Statistics ======="); } +class SegmentFrameworkTest : public SegmentTestBasic +{ +}; + +TEST_F(SegmentFrameworkTest, PrepareWriteBlock) +try +{ + reloadWithOptions({.is_common_handle = false}); + + auto s1_id = splitSegmentAt(DELTA_MERGE_FIRST_SEGMENT_ID, 10); + ASSERT_TRUE(s1_id.has_value()); + auto s2_id = splitSegmentAt(*s1_id, 20); + ASSERT_TRUE(s2_id.has_value()); + + // s1 has range [10, 20) + { + auto [begin, end] = getSegmentKeyRange(*s1_id); + ASSERT_EQ(10, begin); + ASSERT_EQ(20, end); + } + + { + // write_rows == segment_rows, start_key not specified + version = 0; + auto block = prepareWriteBlockInSegmentRange(*s1_id, 10); + ASSERT_COLUMN_EQ( + block.getByName(EXTRA_HANDLE_COLUMN_NAME), + createColumn({10, 11, 12, 13, 14, 15, 16, 17, 18, 19})); + ASSERT_COLUMN_EQ( + block.getByName(VERSION_COLUMN_NAME), + createColumn({1, 1, 1, 1, 1, 1, 1, 1, 1, 1})); + } + { + // write_rows > segment_rows, start_key not specified + version = 0; + auto block = prepareWriteBlockInSegmentRange(*s1_id, 13); + ASSERT_COLUMN_EQ( + block.getByName(EXTRA_HANDLE_COLUMN_NAME), + createColumn({10, 10, 11, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19})); + ASSERT_COLUMN_EQ( + block.getByName(VERSION_COLUMN_NAME), + createColumn({1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1})); + } + { + // start_key specified, end_key - start_key < write_rows + version = 0; + auto block = prepareWriteBlockInSegmentRange(*s1_id, 2, /* at */ 16); + ASSERT_COLUMN_EQ( + block.getByName(EXTRA_HANDLE_COLUMN_NAME), + createColumn({16, 17})); + ASSERT_COLUMN_EQ( + block.getByName(VERSION_COLUMN_NAME), + createColumn({1, 1})); + } + { + version = 0; + auto block = prepareWriteBlockInSegmentRange(*s1_id, 4, /* at */ 16); + ASSERT_COLUMN_EQ( + block.getByName(EXTRA_HANDLE_COLUMN_NAME), + createColumn({16, 17, 18, 19})); + ASSERT_COLUMN_EQ( + block.getByName(VERSION_COLUMN_NAME), + createColumn({1, 1, 1, 1})); + } + { + version = 0; + auto block = prepareWriteBlockInSegmentRange(*s1_id, 5, /* at */ 16); + ASSERT_COLUMN_EQ( + block.getByName(EXTRA_HANDLE_COLUMN_NAME), + createColumn({16, 16, 17, 18, 19})); + ASSERT_COLUMN_EQ( + block.getByName(VERSION_COLUMN_NAME), + createColumn({1, 2, 1, 1, 1})); + } + { + version = 0; + auto block = prepareWriteBlockInSegmentRange(*s1_id, 10, /* at */ 16); + ASSERT_COLUMN_EQ( + block.getByName(EXTRA_HANDLE_COLUMN_NAME), + createColumn({16, 16, 16, 17, 17, 17, 18, 18, 19, 19})); + ASSERT_COLUMN_EQ( + block.getByName(VERSION_COLUMN_NAME), + createColumn({1, 2, 3, 1, 2, 3, 1, 2, 1, 2})); + } + { + // write rows < segment rows, start key not specified, should choose a random start. + auto block = prepareWriteBlockInSegmentRange(*s1_id, 3); + ASSERT_EQ(3, block.rows()); + } + { + // Let's check whether the generated handles will be starting from 12, for at least once. + auto start_from_12 = 0; + for (size_t i = 0; i < 100; i++) + { + auto block = prepareWriteBlockInSegmentRange(*s1_id, 3); + if (block.getByName(EXTRA_HANDLE_COLUMN_NAME).column->getInt(0) == 12) + start_from_12++; + } + ASSERT_TRUE(start_from_12 > 0); // We should hit at least 1 times in 100 iters. + ASSERT_TRUE(start_from_12 < 50); // We should not hit 50 times in 100 iters :) + } +} +CATCH + } // namespace tests } // namespace DM } // namespace DB diff --git a/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.h b/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.h index da68b4e5adc..bc3e1da5cde 100644 --- a/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.h +++ b/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_basic.h @@ -74,7 +74,7 @@ class SegmentTestBasic : public DB::base::TiFlashStorageTestBasic void replaceSegmentData(const std::vector & segments_id, const Block & block); Block prepareWriteBlock(Int64 start_key, Int64 end_key, bool is_deleted = false); - std::vector prepareWriteBlocksInSegmentRange(PageId segment_id, UInt64 total_write_rows, std::optional write_start_key = std::nullopt, bool is_deleted = false); + Block prepareWriteBlockInSegmentRange(PageId segment_id, UInt64 total_write_rows, std::optional write_start_key = std::nullopt, bool is_deleted = false); size_t getSegmentRowNumWithoutMVCC(PageId segment_id); size_t getSegmentRowNum(PageId segment_id); diff --git a/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_randomized.cpp b/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_randomized.cpp index 16ef0ee7287..eb2126f107b 100644 --- a/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_randomized.cpp +++ b/dbms/src/Storages/DeltaMerge/tests/gtest_segment_test_randomized.cpp @@ -317,9 +317,7 @@ class SegmentRandomizedTest : public SegmentTestBasic TEST_F(SegmentRandomizedTest, FastCommonHandle) try { - SegmentTestOptions options; - options.is_common_handle = true; - reloadWithOptions(options); + reloadWithOptions({.is_common_handle = true}); run(/* n */ 500, /* min key */ -50000, /* max key */ 50000); } CATCH @@ -328,9 +326,7 @@ CATCH TEST_F(SegmentRandomizedTest, FastIntHandle) try { - SegmentTestOptions options; - options.is_common_handle = false; - reloadWithOptions(options); + reloadWithOptions({.is_common_handle = false}); run(/* n */ 500, /* min key */ -50000, /* max key */ 50000); } CATCH @@ -340,9 +336,7 @@ CATCH TEST_F(SegmentRandomizedTest, DISABLED_ForCI) try { - SegmentTestOptions options; - options.is_common_handle = true; - reloadWithOptions(options); + reloadWithOptions({.is_common_handle = true}); run(50000, /* min key */ -50000, /* max key */ 50000); } CATCH diff --git a/dbms/src/Storages/DeltaMerge/tests/gtest_sst_files_stream.cpp b/dbms/src/Storages/DeltaMerge/tests/gtest_sst_files_stream.cpp index 94949bdcf01..25c2a55dd59 100644 --- a/dbms/src/Storages/DeltaMerge/tests/gtest_sst_files_stream.cpp +++ b/dbms/src/Storages/DeltaMerge/tests/gtest_sst_files_stream.cpp @@ -111,7 +111,7 @@ try ASSERT_EQ(blocks.size(), 1); auto block = blocks[0]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4})); } { auto blocks = prepareBlocks(1, 14, 3); @@ -119,27 +119,27 @@ try { auto block = blocks[0]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({1, 2, 3}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({1, 2, 3})); } { auto block = blocks[1]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({4, 5, 6}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({4, 5, 6})); } { auto block = blocks[2]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({7, 8, 9}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({7, 8, 9})); } { auto block = blocks[3]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({10, 11, 12}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({10, 11, 12})); } { auto block = blocks[4]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({13}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({13})); } } { @@ -148,17 +148,17 @@ try { auto block = blocks[0]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({1}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({1})); } { auto block = blocks[1]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({2}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({2})); } { auto block = blocks[2]; auto col = block.getByName(MutableSupport::tidb_pk_column_name); - ASSERT_COLUMN_EQ(col, createColumn({3}, "col")); + ASSERT_COLUMN_EQ(col, createColumn({3})); } } } @@ -430,4 +430,4 @@ CATCH } // namespace tests } // namespace DM -} // namespace DB \ No newline at end of file +} // namespace DB