diff options
Diffstat (limited to 'src/peering')
-rw-r--r-- | src/peering/fullmesh.rs | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/peering/fullmesh.rs b/src/peering/fullmesh.rs index bb0c9dc..012c5a0 100644 --- a/src/peering/fullmesh.rs +++ b/src/peering/fullmesh.rs @@ -1,4 +1,4 @@ -use std::collections::{hash_map::Entry::Vacant, HashMap, VecDeque}; +use std::collections::{HashMap, VecDeque}; use std::net::SocketAddr; use std::sync::atomic::{self, AtomicU64}; use std::sync::{Arc, RwLock}; @@ -512,12 +512,14 @@ impl FullMeshPeeringStrategy { } fn on_connected(self: Arc<Self>, id: NodeID, addr: SocketAddr, is_incoming: bool) { + let mut known_hosts = self.known_hosts.write().unwrap(); if is_incoming { - let mut known_hosts = self.known_hosts.write().unwrap(); - if let Vacant(entry) = known_hosts.list.entry(id) { - entry.insert(self.new_peer(&id, addr)); - known_hosts.update_hash(); - self.update_public_peer_list(&known_hosts); + if let Some(host) = known_hosts.list.get_mut(&id) { + if !host.all_addrs.contains(&addr) { + host.all_addrs.push(addr); + } + } else { + known_hosts.list.insert(id, self.new_peer(&id, addr)); } } else { info!( @@ -525,7 +527,6 @@ impl FullMeshPeeringStrategy { hex::encode(&id[..8]), 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; @@ -545,9 +546,9 @@ impl FullMeshPeeringStrategy { }, ); } - known_hosts.update_hash(); - self.update_public_peer_list(&known_hosts); } + known_hosts.update_hash(); + self.update_public_peer_list(&known_hosts); } fn on_disconnected(self: Arc<Self>, id: NodeID, is_incoming: bool) { |