From a5ee494fda700b0d7a92e83f41ae78bda9c2c87c Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Mon, 6 Mar 2023 12:53:31 +0100 Subject: [PATCH] node: Correctly handle disconnect in wire protocol --- radicle-node/src/wire/protocol.rs | 32 +++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/radicle-node/src/wire/protocol.rs b/radicle-node/src/wire/protocol.rs index e8152fee..b97a91b7 100644 --- a/radicle-node/src/wire/protocol.rs +++ b/radicle-node/src/wire/protocol.rs @@ -568,21 +568,37 @@ where // TODO: This should be a fatal error, there's nothing we can do here. log::error!(target: "wire", "Can't poll connections: {}", err); } - reactor::Error::ListenerPollError(id, err) => { + reactor::Error::ListenerPollError(id, _) => { // TODO: This should be a fatal error, there's nothing we can do here. - log::error!(target: "wire", "Received error: listener {} disconnected: {}", id, err); + log::error!(target: "wire", "Received error: listener {} disconnected", id); self.actions.push_back(Action::UnregisterListener(*id)); } - reactor::Error::ListenerDisconnect(id, _, err) => { + reactor::Error::ListenerDisconnect(id, _, _) => { // TODO: This should be a fatal error, there's nothing we can do here. - log::error!(target: "wire", "Received error: listener {} disconnected: {}", id, err); + log::error!(target: "wire", "Received error: listener {} disconnected", id); } - reactor::Error::TransportPollError(fd, err) => { - log::error!(target: "wire", "Received error: peer (fd={fd}) disconnected: {err}"); + reactor::Error::TransportPollError(fd, _) => { + log::error!(target: "wire", "Received error: peer (fd={fd}) poll error"); self.actions.push_back(Action::UnregisterTransport(*fd)); } - reactor::Error::TransportDisconnect(fd, _, err) => { - log::error!(target: "wire", "Received error: peer (fd={fd}) disconnected: {err}"); + reactor::Error::TransportDisconnect(fd, _, _) => { + log::error!(target: "wire", "Received error: peer (fd={fd}) disconnected"); + + match self.peers.get_mut(fd) { + Some(peer) => { + let reason = DisconnectReason::Connection(Arc::new(io::Error::from( + io::ErrorKind::ConnectionReset, + ))); + + if let Some(id) = peer.id() { + self.service.disconnected(*id, &reason); + } + peer.disconnected(reason); + } + None => { + log::warn!(target: "wire", "Peer with fd {fd} is unknown"); + } + } } reactor::Error::WriteFailure(id, err) => { // TODO: Disconnect peer?