From db6b96f8dc53eb32da9c4cfd49f55fe8cf59f33d Mon Sep 17 00:00:00 2001 From: Revertron Date: Fri, 2 Apr 2021 15:25:56 +0200 Subject: [PATCH] Added a disconnect for sockets with 3+ spurious wakeups. --- src/p2p/network.rs | 18 +++++++++++++++--- src/p2p/peer.rs | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/p2p/network.rs b/src/p2p/network.rs index 79ee86d..40a2b50 100644 --- a/src/p2p/network.rs +++ b/src/p2p/network.rs @@ -179,12 +179,24 @@ fn handle_connection_event(context: Arc>, peers: &mut Peers, regi return false; } Some(peer) => { - let mut stream = peer.get_stream(); if event.is_read_closed() { - info!("Spurious wakeup for connection {}, ignoring", token.0); - registry.reregister(stream, token, Interest::READABLE).unwrap(); + debug!("Spurious wakeup for connection {}, ignoring", token.0); + if peer.spurious() >= 3 { + debug!("Disconnecting socket on 3 spurious wakeups"); + return false; + } + let interest = if let State::Message{..} = peer.get_state() { + Interest::WRITABLE + } else { + Interest::READABLE + }; + let stream = peer.get_stream(); + registry.reregister(stream, token, interest).unwrap(); + peer.inc_spurious(); return true; } + peer.reset_spurious(); + let mut stream = peer.get_stream(); read_message(&mut stream) } } diff --git a/src/p2p/peer.rs b/src/p2p/peer.rs index ebf0d67..ad49b96 100644 --- a/src/p2p/peer.rs +++ b/src/p2p/peer.rs @@ -15,6 +15,7 @@ pub struct Peer { public: bool, active: bool, reconnects: u32, + spurious: u32, received_block: u64, fork: HashMap } @@ -31,6 +32,7 @@ impl Peer { public: false, active: false, reconnects: 0, + spurious: 0, received_block: 0, fork: HashMap::new() } @@ -108,6 +110,18 @@ impl Peer { self.reconnects = 0; } + pub fn spurious(&self) -> u32 { + self.spurious + } + + pub fn inc_spurious(&mut self) { + self.spurious += 1; + } + + pub fn reset_spurious(&mut self) { + self.spurious = 0; + } + pub fn disabled(&self) -> bool { self.state.disabled() || self.reconnects > 2 }