use std::path::Path;
use crate::{
core::VlogNum,
error::GhalaDbResult,
keys::Keys,
vlog::{DataEntry, VlogReader},
};
pub(crate) struct GarbageCollector {
vnum: VlogNum,
vlog_iter: VlogReader,
}
impl GarbageCollector {
pub fn new(vnum: VlogNum, path: &Path) -> GhalaDbResult<Self> {
debug!("GarbageCollector::new vlog: {vnum} at: {path:?}");
let vlog_iter = VlogReader::from_path(path)?;
Ok(Self { vnum, vlog_iter })
}
pub fn sweep(&mut self, keys: &mut Keys) -> GhalaDbResult<Option<DataEntry>> {
trace!("GarbageCollector::sweep");
loop {
match self.vlog_iter.next_entry()? {
None => return Ok(None),
Some((dp, de)) => {
match keys.get(&de.key) {
None => continue,
Some(cur_dp) => {
if cur_dp == dp {
return Ok(Some(de));
} else {
continue;
}
}
}
}
}
}
}
pub fn vnum(&self) -> VlogNum {
self.vnum
}
}