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;