in common/rusty_leveldb_sgx/src/db_impl.rs [314:364]
fn delete_obsolete_files(&mut self) -> Result<()> {
let files = self.vset.borrow().live_files();
let filenames = self.opt.env.children(Path::new(&self.path))?;
for name in filenames {
if name
.to_str()
.ok_or_else(|| Status::new(StatusCode::InvalidArgument, "not valid UTF-8"))?
.ends_with(SGX_RECOVERY_FILE_SUFFIX)
{
continue;
}
if let Ok((num, typ)) = parse_file_name(&name) {
match typ {
FileType::Log => {
if num >= self.vset.borrow().log_num {
continue;
}
}
FileType::Descriptor => {
if num >= self.vset.borrow().manifest_num {
continue;
}
}
FileType::Table => {
if files.contains(&num) {
continue;
}
}
// NOTE: In this non-concurrent implementation, we likely never find temp
// files.
FileType::Temp => {
if files.contains(&num) {
continue;
}
}
FileType::Current | FileType::DBLock | FileType::InfoLog => continue,
}
// If we're here, delete this file.
if typ == FileType::Table {
let _ = self.cache.borrow_mut().evict(num);
}
log!(self.opt.log, "Deleting file type={:?} num={}", typ, num);
if let Err(e) = self.opt.env.delete(&self.path.join(&name)) {
log!(self.opt.log, "Deleting file num={} failed: {}", num, e);
}
}
}
Ok(())
}