From 7b7dcfaaf80e7c780a3bfa6c14ddb26c67d45e32 Mon Sep 17 00:00:00 2001 From: overtrue Date: Sat, 22 Aug 2026 19:20:11 +0800 Subject: [PATCH] fix(rebalance): preserve access-denied delete errors --- crates/ecstore/src/store/rebalance/support.rs | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/crates/ecstore/src/store/rebalance/support.rs b/crates/ecstore/src/store/rebalance/support.rs index 6035e58d8..e37fc97bc 100644 --- a/crates/ecstore/src/store/rebalance/support.rs +++ b/crates/ecstore/src/store/rebalance/support.rs @@ -73,7 +73,7 @@ pub(super) fn resolve_rebalance_delete_from_all_pools_result( object: &str, ) -> Result { result.map_err(|err| { - if err == Error::PreconditionFailed { + if matches!(&err, Error::PreconditionFailed | Error::PrefixAccessDenied(_, _)) { err } else { Error::other(format!("failed to delete rebalance source object {bucket}/{object}: {err}")) @@ -86,7 +86,7 @@ fn is_ignorable_rebalance_delete_error(err: &Error) -> bool { } fn rebalance_delete_pool_error(pool_idx: usize, bucket: &str, object: &str, err: Error) -> Error { - if err == Error::PreconditionFailed { + if matches!(&err, Error::PreconditionFailed | Error::PrefixAccessDenied(_, _)) { err } else { Error::other(format!("pool {pool_idx} delete failed for {bucket}/{object}: {err}")) @@ -191,6 +191,18 @@ mod tests { assert_eq!(err, Error::PreconditionFailed); } + #[test] + fn rebalance_delete_result_preserves_prefix_access_denied() { + let err = resolve_rebalance_delete_from_all_pools_result( + Err(Error::PrefixAccessDenied("bucket".to_owned(), "object".to_owned())), + "bucket", + "object", + ) + .expect_err("prefix access denial should remain structured"); + + assert_eq!(err, Error::PrefixAccessDenied("bucket".to_owned(), "object".to_owned())); + } + #[test] fn rebalance_delete_pool_result_preserves_precondition_failed() { let err = resolve_rebalance_delete_from_all_pools_results( @@ -205,4 +217,19 @@ mod tests { assert_eq!(err, Error::PreconditionFailed); } + + #[test] + fn rebalance_delete_pool_result_preserves_prefix_access_denied() { + let err = resolve_rebalance_delete_from_all_pools_results( + vec![RebalanceDeletePoolResult { + pool_idx: 0, + result: Err(Error::PrefixAccessDenied("bucket".to_owned(), "object".to_owned())), + }], + "bucket", + "object", + ) + .expect_err("prefix access denial should remain structured"); + + assert_eq!(err, Error::PrefixAccessDenied("bucket".to_owned(), "object".to_owned())); + } }