mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-14 10:22:38 +00:00
Sync lookup dedup range and blobs (#5561)
* Handle sync range blocks as blocks and blobs * Merge range sync and backfill sync handling * Update tests * Add no_blobs_into_responses test * Address @realbigsean comments * Merge remote-tracking branch 'origin/unstable' into sync-lookup-dedup-range-and-blobs
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use super::batch::{BatchInfo, BatchProcessingResult, BatchState};
|
||||
use crate::network_beacon_processor::ChainSegmentProcessId;
|
||||
use crate::sync::network_context::RangeRequestId;
|
||||
use crate::sync::{
|
||||
manager::Id, network_context::SyncNetworkContext, BatchOperationOutcome, BatchProcessResult,
|
||||
};
|
||||
@@ -905,7 +906,15 @@ impl<T: BeaconChainTypes> SyncingChain<T> {
|
||||
) -> ProcessingResult {
|
||||
if let Some(batch) = self.batches.get_mut(&batch_id) {
|
||||
let (request, batch_type) = batch.to_blocks_by_range_request();
|
||||
match network.blocks_by_range_request(peer, batch_type, request, self.id, batch_id) {
|
||||
match network.blocks_and_blobs_by_range_request(
|
||||
peer,
|
||||
batch_type,
|
||||
request,
|
||||
RangeRequestId::RangeSync {
|
||||
chain_id: self.id,
|
||||
batch_id,
|
||||
},
|
||||
) {
|
||||
Ok(request_id) => {
|
||||
// inform the batch about the new request
|
||||
batch.start_downloading_from_peer(peer, request_id)?;
|
||||
|
||||
@@ -384,7 +384,7 @@ mod tests {
|
||||
use crate::NetworkMessage;
|
||||
|
||||
use super::*;
|
||||
use crate::sync::network_context::BlockOrBlob;
|
||||
use crate::sync::network_context::{BlockOrBlob, RangeRequestId};
|
||||
use beacon_chain::builder::Witness;
|
||||
use beacon_chain::eth1_chain::CachingEth1Backend;
|
||||
use beacon_chain::parking_lot::RwLock;
|
||||
@@ -548,6 +548,51 @@ mod tests {
|
||||
(block_req_id, blob_req_id)
|
||||
}
|
||||
|
||||
fn complete_range_block_and_blobs_response(
|
||||
&mut self,
|
||||
block_req: RequestId,
|
||||
blob_req_opt: Option<RequestId>,
|
||||
) -> (ChainId, BatchId, Id) {
|
||||
if blob_req_opt.is_some() {
|
||||
match block_req {
|
||||
RequestId::Sync(crate::sync::manager::RequestId::RangeBlockAndBlobs { id }) => {
|
||||
let _ = self
|
||||
.cx
|
||||
.range_block_and_blob_response(id, BlockOrBlob::Block(None));
|
||||
let response = self
|
||||
.cx
|
||||
.range_block_and_blob_response(id, BlockOrBlob::Blob(None))
|
||||
.unwrap();
|
||||
let (chain_id, batch_id) =
|
||||
TestRig::unwrap_range_request_id(response.sender_id);
|
||||
(chain_id, batch_id, id)
|
||||
}
|
||||
other => panic!("unexpected request {:?}", other),
|
||||
}
|
||||
} else {
|
||||
match block_req {
|
||||
RequestId::Sync(crate::sync::manager::RequestId::RangeBlockAndBlobs { id }) => {
|
||||
let response = self
|
||||
.cx
|
||||
.range_block_and_blob_response(id, BlockOrBlob::Block(None))
|
||||
.unwrap();
|
||||
let (chain_id, batch_id) =
|
||||
TestRig::unwrap_range_request_id(response.sender_id);
|
||||
(chain_id, batch_id, id)
|
||||
}
|
||||
other => panic!("unexpected request {:?}", other),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn unwrap_range_request_id(sender_id: RangeRequestId) -> (ChainId, BatchId) {
|
||||
if let RangeRequestId::RangeSync { chain_id, batch_id } = sender_id {
|
||||
(chain_id, batch_id)
|
||||
} else {
|
||||
panic!("expected RangeSync request: {:?}", sender_id)
|
||||
}
|
||||
}
|
||||
|
||||
/// Produce a head peer
|
||||
fn head_peer(
|
||||
&self,
|
||||
@@ -744,29 +789,8 @@ mod tests {
|
||||
range.add_peer(&mut rig.cx, local_info, peer1, head_info);
|
||||
let (block_req, blob_req_opt) = rig.grab_request(&peer1, fork);
|
||||
|
||||
let (chain1, batch1, id1) = if blob_req_opt.is_some() {
|
||||
match block_req {
|
||||
RequestId::Sync(crate::sync::manager::RequestId::RangeBlockAndBlobs { id }) => {
|
||||
let _ = rig
|
||||
.cx
|
||||
.range_sync_block_and_blob_response(id, BlockOrBlob::Block(None));
|
||||
let (chain1, response) = rig
|
||||
.cx
|
||||
.range_sync_block_and_blob_response(id, BlockOrBlob::Blob(None))
|
||||
.unwrap();
|
||||
(chain1, response.batch_id, id)
|
||||
}
|
||||
other => panic!("unexpected request {:?}", other),
|
||||
}
|
||||
} else {
|
||||
match block_req {
|
||||
RequestId::Sync(crate::sync::manager::RequestId::RangeBlocks { id }) => {
|
||||
let (chain, batch) = rig.cx.range_sync_block_only_response(id, true).unwrap();
|
||||
(chain, batch, id)
|
||||
}
|
||||
other => panic!("unexpected request {:?}", other),
|
||||
}
|
||||
};
|
||||
let (chain1, batch1, id1) =
|
||||
rig.complete_range_block_and_blobs_response(block_req, blob_req_opt);
|
||||
|
||||
// make the ee offline
|
||||
rig.cx.update_execution_engine_state(EngineState::Offline);
|
||||
@@ -782,29 +806,8 @@ mod tests {
|
||||
range.add_peer(&mut rig.cx, local_info, peer2, finalized_info);
|
||||
let (block_req, blob_req_opt) = rig.grab_request(&peer2, fork);
|
||||
|
||||
let (chain2, batch2, id2) = if blob_req_opt.is_some() {
|
||||
match block_req {
|
||||
RequestId::Sync(crate::sync::manager::RequestId::RangeBlockAndBlobs { id }) => {
|
||||
let _ = rig
|
||||
.cx
|
||||
.range_sync_block_and_blob_response(id, BlockOrBlob::Block(None));
|
||||
let (chain2, response) = rig
|
||||
.cx
|
||||
.range_sync_block_and_blob_response(id, BlockOrBlob::Blob(None))
|
||||
.unwrap();
|
||||
(chain2, response.batch_id, id)
|
||||
}
|
||||
other => panic!("unexpected request {:?}", other),
|
||||
}
|
||||
} else {
|
||||
match block_req {
|
||||
RequestId::Sync(crate::sync::manager::RequestId::RangeBlocks { id }) => {
|
||||
let (chain, batch) = rig.cx.range_sync_block_only_response(id, true).unwrap();
|
||||
(chain, batch, id)
|
||||
}
|
||||
other => panic!("unexpected request {:?}", other),
|
||||
}
|
||||
};
|
||||
let (chain2, batch2, id2) =
|
||||
rig.complete_range_block_and_blobs_response(block_req, blob_req_opt);
|
||||
|
||||
// send the response to the request
|
||||
range.blocks_by_range_response(&mut rig.cx, peer2, chain2, batch2, id2, None);
|
||||
|
||||
Reference in New Issue
Block a user