Skip to content
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

Open
wants to merge 1 commit into
base: unstable
Choose a base branch
from

Conversation

dapplion
Copy link
Collaborator

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, and data_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

  • Sync manager receives block with SyncRequestId::RangeBlockAndBlobs
  • Insert block into SyncNetworkContext::range_block_components_requests
  • (If received stream terminators of all requests)
    • Return Vec<RpcBlock>, and insert into range_sync

Now

  • Sync manager receives block with SyncRequestId::RangeBlockAndBlobs
  • Insert block into SyncNetworkContext:: blocks_by_range_requests
  • (If received stream terminator of this request)
    • Return Vec<SignedBlock>, and insert into SyncNetworkContext::components_by_range_requests
    • (If received a result for all requests)
      • Return Vec<RpcBlock>, and insert into range_sync

@dapplion dapplion added ready-for-review The code is ready for review syncing labels Oct 16, 2024
// practice
//
// rig.expect_chain_segment();
// rig.expect_chain_segment();
Copy link
Collaborator Author

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

Copy link
Member

@realbigsean realbigsean left a 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,
Copy link
Member

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

Copy link
Collaborator Author

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.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)?;
Copy link
Member

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

Copy link
Collaborator Author

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.

beacon_node/network/src/sync/network_context.rs Outdated Show resolved Hide resolved
beacon_node/network/src/sync/network_context.rs Outdated Show resolved Hide resolved
Base automatically changed from sync-active-request-generalize to unstable October 17, 2024 18:14
@dapplion dapplion force-pushed the sync-active-request-byrange branch from df1a6c7 to 5fa2912 Compare October 18, 2024 14:28
@jimmygchen jimmygchen self-assigned this Oct 24, 2024
@dapplion dapplion requested a review from realbigsean November 18, 2024 08:41

self.items.push(item);

Ok(self.items.len() >= *self.request.count() as usize)
Copy link
Member

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?

Copy link
Collaborator Author

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

Copy link
Collaborator Author

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> {
Copy link
Member

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?

Copy link
Collaborator Author

@dapplion dapplion Jan 13, 2025

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

@dapplion dapplion force-pushed the sync-active-request-byrange branch from 5fa2912 to a2d1d69 Compare January 13, 2025 11:02
@dapplion dapplion requested a review from jxs as a code owner January 13, 2025 11:02
@@ -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,
Copy link
Collaborator Author

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

@dapplion dapplion force-pushed the sync-active-request-byrange branch from a2d1d69 to afe72d8 Compare January 13, 2025 11:15
@dapplion dapplion force-pushed the sync-active-request-byrange branch from afe72d8 to 7f71079 Compare January 13, 2025 11:18
@dapplion dapplion requested a review from jimmygchen January 13, 2025 11:19
@dapplion
Copy link
Collaborator Author

Rebased on latest unstable, @jimmygchen ready for another review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ready-for-review The code is ready for review syncing
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants