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