in common/rusty_leveldb_sgx/src/db_impl.rs [668:719]
fn start_compaction(&mut self, mut compaction: Compaction) -> Result<()> {
if compaction.is_trivial_move() {
assert_eq!(1, compaction.num_inputs(0));
let f = compaction.input(0, 0);
let num = f.num;
let size = f.size;
let level = compaction.level();
compaction.edit().delete_file(level, num);
compaction.edit().add_file(level + 1, f);
let r = self.vset.borrow_mut().log_and_apply(compaction.into_edit());
if let Err(e) = r {
log!(self.opt.log, "trivial move failed: {}", e);
Err(e)
} else {
log!(
self.opt.log,
"Moved num={} bytes={} from L{} to L{}",
num,
size,
level,
level + 1
);
log!(
self.opt.log,
"Summary: {}",
self.vset.borrow().current_summary()
);
Ok(())
}
} else {
let smallest = if self.snaps.empty() {
self.vset.borrow().last_seq
} else {
self.snaps.oldest()
};
let mut state = CompactionState::new(compaction, smallest);
if let Err(e) = self.do_compaction_work(&mut state) {
state.cleanup(&self.opt.env, &self.path);
log!(self.opt.log, "Compaction work failed: {}", e);
}
self.install_compaction_results(state)?;
log!(
self.opt.log,
"Compaction finished: {}",
self.vset.borrow().current_summary()
);
self.delete_obsolete_files()
}
}