Skip to content

Commit 3cff0eb

Browse files
authored
chore(storage): Adjust the tier_compaction limit to reduce the impact on ci (#9534)
1 parent 6dfb72a commit 3cff0eb

8 files changed

+61
-26
lines changed

proto/hummock.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ message RiseCtlUpdateCompactionConfigRequest {
546546
uint32 max_sub_compaction = 9;
547547
uint64 level0_stop_write_threshold_sub_level_number = 10;
548548
uint32 level0_sub_level_compact_level_count = 11;
549+
uint32 level0_overlapping_sub_level_compact_level_count = 12;
549550
}
550551
}
551552
repeated uint64 compaction_group_ids = 1;
@@ -634,6 +635,9 @@ message CompactionConfig {
634635
uint64 level0_stop_write_threshold_sub_level_number = 15;
635636
uint64 level0_max_compact_file_number = 16;
636637
uint32 level0_sub_level_compact_level_count = 17;
638+
639+
// for tier compaction pick overlapping level
640+
uint32 level0_overlapping_sub_level_compact_level_count = 18;
637641
}
638642

639643
message TableStats {

src/meta/src/hummock/compaction/compaction_config.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const DEFAULT_MAX_SPACE_RECLAIM_BYTES: u64 = 512 * 1024 * 1024; // 512MB;
3030
const DEFAULT_LEVEL0_STOP_WRITE_THRESHOLD_SUB_LEVEL_NUMBER: u64 = 1000;
3131
const DEFAULT_MAX_COMPACTION_FILE_COUNT: u64 = 96;
3232
const DEFAULT_MIN_SUB_LEVEL_COMPACT_LEVEL_COUNT: u32 = 3;
33+
const DEFAULT_MIN_OVERLAPPING_SUB_LEVEL_COMPACT_LEVEL_COUNT: u32 = 6;
3334

3435
pub struct CompactionConfigBuilder {
3536
config: CompactionConfig,
@@ -73,6 +74,8 @@ impl CompactionConfigBuilder {
7374
// max_bytes_for_level_base
7475
level0_max_compact_file_number: DEFAULT_MAX_COMPACTION_FILE_COUNT,
7576
level0_sub_level_compact_level_count: DEFAULT_MIN_SUB_LEVEL_COMPACT_LEVEL_COUNT,
77+
level0_overlapping_sub_level_compact_level_count:
78+
DEFAULT_MIN_OVERLAPPING_SUB_LEVEL_COMPACT_LEVEL_COUNT,
7679
},
7780
}
7881
}
@@ -137,4 +140,5 @@ builder_field! {
137140
level0_stop_write_threshold_sub_level_number: u64,
138141
level0_max_compact_file_number: u64,
139142
level0_sub_level_compact_level_count: u32,
143+
level0_overlapping_sub_level_compact_level_count: u32,
140144
}

