From c9d2d3bdf5fbb64ccf485ae32a43ac2d0b28015a Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 28 Nov 2023 17:11:45 +0000 Subject: [PATCH] fix builder trim empty roots when rewriting macro blocks --- .../storage/blocksstable/test_index_tree.cpp | 15 +++++++++++++++ .../index_block/ob_index_block_builder.cpp | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/mittest/mtlenv/storage/blocksstable/test_index_tree.cpp b/mittest/mtlenv/storage/blocksstable/test_index_tree.cpp index 00a345f5d..8db60687f 100644 --- a/mittest/mtlenv/storage/blocksstable/test_index_tree.cpp +++ b/mittest/mtlenv/storage/blocksstable/test_index_tree.cpp @@ -828,7 +828,22 @@ TEST_F(TestIndexTree, test_empty_index_tree) ASSERT_EQ(OB_SUCCESS, data_writer.open(data_desc.get_desc(), data_seq)); // do not insert any data ASSERT_EQ(OB_SUCCESS, data_writer.close()); + ASSERT_EQ(1, sstable_builder.roots_.count()); ObSSTableMergeRes res; + ret = sstable_builder.close(res); + ASSERT_EQ(0, sstable_builder.roots_.count()); + ASSERT_EQ(OB_SUCCESS, ret); + ASSERT_TRUE(res.root_desc_.is_empty()); + + // test rebuild macro blocks + ASSERT_EQ(OB_SUCCESS, data_writer.open(data_desc.get_desc(), data_seq)); + // do not insert any data + ASSERT_EQ(OB_SUCCESS, data_writer.close()); + ASSERT_EQ(1, sstable_builder.roots_.count()); + ObSSTableIndexBuilder::ObMacroMetaIter macro_iter; + sstable_builder.init_meta_iter(macro_iter); + ASSERT_EQ(0, sstable_builder.roots_.count()); + ret = sstable_builder.close(res); ASSERT_EQ(OB_SUCCESS, ret); ASSERT_TRUE(res.root_desc_.is_empty()); diff --git a/src/storage/blocksstable/index_block/ob_index_block_builder.cpp b/src/storage/blocksstable/index_block/ob_index_block_builder.cpp index 0f4a7746e..73517cda1 100644 --- a/src/storage/blocksstable/index_block/ob_index_block_builder.cpp +++ b/src/storage/blocksstable/index_block/ob_index_block_builder.cpp @@ -689,7 +689,10 @@ int ObSSTableIndexBuilder::init_meta_iter(ObMacroMetaIter &iter) if (IS_NOT_INIT) { ret = OB_NOT_INIT; STORAGE_LOG(WARN, "invalid sstable builder", K(ret), K_(is_inited)); - } else if (FALSE_IT(sort_roots())) { + } else if (OB_FAIL(trim_empty_roots())) { + STORAGE_LOG(WARN, "fail to trim empty roots", K(ret)); + } else if (OB_FAIL(sort_roots())) { + STORAGE_LOG(WARN, "fail to sort roots", K(ret)); } else if (OB_FAIL(iter.init(roots_, index_store_desc_.get_desc().is_cg()))) { STORAGE_LOG(WARN, "fail to init iter", K(ret)); }