perf(engine): add PrewarmMode::Skipped to avoid spawning idle workers (#22066)

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Ubuntu <ubuntu@dev-yk.tail388b2e.ts.net>
This commit is contained in:
YK
2026-02-11 14:48:48 -05:00
committed by GitHub
parent 2aff617767
commit aa983b49af
2 changed files with 13 additions and 8 deletions

View File

@@ -422,7 +422,7 @@ where
fn spawn_caching_with<P>(
&self,
env: ExecutionEnv<Evm>,
mut transactions: mpsc::Receiver<impl ExecutableTxFor<Evm> + Clone + Send + 'static>,
transactions: mpsc::Receiver<impl ExecutableTxFor<Evm> + Clone + Send + 'static>,
provider_builder: StateProviderBuilder<N, P>,
to_multi_proof: Option<CrossbeamSender<MultiProofMessage>>,
bal: Option<Arc<BlockAccessList>>,
@@ -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)

View File

@@ -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<Tx> {
/// Prewarm by executing transactions from a stream.
Transactions(Receiver<Tx>),
/// Prewarm by prefetching slots from a Block Access List.
BlockAccessList(Arc<BlockAccessList>),
/// 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;