移除过期统计值
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user