From aa983b49af8fddc4ef74ac7f9f7bfb78dcd98fc2 Mon Sep 17 00:00:00 2001 From: YK Date: Wed, 11 Feb 2026 14:48:48 -0500 Subject: [PATCH] perf(engine): add PrewarmMode::Skipped to avoid spawning idle workers (#22066) Co-authored-by: Amp Co-authored-by: Ubuntu --- crates/engine/tree/src/tree/payload_processor/mod.rs | 12 +++++------- .../tree/src/tree/payload_processor/prewarm.rs | 9 ++++++++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/crates/engine/tree/src/tree/payload_processor/mod.rs b/crates/engine/tree/src/tree/payload_processor/mod.rs index 5798e24576..3c7be7b5bd 100644 --- a/crates/engine/tree/src/tree/payload_processor/mod.rs +++ b/crates/engine/tree/src/tree/payload_processor/mod.rs @@ -422,7 +422,7 @@ where fn spawn_caching_with

( &self, env: ExecutionEnv, - mut transactions: mpsc::Receiver + Clone + Send + 'static>, + transactions: mpsc::Receiver + Clone + Send + 'static>, provider_builder: StateProviderBuilder, to_multi_proof: Option>, bal: Option>, @@ -431,11 +431,7 @@ where where P: BlockReader + StateProviderFactory + StateReader + Clone + 'static, { - if self.disable_transaction_prewarming { - // if no transactions should be executed we clear them but still spawn the task for - // caching updates - transactions = mpsc::channel().1; - } + let skip_prewarm = self.disable_transaction_prewarming; let saved_cache = self.disable_state_cache.not().then(|| self.cache_for(env.parent_hash)); @@ -464,7 +460,9 @@ where { let to_prewarm_task = to_prewarm_task.clone(); self.executor.spawn_blocking(move || { - let mode = if let Some(bal) = bal { + let mode = if skip_prewarm { + PrewarmMode::Skipped + } else if let Some(bal) = bal { PrewarmMode::BlockAccessList(bal) } else { PrewarmMode::Transactions(transactions) diff --git a/crates/engine/tree/src/tree/payload_processor/prewarm.rs b/crates/engine/tree/src/tree/payload_processor/prewarm.rs index 2ce8d83b3e..c0828d5c7d 100644 --- a/crates/engine/tree/src/tree/payload_processor/prewarm.rs +++ b/crates/engine/tree/src/tree/payload_processor/prewarm.rs @@ -49,13 +49,16 @@ use std::{ }; use tracing::{debug, debug_span, instrument, trace, warn, Span}; -/// Determines the prewarming mode: transaction-based or BAL-based. +/// Determines the prewarming mode: transaction-based, BAL-based, or skipped. #[derive(Debug)] pub enum PrewarmMode { /// Prewarm by executing transactions from a stream. Transactions(Receiver), /// Prewarm by prefetching slots from a Block Access List. BlockAccessList(Arc), + /// Transaction prewarming is skipped (e.g. small blocks where the overhead exceeds the + /// benefit). No workers are spawned. + Skipped, } /// A wrapper for transactions that includes their index in the block. @@ -416,6 +419,10 @@ where PrewarmMode::BlockAccessList(bal) => { self.run_bal_prewarm(bal, actions_tx); } + PrewarmMode::Skipped => { + let _ = actions_tx + .send(PrewarmTaskEvent::FinishedTxExecution { executed_transactions: 0 }); + } } let mut final_execution_outcome = None;