mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-21 22:04:44 +00:00
Don't request block components until having block (#5774)
* Don't request block components until having block * Update tests * Resolve todo comment * Merge branch 'unstable' into request-blocks-first
This commit is contained in:
@@ -7,7 +7,6 @@ use crate::metrics;
|
||||
use crate::sync::block_lookups::common::{ResponseType, PARENT_DEPTH_TOLERANCE};
|
||||
use crate::sync::block_lookups::parent_chain::find_oldest_fork_ancestor;
|
||||
use crate::sync::manager::{Id, SingleLookupReqId};
|
||||
use crate::sync::network_context::LookupFailure;
|
||||
use beacon_chain::block_verification_types::AsBlock;
|
||||
use beacon_chain::data_availability_checker::AvailabilityCheckErrorCategory;
|
||||
use beacon_chain::{AvailabilityProcessingStatus, BeaconChainTypes, BlockError};
|
||||
@@ -325,12 +324,7 @@ impl<T: BeaconChainTypes> BlockLookups<T> {
|
||||
response: RpcProcessingResult<R::VerifiedResponseType>,
|
||||
cx: &mut SyncNetworkContext<T>,
|
||||
) -> Result<LookupResult, LookupRequestError> {
|
||||
// Downscore peer even if lookup is not known
|
||||
// Only downscore lookup verify errors. RPC errors are downscored in the network handler.
|
||||
if let Err(LookupFailure::LookupVerifyError(e)) = &response {
|
||||
// Note: the error is displayed in full debug form on the match below
|
||||
cx.report_peer(peer_id, PeerAction::LowToleranceError, e.into());
|
||||
}
|
||||
// Note: no need to downscore peers here, already downscored on network context
|
||||
|
||||
let response_type = R::response_type();
|
||||
let Some(lookup) = self.single_block_lookups.get_mut(&id.lookup_id) else {
|
||||
@@ -459,23 +453,16 @@ impl<T: BeaconChainTypes> BlockLookups<T> {
|
||||
// if both components have been processed.
|
||||
request_state.on_processing_success()?;
|
||||
|
||||
// If this was the result of a block request, we can't determined if the block peer did anything
|
||||
// wrong. If we already had both a block and blobs response processed, we should penalize the
|
||||
// blobs peer because they did not provide all blobs on the initial request.
|
||||
if lookup.both_components_processed() {
|
||||
if let Some(blob_peer) = lookup
|
||||
.blob_request_state
|
||||
.state
|
||||
.on_post_process_validation_failure()?
|
||||
{
|
||||
cx.report_peer(
|
||||
blob_peer,
|
||||
PeerAction::MidToleranceError,
|
||||
"sent_incomplete_blobs",
|
||||
);
|
||||
}
|
||||
// We don't request for other block components until being sure that the block has
|
||||
// data. If we request blobs / columns to a peer we are sure those must exist.
|
||||
// Therefore if all components are processed and we still receive `MissingComponents`
|
||||
// it indicates an internal bug.
|
||||
return Err(LookupRequestError::MissingComponentsAfterAllProcessed);
|
||||
} else {
|
||||
// Continue request, potentially request blobs
|
||||
Action::Retry
|
||||
}
|
||||
Action::Retry
|
||||
}
|
||||
BlockProcessingResult::Ignored => {
|
||||
// Beacon processor signalled to ignore the block processing result.
|
||||
|
||||
Reference in New Issue
Block a user