Skip to content

Commit 78a802c

Browse files
authored
Turbopack: Avoid that session-dependent tasks write to DB on every build (#86068)
### What? Refactor session-dependent tasks to avoid session ids. This way session-dependent tasks no longer "change" on very run and dump duplicate data into the database.
1 parent 32dd056 commit 78a802c

File tree

9 files changed

+115
-260
lines changed

9 files changed

+115
-260
lines changed

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

Lines changed: 33 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ use tokio::time::{Duration, Instant};
2727
use tracing::{Span, trace_span};
2828
use turbo_tasks::{
2929
CellId, FxDashMap, FxIndexMap, KeyValuePair, RawVc, ReadCellOptions, ReadConsistency,
30-
ReadOutputOptions, ReadTracking, SessionId, TRANSIENT_TASK_BIT, TaskExecutionReason, TaskId,
31-
TraitTypeId, TurboTasksBackendApi, ValueTypeId,
30+
ReadOutputOptions, ReadTracking, TRANSIENT_TASK_BIT, TaskExecutionReason, TaskId, TraitTypeId,
31+
TurboTasksBackendApi, ValueTypeId,
3232
backend::{
3333
Backend, CachedTaskType, CellContent, TaskExecutionSpec, TransientTaskRoot,
3434
TransientTaskType, TurboTasksExecutionError, TypedCellContent, VerificationMode,
@@ -180,7 +180,6 @@ struct TurboTasksBackendInner<B: BackingStorage> {
180180
options: BackendOptions,
181181

182182
start_time: Instant,
183-
session_id: SessionId,
184183

185184
persisted_task_id_factory: IdFactoryWithReuse<TaskId>,
186185
transient_task_id_factory: IdFactoryWithReuse<TaskId>,
@@ -254,9 +253,6 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
254253
Self {
255254
options,
256255
start_time: Instant::now(),
257-
session_id: backing_storage
258-
.next_session_id()
259-
.expect("Failed get session id"),
260256
persisted_task_id_factory: IdFactoryWithReuse::new(
261257
next_task_id,
262258
TaskId::try_from(TRANSIENT_TASK_BIT - 1).unwrap(),
@@ -295,10 +291,6 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
295291
ExecuteContextImpl::new(self, turbo_tasks)
296292
}
297293

298-
fn session_id(&self) -> SessionId {
299-
self.session_id
300-
}
301-
302294
/// # Safety
303295
///
304296
/// `tx` must be a transaction from this TurboTasksBackendInner instance.
@@ -567,10 +559,10 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
567559
}
568560
}
569561

570-
let is_dirty = task.is_dirty(self.session_id);
562+
let is_dirty = task.is_dirty();
571563

572564
// Check the dirty count of the root node
573-
let has_dirty_containers = task.has_dirty_containers(self.session_id);
565+
let has_dirty_containers = task.has_dirty_containers();
574566
if has_dirty_containers || is_dirty {
575567
let activeness = get_mut!(task, Activeness);
576568
let mut task_ids_to_schedule: Vec<_> = Vec::new();
@@ -589,7 +581,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
589581
.set_active_until_clean();
590582
if ctx.should_track_activeness() {
591583
// A newly added Activeness need to make sure to schedule the tasks
592-
task_ids_to_schedule = task.dirty_containers(self.session_id).collect();
584+
task_ids_to_schedule = task.dirty_containers().collect();
593585
task_ids_to_schedule.push(task_id);
594586
}
595587
get!(task, Activeness).unwrap()
@@ -613,7 +605,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
613605
visited: &mut FxHashSet<TaskId>,
614606
) -> String {
615607
let task = ctx.task(task_id, TaskDataCategory::All);
616-
let is_dirty = task.is_dirty(ctx.session_id());
608+
let is_dirty = task.is_dirty();
617609
let in_progress =
618610
get!(task, InProgress).map_or("not in progress", |p| match p {
619611
InProgressState::InProgress(_) => "in progress",
@@ -634,7 +626,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
634626
};
635627

636628
// Check the dirty count of the root node
637-
let has_dirty_containers = task.has_dirty_containers(ctx.session_id());
629+
let has_dirty_containers = task.has_dirty_containers();
638630

639631
let task_description = ctx.get_task_description(task_id);
640632
let is_dirty_label = if is_dirty { ", dirty" } else { "" };
@@ -653,8 +645,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
653645
{in_progress}, \
654646
{activeness}{is_dirty_label}{has_dirty_containers_label})",
655647
);
656-
let children: Vec<_> =
657-
task.dirty_containers_with_count(ctx.session_id()).collect();
648+
let children: Vec<_> = task.dirty_containers_with_count().collect();
658649
drop(task);
659650

660651
if missing_upper {
@@ -1197,7 +1188,6 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
11971188
let _span = tracing::info_span!(parent: parent_span, "persist", reason = reason).entered();
11981189
{
11991190
if let Err(err) = self.backing_storage.save_snapshot(
1200-
self.session_id,
12011191
suspended_operations,
12021192
persisted_task_cache_log,
12031193
task_snapshots,
@@ -2365,32 +2355,21 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
23652355

23662356
// Grab the old dirty state
23672357
let old_dirtyness = get!(task, Dirty).cloned();
2368-
let (old_self_dirty, old_current_session_self_clean, old_clean_in_session) =
2369-
match old_dirtyness {
2370-
None => (false, false, None),
2371-
Some(Dirtyness::Dirty) => (true, false, None),
2372-
Some(Dirtyness::SessionDependent) => {
2373-
let clean_in_session = get!(task, CleanInSession).copied();
2374-
(
2375-
true,
2376-
clean_in_session == Some(self.session_id),
2377-
clean_in_session,
2378-
)
2379-
}
2380-
};
2358+
let (old_self_dirty, old_current_session_self_clean) = match old_dirtyness {
2359+
None => (false, false),
2360+
Some(Dirtyness::Dirty) => (true, false),
2361+
Some(Dirtyness::SessionDependent) => {
2362+
let clean_in_current_session = get!(task, CurrentSessionClean).is_some();
2363+
(true, clean_in_current_session)
2364+
}
2365+
};
23812366

23822367
// Compute the new dirty state
2383-
let (new_dirtyness, new_clean_in_session, new_self_dirty, new_current_session_self_clean) =
2384-
if session_dependent {
2385-
(
2386-
Some(Dirtyness::SessionDependent),
2387-
Some(self.session_id),
2388-
true,
2389-
true,
2390-
)
2391-
} else {
2392-
(None, None, false, false)
2393-
};
2368+
let (new_dirtyness, new_self_dirty, new_current_session_self_clean) = if session_dependent {
2369+
(Some(Dirtyness::SessionDependent), true, true)
2370+
} else {
2371+
(None, false, false)
2372+
};
23942373

23952374
// Update the dirty state
23962375
if old_dirtyness != new_dirtyness {
@@ -2400,11 +2379,11 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
24002379
task.remove(&CachedDataItemKey::Dirty {});
24012380
}
24022381
}
2403-
if old_clean_in_session != new_clean_in_session {
2404-
if let Some(session_id) = new_clean_in_session {
2405-
task.insert(CachedDataItem::CleanInSession { value: session_id });
2406-
} else if old_clean_in_session.is_some() {
2407-
task.remove(&CachedDataItemKey::CleanInSession {});
2382+
if old_current_session_self_clean != new_current_session_self_clean {
2383+
if new_current_session_self_clean {
2384+
task.insert(CachedDataItem::CurrentSessionClean { value: () });
2385+
} else if old_current_session_self_clean {
2386+
task.remove(&CachedDataItemKey::CurrentSessionClean {});
24082387
}
24092388
}
24102389

@@ -2415,14 +2394,10 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
24152394
let dirty_container_count = get!(task, AggregatedDirtyContainerCount)
24162395
.cloned()
24172396
.unwrap_or_default();
2418-
let current_session_clean_container_count = get!(
2419-
task,
2420-
AggregatedSessionDependentCleanContainerCount {
2421-
session_id: self.session_id
2422-
}
2423-
)
2424-
.copied()
2425-
.unwrap_or_default();
2397+
let current_session_clean_container_count =
2398+
get!(task, AggregatedCurrentSessionCleanContainerCount)
2399+
.copied()
2400+
.unwrap_or_default();
24262401
let result = ComputeDirtyAndCleanUpdate {
24272402
old_dirty_container_count: dirty_container_count,
24282403
new_dirty_container_count: dirty_container_count,
@@ -2914,8 +2889,8 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
29142889

29152890
let mut ctx = self.execute_context(turbo_tasks);
29162891
let mut task = ctx.task(task_id, TaskDataCategory::All);
2917-
let is_dirty = task.is_dirty(self.session_id);
2918-
let has_dirty_containers = task.has_dirty_containers(self.session_id);
2892+
let is_dirty = task.is_dirty();
2893+
let has_dirty_containers = task.has_dirty_containers();
29192894
if is_dirty || has_dirty_containers {
29202895
if let Some(activeness_state) = get_mut!(task, Activeness) {
29212896
// We will finish the task, but it would be removed after the task is done
@@ -3005,7 +2980,7 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
30052980
}
30062981

30072982
let is_dirty = get!(task, Dirty).is_some();
3008-
let has_dirty_container = task.has_dirty_containers(self.session_id);
2983+
let has_dirty_container = task.has_dirty_containers();
30092984
let should_be_in_upper = is_dirty || has_dirty_container;
30102985

30112986
let aggregation_number = get_aggregation_number(&task);

0 commit comments

Comments
 (0)