fix(scanner): preserve background heal compatibility (#3041)

This commit is contained in:
weisd
2026-05-22 14:38:35 +08:00
committed by GitHub
parent b42766f1d3
commit 69345fe059
12 changed files with 1960 additions and 113 deletions
+33 -8
View File
@@ -4129,18 +4129,24 @@ async fn disks_with_all_parts(
}
}
// Build dataErrsByDisk from dataErrsByPart
for (part, disks) in data_errs_by_part.iter() {
for disk_idx in disks.iter() {
if let Some(parts) = data_errs_by_disk.get_mut(disk_idx)
&& *part < parts.len()
populate_data_errs_by_disk(&mut data_errs_by_disk, &data_errs_by_part);
Ok((data_errs_by_disk, data_errs_by_part))
}
fn populate_data_errs_by_disk(
data_errs_by_disk: &mut HashMap<usize, Vec<usize>>,
data_errs_by_part: &HashMap<usize, Vec<usize>>,
) {
for (part_index, part_errs) in data_errs_by_part {
for (disk_index, part_err) in part_errs.iter().enumerate() {
if let Some(disk_errs) = data_errs_by_disk.get_mut(&disk_index)
&& *part_index < disk_errs.len()
{
parts[*part] = disks[*disk_idx];
disk_errs[*part_index] = *part_err;
}
}
}
Ok((data_errs_by_disk, data_errs_by_part))
}
pub fn should_heal_object_on_disk(
@@ -5407,6 +5413,25 @@ mod tests {
assert!(should_heal);
}
#[test]
fn test_populate_data_errs_by_disk_uses_disk_index_not_error_code() {
let mut data_errs_by_disk = HashMap::from([
(0, vec![CHECK_PART_UNKNOWN, CHECK_PART_UNKNOWN]),
(1, vec![CHECK_PART_UNKNOWN, CHECK_PART_UNKNOWN]),
(2, vec![CHECK_PART_UNKNOWN, CHECK_PART_UNKNOWN]),
]);
let data_errs_by_part = HashMap::from([
(0, vec![CHECK_PART_FILE_NOT_FOUND, CHECK_PART_SUCCESS, CHECK_PART_SUCCESS]),
(1, vec![CHECK_PART_SUCCESS, CHECK_PART_FILE_CORRUPT, CHECK_PART_SUCCESS]),
]);
populate_data_errs_by_disk(&mut data_errs_by_disk, &data_errs_by_part);
assert_eq!(data_errs_by_disk.get(&0).unwrap(), &vec![CHECK_PART_FILE_NOT_FOUND, CHECK_PART_SUCCESS]);
assert_eq!(data_errs_by_disk.get(&1).unwrap(), &vec![CHECK_PART_SUCCESS, CHECK_PART_FILE_CORRUPT]);
assert_eq!(data_errs_by_disk.get(&2).unwrap(), &vec![CHECK_PART_SUCCESS, CHECK_PART_SUCCESS]);
}
#[tokio::test]
async fn test_get_disks_info_preserves_runtime_state_for_suspect_and_offline_disks() {
let format = FormatV3::new(1, 3);