From 8fcec6396eb8e5e928dba43fdf45db3788b20053 Mon Sep 17 00:00:00 2001 From: Olivia Lee Date: Thu, 28 Nov 2024 16:47:52 -0800 Subject: [PATCH] keep going when one deletion fails in delete-remote-media We *should* ensure that media deletion is always successful, but when a bug causes a single object to fail deletion it's better to try to delete the remaining objects than to give up entirely. --- src/service/admin.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/service/admin.rs b/src/service/admin.rs index 16d8a086..7fc67118 100644 --- a/src/service/admin.rs +++ b/src/service/admin.rs @@ -807,6 +807,7 @@ impl Service { }); let mut failed_keys = 0; + let mut failed_deletes = 0; while let Some(mxc) = rx.recv().await { let Ok(mxc) = mxc else { // Error details are logged by media::iter_all @@ -825,10 +826,18 @@ impl Service { } } - count += 1; + // Technically this can be collapsed, but relying on && + // short-circuiting to avoid the delete side-effect is + // confusing. + #[allow(clippy::collapsible_if)] if !dry_run { - services().media.delete(mxc).await?; + if services().media.delete(mxc).await.is_err() { + // Error details are logged by media::delete + failed_deletes += 1; + continue; + } } + count += 1; } let mut message = if dry_run { @@ -844,6 +853,17 @@ impl Service { database." ) .unwrap(); + } + + if failed_deletes != 0 { + write!( + message, + "\n{failed_deletes} media objects failed to delete." + ) + .unwrap(); + } + + if failed_keys != 0 || failed_deletes != 0 { write!( message, "\nCheck the server logs for more details."