feat: re-implement remove old backups
ci/woodpecker/push/clippy Pipeline failed Details
ci/woodpecker/push/lint Pipeline was successful Details
ci/woodpecker/push/build Pipeline was successful Details

incremental-backups
Jef Roosens 2023-06-18 21:56:43 +02:00
parent bb7b57899b
commit b51d951688
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
3 changed files with 31 additions and 35 deletions

View File

@ -65,7 +65,8 @@ fn commands_backup(cli: &Cli, _args: &BackupArgs) -> io::Result<()> {
cli.max_backups, cli.max_backups,
)?; )?;
manager.create_backup() manager.create_backup()?;
manager.remove_old_backups()
} }
fn main() -> io::Result<()> { fn main() -> io::Result<()> {

View File

@ -230,7 +230,8 @@ pub struct BackupManager {
backup_dir: PathBuf, backup_dir: PathBuf,
config_dir: PathBuf, config_dir: PathBuf,
world_dir: PathBuf, world_dir: PathBuf,
max_chain_length: u64, chain_len: u64,
chains_to_keep: u64,
max_backups: u64, max_backups: u64,
last_backup: Option<Arc<Backup>>, last_backup: Option<Arc<Backup>>,
chains: Vec<Vec<Backup>>, chains: Vec<Vec<Backup>>,
@ -250,7 +251,8 @@ impl BackupManager {
config_dir, config_dir,
world_dir, world_dir,
max_backups, max_backups,
max_chain_length: 2, chain_len: 2,
chains_to_keep: 1,
chains: Vec::new(), chains: Vec::new(),
last_backup: None, last_backup: None,
} }
@ -279,7 +281,7 @@ impl BackupManager {
let backup = if let Some(current_chain) = self.chains.last() { let backup = if let Some(current_chain) = self.chains.last() {
let current_chain_len: u64 = current_chain.len().try_into().unwrap(); let current_chain_len: u64 = current_chain.len().try_into().unwrap();
if current_chain_len < self.max_chain_length { if current_chain_len < self.chain_len {
if let Some(previous_backup) = current_chain.last() { if let Some(previous_backup) = current_chain.last() {
let state = Backup::state(current_chain); let state = Backup::state(current_chain);
@ -307,38 +309,30 @@ impl BackupManager {
} }
/// Remove the oldest backups /// Remove the oldest backups
// pub fn remove_old_backups(&mut self) -> std::io::Result<()> { pub fn remove_old_backups(&mut self) -> std::io::Result<()> {
// if let Some(last_backup) = &self.last_backup { let chains_to_store: usize = self.chains_to_keep.try_into().unwrap();
// let last_valid_ancestor = last_backup.ancestor(self.max_backups - 1);
// let ancestor = last_valid_ancestor.previous();
// while let Some(backup) = &ancestor { if chains_to_store < self.chains.len() {
// let path = Backup::path(&self.backup_dir, backup.start_time); let mut remove_count: usize = self.chains.len() - chains_to_store;
// std::fs::remove_file(path)?;
// }
// }
// // The naming format used allows us to sort the backups by name and still get a sorting by // We only count finished chains towards the list of stored chains
// // creation time let chain_len: usize = self.chain_len.try_into().unwrap();
// let mut backups = self if self.chains.last().unwrap().len() < chain_len {
// .backup_dir remove_count -= 1;
// .read_dir()? }
// .filter_map(|res| res.map(|e| e.path()).ok())
// .collect::<Vec<PathBuf>>();
// backups.sort();
// let max_backups: usize = self.max_backups.try_into().unwrap(); for chain in self.chains.drain(..remove_count) {
for backup in chain {
let path = Backup::path(&self.backup_dir, backup.start_time);
std::fs::remove_file(path)?;
}
}
}
// if backups.len() > max_backups { self.write_json()?;
// let excess_backups = backups.len() - max_backups;
// for backup in &backups[0..excess_backups] { Ok(())
// std::fs::remove_file(backup)?; }
// }
// }
// Ok(())
// }
pub fn write_json(&self) -> std::io::Result<()> { pub fn write_json(&self) -> std::io::Result<()> {
let json_file = File::create(self.backup_dir.join(Self::METADATA_FILE))?; let json_file = File::create(self.backup_dir.join(Self::METADATA_FILE))?;

View File

@ -70,12 +70,13 @@ impl ServerProcess {
let start_time = chrono::offset::Utc::now(); let start_time = chrono::offset::Utc::now();
let res = self.backups.create_backup(); let res = self.backups.create_backup();
// if res.is_ok() {
// self.backups.remove_old_backups()?;
// }
// The server's save feature needs to be enabled again even if the archive failed to create // The server's save feature needs to be enabled again even if the archive failed to create
self.custom("save-on")?; self.custom("save-on")?;
self.custom("save-all")?;
if res.is_ok() {
self.backups.remove_old_backups()?;
}
let duration = chrono::offset::Utc::now() - start_time; let duration = chrono::offset::Utc::now() - start_time;
let duration_str = format!( let duration_str = format!(