mod point;
mod pool;
mod range;
#[cfg(test)]
mod tests;
use std::{
collections::{BTreeMap, HashMap},
sync::{Arc, atomic::AtomicU8},
};
use reifydb_codec::key::encoded::EncodedKey;
use reifydb_core::common::CommitVersion;
use reifydb_runtime::sync::mutex::Mutex;
use reifydb_store::row::page::{DEFAULT_BUCKET_SHIFT, PageId};
use reifydb_value::util::cowvec::CowVec;
use crate::tier::RangeBatch;
#[derive(Clone, Copy, Debug)]
pub struct ReadBufferConfig {
pub resident_pages: usize,
pub bucket_shift: u8,
pub shards: usize,
}
impl Default for ReadBufferConfig {
fn default() -> Self {
Self {
resident_pages: 1024,
bucket_shift: DEFAULT_BUCKET_SHIFT,
shards: 16,
}
}
}
#[derive(Clone)]
struct PageEntry {
version: CommitVersion,
value: Option<CowVec<u8>>,
}
struct ResidentPage {
entries: BTreeMap<EncodedKey, PageEntry>,
hot: bool,
tick: u64,
range_complete: bool,
}
pub enum ServedChunk {
Served(RangeBatch),
Gap,
}
struct Shard {
pages: HashMap<PageId, ResidentPage>,
next_tick: u64,
page_cap: usize,
}
struct PoolInner {
shards: Box<[Mutex<Shard>]>,
bucket_shift: AtomicU8,
}
#[derive(Clone)]
pub struct MultiReadBufferTier {
inner: Arc<PoolInner>,
}