fix: avoid leveled compaction crash when recovering from manifest (#63)
* Fix: Avoid leveled copaction crash when recovering from manifest * Also sort SSTs in manifest recovery * Add `in_recovery` flag to `apply_compaction_result` - Don't sort the SSTs inside `apply_compaction_result` if in recovery
This commit is contained in:
@@ -160,6 +160,7 @@ impl LeveledCompactionController {
|
||||
snapshot: &LsmStorageState,
|
||||
task: &LeveledCompactionTask,
|
||||
output: &[usize],
|
||||
in_recovery: bool,
|
||||
) -> (LsmStorageState, Vec<usize>) {
|
||||
let mut snapshot = snapshot.clone();
|
||||
let mut files_to_remove = Vec::new();
|
||||
@@ -216,14 +217,17 @@ impl LeveledCompactionController {
|
||||
.collect::<Vec<_>>();
|
||||
assert!(lower_level_sst_ids_set.is_empty());
|
||||
new_lower_level_ssts.extend(output);
|
||||
new_lower_level_ssts.sort_by(|x, y| {
|
||||
snapshot
|
||||
.sstables
|
||||
.get(x)
|
||||
.unwrap()
|
||||
.first_key()
|
||||
.cmp(snapshot.sstables.get(y).unwrap().first_key())
|
||||
});
|
||||
// Don't sort the SST IDs during recovery because actual SSTs are not loaded at that point
|
||||
if !in_recovery {
|
||||
new_lower_level_ssts.sort_by(|x, y| {
|
||||
snapshot
|
||||
.sstables
|
||||
.get(x)
|
||||
.unwrap()
|
||||
.first_key()
|
||||
.cmp(snapshot.sstables.get(y).unwrap().first_key())
|
||||
});
|
||||
}
|
||||
snapshot.levels[task.lower_level - 1].1 = new_lower_level_ssts;
|
||||
(snapshot, files_to_remove)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user