From be307e9865ee8c585a4ab45eb477411ea3b5bb97 Mon Sep 17 00:00:00 2001 From: stringhandler Date: Mon, 3 Feb 2025 15:52:46 +0200 Subject: [PATCH] feat: updated peer exchange (#247) --- src/server/http/stats_collector.rs | 10 +++++++- src/server/p2p/network.rs | 19 +++++++-------- src/server/p2p/peer_store.rs | 37 ++++++++++++++++++++++-------- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/server/http/stats_collector.rs b/src/server/http/stats_collector.rs index a3988e5..a29309b 100644 --- a/src/server/http/stats_collector.rs +++ b/src/server/http/stats_collector.rs @@ -41,6 +41,7 @@ pub(crate) struct StatsCollector { total_peers: u64, total_grey_list: u64, total_black_list: u64, + total_non_squad_peers: u64, pending_incoming: u32, pending_outgoing: u32, established_incoming: u32, @@ -72,6 +73,7 @@ impl StatsCollector { total_peers: 0, total_grey_list: 0, total_black_list: 0, + total_non_squad_peers: 0, sha_network_difficulty: Difficulty::min(), randomx_network_difficulty: Difficulty::min(), sha_target_difficulty: Difficulty::min(), @@ -133,11 +135,13 @@ impl StatsCollector { total_peers, total_grey_list, total_black_list, + total_non_squad, .. } => { self.total_peers = total_peers; self.total_grey_list = total_grey_list; self.total_black_list = total_black_list; + self.total_non_squad_peers = total_non_squad; }, StatData::TargetDifficultyChanged { target_difficulty, @@ -194,7 +198,7 @@ impl StatsCollector { let formatter = Formatter::new(); info!(target: LOG_TARGET, - "========= Uptime: {}. v{}, Sqd: {}, Chains: Rx {}..{}, Sha3 {}..{}. Difficulty (Target/Network): Rx: {}/{} Sha3x: {}/{} Miner accepts(rx/sha): {}/{}. Pool accepts (rx/sha) {}/{}. Peers(a/g/b) {}/{}/{} libp2p (i/o) {}/{} Last gossip: {}==== ", + "========= Uptime: {}. v{}, Sqd: {}, Chains: Rx {}..{}, Sha3 {}..{}. Difficulty (Target/Network): Rx: {}/{} Sha3x: {}/{} Miner accepts(rx/sha): {}/{}. Pool accepts (rx/sha) {}/{}. Peers(a/g/b/o) {}/{}/{}/{} libp2p (i/o) {}/{} Last gossip: {}==== ", humantime::format_duration(Duration::from_secs( EpochTime::now().as_u64().checked_sub( self.first_stat_received.unwrap_or(EpochTime::now()).as_u64()) @@ -216,6 +220,7 @@ impl StatsCollector { self.total_peers, self.total_grey_list, self.total_black_list, + self.total_non_squad_peers, self.established_incoming, self.established_outgoing, humantime::format_duration(Duration::from_secs( @@ -329,6 +334,7 @@ pub(crate) enum StatData { total_peers: u64, total_grey_list: u64, total_black_list: u64, + total_non_squad: u64, timestamp: EpochTime, }, LibP2PStats { @@ -452,11 +458,13 @@ impl StatsBroadcastClient { total_peers: u64, total_grey_list: u64, total_black_list: u64, + total_non_squad: u64, ) -> Result<(), anyhow::Error> { self.broadcast(StatData::NewPeer { total_peers, total_grey_list, total_black_list, + total_non_squad, timestamp: EpochTime::now(), }) } diff --git a/src/server/p2p/network.rs b/src/server/p2p/network.rs index 826faf9..21249e2 100644 --- a/src/server/p2p/network.rs +++ b/src/server/p2p/network.rs @@ -786,9 +786,7 @@ where S: ShareChain return; } let peer_store_read_lock = self.network_peer_store.read().await; - let my_best_peers = peer_store_read_lock.best_peers_to_share(NUM_PEERS_TO_SYNC_PER_ALGO, &self.squad, &[]); - - let my_best_peers: Vec<_> = my_best_peers.into_iter().map(|p| p.peer_info).collect(); + let my_best_peers = vec![]; let known_peers = peer_store_read_lock.get_known_peers(); drop(peer_store_read_lock); self.swarm @@ -850,6 +848,9 @@ where S: ShareChain let num_peers = request.best_peers.len(); info!(target: PEER_INFO_LOGGING_LOG_TARGET, "[DIRECT_PEER_EXCHANGE_REQ] New peer info: {source_peer:?} with {num_peers} new peers"); + for peer in &request.best_peers { + info!(target: PEER_INFO_LOGGING_LOG_TARGET, "new peer from request received. {:?}, squad: {}", peer.peer_id, peer.squad); + } let local_peer_id = *self.swarm.local_peer_id(); if let Ok(info) = self .create_peer_info(self.swarm.external_addresses().cloned().collect()) @@ -1069,12 +1070,12 @@ where S: ShareChain // Keep going until we have all the peers if num_peers_added > 0 { self.initiate_direct_peer_exchange(&peer_id).await; - } else { - // Once we have peer info from the seed peers, disconnect from them. - if self.network_peer_store.read().await.is_seed_peer(&peer_id) { - warn!(target: LOG_TARGET, "Disconnecting from seed peer {}", peer_id); - let _ = self.swarm.disconnect_peer_id(peer_id); - } + } + + // Once we have peer info from the seed peers, disconnect from them. + if self.network_peer_store.read().await.is_seed_peer(&peer_id) { + warn!(target: LOG_TARGET, "Disconnecting from seed peer {}", peer_id); + let _ = self.swarm.disconnect_peer_id(peer_id); } }, Err(error) => { diff --git a/src/server/p2p/peer_store.rs b/src/server/p2p/peer_store.rs index be361bb..ba38d77 100644 --- a/src/server/p2p/peer_store.rs +++ b/src/server/p2p/peer_store.rs @@ -206,16 +206,19 @@ impl PeerStore { } pub fn best_peers_to_share(&self, count: usize, squad: &str, other_nodes_peers: &[PeerId]) -> Vec { - let mut peers = if squad == self.my_squad { - self.whitelist_peers.values().collect::>() - } else { - self.non_squad_peers.values().collect::>() - }; - peers.retain(|peer| { - !peer.peer_info.public_addresses().is_empty() && peer.last_ping.is_some() && peer.peer_info.squad == squad + // let mut peers = if squad == self.my_squad { + // self.whitelist_peers.values().collect::>() + // } else { + // self.non_squad_peers.values().collect::>() + // }; + let mut peers = self.whitelist_peers.values().collect::>(); + peers.extend(self.non_squad_peers.values().collect::>()); + peers.retain(|peer| !peer.peer_info.public_addresses().is_empty() && peer.last_ping.is_some()); + peers.sort_by(|a, b| { + (if a.peer_info.squad == squad { 0 } else { 1 }) + .cmp(&(if b.peer_info.squad == squad { 0 } else { 1 })) + .then(b.last_seen().cmp(&a.last_seen())) }); - peers.sort_by_key(|a| a.last_seen()); - peers.reverse(); peers.retain(|peer| !other_nodes_peers.contains(&peer.peer_id)); peers.truncate(count); @@ -224,6 +227,7 @@ impl PeerStore { pub fn best_peers_to_dial(&self, count: usize) -> Vec { let mut peers = self.whitelist_peers.values().collect::>(); + peers.extend(self.non_squad_peers.values().collect::>()); peers.retain(|peer| { !peer.peer_info.public_addresses().is_empty() && (peer.last_dial_attempt.is_none() || peer.last_dial_attempt.unwrap().elapsed().as_secs() > 120) @@ -231,6 +235,10 @@ impl PeerStore { peers.sort_by(|a, b| { b.num_grey_listings .cmp(&a.num_grey_listings) + .then( + (if a.peer_info.squad == self.my_squad { 0 } else { 1 }) + .cmp(&(if b.peer_info.squad == self.my_squad { 0 } else { 1 })), + ) .then(b.peer_info.current_random_x_pow.cmp(&a.peer_info.current_random_x_pow)) .then(b.peer_info.current_sha3x_pow.cmp(&a.peer_info.current_sha3x_pow)) }); @@ -308,6 +316,12 @@ impl PeerStore { if peer_info.squad != self.my_squad { self.non_squad_peers .insert(peer_id.to_base58(), PeerStoreRecord::new(peer_id, peer_info)); + let _unused = self.stats_broadcast_client.send_new_peer( + self.whitelist_peers.len() as u64, + self.greylist_peers.len() as u64, + self.blacklist_peers.len() as u64, + self.non_squad_peers.len() as u64, + ); return AddPeerStatus::NonSquad; } @@ -333,6 +347,7 @@ impl PeerStore { self.whitelist_peers.len() as u64, self.greylist_peers.len() as u64, self.blacklist_peers.len() as u64, + self.non_squad_peers.len() as u64, ); // self.peer_removals.insert(peer_id, removal_count).await; @@ -359,6 +374,7 @@ impl PeerStore { self.whitelist_peers.len() as u64, self.greylist_peers.len() as u64, self.blacklist_peers.len() as u64, + self.non_squad_peers.len() as u64, ); } @@ -373,6 +389,7 @@ impl PeerStore { self.whitelist_peers.len() as u64, self.greylist_peers.len() as u64, self.blacklist_peers.len() as u64, + self.non_squad_peers.len() as u64, ); } @@ -428,6 +445,7 @@ impl PeerStore { self.whitelist_peers.len() as u64, self.greylist_peers.len() as u64, self.blacklist_peers.len() as u64, + self.non_squad_peers.len() as u64, ); } } @@ -449,6 +467,7 @@ impl PeerStore { self.whitelist_peers.len() as u64, self.greylist_peers.len() as u64, self.blacklist_peers.len() as u64, + self.non_squad_peers.len() as u64, ); } }