mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-19 11:06:17 +00:00
fix(heal): align scanner repair safety with quorum errors (#3887)
* fix(heal): avoid task-level delete on repair failure * fix(scanner): avoid recreate for scanner heal checks * fix(heal): preserve typed quorum failures * test(heal): satisfy clippy bool assertion
This commit is contained in:
@@ -4763,7 +4763,9 @@ impl rustfs_storage_api::HealOperations for SetDisks {
|
||||
let disks = self.disks.read().await;
|
||||
|
||||
let disks = disks.clone();
|
||||
let (_, errs) = Self::read_all_fileinfo(&disks, "", bucket, object, version_id, false, false, false).await?;
|
||||
let (_, errs) = Self::read_all_fileinfo(&disks, "", bucket, object, version_id, false, false, false)
|
||||
.await
|
||||
.map_err(|e| to_object_err(e.into(), vec![bucket, object]))?;
|
||||
if DiskError::is_all_not_found(&errs) {
|
||||
debug!(
|
||||
event = EVENT_SET_DISK_HEAL,
|
||||
@@ -4791,14 +4793,20 @@ impl rustfs_storage_api::HealOperations for SetDisks {
|
||||
// Pass no_lock=true since we already obtained write lock (or are already called with no_lock=true)
|
||||
let mut inner_opts = *opts;
|
||||
inner_opts.no_lock = true;
|
||||
let (result, err) = self.heal_object(bucket, object, version_id, &inner_opts).await?;
|
||||
let (result, err) = self
|
||||
.heal_object(bucket, object, version_id, &inner_opts)
|
||||
.await
|
||||
.map_err(|e| to_object_err(e.into(), vec![bucket, object]))?;
|
||||
if let Some(err) = err.as_ref() {
|
||||
match err {
|
||||
&DiskError::FileCorrupt if opts.scan_mode != HealScanMode::Deep => {
|
||||
// Instead of returning an error when a bitrot error is detected
|
||||
// during a normal heal scan, heal again with bitrot flag enabled.
|
||||
inner_opts.scan_mode = HealScanMode::Deep;
|
||||
let (result, err) = self.heal_object(bucket, object, version_id, &inner_opts).await?;
|
||||
let (result, err) = self
|
||||
.heal_object(bucket, object, version_id, &inner_opts)
|
||||
.await
|
||||
.map_err(|e| to_object_err(e.into(), vec![bucket, object]))?;
|
||||
return Ok((result, err.map(|e| e.into())));
|
||||
}
|
||||
_ => {}
|
||||
|
||||
Reference in New Issue
Block a user