7
7
//! let store: MemoryStore<()> = MemoryStore::new(Default::default());
8
8
//! let behaviour = Behaviour::new(store);
9
9
//! ```
10
- //!
11
- //! ## Persistent storage
12
- //! [`MemoryStore`] keeps all records in memory and will lose all the data
13
- //! once de-allocated. In order to persist the data, enable `serde` feature
14
- //! of `lib2p-peer-store` to read from and write to disk.
15
10
16
11
use std:: {
17
12
collections:: { HashMap , VecDeque } ,
18
13
num:: NonZeroUsize ,
19
14
task:: Waker ,
20
15
} ;
21
16
22
- #[ cfg( feature = "serde" ) ]
23
- use :: serde:: { Deserialize , Serialize } ;
24
17
use libp2p_core:: { Multiaddr , PeerId } ;
25
18
use libp2p_swarm:: FromSwarm ;
26
19
use lru:: LruCache ;
@@ -37,24 +30,14 @@ pub enum Event {
37
30
/// A in-memory store that uses LRU cache for bounded storage of addresses
38
31
/// and a frequency-based ordering of addresses.
39
32
#[ derive( Default ) ]
40
- #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
41
- #[ cfg_attr(
42
- feature = "serde" ,
43
- serde( bound(
44
- serialize = "T: Clone + Serialize " ,
45
- deserialize = "T: Clone + Deserialize<'de>"
46
- ) )
47
- ) ]
48
33
pub struct MemoryStore < T = ( ) > {
49
34
/// The internal store.
50
35
records : HashMap < PeerId , PeerRecord < T > > ,
51
36
/// Events to emit to [`Behaviour`](crate::Behaviour) and [`Swarm`](libp2p_swarm::Swarm)
52
- #[ cfg_attr( feature = "serde" , serde( skip) ) ]
53
37
pending_events : VecDeque < crate :: store:: Event < Event > > ,
54
38
/// Config of the store.
55
39
config : Config ,
56
40
/// Waker for store events.
57
- #[ cfg_attr( feature = "serde" , serde( skip) ) ]
58
41
waker : Option < Waker > ,
59
42
}
60
43
@@ -190,7 +173,6 @@ impl<T> Store for MemoryStore<T> {
190
173
191
174
/// Config for [`MemoryStore`].
192
175
#[ derive( Debug , Clone ) ]
193
- #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
194
176
pub struct Config {
195
177
/// The capacaity of an address store.
196
178
/// The least active address will be discarded to make room for new address.
@@ -220,16 +202,6 @@ impl Config {
220
202
221
203
/// Internal record of [`MemoryStore`].
222
204
#[ derive( Debug , Clone ) ]
223
- #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
224
- #[ cfg_attr(
225
- feature = "serde" ,
226
- serde( bound(
227
- serialize = "T: Clone + Serialize " ,
228
- deserialize = "T: Clone + Deserialize<'de>"
229
- ) )
230
- ) ]
231
- #[ cfg_attr( feature = "serde" , serde( from = "serde::PeerRecord<T>" ) ) ]
232
- #[ cfg_attr( feature = "serde" , serde( into = "serde::PeerRecord<T>" ) ) ]
233
205
pub struct PeerRecord < T > {
234
206
/// A LRU(Least Recently Used) cache for addresses.
235
207
/// Will delete the least-recently-used record when full.
@@ -281,73 +253,6 @@ impl<T> PeerRecord<T> {
281
253
}
282
254
}
283
255
284
- #[ cfg( feature = "serde" ) ]
285
- pub ( crate ) mod serde {
286
- use std:: num:: NonZeroUsize ;
287
-
288
- use libp2p_core:: Multiaddr ;
289
- use serde:: { Deserialize , Serialize } ;
290
-
291
- impl < T > super :: PeerRecord < T > {
292
- /// Build from an iterator. The order is reversed(FILO-ish).
293
- pub ( crate ) fn from_iter (
294
- cap : NonZeroUsize ,
295
- addr_iter : impl Iterator < Item = Multiaddr > ,
296
- custom_data : Option < T > ,
297
- ) -> Self {
298
- let mut lru = lru:: LruCache :: new ( cap) ;
299
- for addr in addr_iter {
300
- lru. get_or_insert ( addr, || ( ) ) ;
301
- }
302
- Self {
303
- addresses : lru,
304
- custom_data,
305
- }
306
- }
307
-
308
- pub ( crate ) fn destruct ( self ) -> ( NonZeroUsize , Vec < Multiaddr > , Option < T > ) {
309
- let cap = self . addresses . cap ( ) ;
310
- let mut addresses = self
311
- . addresses
312
- . into_iter ( )
313
- . map ( |( addr, _) | addr)
314
- . collect :: < Vec < _ > > ( ) ;
315
- // This is somewhat unusual: `LruCache::iter()` retains LRU order
316
- // while `LruCache::into_iter()` reverses the order.
317
- addresses. reverse ( ) ;
318
- ( cap, addresses, self . custom_data )
319
- }
320
- }
321
-
322
- /// Helper struct for serializing and deserializing [`PeerRecord`](super::PeerRecord)
323
- #[ derive( Debug , Clone , Serialize , Deserialize ) ]
324
- pub struct PeerRecord < T > {
325
- pub addresses : Vec < Multiaddr > ,
326
- pub cap : NonZeroUsize ,
327
- pub custom_data : Option < T > ,
328
- }
329
- impl < T : Clone > From < PeerRecord < T > > for super :: PeerRecord < T > {
330
- fn from ( value : PeerRecord < T > ) -> Self {
331
- // Need to reverse the iterator because `LruCache` is FILO.
332
- super :: PeerRecord :: from_iter (
333
- value. cap ,
334
- value. addresses . into_iter ( ) . rev ( ) ,
335
- value. custom_data ,
336
- )
337
- }
338
- }
339
- impl < T : Clone > From < super :: PeerRecord < T > > for PeerRecord < T > {
340
- fn from ( value : super :: PeerRecord < T > ) -> Self {
341
- let ( cap, addresses, custom_data) = value. destruct ( ) ;
342
- PeerRecord {
343
- addresses,
344
- cap,
345
- custom_data,
346
- }
347
- }
348
- }
349
- }
350
-
351
256
#[ cfg( test) ]
352
257
mod test {
353
258
use std:: { num:: NonZero , str:: FromStr } ;
@@ -428,58 +333,6 @@ mod test {
428
333
) ;
429
334
}
430
335
431
- #[ test]
432
- fn serde_roundtrip ( ) {
433
- let store_json = r#"
434
- {
435
- "records": {
436
- "1Aea5mXJrZNUwKxNU2y9xFE2qTFMjvFYSBf4T8cWEEP5Zd":
437
- {
438
- "addresses": [ "/ip4/127.0.0.2", "/ip4/127.0.0.3", "/ip4/127.0.0.4",
439
- "/ip4/127.0.0.5", "/ip4/127.0.0.6", "/ip4/127.0.0.7",
440
- "/ip4/127.0.0.8", "/ip4/127.0.0.9" ],
441
- "cap": 8,
442
- "custom_data": 7
443
- }
444
- },
445
- "config": {
446
- "record_capacity": 8
447
- }
448
- }
449
- "# ;
450
- let store: MemoryStore < u32 > = serde_json:: from_str ( store_json) . unwrap ( ) ;
451
- let peer = PeerId :: from_str ( "1Aea5mXJrZNUwKxNU2y9xFE2qTFMjvFYSBf4T8cWEEP5Zd" )
452
- . expect ( "Parsing to succeed." ) ;
453
- let mut addresses = Vec :: new ( ) ;
454
- for i in 2 ..10 {
455
- let addr_string = format ! ( "/ip4/127.0.0.{}" , i) ;
456
- addresses. push ( Multiaddr :: from_str ( & addr_string) . expect ( "parsing to succeed" ) ) ;
457
- }
458
- // should retain order when deserializing from bytes.
459
- assert_eq ! (
460
- store
461
- . addresses_of_peer( & peer)
462
- . expect( "Peer to exist" )
463
- . cloned( )
464
- . collect:: <Vec <_>>( ) ,
465
- addresses
466
- ) ;
467
- assert_eq ! ( * store. get_custom_data( & peer) . expect( "Peer to exist" ) , 7 ) ;
468
- let ser = serde_json:: to_string ( & store) . expect ( "Serialize to succeed." ) ;
469
- let store_de: MemoryStore < u32 > =
470
- serde_json:: from_str ( & ser) . expect ( "Deserialize to succeed" ) ;
471
- // should retain order when serializing
472
- assert_eq ! (
473
- store_de
474
- . addresses_of_peer( & peer)
475
- . expect( "Peer to exist" )
476
- . cloned( )
477
- . collect:: <Vec <_>>( ) ,
478
- addresses
479
- ) ;
480
- assert_eq ! ( * store_de. get_custom_data( & peer) . expect( "Peer to exist" ) , 7 ) ;
481
- }
482
-
483
336
#[ test]
484
337
fn update_address_on_connect ( ) {
485
338
async fn expect_record_update (
0 commit comments