Fix link-dead detection skipping peers that never send data

The link-dead check required last_recv_time to be Some, so peers that
completed a handshake but never sent any data back (last_recv_time =
None) were silently skipped and lived forever as zombies. Fall back to
session_start when no frame has ever been received.
This commit is contained in:
Johnathan Corgan
2026-03-06 20:05:41 +00:00
parent 56d39f223b
commit 920d93571a
2 changed files with 17 additions and 5 deletions
+12 -5
View File
@@ -452,11 +452,18 @@ impl Node {
let mut dead_peers: Vec<NodeAddr> = Vec::new();
for (node_addr, peer) in self.peers.iter() {
// Check liveness via MMP receiver last_recv_time
if let Some(mmp) = peer.mmp()
&& let Some(last_recv) = mmp.receiver.last_recv_time()
&& now.duration_since(last_recv) >= dead_timeout
{
// Check liveness via MMP receiver last_recv_time.
// Fall back to session_start for peers that never sent data.
let is_dead = if let Some(mmp) = peer.mmp() {
let reference_time = mmp
.receiver
.last_recv_time()
.unwrap_or(peer.session_start());
now.duration_since(reference_time) >= dead_timeout
} else {
false
};
if is_dead {
dead_peers.push(*node_addr);
continue;
}