mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 02:09:06 +00:00
improve perf of remove_network in foreign net mgr (#1847)
This commit is contained in:
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
@@ -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.remove_if(&p, |_, v| {
|
||||||
|
v.remove(network_name);
|
||||||
|
v.is_empty()
|
||||||
});
|
});
|
||||||
self.peer_network_map.retain(|_, v| !v.is_empty());
|
}
|
||||||
self.network_peer_maps.remove(network_name);
|
}
|
||||||
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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>>()
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user