From 4fe6b52033bcff3231cda5f2c0e075531fed64fe Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Tue, 29 Sep 2026 21:29:31 +0800 Subject: [PATCH] refactor(core): complete bounded service retry migration --- src-tauri/src/core/manager/lifecycle.rs | 21 +++++++++++++-------- src-tauri/src/core/manager/state.rs | 3 ++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src-tauri/src/core/manager/lifecycle.rs b/src-tauri/src/core/manager/lifecycle.rs index d8c5784f2..9931a8d3e 100644 --- a/src-tauri/src/core/manager/lifecycle.rs +++ b/src-tauri/src/core/manager/lifecycle.rs @@ -840,29 +840,34 @@ impl CoreManager { AsyncHandler::spawn(|| async move { let manager = Self::global(); let started = Instant::now(); - loop { + use crate::utils::retry::{RetryError, RetryPolicy, retry}; + let attempts = std::num::NonZeroUsize::MIN.saturating_add( + (timing::SERVICE_HANDOFF_WINDOW.as_millis() / timing::SERVICE_HANDOFF_INTERVAL.as_millis()) as usize, + ); + let _ = retry(RetryPolicy::fixed(attempts, std::time::Duration::ZERO), |_| async { if started.elapsed() >= timing::SERVICE_HANDOFF_WINDOW { logging!( info, Type::Core, "service handoff window elapsed; staying in sidecar mode" ); - break; + return Ok(()); } + // The window is checked before waiting, including the final handoff attempt. tokio::time::sleep(timing::SERVICE_HANDOFF_INTERVAL).await; - if !matches!(*manager.get_running_mode(), RunningMode::Sidecar) { - break; + return Ok(()); } match manager.try_handoff_sidecar_to_service().await { - HandoffOutcome::Done => break, + HandoffOutcome::Done => Ok(()), HandoffOutcome::Failed => { logging!(warn, Type::Core, "handoff attempt failed; staying in sidecar mode"); - break; + Ok(()) } - HandoffOutcome::NotReady => {} + HandoffOutcome::NotReady => Err(RetryError::Retry(())), } - } + }) + .await; manager.handoff_watcher_running.store(false, Ordering::Release); }); } diff --git a/src-tauri/src/core/manager/state.rs b/src-tauri/src/core/manager/state.rs index 165f04b6e..8994e2aa5 100644 --- a/src-tauri/src/core/manager/state.rs +++ b/src-tauri/src/core/manager/state.rs @@ -48,7 +48,8 @@ where { let attempts = NonZeroUsize::new(attempts).ok_or_else(|| anyhow::anyhow!("service start failed"))?; retry(RetryPolicy::fixed(attempts, retry_delay), |attempt| { - let future = start(); + // The Windows Service IPC future would otherwise inflate every enclosing lifecycle future. + let future = Box::pin(start()); async move { future.await.map_err(|error| { logging!(