Skip to main content

Mountain/RunTime/Shutdown/
ShutdownWithRecovery.rs

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