Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
338e640
feat: STaC task scaffolding
klkvr Jan 28, 2026
b3eff8f
wip
klkvr Jan 28, 2026
ee1aee0
wip
klkvr Jan 28, 2026
d9105a2
wip
klkvr Jan 28, 2026
6d6cbd6
wip
klkvr Jan 28, 2026
1ca2013
wip
klkvr Jan 28, 2026
ca13e57
feat(trie): add prune method to SparseTrieInterface
yongkangc Jan 26, 2026
4c2522f
fix(trie): reuse revealed_paths allocations and add prune metrics
yongkangc Jan 26, 2026
3ab38d4
docs: add docstrings and comments to prune and revealed_node_count fu…
yongkangc Jan 26, 2026
fa70faf
docs: simplify prune trait docstring
yongkangc Jan 26, 2026
7b96b0f
test: consolidate prune depth tests into single parameterized test
yongkangc Jan 26, 2026
df56431
docs: remove Phase prefix from prune comments
yongkangc Jan 26, 2026
8b18348
fix: remove unused ops::Not import and use ! operator consistently in…
yongkangc Jan 26, 2026
296792c
refactor(trie): extract shared leaf removal helpers
yongkangc Jan 26, 2026
62ddfa3
fix(trie): prune consistency and cleanup
yongkangc Jan 26, 2026
dbbb067
fix(trie): add prefix-free debug assertion and fix comment accuracy i…
yongkangc Jan 26, 2026
b67a1e2
fix(trie): clear revealed_paths for retained storage tries in prune
yongkangc Jan 27, 2026
cb1a2ea
refactor: introduce SparseTrieExt trait for prune method
yongkangc Jan 27, 2026
e1c27f5
refactor(trie): merge prune DFS and conversion into single pass
yongkangc Jan 27, 2026
3f9aed4
refactor(trie): remove SerialSparseTrie::prune, keep only ParallelSpa…
yongkangc Jan 27, 2026
554b926
refactor(trie): remove leaf_removal module and inline code
yongkangc Jan 27, 2026
6c7569e
chore(trie): remove redundant prune_storage_tries_retained metric
yongkangc Jan 27, 2026
93f4718
chore: remove TrieMaskExt, use simple loop for mask iteration
yongkangc Jan 27, 2026
d2dab61
refactor(trie): remove ShrinkConfig and fix prune early return bug
yongkangc Jan 27, 2026
695ff85
docs(trie): improve SparseTrieExt::prune documentation
yongkangc Jan 27, 2026
40b2e56
refactor(trie): remove prune metrics from SparseStateTrie
yongkangc Jan 27, 2026
bf8b12a
chore: remove profiling test and profile data
yongkangc Jan 27, 2026
a8627c2
perf(trie): optimize prune() with faster DFS iteration and selective …
yongkangc Jan 27, 2026
81b84ef
perf(trie): optimize prune() initialization overhead
yongkangc Jan 27, 2026
47bc996
refactor(trie): restore original leaf removal helper signatures and docs
yongkangc Jan 27, 2026
0bc1b0f
chore: revert unnecessary variable rename in SerialSparseTrie
yongkangc Jan 27, 2026
bc51f89
chore: remove prune benchmark
yongkangc Jan 27, 2026
b1f7cdf
docs: add comments to SerialSparseTrie::prune implementation
yongkangc Jan 27, 2026
98c8856
chore: address PR review comments for prune
yongkangc Jan 27, 2026
8bb7d3c
refactor: extract prune helper closures to standalone functions
yongkangc Jan 27, 2026
acde31c
perf(trie): remove parallelism from ParallelSparseTrie::prune()
yongkangc Jan 27, 2026
80c2520
fix: use sort_unstable_by_key for clippy
yongkangc Jan 27, 2026
67a5949
perf(trie): raise SparseStateTrie parallel prune threshold from 8 to 16
yongkangc Jan 27, 2026
044c8da
fix: remove redundant clones
yongkangc Jan 27, 2026
fe79f3c
refactor(trie): address PR review feedback
yongkangc Jan 28, 2026
968fb90
perf(trie): restore parallel pruning for large storage trie sets
yongkangc Jan 28, 2026
ee18503
refactor: use is_hash() helper and add docstring to revealed_node_count
yongkangc Jan 28, 2026
9c8731e
docs: add comment for DFS traversal loop in prune
yongkangc Jan 28, 2026
215e719
docs: add comment for lower subtrie node/value retention
yongkangc Jan 28, 2026
646df7c
refactor: use as_revealed_mut() instead of pattern matching
yongkangc Jan 28, 2026
39e20ab
Apply suggestion from @yongkangc
yongkangc Jan 28, 2026
ba5e2bd
fix: format and collapse if statements in prune
yongkangc Jan 28, 2026
2694062
nits
yongkangc Jan 28, 2026
0f761ba
refactor(trie): address PR review comments for prune implementation
yongkangc Jan 28, 2026
b661678
chore: remove test file
yongkangc Jan 28, 2026
fe1f32d
refactor: make is_prune_parallelism_enabled an associated function
yongkangc Jan 28, 2026
f41dc07
docs: add comment explaining prune child hash check
yongkangc Jan 28, 2026
7ce97e1
docs: simplify prune comment
yongkangc Jan 28, 2026
bcc22e9
refactor(trie): simplify lower subtrie pruning loop
yongkangc Jan 28, 2026
fbccc04
docs: add comments for prune loop skip conditions
yongkangc Jan 28, 2026
c1c7f30
docs: add comment for storage trie eviction loop
yongkangc Jan 28, 2026
860d5bb
docs: fix misleading comment about serial revealed_paths clearing
yongkangc Jan 28, 2026
4965ba4
feat(trie): add update_leaves method to SparseTrieExt
yongkangc Jan 28, 2026
bc5e23d
fix(trie): improve atomicity and correctness in update_leaves
yongkangc Jan 29, 2026
f5c36f8
feat(trie): add update_leaves to RevealableSparseTrie
yongkangc Jan 29, 2026
5da9feb
refactor(trie): remove SparseTrieExt implementation for SerialSparseTrie
yongkangc Jan 29, 2026
ac3e7f0
fix(trie): improve update_leaves atomicity and remove SerialSparseTri…
yongkangc Jan 29, 2026
9fa28f7
fix(trie): simplify update_leaves and add new leaf insert test
yongkangc Jan 29, 2026
79c2a98
refactor: restore explicit cfg blocks in is_prune_parallelism_enabled
yongkangc Jan 29, 2026
7b30eb3
fix(trie): handle NodeNotFoundInProvider as retriable error in update…
yongkangc Jan 29, 2026
ba2ac29
fix(trie): make update_leaf atomic on error
yongkangc Jan 29, 2026
3145e2a
test(trie): add atomicity assertions and edge case tests for update_l…
yongkangc Jan 29, 2026
2879977
fix(trie): improve update_leaf atomicity with full rollback support
yongkangc Jan 29, 2026
74f8379
style: clean up caps comments in update_leaves
yongkangc Jan 29, 2026
17e9920
fix: remove redundant clones in update_leaves tests
yongkangc Jan 29, 2026
a10c5f0
Merge branch 'yk/update_leaves2' into klkvr/sparse-trie-cache-update-…
klkvr Jan 29, 2026
2fe610f
revert: remove prune refactor from update_leaves PR
yongkangc Jan 29, 2026
82da216
docs: add comments to pre_validate_reveal_chain
yongkangc Jan 29, 2026
524b5e9
revert: restore original prune function behavior
yongkangc Jan 29, 2026
9fd3c4d
refactor: rename rollback_update to rollback_insert
yongkangc Jan 29, 2026
47ae746
fix: cache requested proof targets across update_leaves calls
yongkangc Jan 29, 2026
7000143
fix: add backticks for doc-markdown clippy lint
gakonst Jan 29, 2026
76fb8e9
Merge branch 'yk/update_leaves2' into klkvr/sparse-trie-cache-update-…
klkvr Jan 29, 2026
683c5c5
wip
klkvr Jan 29, 2026
ac5769e
wip
klkvr Jan 29, 2026
148695d
fix update_leaf atomicity and remove revealed tracking
mediocregopher Jan 29, 2026
a41f10b
Fix wrong paths being passed to callback
mediocregopher Jan 29, 2026
ba5d645
wip
klkvr Jan 29, 2026
76cccf4
rm tracing logs
klkvr Jan 29, 2026
1687674
fix(trie): PST: Fix update_leaf atomicity, remove update_leaves revea…
mediocregopher Jan 29, 2026
55aaa74
chore: remove cargo-chef from Dockerfile.depot (#21577)
gakonst Jan 29, 2026
1883877
Merge branch 'main' into klkvr/sparse-trie-cache-update-leaves
klkvr Jan 29, 2026
ecd39de
revert changes
klkvr Jan 29, 2026
13b2881
fixes
klkvr Jan 29, 2026
e16246c
update comment
klkvr Jan 29, 2026
7978aa6
Merge branch 'main' into klkvr/sparse-trie-cache-update-leaves
klkvr Jan 29, 2026
7251427
typos
klkvr Jan 29, 2026
9a3b84e
fix
klkvr Jan 29, 2026
ddae07f
fix
klkvr Jan 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions crates/engine/primitives/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ pub struct TreeConfig {
disable_proof_v2: bool,
/// Whether to disable cache metrics recording (can be expensive with large cached state).
disable_cache_metrics: bool,
/// Whether to enable sparse trie as cache.
enable_sparse_trie_as_cache: bool,
}

impl Default for TreeConfig {
Expand Down Expand Up @@ -181,6 +183,7 @@ impl Default for TreeConfig {
account_worker_count: default_account_worker_count(),
disable_proof_v2: false,
disable_cache_metrics: false,
enable_sparse_trie_as_cache: false,
}
}
}
Expand Down Expand Up @@ -239,6 +242,7 @@ impl TreeConfig {
account_worker_count,
disable_proof_v2,
disable_cache_metrics,
enable_sparse_trie_as_cache: false,
}
}

