Skip to main content

PeerManager

Struct PeerManager 

Source
pub struct PeerManager { /* private fields */ }
Expand description

The PeerManager provides functionality to add, find and delete peers. It wraps synchronous WAL-enabled SQLite database access and provides an async interface to the rest of the code base.

Every database call is dispatched to tokio’s blocking thread pool by [BlockingPeerStorage], so a contended peer database can never park a tokio worker thread. See that type’s documentation for why that matters.

Implementations§

Source§

impl PeerManager

Source

pub fn new( database: CommsDatabase, transport_protocols: Vec<TransportProtocol>, ) -> Result<PeerManager, PeerManagerError>

Constructs a new empty PeerManager

Source

pub fn this_peer_identity(&self) -> ThisPeerIdentity

Get this peer’s identity

Source

pub async fn count(&self) -> usize

Get the number of peers in the PeerManager - any error will translate to a size of zero

Source

pub async fn add_or_update_peer( &self, peer: Peer, ) -> Result<PeerId, PeerManagerError>

Adds a peer to the routing table of the PeerManager if the peer does not already exist. When a peer already exist, the stored version will be replaced with the newly provided peer.

Source

pub async fn soft_delete_peer( &self, node_id: &NodeId, ) -> Result<(), PeerManagerError>

The peer with the specified node id will be soft deleted (marked as deleted)

Source

pub async fn get_peers_by_node_ids( &self, node_ids: &[NodeId], ) -> Result<Vec<Peer>, PeerManagerError>

Get all peers based on a list of their node_ids

Source

pub async fn get_peer_public_keys_by_node_ids( &self, node_ids: &[NodeId], ) -> Result<Vec<CommsPublicKey>, PeerManagerError>

Get all peers based on a list of their node_ids

Source

pub async fn get_banned_peers(&self) -> Result<Vec<Peer>, PeerManagerError>

Get all banned peers

Source

pub async fn find_by_node_id( &self, node_id: &NodeId, ) -> Result<Option<Peer>, PeerManagerError>

Find the peer with the provided NodeID

Source

pub async fn get_seed_peers(&self) -> Result<Vec<Peer>, PeerManagerError>

gets all seed peers

Source

pub async fn find_by_public_key( &self, public_key: &CommsPublicKey, ) -> Result<Option<Peer>, PeerManagerError>

Find the peer with the provided PublicKey

Source

pub async fn find_all_starts_with( &self, partial: &[u8], ) -> Result<Vec<Peer>, PeerManagerError>

Find the peer with the provided substring. This currently only compares the given bytes to the NodeId

Source

pub async fn exists( &self, public_key: &CommsPublicKey, ) -> Result<bool, PeerManagerError>

Check if a peer exist using the specified public_key

Source

pub async fn exists_node_id( &self, node_id: &NodeId, ) -> Result<bool, PeerManagerError>

Check if a peer exist using the specified node_id

Source

pub async fn all( &self, features: Option<PeerFeatures>, ) -> Result<Vec<Peer>, PeerManagerError>

Returns all peers

Source

pub async fn get_available_dial_candidates( &self, exclude_node_ids: &[NodeId], limit: Option<usize>, exclude_failed: bool, randomize: bool, ) -> Result<Vec<Peer>, PeerManagerError>

Get available dial candidates that are communication nodes, not banned, not deleted, reachable optionally not failed, optionally at random, and not in the excluded node IDs list

Source

pub async fn discovery_syncing( &self, n: usize, excluded_peers: &[NodeId], features: Option<PeerFeatures>, external_addresses_only: bool, max_n: usize, ) -> Result<Vec<Peer>, PeerManagerError>

Return “good” peers for syncing Criteria:

  • Peer is not banned
  • Peer has been seen within a defined time span (1 week)
  • Returns at most max_n peers (the caller’s configured serve cap); a max_n of 0 falls back to the peer manager default
Source

pub async fn add_or_update_online_peer( &self, pubkey: &CommsPublicKey, node_id: &NodeId, addresses: &[Multiaddr], peer_features: &PeerFeatures, source: &PeerAddressSource, ) -> Result<Peer, PeerManagerError>

Adds or updates a peer and sets the last connection as successful. If the peer is marked as offline, it will be unmarked.

Source

pub async fn direct_identity_node_id( &self, node_id: &NodeId, ) -> Result<Option<Peer>, PeerManagerError>

Get a peer matching the given node ID

Source

pub async fn direct_identity_public_key( &self, public_key: &CommsPublicKey, ) -> Result<Option<Peer>, PeerManagerError>

Get a peer matching the given public key

Source

pub async fn get_not_banned_or_deleted_peers( &self, ) -> Result<Vec<Peer>, PeerManagerError>

Fetch all peers (except banned ones)

Source

