perf(db): flatten HashedPostState before persisting (#21422)

This commit is contained in:
Georgios Konstantopoulos
2026-01-26 14:49:01 -08:00
committed by GitHub
parent adecbd7814
commit 71ed68e944

View File

@@ -630,27 +630,27 @@ impl<TX: DbTx + DbTxMut + 'static, N: NodeTypesForProvider> DatabaseProvider<TX,
},
)?;
timings.write_state += start.elapsed();
let trie_data = block.trie_data();
// insert hashes and intermediate merkle nodes
let start = Instant::now();
self.write_hashed_state(&trie_data.hashed_state)?;
timings.write_hashed_state += start.elapsed();
}
}
// Write all trie updates in a single batch.
// Write all hashed state and trie updates in single batches.
// This reduces cursor open/close overhead from N calls to 1.
if save_mode.with_state() {
let start = Instant::now();
// Blocks are oldest-to-newest, merge_batch expects newest-to-oldest.
let merged =
TrieUpdatesSorted::merge_batch(blocks.iter().rev().map(|b| b.trie_updates()));
let start = Instant::now();
let merged_hashed_state = HashedPostStateSorted::merge_batch(
blocks.iter().rev().map(|b| b.trie_data().hashed_state),
);
if !merged_hashed_state.is_empty() {
self.write_hashed_state(&merged_hashed_state)?;
}
timings.write_hashed_state += start.elapsed();
if !merged.is_empty() {
self.write_trie_updates_sorted(&merged)?;
let start = Instant::now();
let merged_trie =
TrieUpdatesSorted::merge_batch(blocks.iter().rev().map(|b| b.trie_updates()));
if !merged_trie.is_empty() {
self.write_trie_updates_sorted(&merged_trie)?;
}
timings.write_trie_updates += start.elapsed();
}