Expand Down Expand Up @@ -540,4 +544,15 @@ impl TreeConfig {
self.disable_cache_metrics = disable_cache_metrics;
self
}

/// Returns whether sparse trie as cache is enabled.
pub const fn enable_sparse_trie_as_cache(&self) -> bool {
self.enable_sparse_trie_as_cache
}

/// Setter for whether to enable sparse trie as cache.
pub const fn with_enable_sparse_trie_as_cache(mut self, value: bool) -> Self {
self.enable_sparse_trie_as_cache = value;
self
}
}
97 changes: 55 additions & 42 deletions crates/engine/tree/src/tree/payload_processor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ use crate::tree::{
prewarm::{PrewarmCacheTask, PrewarmContext, PrewarmMode, PrewarmTaskEvent},
sparse_trie::StateRootComputeOutcome,
},
sparse_trie::SparseTrieTask,
sparse_trie::{SparseTrieCacheTask, SparseTrieTask},
StateProviderBuilder, TreeConfig,
};
use alloy_eip7928::BlockAccessList;
use alloy_eips::eip1898::BlockWithParent;
use alloy_evm::block::StateChangeSource;
use alloy_primitives::B256;
use crossbeam_channel::Sender as CrossbeamSender;
use crossbeam_channel::{Receiver as CrossbeamReceiver, Sender as CrossbeamSender};
use executor::WorkloadExecutor;
use metrics::Counter;
use multiproof::{SparseTrieUpdate, *};
Expand All @@ -39,10 +39,7 @@ use reth_trie_parallel::{
proof_task::{ProofTaskCtx, ProofWorkerHandle},
root::ParallelStateRootError,
};
use reth_trie_sparse::{
provider::{TrieNodeProvider, TrieNodeProviderFactory},
ClearedSparseStateTrie, RevealableSparseTrie, SparseStateTrie,
};
use reth_trie_sparse::{ClearedSparseStateTrie, RevealableSparseTrie, SparseStateTrie};
use reth_trie_sparse_parallel::{ParallelSparseTrie, ParallelismThresholds};
use std::{
collections::BTreeMap,
Expand Down Expand Up @@ -283,37 +280,45 @@ where
v2_proofs_enabled,
);

