use std::io::Result;
use log::{warn, error};
use serde::{Deserialize, Serialize};
use crate::SegmentId;
use super::WalReadWrite;
use super::s3::S3Wal;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
pub enum WalRecoveryMode {
#[default]
Latest,
Barrier,
}
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
pub struct HyperFileWalConfig {
pub root_uri: String,
#[serde(default)]
pub recovery_mode: WalRecoveryMode,
#[serde(default = "default_publish_every")]
pub publish_every: usize,
}
fn default_publish_every() -> usize { 1 }
impl HyperFileWalConfig {
pub fn new(uri: &str) -> Self {
Self {
root_uri: uri.to_string(),
recovery_mode: WalRecoveryMode::default(),
publish_every: default_publish_every(),
}
}
pub fn with_recovery_mode(mut self, mode: WalRecoveryMode) -> Self {
self.recovery_mode = mode;
self
}
pub fn with_publish_every(mut self, n: usize) -> Self {
self.publish_every = n.max(1);
self
}
pub fn to_wal(&self, data_block_size: usize, last_segid: SegmentId) -> Result<Option<Box<dyn WalReadWrite + Send>>> {
if self.root_uri.starts_with("S3://") || self.root_uri.starts_with("s3://") {
return S3Wal::from_uri(&self.root_uri, data_block_size, last_segid);
} else if self.root_uri.is_empty() {
warn!("root uri of in wal config is not configured, disable wal");
} else {
error!("unknown root uri: {} in wal config, disable wal", self.root_uri);
}
Ok(None)
}
}