From e3478c2d7c4021b2eeb2e88be61ba9ccd2297cd5 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Wed, 17 Jan 2024 16:26:01 +0100 Subject: [PATCH] Fix bug broken invariant active-requests and hole punch attempts --- src/error.rs | 7 ++++++- src/handler/mod.rs | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/error.rs b/src/error.rs index c6323dffb..e0c9fb4e2 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,4 +1,7 @@ -use crate::{handler::Challenge, node_info::NonContactable}; +use crate::{ + handler::Challenge, + node_info::{NodeAddress, NonContactable}, +}; use derive_more::From; use rlp::DecoderError; use std::fmt; @@ -33,6 +36,8 @@ pub enum Discv5Error { ServiceAlreadyStarted, /// A session could not be established with the remote. SessionNotEstablished, + /// A session to the given peer is already established. + SessionAlreadyEstablished(NodeAddress), /// An RLP decoding error occurred. RLPError(DecoderError), /// Failed to encrypt a message. diff --git a/src/handler/mod.rs b/src/handler/mod.rs index 0d108ea25..745747ade 100644 --- a/src/handler/mod.rs +++ b/src/handler/mod.rs @@ -553,6 +553,11 @@ impl Handler { .on_request_time_out::

(relay, local_enr, nonce, target) .await { + Err(NatError::Initiator(Discv5Error::SessionAlreadyEstablished( + node_address, + ))) => { + debug!("Session to peer already established, aborting hole punch attempt. Peer: {node_address}"); + } Err(e) => { warn!("Failed to start hole punching. Error: {:?}", e); } @@ -1591,7 +1596,9 @@ impl HolePunchNat for Handler { ) -> Result<(), NatError> { // Another hole punch process with this target may have just completed. if self.sessions.get(&target_node_address).is_some() { - return Ok(()); + return Err(NatError::Initiator(Discv5Error::SessionAlreadyEstablished( + target_node_address, + ))); } if let Some(session) = self.sessions.get_mut(&relay) { let relay_init_notif =