src/meta/src/hummock/compaction/picker/base_level_compaction_picker.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,10 @@ impl LevelCompactionPicker {
115115
stats: &mut LocalPickerStatistic,
116116
) -> Option<CompactionInput> {
117117
let overlap_strategy = create_overlap_strategy(self.config.compaction_mode());
118+
// FIXME(li0k): Just workaround, need to use more reasonable way to limit task size
118119
let max_depth = std::cmp::max(
119-
(self.config.max_compaction_bytes / self.config.sub_level_max_compaction_bytes)
120-
as usize,
120+
(self.config.max_compaction_bytes as f64
121+
/ self.config.sub_level_max_compaction_bytes as f64) as usize,
121122
self.config.level0_sub_level_compact_level_count as usize + 1,
122123
);
123124

src/meta/src/hummock/compaction/picker/tier_compaction_picker.rs

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,14 @@ impl TierCompactionPicker {
6666
self.config.max_compaction_bytes,
6767
self.config.sub_level_max_compaction_bytes,
6868
);
69+
70+
let tier_sub_level_compact_level_count =
71+
self.config.level0_sub_level_compact_level_count as usize;
72+
// FIXME(li0k): Just workaround, need to use more reasonable way to limit task size
6973
let max_depth = std::cmp::max(
70-
(self.config.max_compaction_bytes / self.config.sub_level_max_compaction_bytes)
71-
as usize,
72-
self.config.level0_sub_level_compact_level_count as usize + 1,
74+
(self.config.max_compaction_bytes as f64
75+
/ self.config.sub_level_max_compaction_bytes as f64) as usize,
76+
tier_sub_level_compact_level_count + 1,
7377
);
7478
let non_overlap_sub_level_picker = NonOverlapSubLevelPicker::new(
7579
0,
@@ -89,6 +93,8 @@ impl TierCompactionPicker {
8993

9094
let mut skip_by_write_amp = false;
9195
let mut level_select_tables: Vec<Vec<SstableInfo>> = vec![];
96+
// Limit the number of selection levels for the non-overlapping
97+
// sub_level at least level0_sub_level_compact_level_count
9298
for (plan_index, (compaction_bytes, all_file_count, level_select_sst)) in
9399
l0_select_tables_vec.into_iter().enumerate()
94100
{
@@ -112,15 +118,14 @@ impl TierCompactionPicker {
112118

113119
// This limitation would keep our write-amplification no more than
114120
// ln(max_compaction_bytes/flush_level_bytes) /
115-
// ln(self.config.level0_tier_compact_file_number/2) Here we only use half
116-
// of level0_tier_compact_file_number just for convenient.
121+
// ln(self.config.level0_sub_level_compact_level_count/2) Here we only use half
122+
// of level0_sub_level_compact_level_count just for convenient.
117123
let is_write_amp_large =
118124
max_level_size * self.config.level0_sub_level_compact_level_count as u64 / 2
119125
>= compaction_bytes;
120126

121127
if is_write_amp_large
122-
&& level_select_sst.len()
123-
< self.config.level0_sub_level_compact_level_count as usize
128+
&& level_select_sst.len() < tier_sub_level_compact_level_count
124129
&& all_file_count < self.config.level0_max_compact_file_number as usize
125130
{
126131
skip_by_write_amp = true;
@@ -192,12 +197,6 @@ impl TierCompactionPicker {
192197
continue;
193198
}
194199

195-
if select_tables.iter().map(|sst| sst.file_size).sum::<u64>()
196-
< self.config.target_file_size_base
197-
{
198-
continue;
199-
}
200-
201200
// support trivial move cross multi sub_levels
202201
let mut overlap = self.overlap_strategy.create_overlap_info();
203202
for sst in &select_tables {
@@ -363,7 +362,7 @@ impl TierCompactionPicker {
363362
let max_compaction_bytes = std::cmp::min(
364363
self.config.max_compaction_bytes,
365364
self.config.sub_level_max_compaction_bytes
366-
* self.config.level0_sub_level_compact_level_count as u64,
365+
* self.config.level0_overlapping_sub_level_compact_level_count as u64,
367366
);
368367

369368
let mut compaction_bytes = level.total_file_size;
@@ -407,7 +406,9 @@ impl TierCompactionPicker {
407406

408407
// If waiting_enough_files is not satisfied, we will raise the priority of the number of
409408
// levels to ensure that we can merge as many sub_levels as possible
410-
if select_level_inputs.len() < self.config.level0_sub_level_compact_level_count as usize
409+
let tier_sub_level_compact_level_count =
410+
self.config.level0_overlapping_sub_level_compact_level_count as usize;
411+
if select_level_inputs.len() < tier_sub_level_compact_level_count
411412
&& waiting_enough_files
412413
{
413414
stats.skip_by_count_limit += 1;
@@ -502,6 +503,7 @@ pub mod tests {
502503
.level0_tier_compact_file_number(2)
503504
.target_file_size_base(30)
504505
.level0_sub_level_compact_level_count(2)
506+
.level0_overlapping_sub_level_compact_level_count(4)
505507
.build(),
506508
);
507509
let mut picker =
@@ -529,6 +531,8 @@ pub mod tests {
529531
generate_table(2, 1, 150, 250, 1),
530532
],
531533
vec![generate_table(3, 1, 10, 90, 1)],
534+
vec![generate_table(4, 1, 10, 90, 1)],
535+
vec![generate_table(5, 1, 10, 90, 1)],
532536
]);
533537
let mut levels = Levels {
534538
l0: Some(l0),
@@ -577,6 +581,10 @@ pub mod tests {
577581
generate_table(4, 1, 100, 200, 1),
578582
generate_table(5, 1, 50, 150, 1),
579583
],
584+
vec![
585+
generate_table(6, 1, 100, 200, 1),
586+
generate_table(7, 1, 50, 150, 1),
587+
],
580588
]);
581589
let levels = Levels {
582590
l0: Some(l0),
@@ -588,6 +596,7 @@ pub mod tests {
588596
CompactionConfigBuilder::new()
589597
.level0_tier_compact_file_number(2)
590598
.level0_sub_level_compact_level_count(2)
599+
.level0_overlapping_sub_level_compact_level_count(4)
591600
.build(),
592601
);
593602
let mut picker =
@@ -596,13 +605,13 @@ pub mod tests {
596605
let ret = picker
597606
.pick_compaction(&levels, &levels_handler, &mut local_stats)
598607
.unwrap();
599-
assert_eq!(ret.input_levels.len(), 3);
608+
assert_eq!(ret.input_levels.len(), 4);
600609
assert_eq!(
601610
ret.input_levels
602611
.iter()
603612
.map(|i| i.table_infos.len())
604613
.sum::<usize>(),
605-
5
614+
7
606615
);
607616

608617
let empty_level = Levels {
@@ -624,7 +633,10 @@ pub mod tests {
624633
generate_table(1, 1, 100, 200, 1),
625634
generate_table(2, 1, 250, 300, 1),
626635
],
627-
vec![generate_table(3, 1, 10, 90, 1)],
636+
vec![
637+
generate_table(3, 1, 10, 90, 1),
638+
generate_table(6, 1, 100, 110, 1),
639+
],
628640
vec![
629641
generate_table(4, 1, 50, 99, 1),
630642
generate_table(5, 1, 100, 200, 1),
@@ -640,6 +652,7 @@ pub mod tests {
640652
let config = Arc::new(
641653
CompactionConfigBuilder::new()
642654
.level0_sub_level_compact_level_count(1)
655+
.level0_overlapping_sub_level_compact_level_count(4)
643656
.build(),
644657
);
645658
let mut picker =
@@ -666,7 +679,10 @@ pub mod tests {
666679
generate_table(1, 1, 100, 200, 1),
667680
generate_table(2, 1, 300, 400, 1),
668681
],
669-
vec![generate_table(3, 1, 100, 200, 1)],
682+
vec![
683+
generate_table(3, 1, 100, 200, 1),
684+
generate_table(6, 1, 300, 500, 1),
685+
],
670686
vec![
671687
generate_table(4, 1, 100, 200, 1),
672688
generate_table(5, 1, 300, 400, 1),
@@ -703,7 +719,7 @@ pub mod tests {
703719
assert_eq!(3, ret.input_levels[1].table_infos[0].get_sst_id());
704720
assert_eq!(1, ret.input_levels[2].table_infos[0].get_sst_id());
705721

706-
// will pick sst [2, 5]
722+
// will pick sst [2, 6, 5]
707723
let ret2 = picker
708724
.pick_compaction(&levels, &levels_handler, &mut local_stats)
709725
.unwrap();
@@ -713,11 +729,12 @@ pub mod tests {
713729
.iter()
714730
.map(|i| i.table_infos.len())
715731
.sum::<usize>(),
716-
2
732+
3
717733
);
718734

719735
assert_eq!(5, ret2.input_levels[0].table_infos[0].get_sst_id());
720-
assert_eq!(2, ret2.input_levels[1].table_infos[0].get_sst_id());
736+
assert_eq!(6, ret2.input_levels[1].table_infos[0].get_sst_id());
737+
assert_eq!(2, ret2.input_levels[2].table_infos[0].get_sst_id());
721738
}
722739

723740
{
@@ -798,6 +815,8 @@ pub mod tests {
798815
],
799816
vec![generate_table(6, 1, 1, 100, 1)],
800817
vec![generate_table(7, 1, 1, 100, 1)],
818+
vec![generate_table(8, 1, 1, 100, 1)],
819+
vec![generate_table(9, 1, 1, 100, 1)],
801820
]);
802821

803822
let mut levels = Levels {
@@ -810,9 +829,10 @@ pub mod tests {
810829
let config = Arc::new(
811830
CompactionConfigBuilder::new()
812831
.level0_tier_compact_file_number(2)
813-
.sub_level_max_compaction_bytes(100)
832+
.sub_level_max_compaction_bytes(500)
814833
.max_compaction_bytes(500000)
815834
.level0_sub_level_compact_level_count(2)
835+
.level0_overlapping_sub_level_compact_level_count(4)
816836
.build(),
817837
);
818838

@@ -824,7 +844,7 @@ pub mod tests {
824844
let ret = picker
825845
.pick_compaction(&levels, &levels_handler, &mut local_stats)
826846
.unwrap();
827-
assert_eq!(ret.input_levels.len(), 2);
847+
assert_eq!(ret.input_levels.len(), 4);
828848
assert_eq!(ret.target_level, 0);
829849
assert_eq!(ret.target_sub_level_id, 1);
830850
}

src/meta/src/hummock/compaction_schedule_policy.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ mod tests {
562562
.level0_tier_compact_file_number(1)
563563
.max_bytes_for_level_base(1)
564564
.level0_sub_level_compact_level_count(1)
565+
.level0_overlapping_sub_level_compact_level_count(1)
565566
.build();
566567
let (_, hummock_manager, _, worker_node) = setup_compute_env_with_config(80, config).await;
567568
let context_id = worker_node.id;

src/meta/src/hummock/compaction_scheduler.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ mod tests {
669669
);
670670

671671
let _sst_infos = add_ssts(1, hummock_manager.as_ref(), context_id).await;
672+
672673
let compactor = hummock_manager.get_idle_compactor().await.unwrap();
673674
// Cannot assign because of invalid compactor
674675
assert_matches!(

src/meta/src/hummock/manager/compaction_group_manager.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,9 @@ fn update_compaction_config(target: &mut CompactionConfig, items: &[MutableConfi
810810
MutableConfig::Level0SubLevelCompactLevelCount(c) => {
811811
target.level0_sub_level_compact_level_count = *c;
812812
}
813+
MutableConfig::Level0OverlappingSubLevelCompactLevelCount(c) => {
814+
target.level0_overlapping_sub_level_compact_level_count = *c;
815+
}
813816
}
814817
}
815818
}

src/meta/src/hummock/test_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ pub async fn setup_compute_env(
313313
.level0_tier_compact_file_number(1)
314314
.level0_max_compact_file_number(130)
315315
.level0_sub_level_compact_level_count(1)
316+
.level0_overlapping_sub_level_compact_level_count(1)
316317
.build();
317318
setup_compute_env_with_config(port, config).await
318319
}

0 commit comments

Comments
 (0)