pub async fn random_peers( &self, n: usize, excluded: &[NodeId], flags: Option<PeerFlags>, known_good: bool, ) -> Result<Vec<Peer>, PeerManagerError>

Fetch n random peers that are Communication Nodes and have at least one external address

Source

pub async fn unban_peer(&self, node_id: &NodeId) -> Result<(), PeerManagerError>

Unbans the peer if it is banned. This function is idempotent.

Source

pub async fn unban_all_peers(&self) -> Result<usize, PeerManagerError>

Unbans the peer if it is banned. This function is idempotent.

Source

pub async fn reset_offline_non_wallet_peers( &self, ) -> Result<usize, PeerManagerError>

Source

pub async fn ban_peer( &self, public_key: &CommsPublicKey, duration: Duration, reason: String, ) -> Result<NodeId, PeerManagerError>

Ban the peer for a length of time specified by the duration

Source

pub async fn ban_peer_by_node_id( &self, node_id: &NodeId, duration: Duration, reason: String, ) -> Result<NodeId, PeerManagerError>

Ban the peer for a length of time specified by the duration

Source

pub async fn is_peer_banned( &self, node_id: &NodeId, ) -> Result<bool, PeerManagerError>

Get the ban status of a peer

Source

pub async fn get_peer_features( &self, node_id: &NodeId, ) -> Result<PeerFeatures, PeerManagerError>

Get the peer’s features

Source

pub async fn get_peer_multi_addresses( &self, node_id: &NodeId, ) -> Result<MultiaddressesWithStats, PeerManagerError>

Get a peer’s multiaddresses

Source

pub async fn get_peers_multi_addresses( &self, node_ids: &[NodeId], ) -> Result<Vec<(NodeId, MultiaddressesWithStats)>, PeerManagerError>

Get multiple peers’ multiaddresses

Source

pub async fn set_peer_metadata( &self, node_id: &NodeId, key: u8, data: Vec<u8>, ) -> Result<Option<Vec<u8>>, PeerManagerError>

This will store metadata inside of the metadata field in the peer provided by the nodeID. It will return None if the value was empty and the old value if the value was updated

Trait Implementations§

Source§

impl Clone for PeerManager

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PeerManager

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> AggregateExpressionMethods for T

Source§

fn aggregate_distinct(self) -> Self::Output
where Self: DistinctDsl,

DISTINCT modifier for aggregate functions Read more
Source§

fn aggregate_all(self) -> Self::Output
where Self: AllDsl,

ALL modifier for aggregate functions Read more
Source§

fn aggregate_filter<P>(self, f: P) -> Self::Output
where P: AsExpression<Bool>, Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,

Add an aggregate function filter Read more
Source§

fn aggregate_order<O>(self, o: O) -> Self::Output
where Self: OrderAggregateDsl<O>,

Add an aggregate function order Read more
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<'a, T> DefaultFeatures<'a> for T
where T: 'a + Send + Sync + Clone,

Source§

fn clone_boxed(&self) -> Box<dyn DefaultFeatures<'a>>

Clone this value, and then immediately put it into a Box behind a trait object of this trait.
Source§

fn self_address_mut(&mut self) -> *mut ()

Returns the address of self. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoSql for T

Source§

fn into_sql<T>(self) -> Self::Expression

Convert self to an expression for Diesel’s query builder. Read more
Source§

fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expression
where &'a Self: AsExpression<T>, T: SqlType + TypedExpressionType,

Convert &self to an expression for Diesel’s query builder. Read more
Source§

impl<'a, T> NonSyncFeatures<'a> for T
where T: 'a + Clone,

Source§

fn clone_boxed(&self) -> Box<dyn NonSyncFeatures<'a>>

Clone this value, and then immediately put it into a Box behind a trait object of this trait.
Source§

fn self_address_mut(&mut self) -> *mut ()

Returns the address of self. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> SafeBorrow<T> for T
where T: ?Sized,

Source§

fn borrow_replacement(ptr: &T) -> &T

Given ptr, which was obtained from a prior call to Self::borrow(), return a value with the same nominal lifetime which is guaranteed to survive mutations to Self. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WindowExpressionMethods for T

Source§

fn over(self) -> Self::Output
where Self: OverDsl,

Turn a function call into a window function call Read more
Source§

fn window_filter<P>(self, f: P) -> Self::Output
where P: AsExpression<Bool>, Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,

Add a filter to the current window function Read more
Source§

fn partition_by<E>(self, expr: E) -> Self::Output
where Self: PartitionByDsl<E>,

Add a partition clause to the current window function Read more
Source§

fn window_order<E>(self, expr: E) -> Self::Output
where Self: OrderWindowDsl<E>,

Add a order clause to the current window function Read more
Source§

fn frame_by<E>(self, expr: E) -> Self::Output
where Self: FrameDsl<E>,

Add a frame clause to the current window function Read more
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more