@@ -14,9 +14,9 @@ use std::{
14
14
task:: { Poll , Waker } ,
15
15
} ;
16
16
17
+ use hashlink:: LruCache ;
17
18
use libp2p_core:: { Multiaddr , PeerId } ;
18
19
use libp2p_swarm:: { behaviour:: ConnectionEstablished , DialError , FromSwarm } ;
19
- use lru:: LruCache ;
20
20
21
21
use super :: Store ;
22
22
@@ -317,15 +317,15 @@ pub struct PeerRecord<T> {
317
317
impl < T > PeerRecord < T > {
318
318
pub ( crate ) fn new ( cap : NonZeroUsize ) -> Self {
319
319
Self {
320
- addresses : LruCache :: new ( cap) ,
320
+ addresses : LruCache :: new ( cap. get ( ) ) ,
321
321
custom_data : None ,
322
322
}
323
323
}
324
324
325
325
/// Iterate over all addresses. More recently-used address comes first.
326
326
/// Does not change the order.
327
327
pub fn addresses ( & self ) -> impl Iterator < Item = & Multiaddr > {
328
- self . addresses . iter ( ) . map ( |( addr, _) | addr)
328
+ self . addresses . iter ( ) . rev ( ) . map ( |( addr, _) | addr)
329
329
}
330
330
331
331
/// Update the address in the LRU cache, promote it to the front if it exists,
@@ -335,14 +335,13 @@ impl<T> PeerRecord<T> {
335
335
pub fn add_address ( & mut self , address : & Multiaddr , is_permanent : bool ) -> bool {
336
336
if let Some ( was_permanent) = self . addresses . get ( address) {
337
337
if !* was_permanent && is_permanent {
338
- self . addresses
339
- . get_or_insert ( address. clone ( ) , || is_permanent) ;
338
+ self . addresses . insert ( address. clone ( ) , is_permanent) ;
340
339
}
341
- return false ;
340
+ false
341
+ } else {
342
+ self . addresses . insert ( address. clone ( ) , is_permanent) ;
343
+ true
342
344
}
343
- self . addresses
344
- . get_or_insert ( address. clone ( ) , || is_permanent) ;
345
- true
346
345
}
347
346
348
347
/// Remove the address in the LRU cache regardless of its position.
@@ -353,7 +352,7 @@ impl<T> PeerRecord<T> {
353
352
if !force && self . addresses . peek ( address) == Some ( & true ) {
354
353
return false ;
355
354
}
356
- self . addresses . pop ( address) . is_some ( )
355
+ self . addresses . remove ( address) . is_some ( )
357
356
}
358
357
359
358
pub fn get_custom_data ( & self ) -> Option < & T > {
@@ -399,14 +398,14 @@ mod test {
399
398
store. add_address ( & peer, & addr1) ;
400
399
store. add_address ( & peer, & addr2) ;
401
400
store. add_address ( & peer, & addr3) ;
402
- assert ! (
401
+ assert_eq ! (
403
402
store
404
403
. records
405
404
. get( & peer)
406
405
. expect( "peer to be in the store" )
407
406
. addresses( )
408
- . collect:: <Vec <_>>( )
409
- == vec![ & addr3, & addr2, & addr1]
407
+ . collect:: <Vec <_>>( ) ,
408
+ vec![ & addr3, & addr2, & addr1]
410
409
) ;
411
410
store. add_address ( & peer, & addr1) ;
412
411
assert ! (
0 commit comments