Skip to content

Commit 244ec4c

Browse files
authored
fix: batch rename_asset with parallel optimization (#11325)
1 parent 805363e commit 244ec4c

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

crates/rspack_core/src/compiler/compilation.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,45 @@ impl Compilation {
857857
}
858858
}
859859

860+
// Batch version of rename_asset with parallel optimization.
861+
// Multiple calls to rename_asset would cause performance degradation due to
862+
// repeated full traversals of chunk_by_ukey. This method uses parallel iteration
863+
// over chunk_by_ukey to reduce traversal frequency and improve performance.
864+
pub fn par_rename_assets(&mut self, renames: Vec<(String, String)>) {
865+
self
866+
.chunk_by_ukey
867+
.values_mut()
868+
.par_bridge()
869+
.for_each(|chunk| {
870+
for (old_name, new_name) in renames.iter() {
871+
if chunk.remove_file(old_name) {
872+
chunk.add_file(new_name.clone());
873+
}
874+
875+
if chunk.remove_auxiliary_file(old_name) {
876+
chunk.add_auxiliary_file(new_name.clone());
877+
}
878+
}
879+
});
880+
881+
for (old_name, new_name) in renames {
882+
if let Some(asset) = self.assets.remove(&old_name) {
883+
// Update related in all other assets
884+
if let Some(related_in_info) = self.assets_related_in.get(&old_name) {
885+
for related_in_name in related_in_info {
886+
if let Some(asset) = self.assets.get_mut(related_in_name) {
887+
asset.get_info_mut().related.source_map = Some(new_name.clone());
888+
}
889+
}
890+
}
891+
self.set_asset_info(&old_name, None, Some(asset.get_info()));
892+
self.set_asset_info(&new_name, Some(asset.get_info()), None);
893+
894+
self.assets.insert(new_name, asset);
895+
}
896+
}
897+
}
898+
860899
pub fn assets(&self) -> &CompilationAssets {
861900
&self.assets
862901
}

crates/rspack_plugin_real_content_hash/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ async fn inner_impl(compilation: &mut Compilation) -> Result<()> {
260260
logger.time_end(start);
261261

262262
let start = logger.time("update assets");
263+
let mut asset_renames = Vec::with_capacity(updates.len());
263264
for (name, new_source, new_name) in updates {
264265
compilation.update_asset(&name, |_, old_info| {
265266
let new_hashes: HashSet<_> = old_info
@@ -279,10 +280,12 @@ async fn inner_impl(compilation: &mut Compilation) -> Result<()> {
279280
))
280281
})?;
281282
if let Some(new_name) = new_name {
282-
compilation.rename_asset(&name, new_name);
283+
asset_renames.push((name, new_name));
283284
}
284285
}
285286

287+
compilation.par_rename_assets(asset_renames);
288+
286289
logger.time_end(start);
287290

288291
Ok(())

0 commit comments

Comments
 (0)