Skip to content

Commit 206ce74

Browse files
committed
Refactoring bootstate code in a self documenting way
Signed-off-by: Sayan Paul <paul.sayan@gmail.com>
1 parent 5969072 commit 206ce74

1 file changed

Lines changed: 53 additions & 30 deletions

File tree

src/main.rs

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)