let multi_proof_task = MultiProofTask::new(
proof_handle.clone(),
to_sparse_trie,
config.multiproof_chunking_enabled().then_some(config.multiproof_chunk_size()),
to_multi_proof.clone(),
from_multi_proof,
)
.with_v2_proofs_enabled(v2_proofs_enabled);
if !config.enable_sparse_trie_as_cache() {
let multi_proof_task = MultiProofTask::new(
proof_handle.clone(),
to_sparse_trie,
config.multiproof_chunking_enabled().then_some(config.multiproof_chunk_size()),
to_multi_proof.clone(),
from_multi_proof.clone(),
)
.with_v2_proofs_enabled(v2_proofs_enabled);

// spawn multi-proof task
let parent_span = span.clone();
let saved_cache = prewarm_handle.saved_cache.clone();
self.executor.spawn_blocking(move || {
let _enter = parent_span.entered();
// Build a state provider for the multiproof task
let provider = provider_builder.build().expect("failed to build provider");
let provider = if let Some(saved_cache) = saved_cache {
let (cache, metrics, _disable_metrics) = saved_cache.split();
Box::new(CachedStateProvider::new(provider, cache, metrics))
as Box<dyn StateProvider>
} else {
Box::new(provider)
};
multi_proof_task.run(provider);
});
// spawn multi-proof task
let parent_span = span.clone();
let saved_cache = prewarm_handle.saved_cache.clone();
self.executor.spawn_blocking(move || {
let _enter = parent_span.entered();
// Build a state provider for the multiproof task
let provider = provider_builder.build().expect("failed to build provider");
let provider = if let Some(saved_cache) = saved_cache {
let (cache, metrics, _disable_metrics) = saved_cache.split();
Box::new(CachedStateProvider::new(provider, cache, metrics))
as Box<dyn StateProvider>
} else {
Box::new(provider)
};
multi_proof_task.run(provider);
});
}

