use std::{
path::PathBuf,
sync::{
Arc,
atomic::{AtomicBool, AtomicU64, Ordering::Relaxed},
},
};
use waof::WalLog;
use wdev::Device;
use wkv::WedbStore;
use crate::storage::sizetracker::cache_size_tracker::CacheSizeTracker;
pub struct GarnetDatabase<D: Device> {
pub id: i64,
pub store: Arc<WedbStore<D>>,
pub device: Arc<D>,
pub checkpoint_dir: PathBuf,
pub aof: Option<Arc<WalLog<D>>>,
pub last_save_store_tail_address: AtomicU64,
pub last_save_ms: AtomicU64,
pub store_index_maxed_out: AtomicBool,
pub checkpoint_paused: AtomicBool,
pub size_tracker: Arc<CacheSizeTracker>,
}
impl<D: Device> GarnetDatabase<D> {
pub fn new(
id: i64,
store: Arc<WedbStore<D>>,
device: Arc<D>,
checkpoint_dir: PathBuf,
aof: Option<Arc<WalLog<D>>>,
) -> Self {
Self {
id,
store,
device,
checkpoint_dir,
aof,
last_save_store_tail_address: AtomicU64::new(0),
last_save_ms: AtomicU64::new(0),
store_index_maxed_out: AtomicBool::new(false),
checkpoint_paused: AtomicBool::new(false),
size_tracker: Arc::new(CacheSizeTracker::new()),
}
}
pub fn update_last_save(&self, now_ms: u64) {
self.last_save_ms.store(now_ms, Relaxed);
self
.last_save_store_tail_address
.store(self.store.tail_address(), Relaxed);
}
pub fn last_save_ms(&self) -> u64 {
self.last_save_ms.load(Relaxed)
}
pub fn aof_size(&self) -> u64 {
self.aof.as_ref().map_or(0, |aof| aof.total_size())
}
}