mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-11 18:04:18 +00:00
RPC RequestId Cleanup (#7238)
I've been working at updating another library to latest Lighthouse and got very confused with RPC request Ids. There were types that had fields called `request_id` and `id`. And interchangeably could have types `PeerRequestId`, `rpc::RequestId`, `AppRequestId`, `api_types::RequestId` or even `Request.id`. I couldn't keep track of which Id was linked to what and what each type meant. So this PR mainly does a few things: - Changes the field naming to match the actual type. So any field that has an `AppRequestId` will be named `app_request_id` rather than `id` or `request_id` for example. - I simplified the types. I removed the two different `RequestId` types (one in Lighthouse_network the other in the rpc) and grouped them into one. It has one downside tho. I had to add a few unreachable lines of code in the beacon processor, which the extra type would prevent, but I feel like it might be worth it. Happy to add an extra type to avoid those few lines. - I also removed the concept of `PeerRequestId` which sometimes went alongside a `request_id`. There were times were had a `PeerRequest` and a `Request` being returned, both of which contain a `RequestId` so we had redundant information. I've simplified the logic by removing `PeerRequestId` and made a `ResponseId`. I think if you look at the code changes, it simplifies things a bit and removes the redundant extra info. I think with this PR things are a little bit easier to reasonable about what is going on with all these RPC Ids. NOTE: I did this with the help of AI, so probably should be checked
This commit is contained in:
@@ -4,8 +4,7 @@
|
||||
use super::methods::{GoodbyeReason, RpcErrorResponse, RpcResponse};
|
||||
use super::outbound::OutboundRequestContainer;
|
||||
use super::protocol::{InboundOutput, Protocol, RPCError, RPCProtocol, RequestType};
|
||||
use super::RequestId;
|
||||
use super::{RPCReceived, RPCSend, ReqId, Request};
|
||||
use super::{RPCReceived, RPCSend, ReqId};
|
||||
use crate::rpc::outbound::OutboundFramed;
|
||||
use crate::rpc::protocol::InboundFramed;
|
||||
use fnv::FnvHashMap;
|
||||
@@ -91,6 +90,11 @@ pub struct RPCHandler<Id, E>
|
||||
where
|
||||
E: EthSpec,
|
||||
{
|
||||
/// The PeerId matching this `ConnectionHandler`.
|
||||
peer_id: PeerId,
|
||||
|
||||
/// The ConnectionId matching this `ConnectionHandler`.
|
||||
connection_id: ConnectionId,
|
||||
/// The upgrade for inbound substreams.
|
||||
listen_protocol: SubstreamProtocol<RPCProtocol<E>, ()>,
|
||||
|
||||
@@ -139,9 +143,6 @@ where
|
||||
|
||||
/// Timeout that will me used for inbound and outbound responses.
|
||||
resp_timeout: Duration,
|
||||
|
||||
/// Information about this handler for logging purposes.
|
||||
log_info: (PeerId, ConnectionId),
|
||||
}
|
||||
|
||||
enum HandlerState {
|
||||
@@ -228,6 +229,8 @@ where
|
||||
connection_id: ConnectionId,
|
||||
) -> Self {
|
||||
RPCHandler {
|
||||
connection_id,
|
||||
peer_id,
|
||||
listen_protocol,
|
||||
events_out: SmallVec::new(),
|
||||
dial_queue: SmallVec::new(),
|
||||
@@ -244,7 +247,6 @@ where
|
||||
fork_context,
|
||||
waker: None,
|
||||
resp_timeout,
|
||||
log_info: (peer_id, connection_id),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,8 +257,8 @@ where
|
||||
if !self.dial_queue.is_empty() {
|
||||
debug!(
|
||||
unsent_queued_requests = self.dial_queue.len(),
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
"Starting handler shutdown"
|
||||
);
|
||||
}
|
||||
@@ -306,8 +308,8 @@ where
|
||||
if !matches!(response, RpcResponse::StreamTermination(..)) {
|
||||
// the stream is closed after sending the expected number of responses
|
||||
trace!(%response, id = ?inbound_id,
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
"Inbound stream has expired. Response not sent");
|
||||
}
|
||||
return;
|
||||
@@ -324,8 +326,8 @@ where
|
||||
if matches!(self.state, HandlerState::Deactivated) {
|
||||
// we no longer send responses after the handler is deactivated
|
||||
debug!(%response, id = ?inbound_id,
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
"Response not sent. Deactivated handler");
|
||||
return;
|
||||
}
|
||||
@@ -394,8 +396,8 @@ where
|
||||
Poll::Ready(_) => {
|
||||
self.state = HandlerState::Deactivated;
|
||||
debug!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
"Shutdown timeout elapsed, Handler deactivated"
|
||||
);
|
||||
return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(
|
||||
@@ -445,8 +447,8 @@ where
|
||||
)));
|
||||
} else {
|
||||
crit!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
stream_id = ?outbound_id.get_ref(), "timed out substream not in the books");
|
||||
}
|
||||
}
|
||||
@@ -577,8 +579,8 @@ where
|
||||
// Its useful to log when the request was completed.
|
||||
if matches!(info.protocol, Protocol::BlocksByRange) {
|
||||
debug!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
duration = Instant::now()
|
||||
.duration_since(info.request_start_time)
|
||||
.as_secs(),
|
||||
@@ -587,8 +589,8 @@ where
|
||||
}
|
||||
if matches!(info.protocol, Protocol::BlobsByRange) {
|
||||
debug!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
duration = Instant::now()
|
||||
.duration_since(info.request_start_time)
|
||||
.as_secs(),
|
||||
@@ -617,16 +619,16 @@ where
|
||||
|
||||
if matches!(info.protocol, Protocol::BlocksByRange) {
|
||||
debug!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
duration = info.request_start_time.elapsed().as_secs(),
|
||||
"BlocksByRange Response failed"
|
||||
);
|
||||
}
|
||||
if matches!(info.protocol, Protocol::BlobsByRange) {
|
||||
debug!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
duration = info.request_start_time.elapsed().as_secs(),
|
||||
"BlobsByRange Response failed"
|
||||
);
|
||||
@@ -816,8 +818,8 @@ where
|
||||
}
|
||||
OutboundSubstreamState::Poisoned => {
|
||||
crit!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
"Poisoned outbound substream"
|
||||
);
|
||||
unreachable!("Coding Error: Outbound substream is poisoned")
|
||||
@@ -852,8 +854,8 @@ where
|
||||
&& self.dial_negotiated == 0
|
||||
{
|
||||
debug!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
"Goodbye sent, Handler deactivated"
|
||||
);
|
||||
self.state = HandlerState::Deactivated;
|
||||
@@ -986,12 +988,13 @@ where
|
||||
self.shutdown(None);
|
||||
}
|
||||
|
||||
self.events_out
|
||||
.push(HandlerEvent::Ok(RPCReceived::Request(Request {
|
||||
id: RequestId::next(),
|
||||
self.events_out.push(HandlerEvent::Ok(RPCReceived::Request(
|
||||
super::InboundRequestId {
|
||||
connection_id: self.connection_id,
|
||||
substream_id: self.current_inbound_substream_id,
|
||||
r#type: req,
|
||||
})));
|
||||
},
|
||||
req,
|
||||
)));
|
||||
self.current_inbound_substream_id.0 += 1;
|
||||
}
|
||||
|
||||
@@ -1049,9 +1052,8 @@ where
|
||||
.is_some()
|
||||
{
|
||||
crit!(
|
||||
peer_id = %self.log_info.0,
|
||||
connection_id = %self.log_info.1,
|
||||
|
||||
peer_id = %self.peer_id,
|
||||
connection_id = %self.connection_id,
|
||||
id = ?self.current_outbound_substream_id, "Duplicate outbound substream id");
|
||||
}
|
||||
self.current_outbound_substream_id.0 += 1;
|
||||
|
||||
Reference in New Issue
Block a user