From a0a6bf78b83c9cd49d0be58dab36c9a39577e0e9 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Fri, 27 Sep 2024 11:51:59 +0200 Subject: [PATCH] handle idle end event for idle detection in persisting --- .../turbo-tasks-backend/src/backend/mod.rs | 27 ++++++++++++++----- turbopack/crates/turbo-tasks/src/backend.rs | 2 ++ turbopack/crates/turbo-tasks/src/manager.rs | 1 + 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs index 2768d09a3a6b4a..eb807c93b6a6f2 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs @@ -129,7 +129,8 @@ struct TurboTasksBackendInner { stopping: AtomicBool, stopping_event: Event, - idle_event: Event, + idle_start_event: Event, + idle_end_event: Event, backing_storage: Arc, } @@ -167,7 +168,8 @@ impl TurboTasksBackendInner { last_snapshot: AtomicU64::new(0), stopping: AtomicBool::new(false), stopping_event: Event::new(|| "TurboTasksBackend::stopping_event".to_string()), - idle_event: Event::new(|| "TurboTasksBackend::idle_event".to_string()), + idle_start_event: Event::new(|| "TurboTasksBackend::idle_start_event".to_string()), + idle_end_event: Event::new(|| "TurboTasksBackend::idle_end_event".to_string()), backing_storage, } } @@ -630,7 +632,11 @@ impl TurboTasksBackendInner { } fn idle_start(&self) { - self.idle_event.notify(usize::MAX); + self.idle_start_event.notify(usize::MAX); + } + + fn idle_end(&self) { + self.idle_end_event.notify(usize::MAX); } fn get_or_create_persistent_task( @@ -1170,16 +1176,21 @@ impl TurboTasksBackendInner { if until > Instant::now() { let mut stop_listener = self.stopping_event.listen(); if !self.stopping.load(Ordering::Acquire) { - let mut idle_listener = self.idle_event.listen(); + let mut idle_start_listener = self.idle_start_event.listen(); + let mut idle_end_listener = self.idle_end_event.listen(); let mut idle_time = until + IDLE_TIMEOUT; loop { tokio::select! { _ = &mut stop_listener => { break; }, - _ = &mut idle_listener => { + _ = &mut idle_start_listener => { idle_time = Instant::now() + IDLE_TIMEOUT; - idle_listener = self.idle_event.listen() + idle_start_listener = self.idle_start_event.listen() + }, + _ = &mut idle_end_listener => { + idle_time = until + IDLE_TIMEOUT; + idle_end_listener = self.idle_end_event.listen() }, _ = tokio::time::sleep_until(until.into()) => { break; @@ -1300,6 +1311,10 @@ impl Backend for TurboTasksBackend { self.0.idle_start(); } + fn idle_end(&self, _turbo_tasks: &dyn TurboTasksBackendApi) { + self.0.idle_end(); + } + fn get_or_create_persistent_task( &self, task_type: CachedTaskType, diff --git a/turbopack/crates/turbo-tasks/src/backend.rs b/turbopack/crates/turbo-tasks/src/backend.rs index 1485a38fb634a7..e73c08d4e268c3 100644 --- a/turbopack/crates/turbo-tasks/src/backend.rs +++ b/turbopack/crates/turbo-tasks/src/backend.rs @@ -534,6 +534,8 @@ pub trait Backend: Sync + Send { #[allow(unused_variables)] fn idle_start(&self, turbo_tasks: &dyn TurboTasksBackendApi) {} + #[allow(unused_variables)] + fn idle_end(&self, turbo_tasks: &dyn TurboTasksBackendApi) {} fn invalidate_task(&self, task: TaskId, turbo_tasks: &dyn TurboTasksBackendApi); diff --git a/turbopack/crates/turbo-tasks/src/manager.rs b/turbopack/crates/turbo-tasks/src/manager.rs index 8231e10fa83abb..8d165c8cb19de5 100644 --- a/turbopack/crates/turbo-tasks/src/manager.rs +++ b/turbopack/crates/turbo-tasks/src/manager.rs @@ -851,6 +851,7 @@ impl TurboTasks { { *self.start.lock().unwrap() = Some(Instant::now()); self.event_start.notify(usize::MAX); + self.backend.idle_end(self); } }