@@ -8,16 +8,39 @@ use lru::LruCache;
88
99use std:: num:: NonZeroUsize ;
1010
11+ #[ derive( Debug , Clone ) ]
12+ /// Configuration of a [`PeerAddresses`] instance.
13+ pub struct PeerAddressesConfig {
14+ /// Capacity of the [`PeerAddresses`] cache.
15+ pub number_of_peers : NonZeroUsize ,
16+
17+ /// Maximum number of cached addresses per peer.
18+ pub number_of_addresses_by_peer : NonZeroUsize ,
19+ }
20+
21+ impl Default for PeerAddressesConfig {
22+ fn default ( ) -> Self {
23+ Self {
24+ number_of_peers : NonZeroUsize :: new ( 100 ) . expect ( "100 != 0" ) ,
25+ number_of_addresses_by_peer : NonZeroUsize :: new ( 10 ) . expect ( "10 != 0" ) ,
26+ }
27+ }
28+ }
29+
1130/// Struct for tracking peers' external addresses of the [`Swarm`](crate::Swarm).
1231#[ derive( Debug ) ]
13- pub struct PeerAddresses ( LruCache < PeerId , LruCache < Multiaddr , ( ) > > ) ;
32+ pub struct PeerAddresses {
33+ config : PeerAddressesConfig ,
34+ inner : LruCache < PeerId , LruCache < Multiaddr , ( ) > > ,
35+ }
1436
1537impl PeerAddresses {
1638 /// Creates a [`PeerAddresses`] cache with capacity for the given number of peers.
1739 ///
18- /// For each peer, we will at most store 10 addresses.
19- pub fn new ( number_of_peers : NonZeroUsize ) -> Self {
20- Self ( LruCache :: new ( number_of_peers) )
40+ /// For each peer, we will at most store `config.number_of_addresses_by_peer` addresses.
41+ pub fn new ( config : PeerAddressesConfig ) -> Self {
42+ let inner = LruCache :: new ( config. number_of_peers ) ;
43+ Self { config, inner }
2144 }
2245
2346 /// Feed a [`FromSwarm`] event to this struct.
@@ -50,12 +73,12 @@ impl PeerAddresses {
5073 pub fn add ( & mut self , peer : PeerId , address : Multiaddr ) -> bool {
5174 match prepare_addr ( & peer, & address) {
5275 Ok ( address) => {
53- if let Some ( cached) = self . 0 . get_mut ( & peer) {
76+ if let Some ( cached) = self . inner . get_mut ( & peer) {
5477 cached. put ( address, ( ) ) . is_none ( )
5578 } else {
56- let mut set = LruCache :: new ( NonZeroUsize :: new ( 10 ) . expect ( "10 > 0" ) ) ;
79+ let mut set = LruCache :: new ( self . config . number_of_addresses_by_peer ) ;
5780 set. put ( address, ( ) ) ;
58- self . 0 . put ( peer, set) ;
81+ self . inner . put ( peer, set) ;
5982
6083 true
6184 }
@@ -66,7 +89,7 @@ impl PeerAddresses {
6689
6790 /// Returns peer's external addresses.
6891 pub fn get ( & mut self , peer : & PeerId ) -> impl Iterator < Item = Multiaddr > + ' _ {
69- self . 0
92+ self . inner
7093 . get ( peer)
7194 . into_iter ( )
7295 . flat_map ( |c| c. iter ( ) . map ( |( m, ( ) ) | m) )
@@ -76,7 +99,7 @@ impl PeerAddresses {
7699 /// Removes address from peer addresses cache.
77100 /// Returns true if the address was removed.
78101 pub fn remove ( & mut self , peer : & PeerId , address : & Multiaddr ) -> bool {
79- match self . 0 . get_mut ( peer) {
102+ match self . inner . get_mut ( peer) {
80103 Some ( addrs) => match prepare_addr ( peer, address) {
81104 Ok ( address) => addrs. pop ( & address) . is_some ( ) ,
82105 Err ( _) => false ,
@@ -92,7 +115,7 @@ fn prepare_addr(peer: &PeerId, addr: &Multiaddr) -> Result<Multiaddr, Multiaddr>
92115
93116impl Default for PeerAddresses {
94117 fn default ( ) -> Self {
95- Self ( LruCache :: new ( NonZeroUsize :: new ( 100 ) . unwrap ( ) ) )
118+ Self :: new ( Default :: default ( ) )
96119 }
97120}
98121
0 commit comments