From f9cf4ff2bf1d3bde60849b3c69ef81ad5517e2ff Mon Sep 17 00:00:00 2001 From: cxymds Date: Thu, 2 Jul 2026 22:36:48 +0800 Subject: [PATCH] fix(ecstore): surface multipart cleanup delete errors (#4198) --- .../src/bucket/lifecycle/bucket_lifecycle_ops.rs | 3 +++ crates/ecstore/src/set_disk/list.rs | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs b/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs index d0d69b75c..e05421858 100644 --- a/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs +++ b/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs @@ -1658,6 +1658,9 @@ async fn cleanup_stale_multipart_uploads_in_set(set: &Arc, now: Offset let mut deleted = 0usize; let mut candidates = HashMap::new(); + // Discovery is intentionally local-owner based: each server lists the disks + // it owns locally. Once a stale upload path is found, delete_all fans out + // idempotently across the set to remove matching shards on every disk. for disk in set.get_local_disks().await.into_iter().flatten() { if !disk.is_online().await { continue; diff --git a/crates/ecstore/src/set_disk/list.rs b/crates/ecstore/src/set_disk/list.rs index d729eafd6..2fba03a7b 100644 --- a/crates/ecstore/src/set_disk/list.rs +++ b/crates/ecstore/src/set_disk/list.rs @@ -54,6 +54,18 @@ impl SetDisks { } } + let failed = errors.iter().filter(|err| err.is_some()).count(); + if failed > 0 { + debug!( + bucket = %bucket, + prefix = %prefix, + failed, + total = errors.len(), + errors = ?errors, + "delete_all completed with disk errors" + ); + } + Ok(()) } }