From 4dbe129284009aa502f2207003955fecc60a1618 Mon Sep 17 00:00:00 2001 From: Stefan Reiter Date: Tue, 4 Aug 2020 12:42:00 +0200 Subject: [PATCH] backup: only allow finished backups as base snapshot If the datastore holds broken backups for some reason, do not attempt to base following snapshots on those. This would lead to an error on /previous, leaving the client no choice but to upload all chunks, even though there might be potential for incremental savings. Signed-off-by: Stefan Reiter --- src/api2/backup.rs | 2 +- src/backup/backup_info.rs | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/api2/backup.rs b/src/api2/backup.rs index ad13faa5d..aafea8fa2 100644 --- a/src/api2/backup.rs +++ b/src/api2/backup.rs @@ -97,7 +97,7 @@ async move { bail!("backup owner check failed ({} != {})", username, owner); } - let last_backup = BackupInfo::last_backup(&datastore.base_path(), &backup_group).unwrap_or(None); + let last_backup = BackupInfo::last_backup(&datastore.base_path(), &backup_group, true).unwrap_or(None); let backup_dir = BackupDir::new_with_group(backup_group.clone(), backup_time); if let Some(last) = &last_backup { diff --git a/src/backup/backup_info.rs b/src/backup/backup_info.rs index 37dc7aa17..ea917d3c9 100644 --- a/src/backup/backup_info.rs +++ b/src/backup/backup_info.rs @@ -313,9 +313,13 @@ impl BackupInfo { } /// Finds the latest backup inside a backup group - pub fn last_backup(base_path: &Path, group: &BackupGroup) -> Result, Error> { + pub fn last_backup(base_path: &Path, group: &BackupGroup, only_finished: bool) + -> Result, Error> + { let backups = group.list_backups(base_path)?; - Ok(backups.into_iter().max_by_key(|item| item.backup_dir.backup_time())) + Ok(backups.into_iter() + .filter(|item| !only_finished || item.is_finished()) + .max_by_key(|item| item.backup_dir.backup_time())) } pub fn sort_list(list: &mut Vec, ascendending: bool) {