@@ -66,10 +66,14 @@ impl TierCompactionPicker {
66
66
self . config . max_compaction_bytes ,
67
67
self . config . sub_level_max_compaction_bytes ,
68
68
) ;
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
69
73
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 ,
73
77
) ;
74
78
let non_overlap_sub_level_picker = NonOverlapSubLevelPicker :: new (
75
79
0 ,
@@ -89,6 +93,8 @@ impl TierCompactionPicker {
89
93
90
94
let mut skip_by_write_amp = false ;
91
95
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
92
98
for ( plan_index, ( compaction_bytes, all_file_count, level_select_sst) ) in
93
99
l0_select_tables_vec. into_iter ( ) . enumerate ( )
94
100
{
@@ -112,15 +118,14 @@ impl TierCompactionPicker {
112
118
113
119
// This limitation would keep our write-amplification no more than
114
120
// 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.
117
123
let is_write_amp_large =
118
124
max_level_size * self . config . level0_sub_level_compact_level_count as u64 / 2
119
125
>= compaction_bytes;
120
126
121
127
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
124
129
&& all_file_count < self . config . level0_max_compact_file_number as usize
125
130
{
126
131
skip_by_write_amp = true ;
@@ -192,12 +197,6 @@ impl TierCompactionPicker {
192
197
continue ;
193
198
}
194
199
195
- if select_tables. iter ( ) . map ( |sst| sst. file_size ) . sum :: < u64 > ( )
196
- < self . config . target_file_size_base
197
- {
198
- continue ;
199
- }
200
-
201
200
// support trivial move cross multi sub_levels
202
201
let mut overlap = self . overlap_strategy . create_overlap_info ( ) ;
203
202
for sst in & select_tables {
@@ -363,7 +362,7 @@ impl TierCompactionPicker {
363
362
let max_compaction_bytes = std:: cmp:: min (
364
363
self . config . max_compaction_bytes ,
365
364
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 ,
367
366
) ;
368
367
369
368
let mut compaction_bytes = level. total_file_size ;
@@ -407,7 +406,9 @@ impl TierCompactionPicker {
407
406
408
407
// If waiting_enough_files is not satisfied, we will raise the priority of the number of
409
408
// 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
411
412
&& waiting_enough_files
412
413
{
413
414
stats. skip_by_count_limit += 1 ;
@@ -502,6 +503,7 @@ pub mod tests {
502
503
. level0_tier_compact_file_number ( 2 )
503
504
. target_file_size_base ( 30 )
504
505
. level0_sub_level_compact_level_count ( 2 )
506
+ . level0_overlapping_sub_level_compact_level_count ( 4 )
505
507
. build ( ) ,
506
508
) ;
507
509
let mut picker =
@@ -529,6 +531,8 @@ pub mod tests {
529
531
generate_table( 2 , 1 , 150 , 250 , 1 ) ,
530
532
] ,
531
533
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 ) ] ,
532
536
] ) ;
533
537
let mut levels = Levels {
534
538
l0 : Some ( l0) ,
@@ -577,6 +581,10 @@ pub mod tests {
577
581
generate_table( 4 , 1 , 100 , 200 , 1 ) ,
578
582
generate_table( 5 , 1 , 50 , 150 , 1 ) ,
579
583
] ,
584
+ vec![
585
+ generate_table( 6 , 1 , 100 , 200 , 1 ) ,
586
+ generate_table( 7 , 1 , 50 , 150 , 1 ) ,
587
+ ] ,
580
588
] ) ;
581
589
let levels = Levels {
582
590
l0 : Some ( l0) ,
@@ -588,6 +596,7 @@ pub mod tests {
588
596
CompactionConfigBuilder :: new ( )
589
597
. level0_tier_compact_file_number ( 2 )
590
598
. level0_sub_level_compact_level_count ( 2 )
599
+ . level0_overlapping_sub_level_compact_level_count ( 4 )
591
600
. build ( ) ,
592
601
) ;
593
602
let mut picker =
@@ -596,13 +605,13 @@ pub mod tests {
596
605
let ret = picker
597
606
. pick_compaction ( & levels, & levels_handler, & mut local_stats)
598
607
. unwrap ( ) ;
599
- assert_eq ! ( ret. input_levels. len( ) , 3 ) ;
608
+ assert_eq ! ( ret. input_levels. len( ) , 4 ) ;
600
609
assert_eq ! (
601
610
ret. input_levels
602
611
. iter( )
603
612
. map( |i| i. table_infos. len( ) )
604
613
. sum:: <usize >( ) ,
605
- 5
614
+ 7
606
615
) ;
607
616
608
617
let empty_level = Levels {
@@ -624,7 +633,10 @@ pub mod tests {
624
633
generate_table( 1 , 1 , 100 , 200 , 1 ) ,
625
634
generate_table( 2 , 1 , 250 , 300 , 1 ) ,
626
635
] ,
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
+ ] ,
628
640
vec![
629
641
generate_table( 4 , 1 , 50 , 99 , 1 ) ,
630
642
generate_table( 5 , 1 , 100 , 200 , 1 ) ,
@@ -640,6 +652,7 @@ pub mod tests {
640
652
let config = Arc :: new (
641
653
CompactionConfigBuilder :: new ( )
642
654
. level0_sub_level_compact_level_count ( 1 )
655
+ . level0_overlapping_sub_level_compact_level_count ( 4 )
643
656
. build ( ) ,
644
657
) ;
645
658
let mut picker =
@@ -666,7 +679,10 @@ pub mod tests {
666
679
generate_table( 1 , 1 , 100 , 200 , 1 ) ,
667
680
generate_table( 2 , 1 , 300 , 400 , 1 ) ,
668
681
] ,
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
+ ] ,
670
686
vec![
671
687
generate_table( 4 , 1 , 100 , 200 , 1 ) ,
672
688
generate_table( 5 , 1 , 300 , 400 , 1 ) ,
@@ -703,7 +719,7 @@ pub mod tests {
703
719
assert_eq ! ( 3 , ret. input_levels[ 1 ] . table_infos[ 0 ] . get_sst_id( ) ) ;
704
720
assert_eq ! ( 1 , ret. input_levels[ 2 ] . table_infos[ 0 ] . get_sst_id( ) ) ;
705
721
706
- // will pick sst [2, 5]
722
+ // will pick sst [2, 6, 5]
707
723
let ret2 = picker
708
724
. pick_compaction ( & levels, & levels_handler, & mut local_stats)
709
725
. unwrap ( ) ;
@@ -713,11 +729,12 @@ pub mod tests {
713
729
. iter( )
714
730
. map( |i| i. table_infos. len( ) )
715
731
. sum:: <usize >( ) ,
716
- 2
732
+ 3
717
733
) ;
718
734
719
735
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( ) ) ;
721
738
}
722
739
723
740
{
@@ -798,6 +815,8 @@ pub mod tests {
798
815
] ,
799
816
vec![ generate_table( 6 , 1 , 1 , 100 , 1 ) ] ,
800
817
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 ) ] ,
801
820
] ) ;
802
821
803
822
let mut levels = Levels {
@@ -810,9 +829,10 @@ pub mod tests {
810
829
let config = Arc :: new (
811
830
CompactionConfigBuilder :: new ( )
812
831
. level0_tier_compact_file_number ( 2 )
813
- . sub_level_max_compaction_bytes ( 100 )
832
+ . sub_level_max_compaction_bytes ( 500 )
814
833
. max_compaction_bytes ( 500000 )
815
834
. level0_sub_level_compact_level_count ( 2 )
835
+ . level0_overlapping_sub_level_compact_level_count ( 4 )
816
836
. build ( ) ,
817
837
) ;
818
838
@@ -824,7 +844,7 @@ pub mod tests {
824
844
let ret = picker
825
845
. pick_compaction ( & levels, & levels_handler, & mut local_stats)
826
846
. unwrap ( ) ;
827
- assert_eq ! ( ret. input_levels. len( ) , 2 ) ;
847
+ assert_eq ! ( ret. input_levels. len( ) , 4 ) ;
828
848
assert_eq ! ( ret. target_level, 0 ) ;
829
849
assert_eq ! ( ret. target_sub_level_id, 1 ) ;
830
850
}
0 commit comments