@@ -6,6 +6,7 @@ use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
6
6
7
7
use bitcoin:: secp256k1:: PublicKey ;
8
8
9
+ use std:: collections:: HashMap ;
9
10
use std:: convert:: TryFrom ;
10
11
use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr , ToSocketAddrs } ;
11
12
use std:: sync:: { Arc , RwLock } ;
@@ -14,30 +15,21 @@ use std::sync::{Arc, RwLock};
14
15
pub ( crate ) const PEER_INFO_PERSISTENCE_KEY : & str = "peers" ;
15
16
16
17
pub ( crate ) struct PeerInfoStorage < K : KVStorePersister > {
17
- peers : RwLock < Vec < PeerInfo > > ,
18
+ peers : RwLock < HashMap < PublicKey , PeerInfo > > ,
18
19
persister : Arc < K > ,
19
20
}
20
21
21
22
impl < K : KVStorePersister > PeerInfoStorage < K > {
22
23
pub ( crate ) fn new ( persister : Arc < K > ) -> Self {
23
- let peers = RwLock :: new ( Vec :: new ( ) ) ;
24
+ let peers = RwLock :: new ( HashMap :: new ( ) ) ;
24
25
Self { peers, persister }
25
26
}
26
27
27
28
pub ( crate ) fn add_peer ( & self , peer_info : PeerInfo ) -> Result < ( ) , Error > {
28
29
let mut locked_peers = self . peers . write ( ) . unwrap ( ) ;
29
30
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) ;
39
32
40
- locked_peers. push ( peer_info) ;
41
33
self . persister
42
34
. persist ( PEER_INFO_PERSISTENCE_KEY , & PeerInfoStorageSerWrapper ( & * locked_peers) )
43
35
. map_err ( |_| Error :: PersistenceFailed ) ?;
@@ -48,7 +40,7 @@ impl<K: KVStorePersister> PeerInfoStorage<K> {
48
40
pub ( crate ) fn remove_peer ( & self , peer_pubkey : & PublicKey ) -> Result < ( ) , Error > {
49
41
let mut locked_peers = self . peers . write ( ) . unwrap ( ) ;
50
42
51
- locked_peers. retain ( |info| info . pubkey != * peer_pubkey) ;
43
+ locked_peers. remove ( peer_pubkey) ;
52
44
53
45
self . persister
54
46
. persist ( PEER_INFO_PERSISTENCE_KEY , & PeerInfoStorageSerWrapper ( & * locked_peers) )
@@ -57,8 +49,12 @@ impl<K: KVStorePersister> PeerInfoStorage<K> {
57
49
Ok ( ( ) )
58
50
}
59
51
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 ( )
62
58
}
63
59
}
64
60
@@ -68,34 +64,37 @@ impl<K: KVStorePersister> ReadableArgs<Arc<K>> for PeerInfoStorage<K> {
68
64
reader : & mut R , persister : Arc < K > ,
69
65
) -> Result < Self , lightning:: ln:: msgs:: DecodeError > {
70
66
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 ) ;
72
68
Ok ( Self { peers, persister } )
73
69
}
74
70
}
75
71
76
72
#[ derive( Clone , Debug , PartialEq , Eq ) ]
77
- pub ( crate ) struct PeerInfoStorageDeserWrapper ( Vec < PeerInfo > ) ;
73
+ pub ( crate ) struct PeerInfoStorageDeserWrapper ( HashMap < PublicKey , PeerInfo > ) ;
78
74
79
75
impl Readable for PeerInfoStorageDeserWrapper {
80
76
fn read < R : lightning:: io:: Read > (
81
77
reader : & mut R ,
82
78
) -> Result < Self , lightning:: ln:: msgs:: DecodeError > {
83
79
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 ) ;
85
81
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) ;
87
85
}
88
86
Ok ( Self ( peers) )
89
87
}
90
88
}
91
89
92
- pub ( crate ) struct PeerInfoStorageSerWrapper < ' a > ( & ' a Vec < PeerInfo > ) ;
90
+ pub ( crate ) struct PeerInfoStorageSerWrapper < ' a > ( & ' a HashMap < PublicKey , PeerInfo > ) ;
93
91
94
92
impl Writeable for PeerInfoStorageSerWrapper < ' _ > {
95
93
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
96
94
( 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) ?;
99
98
}
100
99
Ok ( ( ) )
101
100
}
@@ -196,9 +195,10 @@ mod tests {
196
195
let deser_peer_store =
197
196
PeerInfoStorage :: read ( & mut & persisted_bytes[ ..] , Arc :: clone ( & persister) ) . unwrap ( ) ;
198
197
199
- let peers = deser_peer_store. peers ( ) ;
198
+ let peers = deser_peer_store. list_peers ( ) ;
200
199
assert_eq ! ( peers. len( ) , 1 ) ;
201
200
assert_eq ! ( peers[ 0 ] , expected_peer_info) ;
201
+ assert_eq ! ( deser_peer_store. get_peer( & pubkey) , Some ( expected_peer_info) ) ;
202
202
assert ! ( !persister. get_and_clear_did_persist( ) ) ;
203
203
}
204
204
0 commit comments