Skip to content

Commit 3345349

Browse files
authored
Deduplicate referenced_output_assets (vercel/turborepo#6191)
### Description We're chunking and outputting a multiple times for some entry points, because `references_to_output_assets` doesn't return a stable reference for empty values. It might also matter for non-empty values, but I can easily reproduce the empty ones. ### Testing Instructions <!-- Give a quick description of steps to test your changes. --> Closes WEB-1790
1 parent e39fb67 commit 3345349

File tree

4 files changed

+16
-9
lines changed

4 files changed

+16
-9
lines changed

crates/turbo-tasks/src/vc/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ where
309309
pub async fn debug_identifier(vc: Self) -> Result<String> {
310310
let resolved = vc.resolve().await?;
311311
let raw_vc: RawVc = resolved.node;
312-
if let RawVc::TaskCell(_, CellId { type_id, index }) = raw_vc {
312+
if let RawVc::TaskCell(task_id, CellId { type_id, index }) = raw_vc {
313313
let value_ty = registry::get_value_type(type_id);
314-
Ok(format!("{}#{}", value_ty.name, index))
314+
Ok(format!("{}#{}: {}", value_ty.name, index, task_id))
315315
} else {
316316
unreachable!()
317317
}

crates/turbopack-core/src/chunk/chunk_group.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use super::{
1111
chunk_content, chunking::make_chunks, AsyncModuleInfo, Chunk, ChunkContentResult, ChunkItem,
1212
ChunkingContext,
1313
};
14-
use crate::{module::Module, output::OutputAsset, reference::ModuleReference};
14+
use crate::{module::Module, output::OutputAssets, reference::ModuleReference};
1515

1616
pub struct MakeChunkGroupResult {
1717
pub chunks: Vec<Vc<Box<dyn Chunk>>>,
@@ -169,7 +169,7 @@ pub async fn make_chunk_group(
169169

170170
async fn references_to_output_assets(
171171
references: IndexSet<Vc<Box<dyn ModuleReference>>>,
172-
) -> Result<Vec<Vc<Box<dyn OutputAsset>>>> {
172+
) -> Result<Vc<OutputAssets>> {
173173
let output_assets = references
174174
.into_iter()
175175
.map(|reference| reference.resolve_reference().primary_output_assets())
@@ -182,5 +182,9 @@ async fn references_to_output_assets(
182182
.copied()
183183
.filter(|&asset| set.insert(asset))
184184
.collect::<Vec<_>>();
185-
Ok(output_assets)
185+
Ok(if output_assets.is_empty() {
186+
OutputAssets::empty()
187+
} else {
188+
OutputAssets::new(output_assets)
189+
})
186190
}

crates/turbopack-core/src/chunk/chunking.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use tracing::Level;
1313
use turbo_tasks::{ReadRef, TryJoinIterExt, ValueToString, Vc};
1414

1515
use super::{AsyncModuleInfo, Chunk, ChunkItem, ChunkType, ChunkingContext};
16-
use crate::output::{OutputAsset, OutputAssets};
16+
use crate::output::OutputAssets;
1717

1818
/// Creates chunks based on heuristics for the passed `chunk_items`. Also
1919
/// attaches `referenced_output_assets` to the first chunk.
@@ -22,7 +22,7 @@ pub async fn make_chunks(
2222
chunking_context: Vc<Box<dyn ChunkingContext>>,
2323
chunk_items: impl IntoIterator<Item = (Vc<Box<dyn ChunkItem>>, Option<Vc<AsyncModuleInfo>>)>,
2424
key_prefix: &str,
25-
referenced_output_assets: Vec<Vc<Box<dyn OutputAsset>>>,
25+
mut referenced_output_assets: Vc<OutputAssets>,
2626
) -> Result<Vec<Vc<Box<dyn Chunk>>>> {
2727
let chunk_items = chunk_items
2828
.into_iter()
@@ -37,8 +37,6 @@ pub async fn make_chunks(
3737
map.entry(ty).or_default().push((chunk_item, async_info));
3838
}
3939

40-
let mut referenced_output_assets = Vc::cell(referenced_output_assets);
41-
4240
let mut chunks = Vec::new();
4341
for (ty, chunk_items) in map {
4442
let ty_name = ty.to_string().await?;

crates/turbopack-core/src/output.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ pub struct OutputAssets(Vec<Vc<Box<dyn OutputAsset>>>);
2323

2424
#[turbo_tasks::value_impl]
2525
impl OutputAssets {
26+
#[turbo_tasks::function]
27+
pub fn new(assets: Vec<Vc<Box<dyn OutputAsset>>>) -> Vc<Self> {
28+
Vc::cell(assets)
29+
}
30+
2631
#[turbo_tasks::function]
2732
pub fn empty() -> Vc<Self> {
2833
Vc::cell(vec![])

0 commit comments

Comments
 (0)