@@ -261,39 +261,62 @@ fn health_check() -> Result<()> {
261261 let mut previous_rollback = false ;
262262
263263 if !container_mode {
264- // Detect GRUB-level kernel fallback via deployment ID comparison.
265- // If mismatch, clear next_deployment_id immediately to prevent rollback loop.
266- let grub_fallback = detect_grub_fallback ( ) ;
267- if grub_fallback {
268- previous_rollback = true ;
269- log:: info!( "GRUB kernel fallback detected - new deployment failed to boot" ) ;
270- log:: info!(
271- "Making GRUB fallback permanent by rolling back to the currently booted deployment"
272- ) ;
273- match handle_rollback ( true ) {
274- Ok ( ( ) ) => {
275- log:: info!( "Rollback to previous deployment completed successfully" ) ;
276- with_boot_rw ( unset_next_deployment_id)
277- . unwrap_or_else ( |e| log:: error!( "Failed to clear next-deployment-id: {e}" ) ) ;
264+ enum BootState {
265+ GrubFallback ,
266+ PreviousRollback ,
267+ NormalBoot ,
268+ }
269+
270+ let boot_state = if detect_grub_fallback ( ) {
271+ BootState :: GrubFallback
272+ } else if check_previous_rollback ( ) . unwrap_or ( false ) {
273+ BootState :: PreviousRollback
274+ } else {
275+ BootState :: NormalBoot
276+ } ;
277+
278+ match boot_state {
279+ BootState :: GrubFallback => {
280+ previous_rollback = true ;
281+ log:: info!( "GRUB kernel fallback detected - new deployment failed to boot" ) ;
282+ log:: info!(
283+ "Making GRUB fallback permanent by rolling back to the currently booted deployment"
284+ ) ;
285+ match handle_rollback ( true ) {
286+ Ok ( ( ) ) => {
287+ log:: info!( "Rollback to previous deployment completed successfully" ) ;
288+ with_boot_rw ( || {
289+ unset_next_deployment_id ( ) ?;
290+ unset_fallback ( )
291+ } )
292+ . unwrap_or_else ( |e| {
293+ log:: error!( "Failed to clear grub vars after rollback: {e}" )
294+ } ) ;
295+ }
296+ Err ( e) => log:: error!( "Failed to make GRUB fallback permanent: {e}" ) ,
278297 }
279- Err ( e) => log:: error!( "Failed to make GRUB fallback permanent: {e}" ) ,
280298 }
281- } else if check_previous_rollback ( ) . unwrap_or ( false ) {
282- previous_rollback = true ;
283- match detect_os_deployment ( ) {
284- Some ( manager) => log:: info!(
285- "FALLBACK BOOT DETECTED! Default {manager} deployment has been rolled back."
286- ) ,
287- None => log:: info!( "FALLBACK BOOT DETECTED! Cannot determine the deployment type." ) ,
299+ BootState :: PreviousRollback => {
300+ previous_rollback = true ;
301+ match detect_os_deployment ( ) {
302+ Some ( manager) => log:: info!(
303+ "FALLBACK BOOT DETECTED! Default {manager} deployment has been rolled back."
304+ ) ,
305+ None => {
306+ log:: info!( "FALLBACK BOOT DETECTED! Cannot determine the deployment type." )
307+ }
308+ }
309+ }
310+ BootState :: NormalBoot => {
311+ if get_fallback ( ) . unwrap_or ( false ) {
312+ log:: info!(
313+ "Kernel booted successfully, disarming GRUB fallback before healthchecks"
314+ ) ;
315+ with_boot_rw ( unset_fallback) . unwrap_or_else ( |e : anyhow:: Error | {
316+ log:: error!( "Failed to unset GRUB fallback: {e}" )
317+ } ) ;
318+ }
288319 }
289- }
290-
291- // Disarm GRUB fallback entry if the kernel booted successfully
292- if get_fallback ( ) . unwrap_or ( false ) {
293- log:: info!( "Kernel booted successfully, disarming GRUB fallback before healthchecks" ) ;
294- with_boot_rw ( unset_fallback) . unwrap_or_else ( |e : anyhow:: Error | {
295- log:: error!( "Failed to unset GRUB fallback: {e}" )
296- } ) ;
297320 }
298321 }
299322
0 commit comments