// wire the sparse trie to the state root response receiver
let (state_root_tx, state_root_rx) = channel();

// Spawn the sparse trie task using any stored trie and parallel trie configuration.
self.spawn_sparse_trie_task(sparse_trie_rx, proof_handle, state_root_tx);
self.spawn_sparse_trie_task(
sparse_trie_rx,
proof_handle,
state_root_tx,
from_multi_proof,
config,
);

PayloadHandle {
to_multi_proof: Some(to_multi_proof),
Expand Down Expand Up @@ -493,19 +498,18 @@ where

/// Spawns the [`SparseTrieTask`] for this payload processor.
#[instrument(level = "debug", target = "engine::tree::payload_processor", skip_all)]
fn spawn_sparse_trie_task<BPF>(
fn spawn_sparse_trie_task(
&self,
sparse_trie_rx: mpsc::Receiver<SparseTrieUpdate>,
proof_worker_handle: BPF,
proof_worker_handle: ProofWorkerHandle,
state_root_tx: mpsc::Sender<Result<StateRootComputeOutcome, ParallelStateRootError>>,
) where
BPF: TrieNodeProviderFactory + Clone + Send + Sync + 'static,
BPF::AccountNodeProvider: TrieNodeProvider + Send + Sync,
BPF::StorageNodeProvider: TrieNodeProvider + Send + Sync,
{
from_multi_proof: CrossbeamReceiver<MultiProofMessage>,
config: &TreeConfig,
) {
let cleared_sparse_trie = Arc::clone(&self.sparse_state_trie);
let trie_metrics = self.trie_metrics.clone();
let span = Span::current();
let disable_sparse_trie_as_cache = !config.enable_sparse_trie_as_cache();

self.executor.spawn_blocking(move || {
let _enter = span.entered();
Expand All @@ -525,15 +529,24 @@ where
)
});

let task =
SparseTrieTask::<_, ParallelSparseTrie, ParallelSparseTrie>::new_with_cleared_trie(
let (result, trie) = if disable_sparse_trie_as_cache {
SparseTrieTask::new_with_cleared_trie(
sparse_trie_rx,
proof_worker_handle,
trie_metrics,
sparse_state_trie,
);
)
.run()
} else {
SparseTrieCacheTask::new_with_cleared_trie(
from_multi_proof,
proof_worker_handle,
trie_metrics,
sparse_state_trie,
)
.run()
};

let (result, trie) = task.run();
// Send state root computation result
let _ = state_root_tx.send(result);

Expand Down
Loading
Loading