Add DC/Shutdown capabilities to the behaviour handler (#1233)

* Remove ban event from the PM

* Fix dispatching of responses to peer's requests

* Disconnection logic
This commit is contained in:
divma
2020-06-17 20:53:08 -05:00
committed by GitHub
parent 9db0c28051
commit 065251b701
12 changed files with 544 additions and 358 deletions

View File

@@ -10,8 +10,8 @@ use crate::error;
use crate::service::NetworkMessage;
use beacon_chain::{BeaconChain, BeaconChainTypes, BlockError};
use eth2_libp2p::{
rpc::{RPCError, RequestId, SubstreamId},
MessageId, NetworkGlobals, PeerId, PubsubMessage, Request, Response,
rpc::{RPCError, RequestId},
MessageId, NetworkGlobals, PeerId, PeerRequestId, PubsubMessage, Request, Response,
};
use futures::prelude::*;
use processor::Processor;
@@ -46,7 +46,7 @@ pub enum RouterMessage<T: EthSpec> {
/// An RPC request has been received.
RPCRequestReceived {
peer_id: PeerId,
stream_id: SubstreamId,
id: PeerRequestId,
request: Request,
},
/// An RPC response has been received.
@@ -127,10 +127,10 @@ impl<T: BeaconChainTypes> Router<T> {
}
RouterMessage::RPCRequestReceived {
peer_id,
stream_id,
id,
request,
} => {
self.handle_rpc_request(peer_id, stream_id, request);
self.handle_rpc_request(peer_id, id, request);
}
RouterMessage::RPCResponseReceived {
peer_id,
@@ -160,11 +160,11 @@ impl<T: BeaconChainTypes> Router<T> {
/* RPC - Related functionality */
/// A new RPC request has been received from the network.
fn handle_rpc_request(&mut self, peer_id: PeerId, stream_id: SubstreamId, request: Request) {
fn handle_rpc_request(&mut self, peer_id: PeerId, id: PeerRequestId, request: Request) {
match request {
Request::Status(status_message) => {
self.processor
.on_status_request(peer_id, stream_id, status_message)
.on_status_request(peer_id, id, status_message)
}
Request::Goodbye(goodbye_reason) => {
debug!(
@@ -177,10 +177,10 @@ impl<T: BeaconChainTypes> Router<T> {
}
Request::BlocksByRange(request) => self
.processor
.on_blocks_by_range_request(peer_id, stream_id, request),
.on_blocks_by_range_request(peer_id, id, request),
Request::BlocksByRoot(request) => self
.processor
.on_blocks_by_root_request(peer_id, stream_id, request),
.on_blocks_by_root_request(peer_id, id, request),
}
}

View File

@@ -8,7 +8,7 @@ use beacon_chain::{
BeaconChain, BeaconChainTypes, BlockError, BlockProcessingOutcome, GossipVerifiedBlock,
};
use eth2_libp2p::rpc::*;
use eth2_libp2p::{NetworkGlobals, PeerId, Request, Response};
use eth2_libp2p::{NetworkGlobals, PeerId, PeerRequestId, Request, Response};
use itertools::process_results;
use slog::{debug, error, o, trace, warn};
use ssz::Encode;
@@ -118,7 +118,7 @@ impl<T: BeaconChainTypes> Processor<T> {
pub fn on_status_request(
&mut self,
peer_id: PeerId,
request_id: SubstreamId,
request_id: PeerRequestId,
status: StatusMessage,
) {
debug!(
@@ -283,7 +283,7 @@ impl<T: BeaconChainTypes> Processor<T> {
pub fn on_blocks_by_root_request(
&mut self,
peer_id: PeerId,
request_id: SubstreamId,
request_id: PeerRequestId,
request: BlocksByRootRequest,
) {
let mut send_block_count = 0;
@@ -321,7 +321,7 @@ impl<T: BeaconChainTypes> Processor<T> {
pub fn on_blocks_by_range_request(
&mut self,
peer_id: PeerId,
request_id: SubstreamId,
request_id: PeerRequestId,
req: BlocksByRangeRequest,
) {
debug!(
@@ -958,29 +958,24 @@ impl<T: EthSpec> HandlerNetworkContext<T> {
})
}
pub fn send_response(
&mut self,
peer_id: PeerId,
response: Response<T>,
stream_id: SubstreamId,
) {
pub fn send_response(&mut self, peer_id: PeerId, response: Response<T>, id: PeerRequestId) {
self.inform_network(NetworkMessage::SendResponse {
peer_id,
stream_id,
id,
response,
})
}
pub fn _send_error_response(
&mut self,
peer_id: PeerId,
substream_id: SubstreamId,
id: PeerRequestId,
error: RPCResponseErrorCode,
reason: String,
) {
self.inform_network(NetworkMessage::SendError {
peer_id,
error,
substream_id,
id,
reason,
})
}

View File

@@ -8,8 +8,8 @@ use crate::{error, metrics};
use beacon_chain::{BeaconChain, BeaconChainTypes};
use eth2_libp2p::Service as LibP2PService;
use eth2_libp2p::{
rpc::{RPCResponseErrorCode, RequestId, SubstreamId},
Libp2pEvent, PubsubMessage, Request, Response,
rpc::{RPCResponseErrorCode, RequestId},
Libp2pEvent, PeerRequestId, PubsubMessage, Request, Response,
};
use eth2_libp2p::{BehaviourEvent, Enr, MessageId, NetworkGlobals, PeerId};
use futures::prelude::*;
@@ -164,11 +164,11 @@ fn spawn_service<T: BeaconChainTypes>(
NetworkMessage::SendRequest{ peer_id, request, request_id } => {
service.libp2p.send_request(peer_id, request_id, request);
}
NetworkMessage::SendResponse{ peer_id, response, stream_id } => {
service.libp2p.send_response(peer_id, stream_id, response);
NetworkMessage::SendResponse{ peer_id, response, id } => {
service.libp2p.send_response(peer_id, id, response);
}
NetworkMessage::SendError{ peer_id, error, substream_id, reason } => {
service.libp2p.respond_with_error(peer_id, substream_id, error, reason);
NetworkMessage::SendError{ peer_id, error, id, reason } => {
service.libp2p.respond_with_error(peer_id, id, error, reason);
}
NetworkMessage::Propagate {
propagation_source,
@@ -280,7 +280,7 @@ fn spawn_service<T: BeaconChainTypes>(
};
let _ = service
.router_send
.send(RouterMessage::RPCRequestReceived{peer_id, stream_id:id, request})
.send(RouterMessage::RPCRequestReceived{peer_id, id, request})
.map_err(|_| {
debug!(service.log, "Failed to send RPC to router");
});
@@ -288,7 +288,7 @@ fn spawn_service<T: BeaconChainTypes>(
BehaviourEvent::ResponseReceived{peer_id, id, response} => {
let _ = service
.router_send
.send(RouterMessage::RPCResponseReceived{ peer_id, request_id:id, response })
.send(RouterMessage::RPCResponseReceived{ peer_id, request_id: id, response })
.map_err(|_| {
debug!(service.log, "Failed to send RPC to router");
});
@@ -297,7 +297,7 @@ fn spawn_service<T: BeaconChainTypes>(
BehaviourEvent::RPCFailed{id, peer_id, error} => {
let _ = service
.router_send
.send(RouterMessage::RPCFailed{ peer_id, request_id:id, error })
.send(RouterMessage::RPCFailed{ peer_id, request_id: id, error })
.map_err(|_| {
debug!(service.log, "Failed to send RPC to router");
});
@@ -425,7 +425,7 @@ pub enum NetworkMessage<T: EthSpec> {
SendResponse {
peer_id: PeerId,
response: Response<T>,
stream_id: SubstreamId,
id: PeerRequestId,
},
/// Respond to a peer's request with an error.
SendError {
@@ -434,7 +434,7 @@ pub enum NetworkMessage<T: EthSpec> {
peer_id: PeerId,
error: RPCResponseErrorCode,
reason: String,
substream_id: SubstreamId,
id: PeerRequestId,
},
/// Publish a list of messages to the gossipsub protocol.
Publish { messages: Vec<PubsubMessage<T>> },