From 51ce3989bfbe012349939a9c1d92e637e2db1b42 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 3 Feb 2025 14:44:44 +0100 Subject: [PATCH] [Turbopack] allow to manually mark tasks as root (#75436) ### What? Add `mark_root()` to manually mark tasks as root as performance optimization. --- crates/next-api/src/project.rs | 6 +++-- .../turbo-tasks-backend/src/backend/mod.rs | 27 +++++++++++++++++++ .../crates/turbo-tasks-testing/src/lib.rs | 4 +++ turbopack/crates/turbo-tasks/src/backend.rs | 9 +++++++ turbopack/crates/turbo-tasks/src/lib.rs | 9 ++++--- turbopack/crates/turbo-tasks/src/manager.rs | 14 ++++++++++ 6 files changed, 63 insertions(+), 6 deletions(-) diff --git a/crates/next-api/src/project.rs b/crates/next-api/src/project.rs index 49d899ae5c62a..c296969b652d5 100644 --- a/crates/next-api/src/project.rs +++ b/crates/next-api/src/project.rs @@ -27,6 +27,7 @@ use turbo_tasks::{ debug::ValueDebugFormat, fxindexmap, graph::{AdjacencyMap, GraphTraversal}, + mark_root, trace::TraceRawVcs, Completion, Completions, FxIndexMap, IntoTraitRef, NonLocalValue, OperationValue, OperationVc, ReadRef, ResolvedVc, State, TaskInput, TransientInstance, TryFlatJoinIterExt, Value, Vc, @@ -897,9 +898,9 @@ impl Project { pub async fn whole_app_module_graphs(self: ResolvedVc) -> Result> { async move { let module_graphs_op = whole_app_module_graph_operation(self); - let module_graphs_vc = module_graphs_op.resolve_strongly_consistent().await?; + let module_graphs_vc = module_graphs_op.connect().resolve().await?; let _ = module_graphs_op.take_issues_with_path().await?; - Ok(*module_graphs_vc) + Ok(module_graphs_vc) } .instrument(tracing::info_span!("module graph for app")) .await @@ -1605,6 +1606,7 @@ impl Project { async fn whole_app_module_graph_operation( project: ResolvedVc, ) -> Result> { + mark_root(); let base_single_module_graph = SingleModuleGraph::new_with_entries(project.get_all_entries()); let base_visited_modules = VisitedModules::from_graph(base_single_module_graph); diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs index 5b79be373becc..fae89c59b9713 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs @@ -1643,6 +1643,23 @@ impl TurboTasksBackendInner { } } + fn set_own_task_aggregation_number( + &self, + task: TaskId, + aggregation_number: u32, + turbo_tasks: &dyn TurboTasksBackendApi>, + ) { + let mut ctx = self.execute_context(turbo_tasks); + AggregationUpdateQueue::run( + AggregationUpdateJob::UpdateAggregationNumber { + task_id: task, + base_aggregation_number: aggregation_number, + distance: None, + }, + &mut ctx, + ); + } + fn connect_task( &self, task: TaskId, @@ -1934,6 +1951,16 @@ impl Backend for TurboTasksBackend { self.0.mark_own_task_as_finished(task_id, turbo_tasks); } + fn set_own_task_aggregation_number( + &self, + task: TaskId, + aggregation_number: u32, + turbo_tasks: &dyn TurboTasksBackendApi, + ) { + self.0 + .set_own_task_aggregation_number(task, aggregation_number, turbo_tasks); + } + fn mark_own_task_as_session_dependent( &self, task: TaskId, diff --git a/turbopack/crates/turbo-tasks-testing/src/lib.rs b/turbopack/crates/turbo-tasks-testing/src/lib.rs index 38368e2a5e54a..98e408c918e84 100644 --- a/turbopack/crates/turbo-tasks-testing/src/lib.rs +++ b/turbopack/crates/turbo-tasks-testing/src/lib.rs @@ -288,6 +288,10 @@ impl TurboTasksApi for VcStorage { // no-op } + fn set_own_task_aggregation_number(&self, _task: TaskId, _aggregation_number: u32) { + // no-op + } + fn detached_for_testing( &self, _f: std::pin::Pin> + Send + 'static>>, diff --git a/turbopack/crates/turbo-tasks/src/backend.rs b/turbopack/crates/turbo-tasks/src/backend.rs index 2e00328cd73b4..8c4f2f96caede 100644 --- a/turbopack/crates/turbo-tasks/src/backend.rs +++ b/turbopack/crates/turbo-tasks/src/backend.rs @@ -589,6 +589,15 @@ pub trait Backend: Sync + Send { // Do nothing by default } + fn set_own_task_aggregation_number( + &self, + _task: TaskId, + _aggregation_number: u32, + _turbo_tasks: &dyn TurboTasksBackendApi, + ) { + // Do nothing by default + } + fn mark_own_task_as_session_dependent( &self, _task: TaskId, diff --git a/turbopack/crates/turbo-tasks/src/lib.rs b/turbopack/crates/turbo-tasks/src/lib.rs index adaf1e5fc1b1c..1bc8f60d66971 100644 --- a/turbopack/crates/turbo-tasks/src/lib.rs +++ b/turbopack/crates/turbo-tasks/src/lib.rs @@ -102,10 +102,11 @@ pub use join_iter_ext::{JoinIterExt, TryFlatJoinIterExt, TryJoinIterExt}; pub use key_value_pair::KeyValuePair; pub use magic_any::MagicAny; pub use manager::{ - dynamic_call, emit, mark_finished, mark_session_dependent, mark_stateful, prevent_gc, run_once, - run_once_with_reason, spawn_blocking, spawn_thread, trait_call, turbo_tasks, turbo_tasks_scope, - CurrentCellRef, ReadConsistency, TaskPersistence, TurboTasks, TurboTasksApi, - TurboTasksBackendApi, TurboTasksBackendApiExt, TurboTasksCallApi, Unused, UpdateInfo, + dynamic_call, emit, mark_finished, mark_root, mark_session_dependent, mark_stateful, + prevent_gc, run_once, run_once_with_reason, spawn_blocking, spawn_thread, trait_call, + turbo_tasks, turbo_tasks_scope, CurrentCellRef, ReadConsistency, TaskPersistence, TurboTasks, + TurboTasksApi, TurboTasksBackendApi, TurboTasksBackendApiExt, TurboTasksCallApi, Unused, + UpdateInfo, }; pub use output::OutputContent; pub use raw_vc::{CellId, RawVc, ReadRawVcFuture, ResolveTypeError}; diff --git a/turbopack/crates/turbo-tasks/src/manager.rs b/turbopack/crates/turbo-tasks/src/manager.rs index 98a5b986c03e4..8448894112e6a 100644 --- a/turbopack/crates/turbo-tasks/src/manager.rs +++ b/turbopack/crates/turbo-tasks/src/manager.rs @@ -164,6 +164,7 @@ pub trait TurboTasksApi: TurboTasksCallApi + Sync + Send { fn read_own_task_cell(&self, task: TaskId, index: CellId) -> Result; fn update_own_task_cell(&self, task: TaskId, index: CellId, content: CellContent); fn mark_own_task_as_finished(&self, task: TaskId); + fn set_own_task_aggregation_number(&self, task: TaskId, aggregation_number: u32); fn mark_own_task_as_session_dependent(&self, task: TaskId); fn connect_task(&self, task: TaskId); @@ -1393,6 +1394,11 @@ impl TurboTasksApi for TurboTasks { self.backend.mark_own_task_as_finished(task, self); } + fn set_own_task_aggregation_number(&self, task: TaskId, aggregation_number: u32) { + self.backend + .set_own_task_aggregation_number(task, aggregation_number, self); + } + fn mark_own_task_as_session_dependent(&self, task: TaskId) { self.backend.mark_own_task_as_session_dependent(task, self); } @@ -1696,6 +1702,14 @@ pub fn mark_session_dependent() { }); } +/// Marks the current task as finished. This excludes it from waiting for +/// strongly consistency. +pub fn mark_root() { + with_turbo_tasks(|tt| { + tt.set_own_task_aggregation_number(current_task("turbo_tasks::mark_root()"), u32::MAX) + }); +} + /// Marks the current task as finished. This excludes it from waiting for /// strongly consistency. pub fn mark_finished() {