mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-24 13:16:28 +00:00
fix(scanner): preserve background heal compatibility (#3041)
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user