Skip to content

Commit 9158a12

Browse files
committed
Disconnect sync peer on rpc HandlerReject
1 parent 9667dc2 commit 9158a12

File tree

5 files changed

+25
-10
lines changed

5 files changed

+25
-10
lines changed

beacon_node/eth2_libp2p/src/behaviour/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ pub enum BehaviourEvent<TSpec: EthSpec> {
7777
id: RequestId,
7878
/// The peer to which this request was sent.
7979
peer_id: PeerId,
80+
/// The rpc error that was received.
81+
error: RPCError,
8082
},
8183
RequestReceived {
8284
/// The peer that sent the request.
@@ -891,7 +893,7 @@ impl<TSpec: EthSpec> NetworkBehaviourEventProcess<RPCMessage<TSpec>> for Behavio
891893
);
892894
// inform failures of requests comming outside the behaviour
893895
if !matches!(id, RequestId::Behaviour) {
894-
self.add_event(BehaviourEvent::RPCFailed { peer_id, id });
896+
self.add_event(BehaviourEvent::RPCFailed { peer_id, id, error });
895897
}
896898
}
897899
}

beacon_node/network/src/router/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::error;
1111
use crate::service::NetworkMessage;
1212
use beacon_chain::{BeaconChain, BeaconChainTypes};
1313
use eth2_libp2p::{
14-
rpc::RequestId, MessageId, NetworkGlobals, PeerId, PeerRequestId, PubsubMessage, Request,
15-
Response,
14+
rpc::{RPCError, RequestId},
15+
MessageId, NetworkGlobals, PeerId, PeerRequestId, PubsubMessage, Request, Response,
1616
};
1717
use futures::prelude::*;
1818
use processor::Processor;
@@ -59,6 +59,7 @@ pub enum RouterMessage<T: EthSpec> {
5959
RPCFailed {
6060
peer_id: PeerId,
6161
request_id: RequestId,
62+
error: RPCError,
6263
},
6364
/// A gossip message has been received. The fields are: message id, the peer that sent us this
6465
/// message, the message itself and a bool which indicates if the message should be processed
@@ -141,8 +142,9 @@ impl<T: BeaconChainTypes> Router<T> {
141142
RouterMessage::RPCFailed {
142143
peer_id,
143144
request_id,
145+
error,
144146
} => {
145-
self.processor.on_rpc_error(peer_id, request_id);
147+
self.processor.on_rpc_error(peer_id, request_id, error);
146148
}
147149
RouterMessage::PubsubMessage(id, peer_id, gossip, should_process) => {
148150
self.handle_gossip(id, peer_id, gossip, should_process);

beacon_node/network/src/router/processor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@ impl<T: BeaconChainTypes> Processor<T> {
9595

9696
/// An error occurred during an RPC request. The state is maintained by the sync manager, so
9797
/// this function notifies the sync manager of the error.
98-
pub fn on_rpc_error(&mut self, peer_id: PeerId, request_id: RequestId) {
98+
pub fn on_rpc_error(&mut self, peer_id: PeerId, request_id: RequestId, error: RPCError) {
9999
// Check if the failed RPC belongs to sync
100100
if let RequestId::Sync(id) = request_id {
101-
self.send_to_sync(SyncMessage::RPCError(peer_id, id));
101+
self.send_to_sync(SyncMessage::RPCError(peer_id, id, error));
102102
}
103103
}
104104

beacon_node/network/src/service.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,10 +611,10 @@ fn spawn_service<T: BeaconChainTypes>(
611611
});
612612

613613
}
614-
BehaviourEvent::RPCFailed{id, peer_id} => {
614+
BehaviourEvent::RPCFailed{id, peer_id, error} => {
615615
let _ = service
616616
.router_send
617-
.send(RouterMessage::RPCFailed{ peer_id, request_id: id})
617+
.send(RouterMessage::RPCFailed{ peer_id, request_id: id, error})
618618
.map_err(|_| {
619619
debug!(service.log, "Failed to send RPC to router");
620620
});

beacon_node/network/src/sync/manager.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ use crate::beacon_processor::{ProcessId, WorkEvent as BeaconWorkEvent};
4242
use crate::service::NetworkMessage;
4343
use crate::status::ToStatusMessage;
4444
use beacon_chain::{BeaconChain, BeaconChainTypes, BlockError};
45+
use eth2_libp2p::rpc::RPCError;
4546
use eth2_libp2p::rpc::{methods::MAX_REQUEST_BLOCKS, BlocksByRootRequest, GoodbyeReason};
4647
use eth2_libp2p::types::{NetworkGlobals, SyncState};
4748
use eth2_libp2p::SyncInfo;
@@ -103,7 +104,7 @@ pub enum SyncMessage<T: EthSpec> {
103104
Disconnect(PeerId),
104105

105106
/// An RPC Error has occurred on a request.
106-
RPCError(PeerId, RequestId),
107+
RPCError(PeerId, RequestId, RPCError),
107108

108109
/// A batch has been processed by the block processor thread.
109110
BatchProcessed {
@@ -1020,11 +1021,16 @@ impl<T: BeaconChainTypes> SyncManager<T> {
10201021
SyncMessage::Disconnect(peer_id) => {
10211022
self.peer_disconnect(&peer_id);
10221023
}
1023-
SyncMessage::RPCError(peer_id, request_id) => {
1024+
SyncMessage::RPCError(peer_id, request_id, error) => {
10241025
// Redirect to a sync mechanism if the error is related to one of their
10251026
// requests.
10261027
match self.network.blocks_by_range_response(request_id, true) {
10271028
Some(SyncRequestType::RangeSync(batch_id, chain_id)) => {
1029+
// `HandlerRejected` error signifies that the peer has disconnected from us.
1030+
// Remove the peer from any syncing chain mappings.
1031+
if let RPCError::HandlerRejected = error {
1032+
self.peer_disconnect(&peer_id);
1033+
}
10281034
self.range_sync.inject_error(
10291035
&mut self.network,
10301036
peer_id,
@@ -1035,6 +1041,11 @@ impl<T: BeaconChainTypes> SyncManager<T> {
10351041
self.update_sync_state();
10361042
}
10371043
Some(SyncRequestType::BackFillSync(batch_id)) => {
1044+
// `HandlerRejected` error signifies that the peer has disconnected from us.
1045+
// Remove the peer from any syncing chain mappings.
1046+
if let RPCError::HandlerRejected = error {
1047+
self.peer_disconnect(&peer_id);
1048+
}
10381049
match self.backfill_sync.inject_error(
10391050
&mut self.network,
10401051
batch_id,

0 commit comments

Comments
 (0)