diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index d281fe666ef..8982884655d 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -1482,7 +1482,6 @@ impl BeaconChain { metrics::stop_timer(fork_choice_register_timer); - self.head_tracker.register_block(block_root, &block); metrics::observe( &metrics::OPERATIONS_PER_BLOCK_ATTESTATION, block.body.attestations.len() as f64, @@ -1503,6 +1502,9 @@ impl BeaconChain { self.store.put_state(&block.state_root, &state)?; self.store.put_block(&block_root, signed_block.clone())?; + let parent_root = block.parent_root; + let slot = block.slot; + self.snapshot_cache .try_write_for(BLOCK_PROCESSING_CACHE_LOCK_TIMEOUT) .map(|mut snapshot_cache| { @@ -1522,6 +1524,9 @@ impl BeaconChain { ); }); + self.head_tracker + .register_block(block_root, parent_root, slot); + metrics::stop_timer(db_write_timer); metrics::inc_counter(&metrics::BLOCK_PROCESSING_SUCCESSES); diff --git a/beacon_node/beacon_chain/src/head_tracker.rs b/beacon_node/beacon_chain/src/head_tracker.rs index 7f4e64122c4..886d8b67fec 100644 --- a/beacon_node/beacon_chain/src/head_tracker.rs +++ b/beacon_node/beacon_chain/src/head_tracker.rs @@ -2,7 +2,7 @@ use parking_lot::RwLock; use ssz_derive::{Decode, Encode}; use std::collections::HashMap; use std::iter::FromIterator; -use types::{BeaconBlock, EthSpec, Hash256, Slot}; +use types::{Hash256, Slot}; #[derive(Debug, PartialEq)] pub enum Error { @@ -23,10 +23,10 @@ impl HeadTracker { /// This function assumes that no block is imported without its parent having already been /// imported. It cannot detect an error if this is not the case, it is the responsibility of /// the upstream user. - pub fn register_block(&self, block_root: Hash256, block: &BeaconBlock) { + pub fn register_block(&self, block_root: Hash256, parent_root: Hash256, slot: Slot) { let mut map = self.0.write(); - map.remove(&block.parent_root); - map.insert(block_root, block.slot); + map.remove(&parent_root); + map.insert(block_root, slot); } /// Removes abandoned head. @@ -107,7 +107,7 @@ pub struct SszHeadTracker { mod test { use super::*; use ssz::{Decode, Encode}; - use types::MainnetEthSpec; + use types::{MainnetEthSpec, BeaconBlock, EthSpec}; type E = MainnetEthSpec; @@ -118,7 +118,7 @@ mod test { let head_tracker = HeadTracker::default(); for i in 0..16 { - let mut block = BeaconBlock::empty(spec); + let mut block: BeaconBlock = BeaconBlock::empty(spec); let block_root = Hash256::from_low_u64_be(i); block.slot = Slot::new(i); @@ -128,7 +128,7 @@ mod test { Hash256::from_low_u64_be(i - 1) }; - head_tracker.register_block::(block_root, &block); + head_tracker.register_block(block_root, block.parent_root, block.slot); } assert_eq!( @@ -137,11 +137,11 @@ mod test { "should only have one head" ); - let mut block = BeaconBlock::empty(spec); + let mut block: BeaconBlock = BeaconBlock::empty(spec); let block_root = Hash256::from_low_u64_be(42); block.slot = Slot::new(15); block.parent_root = Hash256::from_low_u64_be(14); - head_tracker.register_block::(block_root, &block); + head_tracker.register_block(block_root, block.parent_root, block.slot); let heads = head_tracker.heads(); diff --git a/beacon_node/store/src/lib.rs b/beacon_node/store/src/lib.rs index e53329203d9..e022636ad07 100644 --- a/beacon_node/store/src/lib.rs +++ b/beacon_node/store/src/lib.rs @@ -96,7 +96,7 @@ pub trait Store: Sync + Send + Sized + 'static { /// Store a state in the store. fn put_state(&self, state_root: &Hash256, state: &BeaconState) -> Result<(), Error>; - /// Execute either all of operations in `batch` or none at all, returning an error. + /// Execute either all of the operations in `batch` or none at all, returning an error. fn do_atomically(&self, batch: &[StoreOp]) -> Result<(), Error>; /// Store a state summary in the store.