From 94c01a3565f0f5804ea096370aced22f8e4a723a Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Thu, 21 Oct 2021 12:14:19 +0200 Subject: try fix --- src/netapp.rs | 8 ++++++-- src/peering/fullmesh.rs | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/netapp.rs b/src/netapp.rs index 8c0b50c..acaed62 100644 --- a/src/netapp.rs +++ b/src/netapp.rs @@ -24,7 +24,7 @@ use crate::proto::*; use crate::server::*; use crate::util::*; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] pub(crate) struct HelloMessage { pub server_addr: Option, pub server_port: u16, @@ -243,13 +243,16 @@ impl NetApp { .log_err("Failed to await for connection collector"); } - /// Drop all endpoint handlers + /// Drop all endpoint handlers, as well as handlers for connection/disconnection + /// events. (This disables the peering strategy) /// /// Use this when terminating to break reference cycles pub fn drop_all_handlers(&self) { for (_, endpoint) in self.endpoints.read().unwrap().iter() { endpoint.drop_handler(); } + self.on_connected_handler.store(None); + self.on_disconnected_handler.store(None); } /// Attempt to connect to a peer, given by its ip:port and its public key. @@ -411,6 +414,7 @@ impl NetApp { #[async_trait] impl EndpointHandler for NetApp { async fn handle(self: &Arc, msg: &HelloMessage, from: NodeID) { + debug!("Hello from {:?}: {:?}", hex::encode(from), msg); if let Some(h) = self.on_connected_handler.load().as_ref() { if let Some(c) = self.server_conns.read().unwrap().get(&from) { let remote_ip = msg.server_addr.unwrap_or_else(|| c.remote_addr.ip()); diff --git a/src/peering/fullmesh.rs b/src/peering/fullmesh.rs index 22657dd..5b73f4e 100644 --- a/src/peering/fullmesh.rs +++ b/src/peering/fullmesh.rs @@ -391,12 +391,19 @@ impl FullMeshPeeringStrategy { fn handle_peer_list(&self, list: &[(NodeID, SocketAddr)]) { let mut known_hosts = self.known_hosts.write().unwrap(); + + let mut changed = false; for (id, addr) in list.iter() { if !known_hosts.list.contains_key(id) { known_hosts.list.insert(*id, self.new_peer(id, *addr)); + changed = true; } } - self.update_public_peer_list(&known_hosts); + + if changed { + known_hosts.update_hash(); + self.update_public_peer_list(&known_hosts); + } } async fn try_connect(self: Arc, id: NodeID, addr: SocketAddr) { @@ -422,18 +429,20 @@ impl FullMeshPeeringStrategy { async fn on_connected(self: Arc, id: NodeID, addr: SocketAddr, is_incoming: bool) { if is_incoming { - if !self.known_hosts.read().unwrap().list.contains_key(&id) { - self.known_hosts - .write() - .unwrap() + let mut known_hosts = self.known_hosts.write().unwrap(); + if !known_hosts.list.contains_key(&id) { + known_hosts .list .insert(id, self.new_peer(&id, addr)); + known_hosts.update_hash(); + self.update_public_peer_list(&known_hosts); } } else { info!("Successfully connected to {} at {}", hex::encode(&id), addr); let mut known_hosts = self.known_hosts.write().unwrap(); if let Some(host) = known_hosts.list.get_mut(&id) { host.state = PeerConnState::Connected; + host.addr = addr; known_hosts.update_hash(); self.update_public_peer_list(&known_hosts); } -- cgit v1.2.3