d727e55abe
## Issue Addressed `BlocksByRange` requests were the main culprit of a series of timeouts to peer's requests in general because they produce build up in the router's processor. Those were moved to the blocking executor but a task is being spawned for each; also not ideal since the amount of resources we give to those is not controlled ## Proposed Changes - Move `BlocksByRange` and `BlocksByRoots` to the `beacon_processor`. The processor crafts the responses and sends them. - Move too the processing of `StatusMessage`s from other peers. This is a fast operation but it can also build up and won't scale if we keep it in the router (processing one at the time). These don't need to send an answer, so there is no harm in processing them "later" if that were to happen. Sending responses to status requests is still in the router, so we answer as soon as we see them. - Some "extras" that are basically clean up: - Split the `Worker` logic in sync methods (chain processing and rpc blocks), gossip methods (the majority of methods) and rpc methods (the new ones) - Move the `status_message` function previously provided by the router's processor to a more central place since it is used by the router, sync, network_context and beacon_processor - Some spelling ## Additional Info What's left to decide/test more thoroughly is the length of the queues and the priority rules. @paulhauner suggested at some point to put status above attestations, and @AgeManning had described an importance of "protecting gossipsub" so my solution is leaving status requests in the router and RPC methods below attestations. Slashings and Exits are at the end.
30 lines
1.1 KiB
Rust
30 lines
1.1 KiB
Rust
use beacon_chain::{BeaconChain, BeaconChainError, BeaconChainTypes};
|
|
use types::ChainSpec;
|
|
|
|
use eth2_libp2p::rpc::StatusMessage;
|
|
/// Trait to produce a `StatusMessage` representing the state of the given `beacon_chain`.
|
|
///
|
|
/// NOTE: The purpose of this is simply to obtain a `StatusMessage` from the `BeaconChain` without
|
|
/// polluting/coupling the type with RPC concepts.
|
|
pub trait ToStatusMessage {
|
|
fn status_message(&self) -> Result<StatusMessage, BeaconChainError>;
|
|
}
|
|
|
|
impl<T: BeaconChainTypes> ToStatusMessage for BeaconChain<T> {
|
|
fn status_message(&self) -> Result<StatusMessage, BeaconChainError> {
|
|
let head_info = self.head_info()?;
|
|
let genesis_validators_root = self.genesis_validators_root;
|
|
|
|
let fork_digest =
|
|
ChainSpec::compute_fork_digest(head_info.fork.current_version, genesis_validators_root);
|
|
|
|
Ok(StatusMessage {
|
|
fork_digest,
|
|
finalized_root: head_info.finalized_checkpoint.root,
|
|
finalized_epoch: head_info.finalized_checkpoint.epoch,
|
|
head_root: head_info.block_root,
|
|
head_slot: head_info.slot,
|
|
})
|
|
}
|
|
}
|