@@ -6,6 +6,7 @@ use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
66
77use bitcoin:: secp256k1:: PublicKey ;
88
9+ use std:: collections:: HashMap ;
910use std:: convert:: TryFrom ;
1011use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr , ToSocketAddrs } ;
1112use std:: sync:: { Arc , RwLock } ;
@@ -14,30 +15,21 @@ use std::sync::{Arc, RwLock};
1415pub ( crate ) const PEER_INFO_PERSISTENCE_KEY : & str = "peers" ;
1516
1617pub ( crate ) struct PeerInfoStorage < K : KVStorePersister > {
17- peers : RwLock < Vec < PeerInfo > > ,
18+ peers : RwLock < HashMap < PublicKey , PeerInfo > > ,
1819 persister : Arc < K > ,
1920}
2021
2122impl < K : KVStorePersister > PeerInfoStorage < K > {
2223 pub ( crate ) fn new ( persister : Arc < K > ) -> Self {
23- let peers = RwLock :: new ( Vec :: new ( ) ) ;
24+ let peers = RwLock :: new ( HashMap :: new ( ) ) ;
2425 Self { peers, persister }
2526 }
2627
2728 pub ( crate ) fn add_peer ( & self , peer_info : PeerInfo ) -> Result < ( ) , Error > {
2829 let mut locked_peers = self . peers . write ( ) . unwrap ( ) ;
2930
30- // Check if we have the peer. If so, either update it or do nothing.
31- for stored_info in locked_peers. iter_mut ( ) {
32- if stored_info. pubkey == peer_info. pubkey {
33- if stored_info. address != peer_info. address {
34- stored_info. address = peer_info. address ;
35- }
36- return Ok ( ( ) ) ;
37- }
38- }
31+ locked_peers. insert ( peer_info. pubkey , peer_info) ;
3932
40- locked_peers. push ( peer_info) ;
4133 self . persister
4234 . persist ( PEER_INFO_PERSISTENCE_KEY , & PeerInfoStorageSerWrapper ( & * locked_peers) )
4335 . map_err ( |_| Error :: PersistenceFailed ) ?;
@@ -48,7 +40,7 @@ impl<K: KVStorePersister> PeerInfoStorage<K> {
4840 pub ( crate ) fn remove_peer ( & self , peer_pubkey : & PublicKey ) -> Result < ( ) , Error > {
4941 let mut locked_peers = self . peers . write ( ) . unwrap ( ) ;
5042
51- locked_peers. retain ( |info| info . pubkey != * peer_pubkey) ;
43+ locked_peers. remove ( peer_pubkey) ;
5244
5345 self . persister
5446 . persist ( PEER_INFO_PERSISTENCE_KEY , & PeerInfoStorageSerWrapper ( & * locked_peers) )
@@ -57,8 +49,12 @@ impl<K: KVStorePersister> PeerInfoStorage<K> {
5749 Ok ( ( ) )
5850 }
5951
60- pub ( crate ) fn peers ( & self ) -> Vec < PeerInfo > {
61- self . peers . read ( ) . unwrap ( ) . clone ( )
52+ pub ( crate ) fn list_peers ( & self ) -> Vec < PeerInfo > {
53+ self . peers . read ( ) . unwrap ( ) . values ( ) . cloned ( ) . collect ( )
54+ }
55+
56+ pub ( crate ) fn get_peer ( & self , peer_pubkey : & PublicKey ) -> Option < PeerInfo > {
57+ self . peers . read ( ) . unwrap ( ) . get ( peer_pubkey) . cloned ( )
6258 }
6359}
6460
@@ -68,34 +64,37 @@ impl<K: KVStorePersister> ReadableArgs<Arc<K>> for PeerInfoStorage<K> {
6864 reader : & mut R , persister : Arc < K > ,
6965 ) -> Result < Self , lightning:: ln:: msgs:: DecodeError > {
7066 let read_peers: PeerInfoStorageDeserWrapper = Readable :: read ( reader) ?;
71- let peers: RwLock < Vec < PeerInfo > > = RwLock :: new ( read_peers. 0 ) ;
67+ let peers: RwLock < HashMap < PublicKey , PeerInfo > > = RwLock :: new ( read_peers. 0 ) ;
7268 Ok ( Self { peers, persister } )
7369 }
7470}
7571
7672#[ derive( Clone , Debug , PartialEq , Eq ) ]
77- pub ( crate ) struct PeerInfoStorageDeserWrapper ( Vec < PeerInfo > ) ;
73+ pub ( crate ) struct PeerInfoStorageDeserWrapper ( HashMap < PublicKey , PeerInfo > ) ;
7874
7975impl Readable for PeerInfoStorageDeserWrapper {
8076 fn read < R : lightning:: io:: Read > (
8177 reader : & mut R ,
8278 ) -> Result < Self , lightning:: ln:: msgs:: DecodeError > {
8379 let len: u16 = Readable :: read ( reader) ?;
84- let mut peers = Vec :: with_capacity ( len as usize ) ;
80+ let mut peers = HashMap :: with_capacity ( len as usize ) ;
8581 for _ in 0 ..len {
86- peers. push ( Readable :: read ( reader) ?) ;
82+ let k: PublicKey = Readable :: read ( reader) ?;
83+ let v: PeerInfo = Readable :: read ( reader) ?;
84+ peers. insert ( k, v) ;
8785 }
8886 Ok ( Self ( peers) )
8987 }
9088}
9189
92- pub ( crate ) struct PeerInfoStorageSerWrapper < ' a > ( & ' a Vec < PeerInfo > ) ;
90+ pub ( crate ) struct PeerInfoStorageSerWrapper < ' a > ( & ' a HashMap < PublicKey , PeerInfo > ) ;
9391
9492impl Writeable for PeerInfoStorageSerWrapper < ' _ > {
9593 fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
9694 ( self . 0 . len ( ) as u16 ) . write ( writer) ?;
97- for e in self . 0 . iter ( ) {
98- e. write ( writer) ?;
95+ for ( k, v) in self . 0 . iter ( ) {
96+ k. write ( writer) ?;
97+ v. write ( writer) ?;
9998 }
10099 Ok ( ( ) )
101100 }
@@ -196,9 +195,10 @@ mod tests {
196195 let deser_peer_store =
197196 PeerInfoStorage :: read ( & mut & persisted_bytes[ ..] , Arc :: clone ( & persister) ) . unwrap ( ) ;
198197
199- let peers = deser_peer_store. peers ( ) ;
198+ let peers = deser_peer_store. list_peers ( ) ;
200199 assert_eq ! ( peers. len( ) , 1 ) ;
201200 assert_eq ! ( peers[ 0 ] , expected_peer_info) ;
201+ assert_eq ! ( deser_peer_store. get_peer( & pubkey) , Some ( expected_peer_info) ) ;
202202 assert ! ( !persister. get_and_clear_did_persist( ) ) ;
203203 }
204204
0 commit comments