From 1a159dfcb622bd5fa92059e8f397aabaca2e927c Mon Sep 17 00:00:00 2001 From: teor Date: Thu, 25 Mar 2021 20:14:52 +1000 Subject: [PATCH] Add more methods for creating MetaAddrs This refactor lets us remove `MetaAddr::update_last_seen()`. --- zebra-network/src/meta_addr.rs | 32 +++++++++++++++++---- zebra-network/src/peer_set/candidate_set.rs | 12 ++++---- zebra-network/src/peer_set/initialize.rs | 2 +- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/zebra-network/src/meta_addr.rs b/zebra-network/src/meta_addr.rs index 37b39369..be239ff8 100644 --- a/zebra-network/src/meta_addr.rs +++ b/zebra-network/src/meta_addr.rs @@ -140,6 +140,33 @@ impl MetaAddr { } } + /// Create a new `MetaAddr` for a peer that we want to reconnect to. + pub fn new_reconnect(addr: &SocketAddr, services: &PeerServices) -> MetaAddr { + MetaAddr { + addr: *addr, + services: *services, + last_seen: Utc::now(), + last_connection_state: AttemptPending, + } + } + + /// Create a new `MetaAddr` for a peer that has just had an error. + pub fn new_errored(addr: &SocketAddr, services: &PeerServices) -> MetaAddr { + MetaAddr { + addr: *addr, + services: *services, + last_seen: Utc::now(), + last_connection_state: Failed, + } + } + + /// Create a new `MetaAddr` for a peer that has just shut down. + pub fn new_shutdown(addr: &SocketAddr, services: &PeerServices) -> MetaAddr { + // TODO: if the peer shut down in the Responded state, preserve that + // state. All other states should be treated as (timeout) errors. + MetaAddr::new_errored(addr, services) + } + /// The last time we interacted with this peer. /// /// The exact meaning depends on `last_connection_state`: @@ -158,11 +185,6 @@ impl MetaAddr { self.last_seen } - /// Update the last time we interacted with this peer to the current time. - pub fn update_last_seen(&mut self) { - self.last_seen = Utc::now(); - } - /// Return a sanitized version of this `MetaAddr`, for sending to a remote peer. pub fn sanitize(&self) -> MetaAddr { let interval = crate::constants::TIMESTAMP_TRUNCATION_SECONDS; diff --git a/zebra-network/src/peer_set/candidate_set.rs b/zebra-network/src/peer_set/candidate_set.rs index a7dafe4a..01b149bb 100644 --- a/zebra-network/src/peer_set/candidate_set.rs +++ b/zebra-network/src/peer_set/candidate_set.rs @@ -8,7 +8,7 @@ use futures::stream::{FuturesUnordered, StreamExt}; use tokio::time::{sleep, sleep_until, Sleep}; use tower::{Service, ServiceExt}; -use crate::{types::MetaAddr, AddressBook, BoxError, PeerAddrState, Request, Response}; +use crate::{types::MetaAddr, AddressBook, BoxError, Request, Response}; /// The `CandidateSet` manages the `PeerSet`'s peer reconnection attempts. /// @@ -218,10 +218,9 @@ where let mut peer_set_guard = self.peer_set.lock().unwrap(); // It's okay to early return here because we're returning None // instead of yielding the next connection. - let mut reconnect = peer_set_guard.reconnection_peers().next()?; + let reconnect = peer_set_guard.reconnection_peers().next()?; - reconnect.update_last_seen(); - reconnect.last_connection_state = PeerAddrState::AttemptPending; + let reconnect = MetaAddr::new_reconnect(&reconnect.addr, &reconnect.services); peer_set_guard.update(reconnect); reconnect }; @@ -233,9 +232,8 @@ where } /// Mark `addr` as a failed peer. - pub fn report_failed(&mut self, mut addr: MetaAddr) { - addr.update_last_seen(); - addr.last_connection_state = PeerAddrState::Failed; + pub fn report_failed(&mut self, addr: &MetaAddr) { + let addr = MetaAddr::new_errored(&addr.addr, &addr.services); self.peer_set.lock().unwrap().update(addr); } } diff --git a/zebra-network/src/peer_set/initialize.rs b/zebra-network/src/peer_set/initialize.rs index 120e84e0..90b4d47f 100644 --- a/zebra-network/src/peer_set/initialize.rs +++ b/zebra-network/src/peer_set/initialize.rs @@ -365,7 +365,7 @@ where } Right((Some(Err(candidate)), _)) => { debug!(?candidate.addr, "marking candidate as failed"); - candidates.report_failed(candidate); + candidates.report_failed(&candidate); // The demand signal that was taken out of the queue // to attempt to connect to the failed candidate never // turned into a connection, so add it back: