Skip to content

Commit 389ca28

Browse files
committed
node iter seek metrics
1 parent 5f80a1d commit 389ca28

File tree

5 files changed

+50
-11
lines changed

5 files changed

+50
-11
lines changed

crates/trie/parallel/src/proof.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use reth_provider::{
1919
use reth_storage_errors::db::DatabaseError;
2020
use reth_trie::{
2121
hashed_cursor::{HashedCursorFactory, HashedPostStateCursorFactory},
22-
node_iter::{TrieElement, TrieNodeIter},
22+
node_iter::{TrieElement, TrieNodeIter, TrieNodeIterType},
2323
prefix_set::{PrefixSetMut, TriePrefixSetsMut},
2424
proof::StorageProof,
2525
trie_cursor::{InMemoryTrieCursorFactory, TrieCursorFactory},
@@ -183,6 +183,7 @@ where
183183
let mut account_node_iter = TrieNodeIter::new(
184184
walker,
185185
hashed_cursor_factory.hashed_account_cursor().map_err(ProviderError::Database)?,
186+
TrieNodeIterType::Account,
186187
);
187188
while let Some(account_node) =
188189
account_node_iter.try_next().map_err(ProviderError::Database)?

crates/trie/parallel/src/root.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use reth_provider::{
1212
use reth_storage_errors::db::DatabaseError;
1313
use reth_trie::{
1414
hashed_cursor::{HashedCursorFactory, HashedPostStateCursorFactory},
15-
node_iter::{TrieElement, TrieNodeIter},
15+
node_iter::{TrieElement, TrieNodeIter, TrieNodeIterType},
1616
trie_cursor::{InMemoryTrieCursorFactory, TrieCursorFactory},
1717
updates::TrieUpdates,
1818
walker::TrieWalker,
@@ -153,6 +153,7 @@ where
153153
let mut account_node_iter = TrieNodeIter::new(
154154
walker,
155155
hashed_cursor_factory.hashed_account_cursor().map_err(ProviderError::Database)?,
156+
TrieNodeIterType::Account,
156157
);
157158

158159
let mut hash_builder = HashBuilder::default().with_updates(retain_updates);

crates/trie/trie/src/node_iter.rs

+33-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::{hashed_cursor::HashedCursor, trie_cursor::TrieCursor, walker::TrieWalker, Nibbles};
22
use alloy_primitives::B256;
3+
use metrics::Counter;
4+
use reth_metrics::Metrics;
35
use reth_storage_errors::db::DatabaseError;
46

57
/// Represents a branch node in the trie.
@@ -49,11 +51,13 @@ pub struct TrieNodeIter<C, H: HashedCursor> {
4951
current_hashed_entry: Option<(B256, <H as HashedCursor>::Value)>,
5052
/// Flag indicating whether we should check the current walker key.
5153
current_walker_key_checked: bool,
54+
55+
metrics: NodeIterMetrics,
5256
}
5357

5458
impl<C, H: HashedCursor> TrieNodeIter<C, H> {
5559
/// Creates a new [`TrieNodeIter`].
56-
pub const fn new(walker: TrieWalker<C>, hashed_cursor: H) -> Self {
60+
pub fn new(walker: TrieWalker<C>, hashed_cursor: H, node_iter_type: TrieNodeIterType) -> Self {
5761
Self {
5862
walker,
5963
hashed_cursor,
@@ -62,6 +66,7 @@ impl<C, H: HashedCursor> TrieNodeIter<C, H> {
6266
hashed_cursor_next: false,
6367
current_hashed_entry: None,
6468
current_walker_key_checked: false,
69+
metrics: NodeIterMetrics::new_with_labels(&[("type", node_iter_type.as_str())]),
6570
}
6671
}
6772

@@ -118,6 +123,8 @@ where
118123
} else {
119124
self.current_hashed_entry = entry;
120125
}
126+
127+
self.metrics.hashed_cursor_seeks.increment(1);
121128
}
122129

123130
// If there's a hashed entry...
@@ -158,3 +165,28 @@ where
158165
Ok(None)
159166
}
160167
}
168+
169+
/// The type of the node iter.
170+
#[derive(Debug)]
171+
pub enum TrieNodeIterType {
172+
/// The node iter for the account trie.
173+
Account,
174+
/// The node iter for the storage trie.
175+
Storage,
176+
}
177+
178+
impl TrieNodeIterType {
179+
fn as_str(&self) -> &'static str {
180+
match self {
181+
Self::Account => "account",
182+
Self::Storage => "storage",
183+
}
184+
}
185+
}
186+
187+
#[derive(Metrics)]
188+
#[metrics(scope = "trie.node_iter")]
189+
struct NodeIterMetrics {
190+
/// The number of times the hashed cursor was seeked.
191+
pub hashed_cursor_seeks: Counter,
192+
}

crates/trie/trie/src/proof/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
hashed_cursor::{HashedCursorFactory, HashedStorageCursor},
3-
node_iter::{TrieElement, TrieNodeIter},
3+
node_iter::{TrieElement, TrieNodeIter, TrieNodeIterType},
44
prefix_set::{PrefixSetMut, TriePrefixSetsMut},
55
trie_cursor::TrieCursorFactory,
66
walker::TrieWalker,
@@ -124,7 +124,8 @@ where
124124
let mut storages: B256Map<_> =
125125
targets.keys().map(|key| (*key, StorageMultiProof::empty())).collect();
126126
let mut account_rlp = Vec::with_capacity(TRIE_ACCOUNT_RLP_MAX_SIZE);
127-
let mut account_node_iter = TrieNodeIter::new(walker, hashed_account_cursor);
127+
let mut account_node_iter =
128+
TrieNodeIter::new(walker, hashed_account_cursor, TrieNodeIterType::Account);
128129
while let Some(account_node) = account_node_iter.try_next()? {
129130
match account_node {
130131
TrieElement::Branch(node) => {
@@ -288,7 +289,8 @@ where
288289
let mut hash_builder = HashBuilder::default()
289290
.with_proof_retainer(retainer)
290291
.with_updates(self.collect_branch_node_masks);
291-
let mut storage_node_iter = TrieNodeIter::new(walker, hashed_storage_cursor);
292+
let mut storage_node_iter =
293+
TrieNodeIter::new(walker, hashed_storage_cursor, TrieNodeIterType::Storage);
292294
while let Some(node) = storage_node_iter.try_next()? {
293295
match node {
294296
TrieElement::Branch(node) => {

crates/trie/trie/src/trie.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
hashed_cursor::{HashedCursorFactory, HashedStorageCursor},
3-
node_iter::{TrieElement, TrieNodeIter},
3+
node_iter::{TrieElement, TrieNodeIter, TrieNodeIterType},
44
prefix_set::{PrefixSet, TriePrefixSets},
55
progress::{IntermediateStateRootState, StateRootProgress},
66
stats::TrieTracker,
@@ -165,15 +165,17 @@ where
165165
self.prefix_sets.account_prefix_set,
166166
)
167167
.with_deletions_retained(retain_updates);
168-
let node_iter = TrieNodeIter::new(walker, hashed_account_cursor)
169-
.with_last_hashed_key(state.last_account_key);
168+
let node_iter =
169+
TrieNodeIter::new(walker, hashed_account_cursor, TrieNodeIterType::Account)
170+
.with_last_hashed_key(state.last_account_key);
170171
(hash_builder, node_iter)
171172
}
172173
None => {
173174
let hash_builder = HashBuilder::default().with_updates(retain_updates);
174175
let walker = TrieWalker::new(trie_cursor, self.prefix_sets.account_prefix_set)
175176
.with_deletions_retained(retain_updates);
176-
let node_iter = TrieNodeIter::new(walker, hashed_account_cursor);
177+
let node_iter =
178+
TrieNodeIter::new(walker, hashed_account_cursor, TrieNodeIterType::Account);
177179
(hash_builder, node_iter)
178180
}
179181
};
@@ -412,7 +414,8 @@ where
412414

413415
let mut hash_builder = HashBuilder::default().with_updates(retain_updates);
414416

415-
let mut storage_node_iter = TrieNodeIter::new(walker, hashed_storage_cursor);
417+
let mut storage_node_iter =
418+
TrieNodeIter::new(walker, hashed_storage_cursor, TrieNodeIterType::Storage);
416419
while let Some(node) = storage_node_iter.try_next()? {
417420
match node {
418421
TrieElement::Branch(node) => {

0 commit comments

Comments
 (0)