Add AddressBook::is_potentially_connected()
This allows checking whether a SocketAddr could potentially be connected, based on the contents of the address book.
This commit is contained in:
parent
fe9cef261d
commit
501db9fcc8
|
|
@ -79,6 +79,30 @@ impl AddressBook {
|
||||||
//self.assert_consistency();
|
//self.assert_consistency();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Compute a cutoff time that can determine whether an entry
|
||||||
|
/// in an address book being updated with peer message timestamps
|
||||||
|
/// represents a known-disconnected peer or a potentially-connected peer.
|
||||||
|
///
|
||||||
|
/// [`constants::LIVE_PEER_DURATION`] represents the time interval in which
|
||||||
|
/// we are guaranteed to receive at least one message from a peer or close
|
||||||
|
/// the connection. Therefore, if the last-seen timestamp is older than
|
||||||
|
/// [`constants::LIVE_PEER_DURATION`] ago, we know we must have disconnected
|
||||||
|
/// from it. Otherwise, we could potentially be connected to it.
|
||||||
|
fn cutoff_time() -> DateTime<Utc> {
|
||||||
|
// chrono uses signed durations while stdlib uses unsigned durations
|
||||||
|
use chrono::Duration as CD;
|
||||||
|
Utc::now() - CD::from_std(constants::LIVE_PEER_DURATION).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if the given [`SocketAddr`] could potentially be connected
|
||||||
|
/// to a node feeding timestamps into this address book.
|
||||||
|
pub fn is_potentially_connected(&self, addr: &SocketAddr) -> bool {
|
||||||
|
match self.by_addr.get(addr) {
|
||||||
|
None => return false,
|
||||||
|
Some((ref last_seen, _)) => last_seen > &AddressBook::cutoff_time(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Return an iterator over all peers, ordered from most recently seen to
|
/// Return an iterator over all peers, ordered from most recently seen to
|
||||||
/// least recently seen.
|
/// least recently seen.
|
||||||
pub fn peers<'a>(&'a self) -> impl Iterator<Item = MetaAddr> + 'a {
|
pub fn peers<'a>(&'a self) -> impl Iterator<Item = MetaAddr> + 'a {
|
||||||
|
|
@ -88,17 +112,10 @@ impl AddressBook {
|
||||||
/// Return an iterator over peers known to be disconnected, ordered from most
|
/// Return an iterator over peers known to be disconnected, ordered from most
|
||||||
/// recently seen to least recently seen.
|
/// recently seen to least recently seen.
|
||||||
pub fn disconnected_peers<'a>(&'a self) -> impl Iterator<Item = MetaAddr> + 'a {
|
pub fn disconnected_peers<'a>(&'a self) -> impl Iterator<Item = MetaAddr> + 'a {
|
||||||
use chrono::Duration as CD;
|
|
||||||
use std::net::{IpAddr, Ipv4Addr};
|
use std::net::{IpAddr, Ipv4Addr};
|
||||||
use std::ops::Bound::{Excluded, Unbounded};
|
use std::ops::Bound::{Excluded, Unbounded};
|
||||||
|
|
||||||
// LIVE_PEER_DURATION represents the time interval in which we are
|
|
||||||
// guaranteed to receive at least one message from a peer or close the
|
|
||||||
// connection. Therefore, if the last-seen timestamp is older than
|
|
||||||
// LIVE_PEER_DURATION ago, we know we must have disconnected from it.
|
|
||||||
let cutoff = Utc::now() - CD::from_std(constants::LIVE_PEER_DURATION).unwrap();
|
|
||||||
let cutoff_meta = MetaAddr {
|
let cutoff_meta = MetaAddr {
|
||||||
last_seen: cutoff,
|
last_seen: AddressBook::cutoff_time(),
|
||||||
// The ordering on MetaAddrs is newest-first, then arbitrary,
|
// The ordering on MetaAddrs is newest-first, then arbitrary,
|
||||||
// so any fields will do here.
|
// so any fields will do here.
|
||||||
addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue