移除过期统计值

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) {
let read = self.inner.read();
for stats in read.values() {
+13 -11
View File
@@ -207,8 +207,8 @@ impl RouteTable {
}
/// 移除过期的路由
pub fn remove_oldest_route(&self, expired_time: Instant) {
self.inner.remove_oldest_route(expired_time);
pub fn remove_oldest_route(&self, expired_time: Instant) -> Vec<(Ipv4Addr, RouteKey)> {
self.inner.remove_oldest_route(expired_time)
}
}
@@ -280,7 +280,7 @@ impl RouteTableInner {
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 time_map = self.route_key_time.lock();
@@ -295,25 +295,27 @@ impl RouteTableInner {
}
if expired_keys.is_empty() {
return;
return expired_keys;
}
let mut table = self.route_table.write();
let mut owner_map = self.route_key_owner.lock();
for (id, route_key) in expired_keys {
if let Some(list) = table.get_mut(&id) {
list.retain(|r| r.route_key() != route_key);
for (id, route_key) in &expired_keys {
if let Some(list) = table.get_mut(id) {
list.retain(|r| r.route_key() != *route_key);
if list.is_empty() {
table.remove(&id);
table.remove(id);
}
}
if let Some(owner_id) = owner_map.get(&route_key) {
if *owner_id == id {
owner_map.remove(&route_key);
if let Some(owner_id) = owner_map.get(route_key) {
if *owner_id == *id {
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(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 punch_ctx = PunchTaskContext {
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 {
tokio::time::sleep(Duration::from_secs(10)).await;
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);
}
}
}