diff --git a/beacon_node/eth2_libp2p/src/peer_manager/mod.rs b/beacon_node/eth2_libp2p/src/peer_manager/mod.rs index ae318e915..448768983 100644 --- a/beacon_node/eth2_libp2p/src/peer_manager/mod.rs +++ b/beacon_node/eth2_libp2p/src/peer_manager/mod.rs @@ -412,6 +412,12 @@ impl PeerManager { } RPCError::ErrorResponse(code, _) => match code { RPCResponseErrorCode::Unknown => PeerAction::HighToleranceError, + RPCResponseErrorCode::ResourceUnavailable => { + // NOTE: This error only makes sense for the `BlocksByRange` and `BlocksByRoot` + // protocols. For the time being, there is no reason why a peer should send + // this error. + PeerAction::Fatal + } RPCResponseErrorCode::ServerError => PeerAction::MidToleranceError, RPCResponseErrorCode::InvalidRequest => PeerAction::LowToleranceError, RPCResponseErrorCode::RateLimited => match protocol { diff --git a/beacon_node/eth2_libp2p/src/rpc/methods.rs b/beacon_node/eth2_libp2p/src/rpc/methods.rs index 3c8604387..b347f61f1 100644 --- a/beacon_node/eth2_libp2p/src/rpc/methods.rs +++ b/beacon_node/eth2_libp2p/src/rpc/methods.rs @@ -262,6 +262,8 @@ pub enum RPCResponseErrorCode { RateLimited, InvalidRequest, ServerError, + /// Error spec'd to indicate that a peer does not have blocks on a requested range. + ResourceUnavailable, Unknown, } @@ -285,6 +287,7 @@ impl RPCCodedResponse { let code = match response_code { 1 => RPCResponseErrorCode::InvalidRequest, 2 => RPCResponseErrorCode::ServerError, + 3 => RPCResponseErrorCode::ResourceUnavailable, 139 => RPCResponseErrorCode::RateLimited, _ => RPCResponseErrorCode::Unknown, }; @@ -318,6 +321,7 @@ impl RPCResponseErrorCode { match self { RPCResponseErrorCode::InvalidRequest => 1, RPCResponseErrorCode::ServerError => 2, + RPCResponseErrorCode::ResourceUnavailable => 3, RPCResponseErrorCode::Unknown => 255, RPCResponseErrorCode::RateLimited => 139, } @@ -328,6 +332,7 @@ impl std::fmt::Display for RPCResponseErrorCode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let repr = match self { RPCResponseErrorCode::InvalidRequest => "The request was invalid", + RPCResponseErrorCode::ResourceUnavailable => "Resource unavailable", RPCResponseErrorCode::ServerError => "Server error occurred", RPCResponseErrorCode::Unknown => "Unknown error occurred", RPCResponseErrorCode::RateLimited => "Rate limited", diff --git a/beacon_node/eth2_libp2p/src/rpc/protocol.rs b/beacon_node/eth2_libp2p/src/rpc/protocol.rs index 4af31f420..4cd01c59f 100644 --- a/beacon_node/eth2_libp2p/src/rpc/protocol.rs +++ b/beacon_node/eth2_libp2p/src/rpc/protocol.rs @@ -577,6 +577,7 @@ impl RPCError { RPCResponseErrorCode::RateLimited => "rate_limited", RPCResponseErrorCode::InvalidRequest => "invalid_request", RPCResponseErrorCode::ServerError => "server_error", + RPCResponseErrorCode::ResourceUnavailable => "resource_unavailable", RPCResponseErrorCode::Unknown => "unknown_response_code", }, RPCError::StreamTimeout => "stream_timeout",