移除过期统计值

This commit is contained in:
lbl
2026-03-02 15:52:24 +08:00
parent 39602c478e
commit e088d305b1
3 changed files with 37 additions and 14 deletions
+12
View File
@@ -259,6 +259,18 @@ impl PacketLossStats {
} }
} }
pub fn remove(&self, ip: &Ipv4Addr, route_key: &RouteKey) {
let mut write = self.inner.write();
write.remove(&(*ip, *route_key));
}
pub fn remove_batch(&self, keys: &[(Ipv4Addr, RouteKey)]) {
let mut write = self.inner.write();
for key in keys {
write.remove(key);
}
}
pub fn reset_all(&self) { pub fn reset_all(&self) {
let read = self.inner.read(); let read = self.inner.read();
for stats in read.values() { for stats in read.values() {
+13 -11
View File
@@ -207,8 +207,8 @@ impl RouteTable {
} }
/// 移除过期的路由 /// 移除过期的路由
pub fn remove_oldest_route(&self, expired_time: Instant) { pub fn remove_oldest_route(&self, expired_time: Instant) -> Vec<(Ipv4Addr, RouteKey)> {
self.inner.remove_oldest_route(expired_time); self.inner.remove_oldest_route(expired_time)
} }
} }
@@ -280,7 +280,7 @@ impl RouteTableInner {
list.insert(pos, route); list.insert(pos, route);
} }
fn remove_oldest_route(&self, expired_time: Instant) { fn remove_oldest_route(&self, expired_time: Instant) -> Vec<(Ipv4Addr, RouteKey)> {
let mut expired_keys = Vec::new(); let mut expired_keys = Vec::new();
{ {
let mut time_map = self.route_key_time.lock(); let mut time_map = self.route_key_time.lock();
@@ -295,25 +295,27 @@ impl RouteTableInner {
} }
if expired_keys.is_empty() { if expired_keys.is_empty() {
return; return expired_keys;
} }
let mut table = self.route_table.write(); let mut table = self.route_table.write();
let mut owner_map = self.route_key_owner.lock(); let mut owner_map = self.route_key_owner.lock();
for (id, route_key) in expired_keys { for (id, route_key) in &expired_keys {
if let Some(list) = table.get_mut(&id) { if let Some(list) = table.get_mut(id) {
list.retain(|r| r.route_key() != route_key); list.retain(|r| r.route_key() != *route_key);
if list.is_empty() { if list.is_empty() {
table.remove(&id); table.remove(id);
} }
} }
if let Some(owner_id) = owner_map.get(&route_key) { if let Some(owner_id) = owner_map.get(route_key) {
if *owner_id == id { if *owner_id == *id {
owner_map.remove(&route_key); owner_map.remove(route_key);
} }
} }
} }
expired_keys
} }
} }
+12 -3
View File
@@ -56,7 +56,10 @@ pub async fn init_tunnel(
)); ));
task_group.spawn(query_tcp_public_addr_loop(app_state.clone(), manager)); task_group.spawn(query_tcp_public_addr_loop(app_state.clone(), manager));
task_group.spawn(route_timeout_task(route_table.clone())); task_group.spawn(route_timeout_task(
route_table.clone(),
app_state.packet_loss_stats.clone(),
));
let app_state_for_punch = app_state.clone(); let app_state_for_punch = app_state.clone();
let punch_ctx = PunchTaskContext { let punch_ctx = PunchTaskContext {
network: app_state.network.clone(), network: app_state.network.clone(),
@@ -142,11 +145,17 @@ pub async fn ping_all(
} }
} }
} }
pub async fn route_timeout_task(route_table: RouteTable) { pub async fn route_timeout_task(
route_table: RouteTable,
packet_loss_stats: PacketLossStats,
) {
loop { loop {
tokio::time::sleep(Duration::from_secs(10)).await; tokio::time::sleep(Duration::from_secs(10)).await;
let expired_time = std::time::Instant::now() - Duration::from_secs(10); let expired_time = std::time::Instant::now() - Duration::from_secs(10);
route_table.remove_oldest_route(expired_time); let removed_keys = route_table.remove_oldest_route(expired_time);
if !removed_keys.is_empty() {
packet_loss_stats.remove_batch(&removed_keys);
}
} }
} }