use lsm_tree::SequenceNumberCounter;
use crate::{
db::Keyspaces,
flush::manager::FlushManager,
journal::{manager::JournalManager, Journal},
snapshot_tracker::SnapshotTracker,
write_buffer_manager::WriteBufferManager,
};
use std::sync::{Arc, Mutex, RwLock};
pub struct SupervisorInner {
pub db_config: crate::Config,
#[doc(hidden)]
pub keyspaces: Arc<RwLock<Keyspaces>>,
pub(crate) write_buffer_size: WriteBufferManager,
pub(crate) flush_manager: FlushManager,
pub seqno: SequenceNumberCounter,
pub snapshot_tracker: SnapshotTracker,
pub(crate) journal: Arc<Journal>,
pub(crate) journal_manager: Arc<RwLock<JournalManager>>,
pub(crate) backpressure_lock: Mutex<()>,
}
#[derive(Clone)]
pub struct Supervisor(Arc<SupervisorInner>);
impl std::ops::Deref for Supervisor {
type Target = SupervisorInner;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl Supervisor {
pub fn new(inner: SupervisorInner) -> Self {
Self(Arc::new(inner))
}
pub fn build_seqno_map(
&self,
keyspaces: &Keyspaces,
) -> Vec<crate::journal::manager::EvictionWatermark> {
use crate::AbstractTree;
let mut seqnos = Vec::with_capacity(keyspaces.len());
for keyspace in keyspaces.values() {
if let Some(lsn) = keyspace.tree.get_highest_memtable_seqno() {
seqnos.push(crate::journal::manager::EvictionWatermark {
lsn,
keyspace: keyspace.clone(),
});
}
}
seqnos
}
}