Skip to content

Commit d965735

Browse files
committed
fix(compaction): correct level0_file_num_compaction_trigger in simple leveled compaction
Signed-off-by: zztaki <zztaki@outlook.com>
1 parent 23802b2 commit d965735

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

mini-lsm/src/compact/simple_leveled.rs

+23-11
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,35 @@ impl SimpleLeveledCompactionController {
3737
&self,
3838
snapshot: &LsmStorageState,
3939
) -> Option<SimpleLeveledCompactionTask> {
40+
if self.options.max_levels == 0 {
41+
return None;
42+
}
43+
4044
let mut level_sizes = Vec::new();
4145
level_sizes.push(snapshot.l0_sstables.len());
4246
for (_, files) in &snapshot.levels {
4347
level_sizes.push(files.len());
4448
}
4549

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+
});
5164
}
65+
}
5266

67+
// check size_ratio_percent for compaction of other levels (>= L1)
68+
for i in 1..self.options.max_levels {
5369
let lower_level = i + 1;
5470
let size_ratio = level_sizes[lower_level] as f64 / level_sizes[i] as f64;
5571
if size_ratio < self.options.size_ratio_percent as f64 / 100.0 {
@@ -58,12 +74,8 @@ impl SimpleLeveledCompactionController {
5874
i, lower_level, size_ratio
5975
);
6076
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(),
6779
lower_level,
6880
lower_level_sst_ids: snapshot.levels[lower_level - 1].1.clone(),
6981
is_lower_level_bottom_level: lower_level == self.options.max_levels,

0 commit comments

Comments
 (0)