use serde::{Deserialize, Serialize};
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Serialize,
Deserialize,
bitcode::Encode,
bitcode::Decode,
Default,
)]
#[repr(u8)]
pub enum Compression {
#[default]
Lz4 = 0,
None = 1,
}
impl From<Compression> for fjall::CompressionType {
#[inline]
fn from(c: Compression) -> Self {
match c {
Compression::Lz4 => fjall::CompressionType::Lz4,
Compression::None => fjall::CompressionType::None,
}
}
}
impl From<fjall::CompressionType> for Compression {
#[inline]
fn from(c: fjall::CompressionType) -> Self {
match c {
fjall::CompressionType::Lz4 => Compression::Lz4,
fjall::CompressionType::None => Compression::None,
}
}
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Serialize,
Deserialize,
bitcode::Encode,
bitcode::Decode,
Default,
)]
#[repr(u8)]
pub enum PersistMode {
Buffer = 0,
#[default]
SyncData = 1,
SyncAll = 2,
}
impl From<PersistMode> for fjall::PersistMode {
#[inline]
fn from(m: PersistMode) -> Self {
match m {
PersistMode::Buffer => fjall::PersistMode::Buffer,
PersistMode::SyncData => fjall::PersistMode::SyncData,
PersistMode::SyncAll => fjall::PersistMode::SyncAll,
}
}
}
#[derive(
Debug, Clone, Copy, PartialEq, Serialize, Deserialize, bitcode::Encode, bitcode::Decode,
)]
pub enum Conf {
CacheSize(usize),
Compression(Compression),
JournalCompression(Compression),
ManualJournalPersist(bool),
PersistIntervalMs(u64),
PersistMode(PersistMode),
WorkerThreads(usize),
MaxJournalingSize(usize),
MaxCachedFiles(usize),
DataBlockSize(usize),
MetaBlockSize(usize),
DataMemtableSize(usize),
MetaMemtableSize(usize),
KvSeparationThreshold(usize),
DisableKvSeparation,
DataHashRatio(f32),
ExpectPointReadHits(bool),
Temporary(bool),
}
#[derive(Debug, Clone)]
pub struct DbConfig {
pub cache_size: usize,
pub compression: Compression,
pub journal_compression: Compression,
pub manual_journal_persist: bool,
pub persist_interval_ms: u64,
pub persist_mode: PersistMode,
pub worker_threads: Option<usize>,
pub max_journaling_size: Option<usize>,
pub max_cached_files: Option<usize>,
pub data_block_size: usize,
pub meta_block_size: usize,
pub data_memtable_size: usize,
pub meta_memtable_size: usize,
pub kv_separation_threshold: Option<usize>,
pub data_hash_ratio: f32,
pub expect_point_read_hits: bool,
pub temporary: bool,
}
impl Default for DbConfig {
fn default() -> Self {
Self {
cache_size: 512 * 1024 * 1024,
compression: Compression::Lz4,
journal_compression: Compression::None,
manual_journal_persist: true,
persist_interval_ms: 50,
persist_mode: PersistMode::SyncData,
worker_threads: None,
max_journaling_size: None,
max_cached_files: None,
data_block_size: 8 * 1024,
meta_block_size: 4 * 1024,
data_memtable_size: 64 * 1024 * 1024,
meta_memtable_size: 32 * 1024 * 1024,
kv_separation_threshold: Some(4096),
data_hash_ratio: 0.75,
expect_point_read_hits: false,
temporary: false,
}
}
}
impl DbConfig {
pub fn from_conf_li<I>(conf_li: I) -> Self
where
I: IntoIterator<Item = Conf>,
{
let mut cfg = Self::default();
for opt in conf_li {
match opt {
Conf::CacheSize(sz) => cfg.cache_size = sz,
Conf::Compression(c) => cfg.compression = c,
Conf::JournalCompression(jc) => cfg.journal_compression = jc,
Conf::ManualJournalPersist(m) => cfg.manual_journal_persist = m,
Conf::PersistIntervalMs(ms) => cfg.persist_interval_ms = ms,
Conf::PersistMode(pm) => cfg.persist_mode = pm,
Conf::WorkerThreads(wt) => cfg.worker_threads = Some(wt),
Conf::MaxJournalingSize(sz) => cfg.max_journaling_size = Some(sz),
Conf::MaxCachedFiles(cf) => cfg.max_cached_files = Some(cf),
Conf::DataBlockSize(sz) => cfg.data_block_size = sz,
Conf::MetaBlockSize(sz) => cfg.meta_block_size = sz,
Conf::DataMemtableSize(sz) => cfg.data_memtable_size = sz,
Conf::MetaMemtableSize(sz) => cfg.meta_memtable_size = sz,
Conf::KvSeparationThreshold(sz) => cfg.kv_separation_threshold = Some(sz),
Conf::DisableKvSeparation => cfg.kv_separation_threshold = None,
Conf::DataHashRatio(r) => cfg.data_hash_ratio = r,
Conf::ExpectPointReadHits(b) => cfg.expect_point_read_hits = b,
Conf::Temporary(t) => cfg.temporary = t,
}
}
cfg
}
}