Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
9883b71
feat(trie): add disjoint_by_keys for sorted overlays
mediocregopher Apr 16, 2026
037828f
feat(stages): add partial finish checkpoint field
mediocregopher Apr 16, 2026
b97544a
feat(stages): move partial trie progress into finish checkpoint
mediocregopher Apr 16, 2026
761acad
fix(node): unwind startup to partial trie checkpoint
mediocregopher Apr 16, 2026
e2bd518
refactor(provider): simplify save_blocks trie masking API
mediocregopher Apr 16, 2026
84b5205
docs(provider): explain save_blocks trie masking range
mediocregopher Apr 16, 2026
ca35283
fix(engine): raise persistence defaults
mediocregopher Apr 17, 2026
9e38dde
fix(provider): persist partial trie finish checkpoint
mediocregopher Apr 17, 2026
ca20cc1
fix(engine): retain partial trie suffix after persistence
mediocregopher Apr 17, 2026
c757a31
feat(engine): add dual-frontier persistence planning
mediocregopher Apr 17, 2026
be4e8cd
refactor(chain-state): derive lazy overlay anchor from blocks
mediocregopher Apr 20, 2026
cacb69a
refactor(chain-state): address lazy overlay review feedback
mediocregopher Apr 20, 2026
ebfaa6f
refactor(chain-state): cache lazy overlays by anchor
mediocregopher Apr 20, 2026
5041d55
refactor(provider): resolve lazy overlay anchors at use time
mediocregopher Apr 20, 2026
812e479
refactor(provider): separate overlay anchors from revert state
mediocregopher Apr 20, 2026
5036eb5
refactor(provider): infer overlay anchors from sources
mediocregopher Apr 20, 2026
b5ad001
refactor(provider): thread explicit requested anchors
mediocregopher Apr 20, 2026
d92ad5a
fix(provider): anchor overlay state providers by hash
mediocregopher Apr 21, 2026
134a7f3
fix(provider): pass overlay anchors via constructor
mediocregopher Apr 21, 2026
7db14d0
fix(engine): anchor state-root test overlay factory
mediocregopher Apr 21, 2026
45db5e0
fix(trie): initialize test overlay anchors
mediocregopher Apr 21, 2026
ffb0587
fix(provider): satisfy overlay lint checks
mediocregopher Apr 21, 2026
87b5240
Merge branch 'main' into mediocregopher/lazyoverlay-refactor
mediocregopher Apr 22, 2026
d5169ed
fix(engine): update sparse trie overlay factory test
mediocregopher Apr 22, 2026
c4d0949
style(engine): format sparse trie overlay test
mediocregopher Apr 22, 2026
6e8dbe3
Merge branch 'main' into mediocregopher/lazyoverlay-refactor
mediocregopher Apr 23, 2026
b60758e
fix(trie): remove unused parallel test dependency
mediocregopher Apr 24, 2026
31d0c78
fix(ci): clean bench checkouts and lock cargo builds
mediocregopher Apr 24, 2026
b6eec2e
refactor(provider): require overlay builder anchor hash
mediocregopher Apr 24, 2026
843b5a8
merge(engine): bring lazy overlay refactor into partial persistence
mediocregopher Apr 27, 2026
743d42f
fix(provider): anchor overlay state providers to trie frontier
mediocregopher Apr 27, 2026
5d40190
fix(provider): stop masking trie writes with in-memory suffix
mediocregopher Apr 27, 2026
0d19b17
fix(provider): preserve partial trie frontier across overlay and unwind
mediocregopher Apr 27, 2026
8248aa2
chore: merge origin/main
mediocregopher Apr 27, 2026
d9d3f69
fix(engine): wire deferred trie persistence config
mediocregopher Apr 27, 2026
adf2930
refactor(engine): split partial persistence frontiers
mediocregopher Apr 28, 2026
e71cf30
fix(provider): preserve masked persistence frontier state
mediocregopher Apr 28, 2026
baf6ef9
Revert "fix(provider): preserve masked persistence frontier state"
mediocregopher Apr 28, 2026
5ab335d
refactor(provider): drive save_blocks from plan steps
mediocregopher Apr 28, 2026
4b4a1b8
fix(trie): mask storage entries in disjoint merges
mediocregopher Apr 28, 2026
c07e228
fix(provider): clamp partial trie unwind during reorgs
mediocregopher Apr 29, 2026
f3e4ad7
chore(provider): add save_blocks persistence debug logging
mediocregopher Apr 30, 2026
b5c4e04
fix(trie): keep masked ancestors of unmasked nodes
mediocregopher Apr 30, 2026
411e65c
fix(trie): keep masked storage ancestors of unmasked nodes
mediocregopher Apr 30, 2026
0891a45
Merge remote-tracking branch 'origin/main' into mediocregopher/partia…
mediocregopher May 1, 2026
1598784
test: add hoodi partial persistence repro script
mediocregopher May 1, 2026
d11b02b
test: harden hoodi partial persistence repro script
mediocregopher May 1, 2026
c0a8e82
test: capture unwind trace logs in hoodi repro
mediocregopher May 1, 2026
f680db7
fix(scripts): pipe hoodi unwind traces to artifacts
mediocregopher May 1, 2026
b810c77
feat(scripts): add merkle trace touch extractor
mediocregopher May 1, 2026
02044b5
fix(scripts): use profiling binaries for hoodi repro
mediocregopher May 2, 2026
858e6c2
fix(scripts): capture full merkle trace logs
mediocregopher May 4, 2026
231b4f4
fix(trie): simplify merkle trace DB comparer
mediocregopher May 4, 2026
c7d9fd6
fix(trie): stop tracing post-drop merkle rebuild
mediocregopher May 4, 2026
3c667b1
chore(provider): improve save_blocks trie debug logging
mediocregopher May 4, 2026
ecbf6ba
fix(trie): preserve equivalent masked trie nodes
mediocregopher May 4, 2026
9040aae
fix(scripts): make Hoodi persistence repro marker detection robust
mediocregopher May 4, 2026
72b0666
fix(scripts): randomize Hoodi crash target block
mediocregopher May 4, 2026
f9e3da0
feat(trie): add walker option for matching branch children
mediocregopher May 5, 2026
3fab9bf
refactor(trie): rename walker branch child option
mediocregopher May 5, 2026
91c25f4
feat(stages): enable full changed-branch walks during merkle unwind
mediocregopher May 5, 2026
8db3ac6
fix(trie): simplify disjointed merge masking
mediocregopher May 5, 2026
eb2c8b8
Merge remote-tracking branch 'origin/main' into mediocregopher/partia…
mediocregopher May 5, 2026
a0dc39c
test(scripts): add hoodi reorg repro
mediocregopher May 5, 2026
636d8f7
chore(engine): log overlay construction details
mediocregopher May 5, 2026
92e4a15
fix(provider): revert overlays from finish frontier
mediocregopher May 6, 2026
6e597b5
fix(provider): reject overlays ahead of partial trie
mediocregopher May 6, 2026
33f55b9
chore(engine): log payload builder overlay frontiers
mediocregopher May 6, 2026
53a6b9f
fix(provider): allow lazy overlays from partial trie
mediocregopher May 6, 2026
a27db17
chore(engine): log payload builder state providers
mediocregopher May 6, 2026
4f1f8e3
chore(scripts): capture provider overlay logs
mediocregopher May 6, 2026
08e61b1
fix(scripts): narrow reorg mismatch detection
mediocregopher May 6, 2026
ad06261
chore: expand overlay repro logging
mediocregopher May 6, 2026
6e574bf
chore: add Hoodi reorg diagnostics
mediocregopher May 7, 2026
70f157c
Merge origin/main into pr-23592
mediocregopher May 7, 2026
eb3f527
fix(reth-bench): preserve replay payload topology
mediocregopher May 8, 2026
3327f0d
chore: replay Hoodi reorg artifacts in repro script
mediocregopher May 8, 2026
694b6b4
fix(engine): catch up trie state before disk reorg removal
mediocregopher May 10, 2026
c9becdd
chore(engine): remove partial persistence debug artifacts
mediocregopher May 10, 2026
cf3f528
Merge origin/main into partial persistence cleanup
mediocregopher May 10, 2026
c7b4582
chore(engine): tidy origin main merge
mediocregopher May 10, 2026
69a6469
chore(engine): remove guarded debug tracing
mediocregopher May 10, 2026
e55fc9a
fix(engine): rename state masking CLI flag
mediocregopher May 11, 2026
0644ee6
fix(engine): simplify disk reorg truncation
mediocregopher May 11, 2026
d2c03c8
Merge origin/main into partial persistence cleanup
mediocregopher May 12, 2026
8e5bc8d
Merge remote-tracking branch 'origin/main' into mediocregopher/partia…
May 12, 2026
00d526e
fix(engine): cap partial persistence plan by threshold
mediocregopher May 12, 2026
82c2106
Merge origin/main into partial persistence branch
mediocregopher May 12, 2026
d7e1684
Merge origin/main into partial persistence branch
mediocregopher May 12, 2026
f28d145
Merge remote-tracking branch 'origin/main' into mediocregopher/partia…
May 18, 2026
1d285fe
fix(engine): restore partial persistence merge logic
May 18, 2026
f36848f
fix(engine): restore partial persistence overlays
May 18, 2026
dbf7656
fix(engine): keep partial persistence rest frontier moving
May 19, 2026
519750e
fix engine backpressure default parsing
decofe May 19, 2026
c9faab4
fix(engine): adjust backpressure default parsing
May 19, 2026
d04eef4
docs: update generated cli reference
May 19, 2026
2b3988e
Merge remote-tracking branch 'origin/pr/24334' into mediocregopher/pa…
May 19, 2026
fd59fd2
Merge remote-tracking branch 'origin/main' into mediocregopher/partia…
May 19, 2026
6e4a0ae
Merge branch 'main' of https://github.com/paradigmxyz/reth into medio…
May 27, 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
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 1 addition & 3 deletions crates/chain-state/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ reth-metrics.workspace = true
reth-ethereum-primitives.workspace = true
reth-primitives-traits = { workspace = true, features = ["dashmap"] }
reth-storage-api.workspace = true
reth-tasks = { workspace = true, features = ["rayon"], optional = true }
reth-trie.workspace = true

