[net-fixes] netapp peer exchange: send only currently connected address
All checks were successful
ci/woodpecker/pr/debug Pipeline was successful
ci/woodpecker/push/debug Pipeline was successful

This commit is contained in:
Alex 2024-03-21 10:50:44 +01:00
parent 961b4f9af3
commit 3844110cd0
Signed by: lx
GPG key ID: 0E496D15096376BE

View file

@ -43,7 +43,7 @@ impl Message for PingMessage {
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct PeerListMessage { struct PeerListMessage {
pub list: Vec<(NodeID, Vec<SocketAddr>)>, pub list: Vec<(NodeID, SocketAddr)>,
} }
impl Message for PeerListMessage { impl Message for PeerListMessage {
@ -185,11 +185,13 @@ impl KnownHosts {
} }
self.hash = hash_state.finalize(); self.hash = hash_state.finalize();
} }
fn connected_peers_vec(&self) -> Vec<(NodeID, Vec<SocketAddr>)> { fn connected_peers_vec(&self) -> Vec<(NodeID, SocketAddr)> {
self.list self.list
.iter() .iter()
.filter(|(_, peer)| peer.state.is_up()) .filter_map(|(id, peer)| match peer.state {
.map(|(id, peer)| (*id, peer.known_addrs.clone())) PeerConnState::Connected { addr } => Some((*id, addr)),
_ => None,
})
.collect::<Vec<_>>() .collect::<Vec<_>>()
} }
} }
@ -468,20 +470,18 @@ impl PeeringManager {
} }
} }
fn handle_peer_list(&self, list: &[(NodeID, Vec<SocketAddr>)]) { fn handle_peer_list(&self, list: &[(NodeID, SocketAddr)]) {
let mut known_hosts = self.known_hosts.write().unwrap(); let mut known_hosts = self.known_hosts.write().unwrap();
let mut changed = false; let mut changed = false;
for (id, addrs) in list.iter() { for (id, addr) in list.iter() {
for addr in addrs.iter() { if let Some(kh) = known_hosts.list.get_mut(id) {
if let Some(kh) = known_hosts.list.get_mut(id) { if kh.add_addr(*addr) {
if kh.add_addr(*addr) {
changed = true;
}
} else {
known_hosts.list.insert(*id, self.new_peer(id, *addr));
changed = true; changed = true;
} }
} else {
known_hosts.list.insert(*id, self.new_peer(id, *addr));
changed = true;
} }
} }