Skip to content

Commit ad11817

Browse files
meegoowanpengfei-git
authored andcommitted
[Enhancement] Skip duplicate key large base rowset compaction (#23369)
Signed-off-by: meegoo <[email protected]> (cherry picked from commit 840265d)
1 parent cf58d3a commit ad11817

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

be/src/storage/size_tiered_compaction_policy.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,17 @@ Status SizeTieredCompactionPolicy::_pick_rowsets_to_size_tiered_compact(bool for
177177
int64_t level_size = -1;
178178
int64_t total_size = 0;
179179
int64_t prev_end_version = -1;
180+
bool skip_dup_large_base_rowset = true;
180181
for (auto rowset : candidate_rowsets) {
182+
// when duplicate key's base rowset larger than 0.8 * max_segment_file_size, we don't need compact it
183+
if (keys_type == KeysType::DUP_KEYS && skip_dup_large_base_rowset &&
184+
!rowset->rowset_meta()->is_segments_overlapping() &&
185+
rowset->data_disk_size() > config::max_segment_file_size * 0.8) {
186+
continue;
187+
} else {
188+
skip_dup_large_base_rowset = false;
189+
}
190+
181191
int64_t rowset_size = rowset->data_disk_size() > 0 ? rowset->data_disk_size() : 1;
182192
if (level_size == -1) {
183193
level_size = rowset_size < _max_level_size ? rowset_size : _max_level_size;

be/test/storage/size_tiered_compaction_policy_test.cpp

+55
Original file line numberDiff line numberDiff line change
@@ -1379,4 +1379,59 @@ TEST_F(SizeTieredCompactionPolicyTest, test_delete_limit) {
13791379
}
13801380
}
13811381

1382+
TEST_F(SizeTieredCompactionPolicyTest, test_large_dup_base_rowset) {
1383+
LOG(INFO) << "test_large_dup_base_rowset";
1384+
create_tablet_schema(DUP_KEYS);
1385+
1386+
TabletMetaSharedPtr tablet_meta = std::make_shared<TabletMeta>();
1387+
create_tablet_meta(tablet_meta.get());
1388+
1389+
write_new_version(tablet_meta, 2);
1390+
write_new_version(tablet_meta, 1);
1391+
write_new_version(tablet_meta, 1);
1392+
write_new_version(tablet_meta, 1);
1393+
1394+
TabletSharedPtr tablet =
1395+
Tablet::create_tablet_from_meta(tablet_meta, starrocks::StorageEngine::instance()->get_stores()[0]);
1396+
tablet->init();
1397+
init_compaction_context(tablet);
1398+
1399+
ASSERT_EQ(4, tablet->version_count());
1400+
1401+
config::max_segment_file_size = 1024 * 128;
1402+
DeferOp defer([&]() {
1403+
config::max_segment_file_size = 1073741824;
1404+
});
1405+
1406+
{
1407+
auto res = compact(tablet);
1408+
ASSERT_TRUE(res.ok());
1409+
1410+
ASSERT_EQ(2, tablet->version_count());
1411+
std::vector<Version> versions;
1412+
tablet->list_versions(&versions);
1413+
ASSERT_EQ(2, versions.size());
1414+
ASSERT_EQ(0, versions[0].first);
1415+
ASSERT_EQ(0, versions[0].second);
1416+
ASSERT_EQ(1, versions[1].first);
1417+
ASSERT_EQ(3, versions[1].second);
1418+
}
1419+
1420+
{
1421+
auto res = compact(tablet);
1422+
ASSERT_FALSE(res.ok());
1423+
1424+
ASSERT_EQ(2, tablet->version_count());
1425+
}
1426+
1427+
config::max_segment_file_size = 1073741824;
1428+
1429+
{
1430+
auto res = compact(tablet);
1431+
ASSERT_TRUE(res.ok());
1432+
1433+
ASSERT_EQ(1, tablet->version_count());
1434+
}
1435+
}
1436+
13821437
} // namespace starrocks

0 commit comments

Comments
 (0)