Skip to content

Commit 87fb607

Browse files
committed
Turbopack: Track errored tasks as dependency when using untracked()
1 parent 1112dce commit 87fb607

File tree

7 files changed

+173
-156
lines changed

7 files changed

+173
-156
lines changed

turbopack/crates/turbo-tasks-backend/src/backend/mod.rs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ use tokio::time::{Duration, Instant};
2828
use tracing::{Span, field::Empty, info_span, trace_span};
2929
use turbo_tasks::{
3030
CellId, FxDashMap, FxIndexMap, KeyValuePair, RawVc, ReadCellOptions, ReadConsistency,
31-
SessionId, TRANSIENT_TASK_BIT, TaskExecutionReason, TaskId, TraitTypeId, TurboTasksBackendApi,
32-
ValueTypeId,
31+
ReadOutputOptions, ReadTracking, SessionId, TRANSIENT_TASK_BIT, TaskExecutionReason, TaskId,
32+
TraitTypeId, TurboTasksBackendApi, ValueTypeId,
3333
backend::{
3434
Backend, CachedTaskType, CellContent, TaskExecutionSpec, TransientTaskRoot,
3535
TransientTaskType, TurboTasksExecutionError, TypedCellContent,
@@ -458,7 +458,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
458458
self: &Arc<Self>,
459459
task_id: TaskId,
460460
reader: Option<TaskId>,
461-
consistency: ReadConsistency,
461+
options: ReadOutputOptions,
462462
turbo_tasks: &dyn TurboTasksBackendApi<TurboTasksBackend<B>>,
463463
) -> Result<Result<RawVc, EventListener>> {
464464
self.assert_not_persistent_calling_transient(reader, task_id, /* cell_id */ None);
@@ -469,15 +469,16 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
469469
fn listen_to_done_event<B: BackingStorage>(
470470
this: &TurboTasksBackendInner<B>,
471471
reader: Option<TaskId>,
472+
tracking: ReadTracking,
472473
done_event: &Event,
473474
) -> EventListener {
474475
done_event.listen_with_note(move || {
475476
let reader_desc = reader.map(|r| this.get_task_desc_fn(r));
476477
move || {
477478
if let Some(reader_desc) = reader_desc.as_ref() {
478-
format!("try_read_task_output from {}", reader_desc())
479+
format!("try_read_task_output from {} ({})", reader_desc(), tracking)
479480
} else {
480-
"try_read_task_output (untracked)".to_string()
481+
format!("try_read_task_output ({})", tracking)
481482
}
482483
}
483484
})
@@ -487,16 +488,19 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
487488
this: &TurboTasksBackendInner<B>,
488489
task: &impl TaskGuard,
489490
reader: Option<TaskId>,
491+
tracking: ReadTracking,
490492
ctx: &impl ExecuteContext<'_>,
491493
) -> Option<std::result::Result<std::result::Result<RawVc, EventListener>, anyhow::Error>>
492494
{
493495
match get!(task, InProgress) {
494-
Some(InProgressState::Scheduled { done_event, .. }) => {
495-
Some(Ok(Err(listen_to_done_event(this, reader, done_event))))
496-
}
496+
Some(InProgressState::Scheduled { done_event, .. }) => Some(Ok(Err(
497+
listen_to_done_event(this, reader, tracking, done_event),
498+
))),
497499
Some(InProgressState::InProgress(box InProgressStateInner {
498500
done_event, ..
499-
})) => Some(Ok(Err(listen_to_done_event(this, reader, done_event)))),
501+
})) => Some(Ok(Err(listen_to_done_event(
502+
this, reader, tracking, done_event,
503+
)))),
500504
Some(InProgressState::Canceled) => Some(Err(anyhow::anyhow!(
501505
"{} was canceled",
502506
ctx.get_task_description(task.id())
@@ -505,7 +509,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
505509
}
506510
}
507511

508-
if matches!(consistency, ReadConsistency::Strong) {
512+
if matches!(options.consistency, ReadConsistency::Strong) {
509513
// Ensure it's an root node
510514
loop {
511515
let aggregation_number = get_aggregation_number(&task);
@@ -687,7 +691,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
687691
}
688692
}
689693

690-
if let Some(value) = check_in_progress(self, &task, reader, &ctx) {
694+
if let Some(value) = check_in_progress(self, &task, reader, options.tracking, &ctx) {
691695
return value;
692696
}
693697

@@ -705,6 +709,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
705709
};
706710
if self.should_track_dependencies()
707711
&& let Some(reader) = reader
712+
&& options.tracking.should_track(result.is_err())
708713
&& (!task.is_immutable() || cfg!(feature = "verify_immutable"))
709714
{
710715
let _ = task.add(CachedDataItem::OutputDependent {
@@ -810,7 +815,9 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
810815
None
811816
};
812817
if let Some(content) = content {
813-
add_cell_dependency(self, task, reader, cell, task_id, &mut ctx);
818+
if options.tracking.should_track(false) {
819+
add_cell_dependency(self, task, reader, cell, task_id, &mut ctx);
820+
}
814821
return Ok(Ok(TypedCellContent(
815822
cell.type_id,
816823
CellContent(Some(content.reference)),
@@ -835,14 +842,18 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
835842
)
836843
.copied();
837844
let Some(max_id) = max_id else {
838-
add_cell_dependency(self, task, reader, cell, task_id, &mut ctx);
845+
if options.tracking.should_track(true) {
846+
add_cell_dependency(self, task, reader, cell, task_id, &mut ctx);
847+
}
839848
bail!(
840849
"Cell {cell:?} no longer exists in task {} (no cell of this type exists)",
841850
ctx.get_task_description(task_id)
842851
);
843852
};
844853
if cell.index >= max_id {
845-
add_cell_dependency(self, task, reader, cell, task_id, &mut ctx);
854+
if options.tracking.should_track(true) {
855+
add_cell_dependency(self, task, reader, cell, task_id, &mut ctx);
856+
}
846857
bail!(
847858
"Cell {cell:?} no longer exists in task {} (index out of bounds)",
848859
ctx.get_task_description(task_id)
@@ -2457,7 +2468,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
24572468
})
24582469
}
24592470

2460-
fn try_read_own_task_cell_untracked(
2471+
fn try_read_own_task_cell(
24612472
&self,
24622473
task_id: TaskId,
24632474
cell: CellId,
@@ -3139,11 +3150,11 @@ impl<B: BackingStorage> Backend for TurboTasksBackend<B> {
31393150
&self,
31403151
task_id: TaskId,
31413152
reader: Option<TaskId>,
3142-
consistency: ReadConsistency,
3153+
options: ReadOutputOptions,
31433154
turbo_tasks: &dyn TurboTasksBackendApi<Self>,
31443155
) -> Result<Result<RawVc, EventListener>> {
31453156
self.0
3146-
.try_read_task_output(task_id, reader, consistency, turbo_tasks)
3157+
.try_read_task_output(task_id, reader, options, turbo_tasks)
31473158
}
31483159

31493160
fn try_read_task_cell(
@@ -3158,15 +3169,15 @@ impl<B: BackingStorage> Backend for TurboTasksBackend<B> {
31583169
.try_read_task_cell(task_id, reader, cell, options, turbo_tasks)
31593170
}
31603171

3161-
fn try_read_own_task_cell_untracked(
3172+
fn try_read_own_task_cell(
31623173
&self,
31633174
task_id: TaskId,
31643175
cell: CellId,
31653176
options: ReadCellOptions,
31663177
turbo_tasks: &dyn TurboTasksBackendApi<Self>,
31673178
) -> Result<TypedCellContent> {
31683179
self.0
3169-
.try_read_own_task_cell_untracked(task_id, cell, options, turbo_tasks)
3180+
.try_read_own_task_cell(task_id, cell, options, turbo_tasks)
31703181
}
31713182

31723183
fn read_task_collectibles(

turbopack/crates/turbo-tasks-testing/src/lib.rs

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use rustc_hash::FxHashMap;
1717
use tokio::sync::mpsc::Receiver;
1818
use turbo_tasks::{
1919
CellId, ExecutionId, InvalidationReason, LocalTaskId, MagicAny, RawVc, ReadCellOptions,
20-
ReadConsistency, TaskId, TaskPersistence, TraitTypeId, TurboTasksApi, TurboTasksCallApi,
20+
ReadOutputOptions, TaskId, TaskPersistence, TraitTypeId, TurboTasksApi, TurboTasksCallApi,
2121
backend::{CellContent, TaskCollectiblesMap, TypedCellContent},
2222
event::{Event, EventListener},
2323
message_queue::CompilationEvent,
@@ -176,7 +176,7 @@ impl TurboTasksApi for VcStorage {
176176
fn try_read_task_output(
177177
&self,
178178
id: TaskId,
179-
_consistency: ReadConsistency,
179+
_options: ReadOutputOptions,
180180
) -> Result<Result<RawVc, EventListener>> {
181181
let tasks = self.tasks.lock().unwrap();
182182
let i = *id - 1;
@@ -190,14 +190,6 @@ impl TurboTasksApi for VcStorage {
190190
}
191191
}
192192

193-
fn try_read_task_output_untracked(
194-
&self,
195-
task: TaskId,
196-
consistency: ReadConsistency,
197-
) -> Result<Result<RawVc, EventListener>> {
198-
self.try_read_task_output(task, consistency)
199-
}
200-
201193
fn try_read_task_cell(
202194
&self,
203195
task: TaskId,
@@ -212,23 +204,7 @@ impl TurboTasksApi for VcStorage {
212204
}
213205
.into_typed(index.type_id)))
214206
}
215-
216-
fn try_read_task_cell_untracked(
217-
&self,
218-
task: TaskId,
219-
index: CellId,
220-
_options: ReadCellOptions,
221-
) -> Result<Result<TypedCellContent, EventListener>> {
222-
let map = self.cells.lock().unwrap();
223-
Ok(Ok(if let Some(cell) = map.get(&(task, index)) {
224-
cell.to_owned()
225-
} else {
226-
Default::default()
227-
}
228-
.into_typed(index.type_id)))
229-
}
230-
231-
fn try_read_own_task_cell_untracked(
207+
fn try_read_own_task_cell(
232208
&self,
233209
current_task: TaskId,
234210
index: CellId,

turbopack/crates/turbo-tasks/src/backend.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,11 @@ use tracing::Span;
1717
use turbo_rcstr::RcStr;
1818

1919
use crate::{
20-
RawVc, ReadCellOptions, ReadRef, SharedReference, TaskId, TaskIdSet, TraitRef, TraitTypeId,
21-
TurboTasksPanic, ValueTypeId, VcRead, VcValueTrait, VcValueType,
22-
event::EventListener,
23-
macro_helpers::NativeFunction,
24-
magic_any::MagicAny,
25-
manager::{ReadConsistency, TurboTasksBackendApi},
26-
raw_vc::CellId,
27-
registry,
28-
task::shared_reference::TypedSharedReference,
29-
task_statistics::TaskStatisticsApi,
20+
RawVc, ReadCellOptions, ReadOutputOptions, ReadRef, SharedReference, TaskId, TaskIdSet,
21+
TraitRef, TraitTypeId, TurboTasksPanic, ValueTypeId, VcRead, VcValueTrait, VcValueType,
22+
event::EventListener, macro_helpers::NativeFunction, magic_any::MagicAny,
23+
manager::TurboTasksBackendApi, raw_vc::CellId, registry,
24+
task::shared_reference::TypedSharedReference, task_statistics::TaskStatisticsApi,
3025
triomphe_utils::unchecked_sidecast_triomphe_arc,
3126
};
3227

@@ -564,7 +559,7 @@ pub trait Backend: Sync + Send {
564559
&self,
565560
task: TaskId,
566561
reader: Option<TaskId>,
567-
consistency: ReadConsistency,
562+
options: ReadOutputOptions,
568563
turbo_tasks: &dyn TurboTasksBackendApi<Self>,
569564
) -> Result<Result<RawVc, EventListener>>;
570565

@@ -581,7 +576,7 @@ pub trait Backend: Sync + Send {
581576

582577
/// INVALIDATION: Be careful with this, it will not track dependencies, so
583578
/// using it could break cache invalidation.
584-
fn try_read_own_task_cell_untracked(
579+
fn try_read_own_task_cell(
585580
&self,
586581
current_task: TaskId,
587582
index: CellId,

turbopack/crates/turbo-tasks/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,14 @@ pub use join_iter_ext::{JoinIterExt, TryFlatJoinIterExt, TryJoinIterExt};
108108
pub use key_value_pair::KeyValuePair;
109109
pub use magic_any::MagicAny;
110110
pub use manager::{
111-
CurrentCellRef, ReadConsistency, TaskPersistence, TurboTasks, TurboTasksApi,
111+
CurrentCellRef, ReadConsistency, ReadTracking, TaskPersistence, TurboTasks, TurboTasksApi,
112112
TurboTasksBackendApi, TurboTasksCallApi, Unused, UpdateInfo, dynamic_call, emit, mark_finished,
113113
mark_root, mark_session_dependent, mark_stateful, prevent_gc, run, run_once,
114114
run_once_with_reason, trait_call, turbo_tasks, turbo_tasks_scope,
115115
};
116116
pub use output::OutputContent;
117117
pub use raw_vc::{CellId, RawVc, ReadRawVcFuture, ResolveTypeError};
118-
pub use read_options::ReadCellOptions;
118+
pub use read_options::{ReadCellOptions, ReadOutputOptions};
119119
pub use read_ref::ReadRef;
120120
use rustc_hash::FxHasher;
121121
pub use serialization_invalidation::SerializationInvalidator;

0 commit comments

Comments
 (0)