Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RunTime/Execute/
RunWithRetry.rs

1//! Retry a failing effect with exponential back-off, doubling the inter-
2//! attempt delay after each failure to avoid overwhelming the recovering
3//! system.
4
5use std::sync::Arc;
6
7use CommonLibrary::{
8	Effect::{ActionEffect::ActionEffect, ApplicationRunTime::ApplicationRunTime as ApplicationRunTimeTrait},
9	Environment::Requires::Requires,
10	Error::CommonError::CommonError,
11};
12
13use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, dev_log};
14
15impl ApplicationRunTime {
16	pub async fn RunWithRetry<TCapabilityProvider, TError, TOutput>(
17		&self,
18
19		Effect:ActionEffect<Arc<TCapabilityProvider>, TError, TOutput>,
20
21		MaximumRetries:u32,
22
23		InitialDelay:std::time::Duration,
24	) -> Result<TOutput, TError>
25	where
26		TCapabilityProvider: ?Sized + Send + Sync + 'static,
27		<Self as CommonLibrary::Environment::HasEnvironment::HasEnvironment>::EnvironmentType:
28			Requires<TCapabilityProvider>,
29		TError: From<CommonError> + Send + Sync + 'static + std::fmt::Display,
30		TOutput: Send + Sync + 'static, {
31		let mut RetryCount = 0;
32
33		let mut CurrentDelay = InitialDelay;
34
35		while RetryCount <= MaximumRetries {
36			match ApplicationRunTimeTrait::Run(self, Effect.clone()).await {
37				Ok(Result) => return Ok(Result),
38
39				Err(Error) => {
40					if RetryCount == MaximumRetries {
41						return Err(Error);
42					}
43
44					RetryCount += 1;
45
46					dev_log!(
47						"lifecycle",
48						"warn: [ApplicationRunTime] Effect execution failed (attempt {}): {}. Retrying in {:?}...",
49						RetryCount,
50						Error,
51						CurrentDelay
52					);
53
54					tokio::time::sleep(CurrentDelay).await;
55
56					CurrentDelay *= 2;
57				},
58			}
59		}
60
61		Err(
62			CommonError::Unknown { Description:format!("Effect execution failed after {} retries", MaximumRetries) }
63				.into(),
64		)
65	}
66}