|
|
|
@ -194,6 +194,10 @@ impl Peers {
|
|
|
|
|
for (_, peer) in self.peers.iter() {
|
|
|
|
|
if peer.active() {
|
|
|
|
|
count += 1;
|
|
|
|
|
} else {
|
|
|
|
|
if !matches!(peer.get_state(), State::Connecting) {
|
|
|
|
|
debug!("Inactive peer from {:?} in state: {:?}", peer.get_addr(), peer.get_state());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
count
|
|
|
|
@ -249,6 +253,7 @@ impl Peers {
|
|
|
|
|
let nodes = self.get_peers_active_count();
|
|
|
|
|
|
|
|
|
|
let random_time = random::<u64>() % PING_PERIOD;
|
|
|
|
|
let mut stale_tokens = Vec::new();
|
|
|
|
|
for (token, peer) in self.peers.iter_mut() {
|
|
|
|
|
if let State::Idle { from } = peer.get_state() {
|
|
|
|
|
if from.elapsed().as_secs() >= PING_PERIOD + random_time {
|
|
|
|
@ -261,10 +266,23 @@ impl Peers {
|
|
|
|
|
|
|
|
|
|
peer.set_state(State::message(message));
|
|
|
|
|
let stream = peer.get_stream();
|
|
|
|
|
registry.reregister(stream, *token, Interest::WRITABLE | Interest::READABLE).unwrap();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if matches!(peer.get_state(), State::Message {..}) {
|
|
|
|
|
if !peer.active() {
|
|
|
|
|
stale_tokens.push((token.clone(), peer.get_addr()));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
let stream = peer.get_stream();
|
|
|
|
|
registry.reregister(stream, *token, Interest::WRITABLE).unwrap();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (token, addr) in &stale_tokens {
|
|
|
|
|
info!("Closing stale peer from {}", addr);
|
|
|
|
|
self.close_peer(registry, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Just purging ignored/banned IPs every 10 minutes
|
|
|
|
|
// TODO make it individual for every IP
|
|
|
|
@ -289,7 +307,7 @@ impl Peers {
|
|
|
|
|
None => {}
|
|
|
|
|
Some((token, peer)) => {
|
|
|
|
|
debug!("Peer {} is behind ({}), sending ping", &peer.get_addr().ip(), peer.get_height());
|
|
|
|
|
registry.reregister(peer.get_stream(), *token, Interest::WRITABLE).unwrap();
|
|
|
|
|
registry.reregister(peer.get_stream(), *token, Interest::WRITABLE | Interest::READABLE).unwrap();
|
|
|
|
|
peer.set_state(State::message(Message::Ping { height, hash }));
|
|
|
|
|
peer.set_sent_height(height);
|
|
|
|
|
self.update_behind_ping_time();
|
|
|
|
@ -336,7 +354,7 @@ impl Peers {
|
|
|
|
|
None => {}
|
|
|
|
|
Some((token, peer)) => {
|
|
|
|
|
debug!("Peer {} is higher than we are, requesting block {}", &peer.get_addr().ip(), height + 1);
|
|
|
|
|
registry.reregister(peer.get_stream(), *token, Interest::WRITABLE).unwrap();
|
|
|
|
|
registry.reregister(peer.get_stream(), *token, Interest::WRITABLE | Interest::READABLE).unwrap();
|
|
|
|
|
peer.set_state(State::message(Message::GetBlock { index: height + 1 }));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -356,7 +374,7 @@ impl Peers {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
debug!("Peer {} is higher than we are, requesting block {}", &peer.get_addr().ip(), index);
|
|
|
|
|
registry.reregister(peer.get_stream(), *token, Interest::WRITABLE).unwrap();
|
|
|
|
|
registry.reregister(peer.get_stream(), *token, Interest::WRITABLE | Interest::READABLE).unwrap();
|
|
|
|
|
peer.set_state(State::message(Message::GetBlock { index }));
|
|
|
|
|
index += 1;
|
|
|
|
|
if index > max_height {
|
|
|
|
|