Skip to main content

Mountain/RunTime/Shutdown/
ShutdownWithRecovery.rs

1
2//! Robust shutdown that continues across individual service failures.
3//! Cocoon retry → terminal disposal → state save → flush. Errors collected
4//! into one summary instead of crashing.
5
6use CommonLibrary::Error::CommonError::CommonError;
7
8use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, dev_log};
9
10impl ApplicationRunTime {
11	pub async fn ShutdownWithRecovery(&self) -> Result<(), CommonError> {
12		dev_log!("lifecycle", "[ApplicationRunTime] Initiating robust shutdown with recovery...");
13
14		let mut ShutdownErrors:Vec<String> = Vec::new();
15
16		match self.ShutdownCocoonWithRetry().await {
17			Ok(()) => dev_log!("lifecycle", "[ApplicationRunTime] Cocoon shutdown successful"),
18
19			Err(Error) => {
20				ShutdownErrors.push(format!("Cocoon shutdown failed: {}", Error));
21
22				dev_log!("lifecycle", "warn: [ApplicationRunTime] Cocoon shutdown failed, continuing...");
23			},
24		}
25
26		match self.DisposeTerminalsSafely().await {
27			Ok(()) => dev_log!("lifecycle", "[ApplicationRunTime] Terminal disposal successful"),
28
29			Err(Error) => {
30				ShutdownErrors.push(format!("Terminal disposal failed: {}", Error));
31
32				dev_log!(
33					"lifecycle",
34					"warn: [ApplicationRunTime] Terminal disposal failed, continuing..."
35				);
36			},
37		}
38
39		match self.SaveApplicationState().await {
40			Ok(()) => dev_log!("lifecycle", "[ApplicationRunTime] Application state saved"),
41
42			Err(Error) => {
43				ShutdownErrors.push(format!("State save failed: {}", Error));
44
45				dev_log!(
46					"lifecycle",
47					"warn: [ApplicationRunTime] Failed to save application state, continuing..."
48				);
49			},
50		}
51
52		self.FlushPendingOperations().await;
53
54		if !ShutdownErrors.is_empty() {
55			Err(CommonError::Unknown {
56				Description:format!("Shutdown completed with {} errors: {:?}", ShutdownErrors.len(), ShutdownErrors),
57			})
58		} else {
59			Ok(())
60		}
61	}
62}