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
+36 -57
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 {
Ok(info) => self.peers.insert(peer_id, info).await,
Err(error) => {
tracing::warn!(%peer_id, ?error, "failed to fetch dns export config from peer"); tracing::warn!(%peer_id, ?error, "failed to fetch dns export config from peer");
invalidate = true; }).ok()
} } else {
None
}; };
}
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
assert!(
snapshot
.zones .zones
.iter() .iter()
.any(|z| z.origin.contains("local-custom.test")) .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,17 +554,11 @@ 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",
Ipv4Addr::new(10, 2, 0, 2),
)
.await; .await;
let peer_b = create_peer_manager_with_zone( let peer_b =
"peer-b", create_peer_manager_with_zone("peer-b", "remote-b.test", Ipv4Addr::new(10, 2, 0, 3))
"remote-b.test",
Ipv4Addr::new(10, 2, 0, 3),
)
.await; .await;
let local_dns = DnsPeerMgr::new(local.clone(), local.get_global_ctx()); let local_dns = DnsPeerMgr::new(local.clone(), local.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
assert!(
!snapshot
.zones .zones
.iter() .iter()
.any(|z| z.origin.contains("remote-b.test")) .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
assert!(
before
.zones .zones
.iter() .iter()
.any(|z| z.origin.contains("local-tti.test")) .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());
} }
} }