fix(heal): preserve terminal progress counters

This commit is contained in:
马登山
2026-08-23 00:25:27 +08:00
parent 69ae9ef671
commit 79a8371479
2 changed files with 14 additions and 7 deletions
+4 -4
View File
@@ -1180,7 +1180,7 @@ impl ErasureSetHealer {
telemetry_unknown |= !increment_counter(processed_objects); telemetry_unknown |= !increment_counter(processed_objects);
completed_in_page += 1; completed_in_page += 1;
let progress_unknown = { let (progress_unknown, skipped_new_versions, skipped_ilm_expired) = {
let mut progress = self.progress.write().await; let mut progress = self.progress.write().await;
progress.set_current_object(Some(format!("{bucket}/{object}"))); progress.set_current_object(Some(format!("{bucket}/{object}")));
progress.update_object_progress( progress.update_object_progress(
@@ -1193,7 +1193,7 @@ impl ErasureSetHealer {
if telemetry_unknown { if telemetry_unknown {
progress.mark_unknown(); progress.mark_unknown();
} }
progress.counter_unknown (progress.counter_unknown, progress.skipped_new_versions, progress.skipped_ilm_expired)
}; };
checkpoint_manager checkpoint_manager
.record_object_outcome( .record_object_outcome(
@@ -1203,8 +1203,8 @@ impl ErasureSetHealer {
*failed_objects, *failed_objects,
*skipped_objects, *skipped_objects,
bytes_processed, bytes_processed,
0, skipped_new_versions,
0, skipped_ilm_expired,
telemetry_unknown || progress_unknown, telemetry_unknown || progress_unknown,
) )
.await?; .await?;
+10 -3
View File
@@ -290,14 +290,12 @@ impl HealTask {
self.check_control_flags().await?; self.check_control_flags().await?;
let mut telemetry_unknown = false; let mut telemetry_unknown = false;
let object = item.name.as_str(); let object = item.name.as_str();
if retry_attempt == 0 {
telemetry_unknown |= !increment_counter(&mut scanned);
}
{ {
let mut progress = self.progress.write().await; let mut progress = self.progress.write().await;
progress.set_current_object(Some(format!("{bucket}/{object}"))); progress.set_current_object(Some(format!("{bucket}/{object}")));
} }
let mut terminal_outcome = true;
let error = match self let error = match self
.await_with_control( .await_with_control(
self.storage self.storage
@@ -345,6 +343,7 @@ impl HealTask {
"Heal bucket object repair skipped due to transient metadata error" "Heal bucket object repair skipped due to transient metadata error"
); );
} else if err.is_recoverable_heal() && retry_attempt < MAX_BUCKET_OBJECT_HEAL_RETRIES { } else if err.is_recoverable_heal() && retry_attempt < MAX_BUCKET_OBJECT_HEAL_RETRIES {
terminal_outcome = false;
debug!( debug!(
target: "rustfs::heal::task", target: "rustfs::heal::task",
event = EVENT_HEAL_BUCKET_RESULT, 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; let mut progress = self.progress.write().await;
progress.update_object_progress(scanned, healed, failed, skipped, bytes); progress.update_object_progress(scanned, healed, failed, skipped, bytes);
if telemetry_unknown { if telemetry_unknown {