prune: never fail, just warn about failed removals

A removal can fail if the snapshot is already gone (this is fine, our
job is done either way) or we couldn't get a lock (also fine, it can't
be removed then, just warn the user so he knows what happened and why it
wasn't removed) - keep going either way.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
This commit is contained in:
Stefan Reiter 2020-10-14 14:16:30 +02:00 committed by Dietmar Maurer
parent 836c4a278d
commit f153930066

View File

@ -16,7 +16,6 @@ use proxmox::api::{
use proxmox::api::router::SubdirMap; use proxmox::api::router::SubdirMap;
use proxmox::api::schema::*; use proxmox::api::schema::*;
use proxmox::tools::fs::{replace_file, CreateOptions}; use proxmox::tools::fs::{replace_file, CreateOptions};
use proxmox::try_block;
use proxmox::{http_err, identity, list_subdirs_api_method, sortable}; use proxmox::{http_err, identity, list_subdirs_api_method, sortable};
use pxar::accessor::aio::Accessor; use pxar::accessor::aio::Accessor;
@ -692,53 +691,52 @@ fn prune(
// We use a WorkerTask just to have a task log, but run synchrounously // We use a WorkerTask just to have a task log, but run synchrounously
let worker = WorkerTask::new("prune", Some(worker_id), Userid::root_userid().clone(), true)?; let worker = WorkerTask::new("prune", Some(worker_id), Userid::root_userid().clone(), true)?;
let result = try_block! { if keep_all {
if keep_all { worker.log("No prune selection - keeping all files.");
worker.log("No prune selection - keeping all files."); } else {
} else { worker.log(format!("retention options: {}", prune_options.cli_options_string()));
worker.log(format!("retention options: {}", prune_options.cli_options_string())); worker.log(format!("Starting prune on store \"{}\" group \"{}/{}\"",
worker.log(format!("Starting prune on store \"{}\" group \"{}/{}\"", store, backup_type, backup_id));
store, backup_type, backup_id)); }
}
for (info, mut keep) in prune_info { for (info, mut keep) in prune_info {
if keep_all { keep = true; } if keep_all { keep = true; }
let backup_time = info.backup_dir.backup_time(); let backup_time = info.backup_dir.backup_time();
let timestamp = info.backup_dir.backup_time_string(); let timestamp = info.backup_dir.backup_time_string();
let group = info.backup_dir.group(); let group = info.backup_dir.group();
let msg = format!( let msg = format!(
"{}/{}/{} {}", "{}/{}/{} {}",
group.backup_type(), group.backup_type(),
group.backup_id(), group.backup_id(),
timestamp, timestamp,
if keep { "keep" } else { "remove" }, if keep { "keep" } else { "remove" },
); );
worker.log(msg); worker.log(msg);
prune_result.push(json!({ prune_result.push(json!({
"backup-type": group.backup_type(), "backup-type": group.backup_type(),
"backup-id": group.backup_id(), "backup-id": group.backup_id(),
"backup-time": backup_time, "backup-time": backup_time,
"keep": keep, "keep": keep,
})); }));
if !(dry_run || keep) { if !(dry_run || keep) {
datastore.remove_backup_dir(&info.backup_dir, false)?; if let Err(err) = datastore.remove_backup_dir(&info.backup_dir, false) {
worker.warn(
format!(
"failed to remove dir {:?}: {}",
info.backup_dir.relative_path(), err
)
);
} }
} }
}
Ok(()) worker.log_result(&Ok(()));
};
worker.log_result(&result);
if let Err(err) = result {
bail!("prune failed - {}", err);
};
Ok(json!(prune_result)) Ok(json!(prune_result))
} }