use std::path::PathBuf;
use d_engine_proto::common::LogId;
#[derive(Debug)]
pub(crate) struct SnapshotPathManager {
pub(crate) base_dir: PathBuf,
pub(crate) snapshot_prefix: String,
pub(crate) temp_prefix: String,
}
impl SnapshotPathManager {
pub(crate) fn new(
base_dir: PathBuf,
snapshot_prefix: String,
) -> Self {
Self {
base_dir,
snapshot_prefix,
temp_prefix: "temp-".to_string(),
}
}
pub(crate) fn temp_assembly_file(&self) -> PathBuf {
self.base_dir.join(format!("{}snapshot.part.tar.gz", self.temp_prefix))
}
#[allow(unused)]
pub(crate) fn with_prefixes(
base_dir: PathBuf,
snapshot_prefix: String,
temp_prefix: String,
) -> Self {
Self {
base_dir,
snapshot_prefix,
temp_prefix,
}
}
pub(crate) fn final_snapshot_path(
&self,
log_id: &LogId,
) -> PathBuf {
self.base_dir.join(format!(
"{}{}-{}.tar.gz",
self.snapshot_prefix, log_id.index, log_id.term
))
}
pub(crate) fn temp_work_path(
&self,
log_id: &LogId,
) -> PathBuf {
self.base_dir.join(format!(
"{}{}-{}",
self.temp_prefix, log_id.index, log_id.term
))
}
#[allow(unused)]
pub(crate) fn versioned_temp_path(
&self,
version: u64,
) -> PathBuf {
self.base_dir.join(format!(".temp-{version}"))
}
#[allow(unused)]
pub(crate) fn versioned_final_path(
&self,
version: u64,
log_id: &LogId,
) -> PathBuf {
self.base_dir.join(format!(
"{}{}-{}-{}",
self.snapshot_prefix, version, log_id.index, log_id.term
))
}
#[allow(unused)]
pub(crate) fn parse_snapshot_filename(
&self,
filename: &str,
) -> Option<(u64, u64)> {
let patterns = [
&self.snapshot_prefix, &self.temp_prefix, "snapshot.part", ];
for pattern in patterns {
if let Some(stripped) = filename.strip_prefix(pattern) {
let parts: Vec<&str> = stripped.split('-').collect();
if parts.len() >= 2 {
if let (Ok(index), Ok(term)) =
(parts[0].parse(), parts[1].split('.').next()?.parse())
{
return Some((index, term));
}
}
}
}
None
}
}