From 79a8371479d418729bf74e614797ce877d52b245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E7=99=BB=E5=B1=B1?= Date: Sun, 23 Aug 2026 00:25:27 +0800 Subject: [PATCH] fix(heal): preserve terminal progress counters --- crates/heal/src/heal/erasure_healer.rs | 8 ++++---- crates/heal/src/heal/task/heal_bucket.rs | 13 ++++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/crates/heal/src/heal/erasure_healer.rs b/crates/heal/src/heal/erasure_healer.rs index b26889df6..41931519a 100644 --- a/crates/heal/src/heal/erasure_healer.rs +++ b/crates/heal/src/heal/erasure_healer.rs @@ -1180,7 +1180,7 @@ impl ErasureSetHealer { telemetry_unknown |= !increment_counter(processed_objects); completed_in_page += 1; - let progress_unknown = { + let (progress_unknown, skipped_new_versions, skipped_ilm_expired) = { let mut progress = self.progress.write().await; progress.set_current_object(Some(format!("{bucket}/{object}"))); progress.update_object_progress( @@ -1193,7 +1193,7 @@ impl ErasureSetHealer { if telemetry_unknown { progress.mark_unknown(); } - progress.counter_unknown + (progress.counter_unknown, progress.skipped_new_versions, progress.skipped_ilm_expired) }; checkpoint_manager .record_object_outcome( @@ -1203,8 +1203,8 @@ impl ErasureSetHealer { *failed_objects, *skipped_objects, bytes_processed, - 0, - 0, + skipped_new_versions, + skipped_ilm_expired, telemetry_unknown || progress_unknown, ) .await?; diff --git a/crates/heal/src/heal/task/heal_bucket.rs b/crates/heal/src/heal/task/heal_bucket.rs index 5252b8c77..6bae3b0c5 100644 --- a/crates/heal/src/heal/task/heal_bucket.rs +++ b/crates/heal/src/heal/task/heal_bucket.rs @@ -290,14 +290,12 @@ impl HealTask { self.check_control_flags().await?; let mut telemetry_unknown = false; let object = item.name.as_str(); - if retry_attempt == 0 { - telemetry_unknown |= !increment_counter(&mut scanned); - } { let mut progress = self.progress.write().await; progress.set_current_object(Some(format!("{bucket}/{object}"))); } + let mut terminal_outcome = true; let error = match self .await_with_control( self.storage @@ -345,6 +343,7 @@ impl HealTask { "Heal bucket object repair skipped due to transient metadata error" ); } else if err.is_recoverable_heal() && retry_attempt < MAX_BUCKET_OBJECT_HEAL_RETRIES { + terminal_outcome = false; debug!( target: "rustfs::heal::task", event = EVENT_HEAL_BUCKET_RESULT, @@ -386,6 +385,14 @@ impl HealTask { } } + if terminal_outcome { + telemetry_unknown |= !increment_counter(&mut scanned); + } + + if !terminal_outcome { + continue; + } + let mut progress = self.progress.write().await; progress.update_object_progress(scanned, healed, failed, skipped, bytes); if telemetry_unknown {