-
Notifications
You must be signed in to change notification settings - Fork 784
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add individual by_range sync requests #6497
base: unstable
Are you sure you want to change the base?
Conversation
// practice | ||
// | ||
// rig.expect_chain_segment(); | ||
// rig.expect_chain_segment(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I want to migrate the range sync tests to the event-driven format but would prefer to do so in a separate PR
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks really good overall!
@@ -43,12 +47,50 @@ pub struct DataColumnsByRootRequestId { | |||
pub requester: DataColumnsByRootRequester, | |||
} | |||
|
|||
#[derive(Debug, Hash, PartialEq, Eq, Clone, Copy)] | |||
pub struct BlocksByRangeRequestId { | |||
pub id: Id, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i'm understanding this is the sub-request id and requester.id
is the meta-request id, can we rename one of them? it's sort of confusing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What name(s) do you have in mind? I can add docs otherwise
beacon_node/network/src/sync/network_context/requests/blobs_by_range.rs
Outdated
Show resolved
Hide resolved
"epoch" => epoch, | ||
"peer" => %peer_id, | ||
); | ||
let _blocks_req_id = self.send_blocks_by_range_request(peer_id, request.clone(), id)?; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The _blocks_req_id
here is unused and blobs_req_id
is only used to check if a blobs request was made. I don't see these send_
methods used anywhere else so I think we can return Result<(), ..>
rather than Result<BlocksByRangeRequestId, ..>
for blocks. Maybe a bool for blobs. Looks like for custody columns, we care about the count requested but not particular ids
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In a future PR RangeBlockComponentsRequest
will track individual requests by ID. Left this variable named but unused as a hint that it should be used.
df1a6c7
to
5fa2912
Compare
|
||
self.items.push(item); | ||
|
||
Ok(self.items.len() >= *self.request.count() as usize) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we check if a block for the slot already exists in self.items
, to handle the case where the same block is sent twice? or is this handled elsewhere?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added the check for duplicate data
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added the duplicate data check to all by_range requests
Ok(self.items.len() >= self.request.count as usize * self.request.columns.len()) | ||
} | ||
|
||
fn consume(&mut self) -> Vec<Self::Item> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like this impl can be moved to ActiveRequestItems
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It can't as it uses state in DataColumnsByRangeRequestItems
5fa2912
to
a2d1d69
Compare
@@ -29,18 +28,13 @@ pub struct RangeBlockComponentsRequest<E: EthSpec> { | |||
/// Used to determine if the number of data columns stream termination this accumulator should | |||
/// wait for. This may be less than the number of `expects_custody_columns` due to request batching. | |||
num_custody_column_requests: Option<usize>, | |||
/// The peers the request was made to. | |||
pub(crate) peer_ids: Vec<PeerId>, | |||
max_blobs_per_block: usize, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed this from the state, since into_responses_with_blobs
has access to the spec
a2d1d69
to
afe72d8
Compare
afe72d8
to
7f71079
Compare
Rebased on latest unstable, @jimmygchen ready for another review |
Issue Addressed
Part of
To address PeerDAS sync issues we need to make individual by_range requests within a batch retriable. We should adopt the same pattern for lookup sync where each request (block/blobs/columns) is tracked individually within a "meta" request that group them all and handles retry logic.
Proposed Changes
second step is to add individual request accumulators for
blocks_by_range
,blobs_by_range
, anddata_columns_by_range
. This will allow each request to progress independently and be retried separately.Most of the logic is just piping, excuse the large diff. This PR does not change the logic of how requests are handled or retried. This will be done in a future PR changing the logic of
RangeBlockComponentsRequest
.Before
SyncRequestId::RangeBlockAndBlobs
SyncNetworkContext::range_block_components_requests
Vec<RpcBlock>
, and insert intorange_sync
Now
SyncRequestId::RangeBlockAndBlobs
SyncNetworkContext:: blocks_by_range_requests
Vec<SignedBlock>
, and insert intoSyncNetworkContext::components_by_range_requests
Vec<RpcBlock>
, and insert intorange_sync