#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PersistPolicy {
Buffer,
SyncData,
SyncAll,
}
#[allow(clippy::derivable_impls)]
impl Default for PersistPolicy {
fn default() -> Self {
PersistPolicy::SyncData
}
}
impl PersistPolicy {
pub(crate) fn to_fjall(self) -> fjall::PersistMode {
match self {
PersistPolicy::Buffer => fjall::PersistMode::Buffer,
PersistPolicy::SyncData => fjall::PersistMode::SyncData,
PersistPolicy::SyncAll => fjall::PersistMode::SyncAll,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LsmDbConfig {
pub cache_size: u64,
pub persist: PersistPolicy,
}
impl Default for LsmDbConfig {
fn default() -> Self {
Self {
cache_size: 64 * 1024 * 1024, persist: PersistPolicy::SyncData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LsmConfig {
pub reversed: bool,
pub memtable_size: u64,
pub lock_stripes: usize,
}
impl Default for LsmConfig {
fn default() -> Self {
Self {
reversed: true,
memtable_size: 64 * 1024 * 1024, lock_stripes: std::thread::available_parallelism()
.map(|p| p.get())
.unwrap_or(4)
.clamp(1, 64),
}
}
}
impl LsmConfig {
#[allow(clippy::unused_self)]
pub(crate) fn persist_or_default(&self) -> PersistPolicy {
PersistPolicy::SyncData
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lsm_config_defaults() {
let c = LsmConfig::default();
assert!(c.reversed, "reversed defaults to true (matches Bitcask)");
assert!(c.lock_stripes >= 1);
assert_eq!(LsmDbConfig::default().persist, PersistPolicy::SyncData);
}
}