@@ -37,19 +37,35 @@ impl SimpleLeveledCompactionController {
37
37
& self ,
38
38
snapshot : & LsmStorageState ,
39
39
) -> Option < SimpleLeveledCompactionTask > {
40
+ if self . options . max_levels == 0 {
41
+ return None ;
42
+ }
43
+
40
44
let mut level_sizes = Vec :: new ( ) ;
41
45
level_sizes. push ( snapshot. l0_sstables . len ( ) ) ;
42
46
for ( _, files) in & snapshot. levels {
43
47
level_sizes. push ( files. len ( ) ) ;
44
48
}
45
49
46
- for i in 0 ..self . options . max_levels {
47
- if i == 0
48
- && snapshot. l0_sstables . len ( ) < self . options . level0_file_num_compaction_trigger
49
- {
50
- continue ;
50
+ // check level0_file_num_compaction_trigger for compaction of L0 and L1
51
+ {
52
+ if snapshot. l0_sstables . len ( ) >= self . options . level0_file_num_compaction_trigger {
53
+ println ! (
54
+ "compaction triggered at level 0 and 1 because L0 has {} SSTs" ,
55
+ snapshot. l0_sstables. len( )
56
+ ) ;
57
+ return Some ( SimpleLeveledCompactionTask {
58
+ upper_level : None ,
59
+ upper_level_sst_ids : snapshot. l0_sstables . clone ( ) ,
60
+ lower_level : 1 ,
61
+ lower_level_sst_ids : snapshot. levels [ 0 ] . 1 . clone ( ) ,
62
+ is_lower_level_bottom_level : false ,
63
+ } ) ;
51
64
}
65
+ }
52
66
67
+ // check size_ratio_percent for compaction of other levels (>= L1)
68
+ for i in 1 ..self . options . max_levels {
53
69
let lower_level = i + 1 ;
54
70
let size_ratio = level_sizes[ lower_level] as f64 / level_sizes[ i] as f64 ;
55
71
if size_ratio < self . options . size_ratio_percent as f64 / 100.0 {
@@ -58,12 +74,8 @@ impl SimpleLeveledCompactionController {
58
74
i, lower_level, size_ratio
59
75
) ;
60
76
return Some ( SimpleLeveledCompactionTask {
61
- upper_level : if i == 0 { None } else { Some ( i) } ,
62
- upper_level_sst_ids : if i == 0 {
63
- snapshot. l0_sstables . clone ( )
64
- } else {
65
- snapshot. levels [ i - 1 ] . 1 . clone ( )
66
- } ,
77
+ upper_level : Some ( i) ,
78
+ upper_level_sst_ids : snapshot. levels [ i - 1 ] . 1 . clone ( ) ,
67
79
lower_level,
68
80
lower_level_sst_ids : snapshot. levels [ lower_level - 1 ] . 1 . clone ( ) ,
69
81
is_lower_level_bottom_level : lower_level == self . options . max_levels ,
0 commit comments