use crate::checkpoint::CheckpointFile;
use crate::error::PersistenceResult;
use crate::recover::CheckpointState;
use crate::storage::Directory;
use crate::walog::{WalEntry, WalMaintenance, WalWriter};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct PublishResult {
pub checkpoint_path: String,
pub checkpoint_last_entry_id: u64,
pub wal_checkpoint_entry_id: u64,
pub deleted_wal_segments: usize,
}
pub struct CheckpointPublisher {
directory: Arc<dyn Directory>,
}
impl CheckpointPublisher {
pub fn new(directory: impl Into<Arc<dyn Directory>>) -> Self {
Self {
directory: directory.into(),
}
}
pub fn publish_checkpoint(
&self,
wal: &mut WalWriter<WalEntry>,
state: &CheckpointState,
checkpoint_last_entry_id: u64,
checkpoint_path: &str,
) -> PersistenceResult<PublishResult> {
let ckpt = CheckpointFile::new(self.directory.clone());
ckpt.write_postcard_durable(checkpoint_path, checkpoint_last_entry_id, state)?;
let wal_checkpoint_entry_id = wal.append(&WalEntry::Checkpoint {
checkpoint_path: checkpoint_path.to_string(),
last_entry_id: checkpoint_last_entry_id,
})?;
wal.flush_and_sync()?;
let deleted_wal_segments = WalMaintenance::new(self.directory.clone())
.truncate_prefix(checkpoint_last_entry_id)?;
Ok(PublishResult {
checkpoint_path: checkpoint_path.to_string(),
checkpoint_last_entry_id,
wal_checkpoint_entry_id,
deleted_wal_segments,
})
}
}