mirror of
https://github.com/sigp/lighthouse.git
synced 2026-04-19 22:08:30 +00:00
Use forwards iterator for state root lookups (#2422)
## Issue Addressed #2377 ## Proposed Changes Implement the same code used for block root lookups (from #2376) to state root lookups in order to improve performance and reduce associated memory spikes (e.g. from certain HTTP API requests). ## Additional Changes - Tests using `rev_iter_state_roots` and `rev_iter_block_roots` have been refactored to use their `forwards` versions instead. - The `rev_iter_state_roots` and `rev_iter_block_roots` functions are now unused and have been removed. - The `state_at_slot` function has been changed to use the `forwards` iterator. ## Additional Info - Some tests still need to be refactored to use their `forwards_iter` versions. These tests start their iteration from a specific beacon state and thus use the `rev_iter_state_roots_from` and `rev_iter_block_roots_from` functions. If they can be refactored, those functions can also be removed.
This commit is contained in:
@@ -309,7 +309,7 @@ fn epoch_boundary_state_attestation_processing() {
|
||||
let finalized_epoch = harness
|
||||
.chain
|
||||
.head_info()
|
||||
.expect("head ok")
|
||||
.expect("should get head")
|
||||
.finalized_checkpoint
|
||||
.epoch;
|
||||
|
||||
@@ -444,8 +444,8 @@ fn delete_blocks_and_states() {
|
||||
let split_slot = store.get_split_slot();
|
||||
let finalized_states = harness
|
||||
.chain
|
||||
.rev_iter_state_roots()
|
||||
.expect("rev iter ok")
|
||||
.forwards_iter_state_roots(Slot::new(0))
|
||||
.expect("should get iter")
|
||||
.map(Result::unwrap);
|
||||
|
||||
for (state_root, slot) in finalized_states {
|
||||
@@ -706,7 +706,7 @@ fn check_shuffling_compatible(
|
||||
{
|
||||
let (block_root, slot) = maybe_tuple.unwrap();
|
||||
// Shuffling is compatible targeting the current epoch,
|
||||
// iff slot is greater than or equal to the current epoch pivot block
|
||||
// if slot is greater than or equal to the current epoch pivot block.
|
||||
assert_eq!(
|
||||
harness.chain.shuffling_is_compatible(
|
||||
&block_root,
|
||||
@@ -1671,7 +1671,7 @@ fn pruning_test(
|
||||
|
||||
let all_canonical_states = harness
|
||||
.chain
|
||||
.rev_iter_state_roots()
|
||||
.forwards_iter_state_roots(Slot::new(0))
|
||||
.unwrap()
|
||||
.map(Result::unwrap)
|
||||
.map(|(state_root, _)| state_root.into())
|
||||
@@ -1799,17 +1799,12 @@ fn check_chain_dump(harness: &TestHarness, expected_len: u64) {
|
||||
.map(|checkpoint| (checkpoint.beacon_block_root, checkpoint.beacon_block.slot()))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let head = harness.chain.head().expect("should get head");
|
||||
let mut forward_block_roots = HotColdDB::forwards_block_roots_iterator(
|
||||
harness.chain.store.clone(),
|
||||
Slot::new(0),
|
||||
head.beacon_state,
|
||||
head.beacon_block_root,
|
||||
&harness.spec,
|
||||
)
|
||||
.unwrap()
|
||||
.map(Result::unwrap)
|
||||
.collect::<Vec<_>>();
|
||||
let mut forward_block_roots = harness
|
||||
.chain
|
||||
.forwards_iter_block_roots(Slot::new(0))
|
||||
.expect("should get iter")
|
||||
.map(Result::unwrap)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
// Drop the block roots for skipped slots.
|
||||
forward_block_roots.dedup_by_key(|(block_root, _)| *block_root);
|
||||
@@ -1827,10 +1822,10 @@ fn check_chain_dump(harness: &TestHarness, expected_len: u64) {
|
||||
/// Check that every state from the canonical chain is in the database, and that the
|
||||
/// reverse state and block root iterators reach genesis.
|
||||
fn check_iterators(harness: &TestHarness) {
|
||||
let mut min_slot = None;
|
||||
let mut max_slot = None;
|
||||
for (state_root, slot) in harness
|
||||
.chain
|
||||
.rev_iter_state_roots()
|
||||
.forwards_iter_state_roots(Slot::new(0))
|
||||
.expect("should get iter")
|
||||
.map(Result::unwrap)
|
||||
{
|
||||
@@ -1844,20 +1839,23 @@ fn check_iterators(harness: &TestHarness) {
|
||||
"state {:?} from canonical chain should be in DB",
|
||||
state_root
|
||||
);
|
||||
min_slot = Some(slot);
|
||||
max_slot = Some(slot);
|
||||
}
|
||||
// Assert that we reached genesis.
|
||||
assert_eq!(min_slot, Some(Slot::new(0)));
|
||||
// Assert that the block root iterator reaches genesis.
|
||||
// Assert that we reached the head.
|
||||
assert_eq!(
|
||||
max_slot,
|
||||
Some(harness.chain.head_info().expect("should get head").slot)
|
||||
);
|
||||
// Assert that the block root iterator reaches the head.
|
||||
assert_eq!(
|
||||
harness
|
||||
.chain
|
||||
.rev_iter_block_roots()
|
||||
.forwards_iter_block_roots(Slot::new(0))
|
||||
.expect("should get iter")
|
||||
.last()
|
||||
.map(Result::unwrap)
|
||||
.map(|(_, slot)| slot),
|
||||
Some(Slot::new(0))
|
||||
Some(harness.chain.head_info().expect("should get head").slot)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -77,13 +77,13 @@ fn iterators() {
|
||||
|
||||
let block_roots: Vec<(Hash256, Slot)> = harness
|
||||
.chain
|
||||
.rev_iter_block_roots()
|
||||
.forwards_iter_block_roots(Slot::new(0))
|
||||
.expect("should get iter")
|
||||
.map(Result::unwrap)
|
||||
.collect();
|
||||
let state_roots: Vec<(Hash256, Slot)> = harness
|
||||
.chain
|
||||
.rev_iter_state_roots()
|
||||
.forwards_iter_state_roots(Slot::new(0))
|
||||
.expect("should get iter")
|
||||
.map(Result::unwrap)
|
||||
.collect();
|
||||
@@ -112,30 +112,30 @@ fn iterators() {
|
||||
block_roots.windows(2).for_each(|x| {
|
||||
assert_eq!(
|
||||
x[1].1,
|
||||
x[0].1 - 1,
|
||||
"block root slots should be decreasing by one"
|
||||
x[0].1 + 1,
|
||||
"block root slots should be increasing by one"
|
||||
)
|
||||
});
|
||||
state_roots.windows(2).for_each(|x| {
|
||||
assert_eq!(
|
||||
x[1].1,
|
||||
x[0].1 - 1,
|
||||
"state root slots should be decreasing by one"
|
||||
x[0].1 + 1,
|
||||
"state root slots should be increasing by one"
|
||||
)
|
||||
});
|
||||
|
||||
let head = &harness.chain.head().expect("should get head");
|
||||
|
||||
assert_eq!(
|
||||
*block_roots.first().expect("should have some block roots"),
|
||||
*block_roots.last().expect("should have some block roots"),
|
||||
(head.beacon_block_root, head.beacon_block.slot()),
|
||||
"first block root and slot should be for the head block"
|
||||
"last block root and slot should be for the head block"
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
*state_roots.first().expect("should have some state roots"),
|
||||
*state_roots.last().expect("should have some state roots"),
|
||||
(head.beacon_state_root(), head.beacon_state.slot),
|
||||
"first state root and slot should be for the head state"
|
||||
"last state root and slot should be for the head state"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user