improve perf of remove_network in foreign net mgr (#1847)

This commit is contained in:
KKRainbow
2026-01-30 23:04:31 +08:00
committed by GitHub
parent acd7c85ff6
commit 9e3c9228bb
9 changed files with 24 additions and 24 deletions
+1 -1
View File
@@ -122,7 +122,7 @@ impl GlobalCtx {
let net_ns = NetNS::new(config_fs.get_netns()); let net_ns = NetNS::new(config_fs.get_netns());
let hostname = config_fs.get_hostname(); let hostname = config_fs.get_hostname();
let (event_bus, _) = tokio::sync::broadcast::channel(8); let (event_bus, _) = tokio::sync::broadcast::channel(16);
let stun_info_collector = StunInfoCollector::new_with_default_servers(); let stun_info_collector = StunInfoCollector::new_with_default_servers();
+1 -1
View File
@@ -442,7 +442,7 @@ impl PeerCenterPeerManagerTrait for PeerMapWithPeerRpcManager {
// TODO: currently latency between public server cannot be calculated because one public-server pair // TODO: currently latency between public server cannot be calculated because one public-server pair
// has no connection between them. (hard to get latency from peer manager because it's hard to transfrom the peer id) // has no connection between them. (hard to get latency from peer manager because it's hard to transfrom the peer id)
// but it's fine because we don't want to too much traffic between public servers. // but it's fine because we don't want to too much traffic between public servers.
let peers = self.peer_map.list_peers().await; let peers = self.peer_map.list_peers();
let mut ret = PeerInfoForGlobalMap::default(); let mut ret = PeerInfoForGlobalMap::default();
for peer in peers { for peer in peers {
if let Some(conns) = self.peer_map.list_peer_conns(peer).await { if let Some(conns) = self.peer_map.list_peer_conns(peer).await {
+1 -1
View File
@@ -48,7 +48,7 @@ impl ForeignNetworkClient {
} }
pub async fn list_public_peers(&self) -> Vec<PeerId> { pub async fn list_public_peers(&self) -> Vec<PeerId> {
self.peer_map.list_peers().await self.peer_map.list_peers()
} }
pub fn get_next_hop(&self, peer_id: PeerId) -> Option<PeerId> { pub fn get_next_hop(&self, peer_id: PeerId) -> Option<PeerId> {
+10 -8
View File
@@ -466,11 +466,15 @@ impl ForeignNetworkManagerData {
fn remove_network(&self, network_name: &String) { fn remove_network(&self, network_name: &String) {
let _l = self.lock.lock().unwrap(); let _l = self.lock.lock().unwrap();
self.peer_network_map.iter().for_each(|v| { if let Some(old) = self.network_peer_maps.remove(network_name) {
v.value().remove(network_name); let to_remove_peers = old.1.peer_map.list_peers();
}); for p in to_remove_peers {
self.peer_network_map.retain(|_, v| !v.is_empty()); self.peer_network_map.remove_if(&p, |_, v| {
self.network_peer_maps.remove(network_name); v.remove(network_name);
v.is_empty()
});
}
}
self.network_peer_last_update.remove(network_name); self.network_peer_last_update.remove(network_name);
} }
@@ -695,7 +699,7 @@ impl ForeignNetworkManager {
my_peer_id_for_this_network: item.my_peer_id, my_peer_id_for_this_network: item.my_peer_id,
peers: Default::default(), peers: Default::default(),
}; };
for peer in item.peer_map.list_peers().await { for peer in item.peer_map.list_peers() {
let peer_info = PeerInfo { let peer_info = PeerInfo {
peer_id: peer, peer_id: peer,
conns: item.peer_map.list_peer_conns(peer).await.unwrap_or(vec![]), conns: item.peer_map.list_peer_conns(peer).await.unwrap_or(vec![]),
@@ -921,7 +925,6 @@ pub mod tests {
.get_foreign_network_client() .get_foreign_network_client()
.get_peer_map() .get_peer_map()
.list_peers() .list_peers()
.await
); );
assert_eq!( assert_eq!(
vec![pm_center vec![pm_center
@@ -932,7 +935,6 @@ pub mod tests {
.get_foreign_network_client() .get_foreign_network_client()
.get_peer_map() .get_peer_map()
.list_peers() .list_peers()
.await
); );
assert_eq!(2, pma_net1.list_routes().await.len()); assert_eq!(2, pma_net1.list_routes().await.len());
+3 -3
View File
@@ -266,7 +266,7 @@ impl PeerMap {
self.peer_map.is_empty() self.peer_map.is_empty()
} }
pub async fn list_peers(&self) -> Vec<PeerId> { pub fn list_peers(&self) -> Vec<PeerId> {
let mut ret = Vec::new(); let mut ret = Vec::new();
for item in self.peer_map.iter() { for item in self.peer_map.iter() {
let peer_id = item.key(); let peer_id = item.key();
@@ -277,7 +277,7 @@ impl PeerMap {
pub async fn list_peers_with_conn(&self) -> Vec<PeerId> { pub async fn list_peers_with_conn(&self) -> Vec<PeerId> {
let mut ret = Vec::new(); let mut ret = Vec::new();
let peers = self.list_peers().await; let peers = self.list_peers();
for peer_id in peers.iter() { for peer_id in peers.iter() {
let Some(peer) = self.get_peer_by_id(*peer_id) else { let Some(peer) = self.get_peer_by_id(*peer_id) else {
continue; continue;
@@ -337,7 +337,7 @@ impl PeerMap {
pub async fn clean_peer_without_conn(&self) { pub async fn clean_peer_without_conn(&self) {
let mut to_remove = vec![]; let mut to_remove = vec![];
for peer_id in self.list_peers().await { for peer_id in self.list_peers() {
let conns = self.list_peer_conns(peer_id).await; let conns = self.list_peer_conns(peer_id).await;
if conns.is_none() || conns.as_ref().unwrap().is_empty() { if conns.is_none() || conns.as_ref().unwrap().is_empty() {
to_remove.push(peer_id); to_remove.push(peer_id);
-1
View File
@@ -3289,7 +3289,6 @@ mod tests {
routable_peer routable_peer
.get_peer_map() .get_peer_map()
.list_peers() .list_peers()
.await
.into_iter() .into_iter()
.collect::<BTreeSet<PeerId>>() .collect::<BTreeSet<PeerId>>()
); );
+6 -6
View File
@@ -235,15 +235,15 @@ pub mod tests {
.await .await
.unwrap(); .unwrap();
assert_eq!(peer_mgr_a.get_peer_map().list_peers().await.len(), 1); assert_eq!(peer_mgr_a.get_peer_map().list_peers().len(), 1);
assert_eq!( assert_eq!(
peer_mgr_a.get_peer_map().list_peers().await[0], peer_mgr_a.get_peer_map().list_peers()[0],
peer_mgr_b.my_peer_id() peer_mgr_b.my_peer_id()
); );
assert_eq!(peer_mgr_c.get_peer_map().list_peers().await.len(), 1); assert_eq!(peer_mgr_c.get_peer_map().list_peers().len(), 1);
assert_eq!( assert_eq!(
peer_mgr_c.get_peer_map().list_peers().await[0], peer_mgr_c.get_peer_map().list_peers()[0],
peer_mgr_b.my_peer_id() peer_mgr_b.my_peer_id()
); );
@@ -299,9 +299,9 @@ pub mod tests {
.await .await
.unwrap(); .unwrap();
assert_eq!(peer_mgr_a.get_peer_map().list_peers().await.len(), 1); assert_eq!(peer_mgr_a.get_peer_map().list_peers().len(), 1);
assert_eq!( assert_eq!(
peer_mgr_a.get_peer_map().list_peers().await[0], peer_mgr_a.get_peer_map().list_peers()[0],
peer_mgr_b.my_peer_id() peer_mgr_b.my_peer_id()
); );
+1 -2
View File
@@ -33,13 +33,12 @@ impl PeerManagerRpcService {
} }
pub async fn list_peers(peer_manager: &PeerManager) -> Vec<PeerInfo> { pub async fn list_peers(peer_manager: &PeerManager) -> Vec<PeerInfo> {
let mut peers = peer_manager.get_peer_map().list_peers().await; let mut peers = peer_manager.get_peer_map().list_peers();
peers.extend( peers.extend(
peer_manager peer_manager
.get_foreign_network_client() .get_foreign_network_client()
.get_peer_map() .get_peer_map()
.list_peers() .list_peers()
.await
.iter(), .iter(),
); );
let peer_map = peer_manager.get_peer_map(); let peer_map = peer_manager.get_peer_map();
+1 -1
View File
@@ -115,7 +115,7 @@ async fn foreign_mgr_stress_test() {
i, i,
p.list_routes().await, p.list_routes().await,
p.list_global_foreign_network().await.foreign_networks.len(), p.list_global_foreign_network().await.foreign_networks.len(),
p.get_peer_map().list_peers().await p.get_peer_map().list_peers()
); );
} }
tokio::time::sleep(std::time::Duration::from_secs(1)).await; tokio::time::sleep(std::time::Duration::from_secs(1)).await;