Skip to content

Commit 7612ec9

Browse files
authored
req-resp: Fix memory leak of pending substreams (#297)
Similar to #296, there is a possibility of leaking memory in the following edge-case: - T0: Connection is established and outbound substream is initiated with peer - This maps the substream ID to the request bytes information - T1: Connection is closed before the service has a chance to report `TransportEvent::SubstreamOpened` or `TransportEvent::SubstreamOpenFailure` In this case, if we connect and immediately disconnect with a request in flight, we are effectively leaking the request bytes. Detected by: - #294 ### Dashboard - We are leaking ~111 requests over 3 days timespan: <img width="1484" alt="Screenshot 2024-12-03 at 10 41 01" src="https://github.com/user-attachments/assets/f6701017-4add-4aa1-aee1-e1f8d33d54f3"> cc @paritytech/networking Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>
1 parent 28d42c6 commit 7612ec9

File tree

1 file changed

+3
-0
lines changed
  • src/protocol/request_response

1 file changed

+3
-0
lines changed

src/protocol/request_response/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@ impl RequestResponseProtocol {
292292
async fn on_connection_closed(&mut self, peer: PeerId) {
293293
tracing::debug!(target: LOG_TARGET, ?peer, protocol = %self.protocol, "connection closed");
294294

295+
// Remove any pending outbound substreams for this peer.
296+
self.pending_outbound.retain(|_, context| context.peer != peer);
297+
295298
let Some(context) = self.peers.remove(&peer) else {
296299
tracing::error!(
297300
target: LOG_TARGET,

0 commit comments

Comments
 (0)