From 88995b70b1e721dc87c400dc07b2a91c18672152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E7=99=BB=E5=B1=B1?= Date: Sat, 22 Aug 2026 15:44:02 +0800 Subject: [PATCH] test(heal): cover suspended owner production path --- crates/ecstore/src/store/heal.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/crates/ecstore/src/store/heal.rs b/crates/ecstore/src/store/heal.rs index 06e92cad7..ffac77751 100644 --- a/crates/ecstore/src/store/heal.rs +++ b/crates/ecstore/src/store/heal.rs @@ -616,6 +616,21 @@ mod tests { .await .expect("duplicate owner object should be written"); } + let duplicate_missing_disk = store.pools[0].disk_set[0].disks.read().await[0] + .clone() + .expect("duplicate active owner disk should be online"); + duplicate_missing_disk + .delete( + &bucket, + duplicate_object, + DeleteOptions { + recursive: true, + immediate: true, + ..Default::default() + }, + ) + .await + .expect("duplicate active owner shard should be removed for repair"); let history_version = Uuid::new_v4(); let mut history_reader = PutObjReader::from_vec(b"marker history".to_vec()); store.pools[0] @@ -679,6 +694,16 @@ mod tests { active_duplicate_owner, 0, "suspended duplicate must be excluded from active owner selection" ); + let (duplicate_result, duplicate_err) = store + .handle_heal_object(&bucket, duplicate_object, "", &HealOpts::default()) + .await + .expect("duplicate owner heal should complete through the production path"); + assert_eq!(duplicate_result.object, duplicate_object); + assert!(duplicate_err.is_none(), "active duplicate should be repaired: {duplicate_err:?}"); + assert!( + duplicate_missing_disk.read_xl(&bucket, duplicate_object, false).await.is_ok(), + "production heal must repair the active duplicate owner rather than the suspended owner" + ); let (marker_info, marker_owner) = store .get_latest_object_info_with_idx( &bucket,