diff --git a/src/node/handlers/mmp.rs b/src/node/handlers/mmp.rs index 7c2e079..328f62e 100644 --- a/src/node/handlers/mmp.rs +++ b/src/node/handlers/mmp.rs @@ -452,11 +452,18 @@ impl Node { let mut dead_peers: Vec = 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; } diff --git a/src/peer/active.rs b/src/peer/active.rs index 8da5024..f6d5997 100644 --- a/src/peer/active.rs +++ b/src/peer/active.rs @@ -544,6 +544,11 @@ impl ActivePeer { self.session_start.elapsed().as_millis() as u32 } + /// When this peer's session started (for link-dead fallback timing). + pub fn session_start(&self) -> Instant { + self.session_start + } + // === Heartbeat === /// When we last sent a heartbeat to this peer.