use crate::{
SequenceNumberCounter, TableId,
compaction::state::CompactionState,
config::Config,
stop_signal::StopSignal,
version::{SuperVersions, Version, persist_version},
};
use std::sync::{Arc, Mutex, RwLock, atomic::AtomicU64};
#[cfg(feature = "metrics")]
use crate::metrics::Metrics;
pub type TreeId = u64;
pub type MemtableId = u64;
pub fn get_next_tree_id() -> TreeId {
static TREE_ID_COUNTER: AtomicU64 = AtomicU64::new(0);
TREE_ID_COUNTER.fetch_add(1, std::sync::atomic::Ordering::Relaxed)
}
pub struct TreeInner {
pub id: TreeId,
#[doc(hidden)]
pub memtable_id_counter: SequenceNumberCounter,
#[doc(hidden)]
pub table_id_counter: SequenceNumberCounter,
pub(crate) blob_file_id_counter: SequenceNumberCounter,
pub(crate) version_history: Arc<RwLock<SuperVersions>>,
pub(crate) compaction_state: Arc<Mutex<CompactionState>>,
pub config: Arc<Config>,
pub(crate) stop_signal: StopSignal,
pub(crate) major_compaction_lock: RwLock<()>,
pub(crate) flush_lock: Mutex<()>,
#[doc(hidden)]
#[cfg(feature = "metrics")]
pub metrics: Arc<Metrics>,
}
impl TreeInner {
pub(crate) fn create_new(config: Config) -> crate::Result<Self> {
let version = Version::new(
0,
if config.kv_separation_opts.is_some() {
crate::TreeType::Blob
} else {
crate::TreeType::Standard
},
);
persist_version(
&config.path,
&version,
config.comparator.name(),
&*config.fs,
)?;
let comparator = config.comparator.clone();
Ok(Self {
id: get_next_tree_id(),
memtable_id_counter: SequenceNumberCounter::new(1),
table_id_counter: SequenceNumberCounter::default(),
blob_file_id_counter: SequenceNumberCounter::default(),
config: Arc::new(config),
version_history: Arc::new(RwLock::new(SuperVersions::new(version, &comparator))),
stop_signal: StopSignal::default(),
major_compaction_lock: RwLock::default(),
flush_lock: Mutex::default(),
compaction_state: Arc::new(Mutex::new(CompactionState::default())),
#[cfg(feature = "metrics")]
metrics: Metrics::default().into(),
})
}
pub fn get_next_table_id(&self) -> TableId {
self.table_id_counter.next()
}
}
impl Drop for TreeInner {
fn drop(&mut self) {
log::debug!("Dropping TreeInner");
log::trace!("Sending stop signal to compactors");
self.stop_signal.send();
}
}