# ethereum
Expand Down Expand Up @@ -84,6 +83,5 @@ test-utils = [
"reth-primitives-traits/test-utils",
"reth-trie/test-utils",
"reth-ethereum-primitives/test-utils",
"reth-tasks?/test-utils",
]
rayon = ["dep:rayon", "dep:reth-tasks"]
rayon = ["dep:rayon"]
848 changes: 786 additions & 62 deletions crates/chain-state/src/deferred_trie.rs

Large diffs are not rendered by default.

46 changes: 38 additions & 8 deletions crates/chain-state/src/in_memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ use reth_primitives_traits::{
SignedTransaction,
};
use reth_storage_api::StateProviderBox;
use reth_trie::{updates::TrieUpdatesSorted, HashedPostStateSorted, LazyTrieData, SortedTrieData};
use reth_trie::{
updates::TrieUpdatesSorted, HashedPostStateSorted, LazyTrieData, SortedTrieData,
TrieInputSorted,
};
use std::{collections::BTreeMap, sync::Arc, time::Instant};
use tokio::sync::{broadcast, watch};

Expand Down Expand Up @@ -317,6 +320,19 @@ impl<N: NodePrimitives> CanonicalInMemoryState<N> {
/// This will update the links between blocks and remove all blocks that are [..
/// `persisted_height`].
pub fn remove_persisted_blocks(&self, persisted_num_hash: BlockNumHash) {
self.remove_persisted_blocks_until(persisted_num_hash, persisted_num_hash.number);
}

/// Removes blocks from the in-memory state through `remove_until` while still reporting the
/// provided block as the persisted tip.
///
/// This is used when block bodies/plain state have been persisted further than trie data, so a
/// suffix still needs to remain in memory for trie-backed operations.
pub fn remove_persisted_blocks_until(
&self,
persisted_num_hash: BlockNumHash,
remove_until: BlockNumber,
) {
self.set_persisted(persisted_num_hash);
// if the persisted hash is not in the canonical in memory state, do nothing, because it
// means canonical blocks were not actually persisted.
Expand All @@ -334,16 +350,15 @@ impl<N: NodePrimitives> CanonicalInMemoryState<N> {
let mut numbers = self.inner.in_memory_state.numbers.write();
let mut blocks = self.inner.in_memory_state.blocks.write();

let BlockNumHash { number: persisted_height, hash: _ } = persisted_num_hash;
let remove_until = remove_until.min(persisted_num_hash.number);

// clear all numbers
numbers.clear();

// drain all blocks and only keep the ones that are not persisted (below the persisted
// height)
// Drain all blocks and keep only the suffix that still has to stay in memory.
let mut old_blocks = blocks
.drain()
.filter(|(_, b)| b.block_ref().recovered_block().number() > persisted_height)
.filter(|(_, b)| b.block_ref().recovered_block().number() > remove_until)
.map(|(_, b)| b.block.clone())
.collect::<Vec<_>>();

Expand Down Expand Up @@ -803,9 +818,10 @@ impl<N: NodePrimitives> ExecutedBlock<N> {
/// This is useful if the trie data is populated somewhere else, e.g. asynchronously
/// after the block was validated.
///
/// The [`DeferredTrieData`] handle allows expensive trie operations (sorting hashed state and
/// trie updates) to be performed outside the critical validation path. This can improve latency
/// for time-sensitive operations like block validation.
/// The [`DeferredTrieData`] handle allows expensive trie operations (sorting hashed state,
/// sorting trie updates, and building the accumulated trie input overlay) to be performed
/// outside the critical validation path. This can improve latency for time-sensitive
/// operations like block validation.
///
/// If the data hasn't been populated when [`Self::trie_data()`] is called, computation
/// occurs synchronously from stored inputs, so there is no blocking or deadlock risk.
Expand Down Expand Up @@ -874,6 +890,20 @@ impl<N: NodePrimitives> ExecutedBlock<N> {
self.trie_data().trie_updates
}

/// Returns the trie input anchored to the persisted ancestor.
///
/// May compute trie data synchronously if the deferred task hasn't completed.
#[inline]
pub fn trie_input(&self) -> Option<Arc<TrieInputSorted>> {
self.trie_data().trie_input().cloned()
}

/// Returns the anchor hash of the trie input, if present.
#[inline]
pub fn anchor_hash(&self) -> Option<B256> {
self.trie_data().anchor_hash()
}

/// Returns a [`BlockNumber`] of the block.
#[inline]
pub fn block_number(&self) -> BlockNumber {
Expand Down
Loading
Loading