peer_mgr: remove peer from cache when lost route

This commit is contained in:
Luna Yao
2026-04-06 17:04:30 +02:00
parent ddbfe76932
commit 50ecd3679b
+57 -78
View File
@@ -79,8 +79,13 @@ impl DnsPeerMgrInner {
} }
let Some(route) = self.peer_mgr.get_route().get_peer_info(peer_id).await else { let Some(route) = self.peer_mgr.get_route().get_peer_info(peer_id).await else {
if self.peers.remove(&peer_id).await.is_some() {
tracing::debug!(%peer_id, "peer route disappeared, removing from cache");
self.dirty.mark();
}
return; return;
}; };
if self if self
.peers .peers
.get(&peer_id) .get(&peer_id)
@@ -90,19 +95,18 @@ impl DnsPeerMgrInner {
return; return;
} }
let mut invalidate = route.dns.is_empty(); let info =
if !route.dns.is_empty() {
if !invalidate { self.fetch(peer_id).await.inspect_err(|error| {
match self.fetch(peer_id).await { tracing::warn!(%peer_id, ?error, "failed to fetch dns export config from peer");
Ok(info) => self.peers.insert(peer_id, info).await, }).ok()
Err(error) => { } else {
tracing::warn!(%peer_id, ?error, "failed to fetch dns export config from peer"); None
invalidate = true;
}
}; };
}
if invalidate { if let Some(info) = info {
self.peers.insert(peer_id, info).await;
} else {
self.peers.invalidate(&peer_id).await; self.peers.invalidate(&peer_id).await;
} }
@@ -288,18 +292,14 @@ mod tests {
.await; .await;
let snapshot = mgr.snapshot(); let snapshot = mgr.snapshot();
assert!( assert!(snapshot
snapshot .zones
.zones .iter()
.iter() .any(|z| z.origin.contains("peer-cache.test")));
.any(|z| z.origin.contains("peer-cache.test")) assert!(snapshot
); .zones
assert!( .iter()
snapshot .any(|z| z.origin.contains("local-custom.test")));
.zones
.iter()
.any(|z| z.origin.contains("local-custom.test"))
);
} }
#[tokio::test] #[tokio::test]
@@ -540,12 +540,10 @@ mod tests {
assert!(local_dns.dirty.peek()); assert!(local_dns.dirty.peek());
let snapshot = local_dns.snapshot(); let snapshot = local_dns.snapshot();
assert!( assert!(snapshot
snapshot .zones
.zones .iter()
.iter() .any(|z| z.origin.contains("remote-export.test")));
.any(|z| z.origin.contains("remote-export.test"))
);
} }
#[tokio::test] #[tokio::test]
@@ -556,18 +554,12 @@ mod tests {
Ipv4Addr::new(10, 2, 0, 1), Ipv4Addr::new(10, 2, 0, 1),
) )
.await; .await;
let peer_a = create_peer_manager_with_zone( let peer_a =
"peer-a", create_peer_manager_with_zone("peer-a", "remote-a.test", Ipv4Addr::new(10, 2, 0, 2))
"remote-a.test", .await;
Ipv4Addr::new(10, 2, 0, 2), let peer_b =
) create_peer_manager_with_zone("peer-b", "remote-b.test", Ipv4Addr::new(10, 2, 0, 3))
.await; .await;
let peer_b = create_peer_manager_with_zone(
"peer-b",
"remote-b.test",
Ipv4Addr::new(10, 2, 0, 3),
)
.await;
let local_dns = DnsPeerMgr::new(local.clone(), local.get_global_ctx()); let local_dns = DnsPeerMgr::new(local.clone(), local.get_global_ctx());
let peer_a_dns = DnsPeerMgr::new(peer_a.clone(), peer_a.get_global_ctx()); let peer_a_dns = DnsPeerMgr::new(peer_a.clone(), peer_a.get_global_ctx());
@@ -585,18 +577,14 @@ mod tests {
local_dns.refresh(peer_a.my_peer_id()).await; local_dns.refresh(peer_a.my_peer_id()).await;
let snapshot = local_dns.snapshot(); let snapshot = local_dns.snapshot();
assert!( assert!(snapshot
snapshot .zones
.zones .iter()
.iter() .any(|z| z.origin.contains("remote-a.test")));
.any(|z| z.origin.contains("remote-a.test")) assert!(!snapshot
); .zones
assert!( .iter()
!snapshot .any(|z| z.origin.contains("remote-b.test")));
.zones
.iter()
.any(|z| z.origin.contains("remote-b.test"))
);
} }
#[tokio::test] #[tokio::test]
@@ -744,12 +732,10 @@ mod tests {
.get(&unchanged_id) .get(&unchanged_id)
.await .await
.expect("unchanged peer cache should stay"); .expect("unchanged peer cache should stay");
assert!( assert!(unchanged_cache
unchanged_cache .zones
.zones .iter()
.iter() .any(|z| z.origin.contains("cached-unchanged.test")));
.any(|z| z.origin.contains("cached-unchanged.test"))
);
} }
#[tokio::test] #[tokio::test]
@@ -775,18 +761,14 @@ mod tests {
.await; .await;
let before = mgr.snapshot(); let before = mgr.snapshot();
assert!( assert!(before
before .zones
.zones .iter()
.iter() .any(|z| z.origin.contains("cached-expire.test")));
.any(|z| z.origin.contains("cached-expire.test")) assert!(before
); .zones
assert!( .iter()
before .any(|z| z.origin.contains("local-tti.test")));
.zones
.iter()
.any(|z| z.origin.contains("local-tti.test"))
);
let deadline = tokio::time::Instant::now() + DNS_PEER_TTI + Duration::from_secs(3); let deadline = tokio::time::Instant::now() + DNS_PEER_TTI + Duration::from_secs(3);
loop { loop {
@@ -796,12 +778,10 @@ mod tests {
.iter() .iter()
.any(|z| z.origin.contains("cached-expire.test")); .any(|z| z.origin.contains("cached-expire.test"));
if expired { if expired {
assert!( assert!(now_snapshot
now_snapshot .zones
.zones .iter()
.iter() .any(|z| z.origin.contains("local-tti.test")));
.any(|z| z.origin.contains("local-tti.test"))
);
break; break;
} }
@@ -867,4 +847,3 @@ mod tests {
assert!(res.is_none()); assert!(res.is_none());
} }
} }