use std::path::PathBuf;
use serde::{Deserialize, Serialize};
#[cfg(test)]
use tempfile::TempDir;
use crate::database::config::{
config_error::ConfigError, version_manager_config::VersionMangerSyncVariant,
};
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum WALVariant {
Default,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum WALSyncVariant {
NoSync,
GroupSync(u64),
Always,
}
impl From<VersionMangerSyncVariant> for WALSyncVariant {
fn from(value: VersionMangerSyncVariant) -> Self {
match value {
VersionMangerSyncVariant::Always => WALSyncVariant::Always,
VersionMangerSyncVariant::GroupSync(x) => WALSyncVariant::GroupSync(x),
VersionMangerSyncVariant::NoSync => WALSyncVariant::NoSync,
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct WALConfig {
pub wal_dir: PathBuf,
pub variant: WALVariant,
pub wal_file_size_in_bytes: u64,
pub wal_max_payload_len_in_bytes: u64,
pub wal_sync_variant: WALSyncVariant,
}
impl WALConfig {
pub fn validate(&self) -> Result<(), ConfigError> {
if let WALSyncVariant::GroupSync(x) = self.wal_sync_variant
&& x == 0
{
eprintln!(
"Group size is set to 0 please use NoSync variant for better understandanbility"
)
}
if self.wal_max_payload_len_in_bytes == 0 {
return Err(ConfigError::InvalidWALConfig(format!(
"wal_max_payload_len_in_bytes must be > 0, got {}",
self.wal_max_payload_len_in_bytes
)));
}
if self.wal_file_size_in_bytes <= self.wal_max_payload_len_in_bytes * 10 {
return Err(ConfigError::InvalidWALConfig(format!(
"wal_file_size_in_bytes ({}) must be at least 10x wal_max_payload_len_in_bytes ({})",
self.wal_file_size_in_bytes, self.wal_max_payload_len_in_bytes
)));
}
Ok(())
}
#[cfg(test)]
pub fn get_default_wal_test_config() -> (Self, TempDir) {
let root_dir = TempDir::new().unwrap();
(
WALConfig {
wal_dir: root_dir.path().into(),
variant: WALVariant::Default,
wal_file_size_in_bytes: 4 * 1024, wal_max_payload_len_in_bytes: 512,
wal_sync_variant: WALSyncVariant::NoSync,
},
root_dir,
)
}
}