mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-09 08:14:42 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user