use std::path::PathBuf;
use crate::checkpoint::CheckpointConfig;
const DEFAULT_FILE_BUFFER_POOL_SIZE: usize = 256;
const DEFAULT_MEMORY_BUFFER_POOL_SIZE: usize = 64;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum Storage {
File {
dir: PathBuf,
},
Memory,
}
#[derive(Debug, Clone)]
pub struct TreeConfig {
pub storage: Storage,
pub buffer_pool_size: usize,
pub wal_sync: bool,
pub memory_flush_on_write: bool,
pub checkpoint: CheckpointConfig,
}
impl TreeConfig {
#[must_use]
pub fn new<P: Into<PathBuf>>(dir: P) -> Self {
Self {
storage: Storage::File { dir: dir.into() },
buffer_pool_size: DEFAULT_FILE_BUFFER_POOL_SIZE,
wal_sync: false,
memory_flush_on_write: true,
checkpoint: CheckpointConfig::default(),
}
}
#[must_use]
pub fn memory() -> Self {
Self {
storage: Storage::Memory,
buffer_pool_size: DEFAULT_MEMORY_BUFFER_POOL_SIZE,
wal_sync: false,
memory_flush_on_write: true,
checkpoint: CheckpointConfig {
enabled: false,
..CheckpointConfig::default()
},
}
}
#[must_use]
pub fn is_memory(&self) -> bool {
matches!(self.storage, Storage::Memory)
}
#[must_use]
pub fn wal_path(&self) -> Option<PathBuf> {
match &self.storage {
Storage::File { dir } => Some(dir.join("journal.wal")),
Storage::Memory => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn file_backed_default_buffer_pool_is_service_sized() {
let cfg = TreeConfig::new("/tmp/holt");
assert_eq!(cfg.buffer_pool_size, 256);
}
#[test]
fn memory_default_buffer_pool_stays_small() {
let cfg = TreeConfig::memory();
assert_eq!(cfg.buffer_pool_size, 64);
}
}