From 551918b0d80615d3b6abda1dec0eaae5a23e42ed Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Mon, 12 Jan 2026 00:30:14 +0100 Subject: [PATCH] refactor(engine): defer sparse trie setup to spawned task (#20942) --- .../tree/src/tree/payload_processor/mod.rs | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/crates/engine/tree/src/tree/payload_processor/mod.rs b/crates/engine/tree/src/tree/payload_processor/mod.rs index 1e4a2e1440..a9e5a961ad 100644 --- a/crates/engine/tree/src/tree/payload_processor/mod.rs +++ b/crates/engine/tree/src/tree/payload_processor/mod.rs @@ -491,38 +491,40 @@ where BPF::AccountNodeProvider: TrieNodeProvider + Send + Sync, BPF::StorageNodeProvider: TrieNodeProvider + Send + Sync, { - // Reuse a stored SparseStateTrie, or create a new one using the desired configuration if - // there's none to reuse. let cleared_sparse_trie = Arc::clone(&self.sparse_state_trie); - let sparse_state_trie = cleared_sparse_trie.lock().take().unwrap_or_else(|| { - let default_trie = SparseTrie::blind_from(if self.disable_parallel_sparse_trie { - ConfiguredSparseTrie::Serial(Default::default()) - } else { - ConfiguredSparseTrie::Parallel(Box::new( - ParallelSparseTrie::default() - .with_parallelism_thresholds(PARALLEL_SPARSE_TRIE_PARALLELISM_THRESHOLDS), - )) - }); - ClearedSparseStateTrie::from_state_trie( - SparseStateTrie::new() - .with_accounts_trie(default_trie.clone()) - .with_default_storage_trie(default_trie) - .with_updates(true), - ) - }); - - let task = - SparseTrieTask::<_, ConfiguredSparseTrie, ConfiguredSparseTrie>::new_with_cleared_trie( - sparse_trie_rx, - proof_worker_handle, - self.trie_metrics.clone(), - sparse_state_trie, - ); - + let disable_parallel_sparse_trie = self.disable_parallel_sparse_trie; + let trie_metrics = self.trie_metrics.clone(); let span = Span::current(); + self.executor.spawn_blocking(move || { let _enter = span.entered(); + // Reuse a stored SparseStateTrie, or create a new one using the desired configuration + // if there's none to reuse. + let sparse_state_trie = cleared_sparse_trie.lock().take().unwrap_or_else(|| { + let default_trie = SparseTrie::blind_from(if disable_parallel_sparse_trie { + ConfiguredSparseTrie::Serial(Default::default()) + } else { + ConfiguredSparseTrie::Parallel(Box::new( + ParallelSparseTrie::default() + .with_parallelism_thresholds(PARALLEL_SPARSE_TRIE_PARALLELISM_THRESHOLDS), + )) + }); + ClearedSparseStateTrie::from_state_trie( + SparseStateTrie::new() + .with_accounts_trie(default_trie.clone()) + .with_default_storage_trie(default_trie) + .with_updates(true), + ) + }); + + let task = SparseTrieTask::<_, ConfiguredSparseTrie, ConfiguredSparseTrie>::new_with_cleared_trie( + sparse_trie_rx, + proof_worker_handle, + trie_metrics, + sparse_state_trie, + ); + let (result, trie) = task.run(); // Send state root computation result let _ = state_root_tx.send(result);