use slog::Logger;
use std::fs;
use std::io;
use std::path::Path;
use crate::{Error, Result};
const RECOVERY_FILE_NAME: &str = "recovery.yml";
const COMPLETED_RECOVERY_FILE_NAME: &str = "recovery.done";
pub struct RecoveryRequest;
pub fn prepare_recovery<P: AsRef<Path>>(
logger: &Logger,
data_dir: P,
) -> Result<Option<RecoveryRequest>> {
let src = data_dir.as_ref().join(RECOVERY_FILE_NAME);
let dest = data_dir.as_ref().join(COMPLETED_RECOVERY_FILE_NAME);
match fs::rename(&src, &dest) {
Ok(()) => {
info!(
logger,
"Rename the recovery file: src={:?}, dest={:?}", src, dest
);
Ok(Some(RecoveryRequest))
}
Err(e) => {
if let io::ErrorKind::NotFound = e.kind() {
info!(
logger,
"Skipped recovery process because the recovery file is not found.: src={:?}, dest={:?}", src, dest
);
Ok(None)
} else {
Err(track!(Error::from(e)))
}
}
}
}