From 08d771ad9c34d16dd1637773c02236ab351f5886 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 13 Nov 2024 21:07:30 +0100 Subject: [PATCH] [Turbopack] fix collectibles counting and aggregation (#72609) ### What? fix some bugs when counting collectibles --- .../turbo-tasks-backend/src/backend/mod.rs | 9 ++++++ .../backend/operation/aggregation_update.rs | 2 +- .../backend/operation/cleanup_old_edges.rs | 12 ++++++-- .../backend/operation/update_collectible.rs | 30 +++++++++---------- 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs index 7fb1b93de0c18..f2c6e1a7c756d 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs @@ -1280,6 +1280,15 @@ impl TurboTasksBackendInner { _ => None, }, )); + old_edges.extend(task.iter(CachedDataItemIndex::Collectibles).filter_map( + |(key, value)| match (key, value) { + ( + CachedDataItemKey::OutdatedCollectible { collectible }, + CachedDataItemValue::OutdatedCollectible { value }, + ) => Some(OutdatedEdge::Collectible(*collectible, *value)), + _ => None, + }, + )); } if self.should_track_dependencies() { old_edges.extend(task.iter(CachedDataItemIndex::Dependencies).filter_map( diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/operation/aggregation_update.rs b/turbopack/crates/turbo-tasks-backend/src/backend/operation/aggregation_update.rs index e687283101418..3b1795c0ee78c 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/operation/aggregation_update.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/operation/aggregation_update.rs @@ -146,7 +146,7 @@ impl AggregatedDataUpdate { let aggregation = get_aggregation_number(task); let mut dirty_container_count = Default::default(); let mut collectibles_update: Vec<_> = - get_many!(task, Collectible { collectible } => (*collectible, 1)); + get_many!(task, Collectible { collectible } count => (*collectible, *count)); if is_aggregating_node(aggregation) { dirty_container_count = get!(task, AggregatedDirtyContainerCount) .cloned() diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/operation/cleanup_old_edges.rs b/turbopack/crates/turbo-tasks-backend/src/backend/operation/cleanup_old_edges.rs index f0fc490613381..9dcdaa499c9ad 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/operation/cleanup_old_edges.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/operation/cleanup_old_edges.rs @@ -99,7 +99,7 @@ impl Operation for CleanupOldEdgesOperation { } OutdatedEdge::Collectible(collectible, count) => { let mut collectibles = Vec::new(); - collectibles.push((collectible, count)); + collectibles.push((collectible, -count)); outdated.retain(|e| match e { OutdatedEdge::Collectible(collectible, count) => { collectibles.push((*collectible, -*count)); @@ -108,8 +108,14 @@ impl Operation for CleanupOldEdgesOperation { _ => true, }); let mut task = ctx.task(task_id, TaskDataCategory::All); - for &(collectible, count) in collectibles.iter() { - update_count!(task, Collectible { collectible }, -count); + for (collectible, count) in collectibles.iter_mut() { + update_count!( + task, + Collectible { + collectible: *collectible + }, + *count + ); } queue.extend(AggregationUpdateJob::data_update( &mut task, diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/operation/update_collectible.rs b/turbopack/crates/turbo-tasks-backend/src/backend/operation/update_collectible.rs index 478417542a0dd..71843ed1a4c41 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/operation/update_collectible.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/operation/update_collectible.rs @@ -20,7 +20,7 @@ impl UpdateCollectibleOperation { pub fn run( task_id: TaskId, collectible: CollectibleRef, - count: i32, + mut count: i32, mut ctx: impl ExecuteContext, ) { if !ctx.should_track_children() { @@ -32,26 +32,24 @@ impl UpdateCollectibleOperation { let outdated = get!(task, OutdatedCollectible { collectible }).copied(); if let Some(outdated) = outdated { if count > 0 && outdated > 0 { - update_count!( - task, - OutdatedCollectible { collectible }, - -min(count, outdated) - ); + let shared = min(count, outdated); + update_count!(task, OutdatedCollectible { collectible }, -shared); + count -= shared; } else if count < 0 && outdated < 0 { - update_count!( - task, - OutdatedCollectible { collectible }, - min(-count, -outdated) - ); + let shared = min(-count, -outdated); + update_count!(task, OutdatedCollectible { collectible }, shared); + count += shared; } else { // Not reduced from outdated } } - update_count!(task, Collectible { collectible }, count); - queue.extend(AggregationUpdateJob::data_update( - &mut task, - AggregatedDataUpdate::new().collectibles_update(vec![(collectible, count)]), - )); + if count != 0 { + update_count!(task, Collectible { collectible }, count); + queue.extend(AggregationUpdateJob::data_update( + &mut task, + AggregatedDataUpdate::new().collectibles_update(vec![(collectible, count)]), + )); + } drop(task);