From 27bb944fd078be9a016f8f3a9558434b9705238d Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 10 Jul 2025 23:11:09 +0000 Subject: [PATCH] updates Created using spr 1.3.6-beta.1 --- sled-agent/types/src/zone_images.rs | 22 ++++++- .../zone-images/src/mupdate_override.rs | 65 ++++++++++++++++++- 2 files changed, 82 insertions(+), 5 deletions(-) diff --git a/sled-agent/types/src/zone_images.rs b/sled-agent/types/src/zone_images.rs index 16300fbea1..371d22eb8f 100644 --- a/sled-agent/types/src/zone_images.rs +++ b/sled-agent/types/src/zone_images.rs @@ -888,8 +888,10 @@ pub enum ClearMupdateOverrideNonBootResult { /// No status was found for the non-boot disk, possibly indicating the /// non-boot disk being missing at the time Sled Agent was started. NoStatus, - - /// The internal disk was missing + + /// The disk was missing from the latest InternalDisksWithBootDisk but was + /// present at startup. The on-disk data was not altered. + DiskMissing, /// No mupdate override was found on the non-boot disk. NoOverride, @@ -939,6 +941,13 @@ impl ClearMupdateOverrideNonBootResult { started, mupdate override not cleared" ); } + ClearMupdateOverrideNonBootResult::DiskMissing => { + warn!( + log, + "non-boot disk missing from latest InternalDisks, \ + mupdate override not cleared" + ); + } ClearMupdateOverrideNonBootResult::NoOverride => { warn!( log, @@ -980,7 +989,14 @@ impl fmt::Display for ClearMupdateOverrideNonBootDisplay<'_> { write!( f, "no status was available when sled-agent was started, \ - so not cleared" + so mupdate override not cleared" + ) + } + ClearMupdateOverrideNonBootResult::DiskMissing => { + write!( + f, + "non-boot disk missing from latest InternalDisks, \ + mupdate override not cleared" ) } ClearMupdateOverrideNonBootResult::NoOverride => { diff --git a/sled-agent/zone-images/src/mupdate_override.rs b/sled-agent/zone-images/src/mupdate_override.rs index b59d2c7a0b..bbd3a50588 100644 --- a/sled-agent/zone-images/src/mupdate_override.rs +++ b/sled-agent/zone-images/src/mupdate_override.rs @@ -169,15 +169,76 @@ impl AllMupdateOverrides { // Are there any non-boot disks that were originally read at startup but // are missing from InternalDisksWithBootDisk? - for non_boot_disk_override in &self.non_boot_disk_overrides { + for mut non_boot_disk_override in &mut self.non_boot_disk_overrides { if !non_boot_disk_info .contains_key(&non_boot_disk_override.zpool_id) { + // If the boot disk was successfully cleared, we may have + // introduced a mismatch. + if let Ok(boot_disk_info) = &boot_disk_result { + let new_result = match &non_boot_disk_override.result { + MupdateOverrideNonBootResult::MatchesPresent => { + MupdateOverrideNonBootResult::Mismatch( + MupdateOverrideNonBootMismatch::BootAbsentOtherPresent { + non_boot_disk_info: boot_disk_info.clone(), + }, + ) + } + MupdateOverrideNonBootResult::MatchesAbsent => { + unreachable!( + "boot disk absent means that \ + boot_disk_result is always an error" + ) + } + MupdateOverrideNonBootResult::Mismatch( + MupdateOverrideNonBootMismatch::BootPresentOtherAbsent + ) => { + // The mupdate override file is now absent from both + // the boot and the non-boot disk, so this goes from + // mismatch to MatchesAbsent. + MupdateOverrideNonBootResult::MatchesAbsent + } + MupdateOverrideNonBootResult::Mismatch( + MupdateOverrideNonBootMismatch::BootAbsentOtherPresent { + .. + }, + ) => { + unreachable!( + "boot disk absent means that \ + boot_disk_result is always an error" + ) + } + MupdateOverrideNonBootResult::Mismatch( + MupdateOverrideNonBootMismatch::ValueMismatch { non_boot_disk_info }, + ) => { + // Goes to BootAbsentOtherPresent. + MupdateOverrideNonBootResult::Mismatch( + MupdateOverrideNonBootMismatch::BootAbsentOtherPresent { + non_boot_disk_info: non_boot_disk_info.clone(), + } + ) + } + MupdateOverrideNonBootResult::Mismatch( + MupdateOverrideNonBootMismatch::BootDiskReadError { .. }, + ) => { + unreachable!( + "boot disk read error means that \ + boot_disk_result is always an error" + ) + } + MupdateOverrideNonBootResult::ReadError(_) + => { + non_boot_disk_override.result.clone() + } + }; + + non_boot_disk_override.result = new_result; + } non_boot_disk_info .insert_unique(ClearMupdateOverrideNonBootInfo { zpool_id: non_boot_disk_override.zpool_id, path: Some(non_boot_disk_override.path.clone()), - result: ClearMupdateOverrideNonBootResult::NoStatus, + result: ClearMupdateOverrideNonBootResult::DiskMissing, }) .expect("non-boot zpool IDs should be unique"); }