insert cached child at the front of a chain of parent lookups (#4780)

* insert cached child at the front of a chain of parent lookups

* use vecdeque in parent lookup chain of blocks
This commit is contained in:
realbigsean 2023-09-29 12:55:12 -04:00 committed by GitHub
parent 57edc0f3ce
commit 67aeb6bf6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 8 deletions

View File

@ -27,7 +27,7 @@ pub use single_block_lookup::CachedChildComponents;
pub use single_block_lookup::{BlobRequestState, BlockRequestState}; pub use single_block_lookup::{BlobRequestState, BlockRequestState};
use slog::{debug, error, trace, warn, Logger}; use slog::{debug, error, trace, warn, Logger};
use smallvec::SmallVec; use smallvec::SmallVec;
use std::collections::HashMap; use std::collections::{HashMap, VecDeque};
use std::fmt::Debug; use std::fmt::Debug;
use std::sync::Arc; use std::sync::Arc;
use std::time::Duration; use std::time::Duration;
@ -1122,7 +1122,7 @@ impl<T: BeaconChainTypes> BlockLookups<T> {
let (chain_hash, blocks, hashes, block_request) = let (chain_hash, blocks, hashes, block_request) =
parent_lookup.parts_for_processing(); parent_lookup.parts_for_processing();
let blocks = self.add_child_block_to_chain(chain_hash, blocks, cx); let blocks = self.add_child_block_to_chain(chain_hash, blocks, cx).into();
let process_id = ChainSegmentProcessId::ParentLookup(chain_hash); let process_id = ChainSegmentProcessId::ParentLookup(chain_hash);
@ -1177,9 +1177,9 @@ impl<T: BeaconChainTypes> BlockLookups<T> {
fn add_child_block_to_chain( fn add_child_block_to_chain(
&mut self, &mut self,
chain_hash: Hash256, chain_hash: Hash256,
mut blocks: Vec<RpcBlock<T::EthSpec>>, mut blocks: VecDeque<RpcBlock<T::EthSpec>>,
cx: &SyncNetworkContext<T>, cx: &SyncNetworkContext<T>,
) -> Vec<RpcBlock<T::EthSpec>> { ) -> VecDeque<RpcBlock<T::EthSpec>> {
// Find the child block that spawned the parent lookup request and add it to the chain // Find the child block that spawned the parent lookup request and add it to the chain
// to send for processing. // to send for processing.
if let Some(child_lookup_id) = self if let Some(child_lookup_id) = self
@ -1193,7 +1193,9 @@ impl<T: BeaconChainTypes> BlockLookups<T> {
}; };
match child_lookup.get_cached_child_block() { match child_lookup.get_cached_child_block() {
CachedChild::Ok(rpc_block) => { CachedChild::Ok(rpc_block) => {
blocks.push(rpc_block); // Insert this block at the front. This order is important because we later check
// for linear roots in `filter_chain_segment`
blocks.push_front(rpc_block);
} }
CachedChild::DownloadIncomplete => { CachedChild::DownloadIncomplete => {
trace!(self.log, "Parent lookup chain complete, awaiting child response"; "chain_hash" => ?chain_hash); trace!(self.log, "Parent lookup chain complete, awaiting child response"; "chain_hash" => ?chain_hash);

View File

@ -9,6 +9,7 @@ use beacon_chain::data_availability_checker::DataAvailabilityChecker;
use beacon_chain::BeaconChainTypes; use beacon_chain::BeaconChainTypes;
use itertools::Itertools; use itertools::Itertools;
use lighthouse_network::PeerId; use lighthouse_network::PeerId;
use std::collections::VecDeque;
use std::sync::Arc; use std::sync::Arc;
use store::Hash256; use store::Hash256;
use strum::IntoStaticStr; use strum::IntoStaticStr;
@ -145,7 +146,7 @@ impl<T: BeaconChainTypes> ParentLookup<T> {
self, self,
) -> ( ) -> (
Hash256, Hash256,
Vec<RpcBlock<T::EthSpec>>, VecDeque<RpcBlock<T::EthSpec>>,
Vec<Hash256>, Vec<Hash256>,
SingleBlockLookup<Parent, T>, SingleBlockLookup<Parent, T>,
) { ) {
@ -155,10 +156,10 @@ impl<T: BeaconChainTypes> ParentLookup<T> {
current_parent_request, current_parent_request,
} = self; } = self;
let block_count = downloaded_blocks.len(); let block_count = downloaded_blocks.len();
let mut blocks = Vec::with_capacity(block_count); let mut blocks = VecDeque::with_capacity(block_count);
let mut hashes = Vec::with_capacity(block_count); let mut hashes = Vec::with_capacity(block_count);
for (hash, block) in downloaded_blocks.into_iter() { for (hash, block) in downloaded_blocks.into_iter() {
blocks.push(block); blocks.push_back(block);
hashes.push(hash); hashes.push(hash);
} }
(chain_hash, blocks, hashes, current_parent_request) (chain_hash, blocks, hashes, current_parent_request)