use crate::{worker_pool::WorkerMessage, Keyspace};
use lsm_tree::{AnyIngestion, UserKey, UserValue};
pub struct Ingestion<'a> {
keyspace: &'a Keyspace,
inner: AnyIngestion<'a>,
}
impl<'a> Ingestion<'a> {
pub fn new(keyspace: &'a Keyspace) -> crate::Result<Self> {
let inner = keyspace.tree.ingestion()?;
Ok(Self { keyspace, inner })
}
pub fn write<K: Into<UserKey>, V: Into<UserValue>>(
&mut self,
key: K,
value: V,
) -> crate::Result<()> {
self.inner.write(key, value).map_err(Into::into)
}
pub fn write_tombstone<K: Into<UserKey>>(&mut self, key: K) -> crate::Result<()> {
self.inner.write_tombstone(key).map_err(Into::into)
}
#[doc(hidden)]
pub fn write_weak_tombstone<K: Into<UserKey>>(&mut self, key: K) -> crate::Result<()> {
self.inner.write_weak_tombstone(key).map_err(Into::into)
}
pub fn finish(self) -> crate::Result<()> {
let _journal_lock = self.keyspace.supervisor.journal.get_writer();
self.inner
.finish()
.inspect(|()| {
self.keyspace
.worker_messager
.try_send(WorkerMessage::Compact(self.keyspace.clone()))
.ok();
self.keyspace.supervisor.snapshot_tracker.gc();
})
.map_err(Into::into)
}
}