@@ -20,6 +20,8 @@ use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescr
20
20
use lightning:: routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler } ;
21
21
use lightning:: util:: events:: { Event , EventHandler , EventsProvider } ;
22
22
use lightning:: util:: logger:: Logger ;
23
+ use lightning:: util:: persist:: Persister ;
24
+ use lightning_persister:: FilesystemPersister ;
23
25
use std:: sync:: Arc ;
24
26
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
25
27
use std:: thread;
@@ -80,22 +82,6 @@ const FIRST_NETWORK_PRUNE_TIMER: u64 = 60;
80
82
#[ cfg( test) ]
81
83
const FIRST_NETWORK_PRUNE_TIMER : u64 = 1 ;
82
84
83
- /// Trait that handles persisting a [`ChannelManager`] and [`NetworkGraph`] to disk.
84
- pub trait Persister < Signer : Sign , M : Deref , T : Deref , K : Deref , F : Deref , L : Deref >
85
- where
86
- M :: Target : ' static + chain:: Watch < Signer > ,
87
- T :: Target : ' static + BroadcasterInterface ,
88
- K :: Target : ' static + KeysInterface < Signer = Signer > ,
89
- F :: Target : ' static + FeeEstimator ,
90
- L :: Target : ' static + Logger ,
91
- {
92
- /// Persist the given [`ChannelManager`] to disk, returning an error if persistence failed
93
- /// (which will cause the [`BackgroundProcessor`] which called this method to exit).
94
- fn persist_manager ( & self , channel_manager : & ChannelManager < Signer , M , T , K , F , L > ) -> Result < ( ) , std:: io:: Error > ;
95
-
96
- /// Persist the given [`NetworkGraph`] to disk, returning an error if persistence failed.
97
- fn persist_graph ( & self , network_graph : & NetworkGraph ) -> Result < ( ) , std:: io:: Error > ;
98
- }
99
85
100
86
/// Decorates an [`EventHandler`] with common functionality provided by standard [`EventHandler`]s.
101
87
struct DecoratingEventHandler <
@@ -138,12 +124,12 @@ impl BackgroundProcessor {
138
124
///
139
125
/// [`Persister::persist_manager`] is responsible for writing out the [`ChannelManager`] to disk, and/or
140
126
/// uploading to one or more backup services. See [`ChannelManager::write`] for writing out a
141
- /// [`ChannelManager`]. See [`FilesystemPersister ::persist_manager`] for Rust-Lightning 's
127
+ /// [`ChannelManager`]. See [`Persister ::persist_manager`] for LDK 's
142
128
/// provided implementation.
143
129
///
144
130
/// [`Persister::persist_graph`] is responsible for writing out the [`NetworkGraph`] to disk. See
145
- /// [`NetworkGraph::write`] for writing out a [`NetworkGraph`]. See [`FilesystemPersister::persist_network_graph `]
146
- /// for Rust-Lightning 's provided implementation.
131
+ /// [`NetworkGraph::write`] for writing out a [`NetworkGraph`]. See [`FilesystemPersister`]
132
+ /// for LDK 's provided implementation.
147
133
///
148
134
/// Typically, users should either implement [`Persister::persist_manager`] to never return an
149
135
/// error or call [`join`] and handle any error that may arise. For the latter case,
@@ -161,8 +147,8 @@ impl BackgroundProcessor {
161
147
/// [`stop`]: Self::stop
162
148
/// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
163
149
/// [`ChannelManager::write`]: lightning::ln::channelmanager::ChannelManager#impl-Writeable
164
- /// [`FilesystemPersister ::persist_manager`]: lightning_persister::FilesystemPersister ::persist_manager
165
- /// [`FilesystemPersister::persist_network_graph `]: lightning_persister::FilesystemPersister::persist_network_graph
150
+ /// [`Persister ::persist_manager`]: lightning::util::persist::Persister ::persist_manager
151
+ /// [`Persister::persist_graph `]: lightning::util::persist::Persister::persist_graph
166
152
/// [`NetworkGraph`]: lightning::routing::network_graph::NetworkGraph
167
153
/// [`NetworkGraph::write`]: lightning::routing::network_graph::NetworkGraph#impl-Writeable
168
154
pub fn start <
@@ -180,7 +166,7 @@ impl BackgroundProcessor {
180
166
CMH : ' static + Deref + Send + Sync ,
181
167
RMH : ' static + Deref + Send + Sync ,
182
168
EH : ' static + EventHandler + Send ,
183
- PS : ' static + Send + Persister < Signer , CW , T , K , F , L > ,
169
+ PS : ' static + Deref + Send ,
184
170
M : ' static + Deref < Target = ChainMonitor < Signer , CF , T , F , L , P > > + Send + Sync ,
185
171
CM : ' static + Deref < Target = ChannelManager < Signer , CW , T , K , F , L > > + Send + Sync ,
186
172
NG : ' static + Deref < Target = NetGraphMsgHandler < G , CA , L > > + Send + Sync ,
@@ -202,6 +188,7 @@ impl BackgroundProcessor {
202
188
CMH :: Target : ' static + ChannelMessageHandler ,
203
189
RMH :: Target : ' static + RoutingMessageHandler ,
204
190
UMH :: Target : ' static + CustomMessageHandler ,
191
+ PS :: Target : ' static + Persister < Signer , CW , T , K , F , L >
205
192
{
206
193
let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
207
194
let stop_thread_clone = stop_thread. clone ( ) ;
@@ -365,10 +352,11 @@ mod tests {
365
352
use lightning:: util:: logger:: Logger ;
366
353
use lightning:: util:: ser:: Writeable ;
367
354
use lightning:: util:: test_utils;
355
+ use lightning:: util:: persist:: KVStorePersister ;
368
356
use lightning_invoice:: payment:: { InvoicePayer , RetryAttempts } ;
369
357
use lightning_invoice:: utils:: DefaultRouter ;
370
- use lightning_persister:: FilesystemPersister ;
371
- use std:: fs;
358
+ use lightning_persister:: { FilesystemPersister } ;
359
+ use std:: fs:: { self , File } ;
372
360
use std:: ops:: Deref ;
373
361
use std:: path:: PathBuf ;
374
362
use std:: sync:: { Arc , Mutex } ;
@@ -414,12 +402,14 @@ mod tests {
414
402
struct Persister {
415
403
data_dir : String ,
416
404
graph_error : Option < ( std:: io:: ErrorKind , & ' static str ) > ,
417
- manager_error : Option < ( std:: io:: ErrorKind , & ' static str ) >
405
+ manager_error : Option < ( std:: io:: ErrorKind , & ' static str ) > ,
406
+ filesystem_persister : FilesystemPersister
418
407
}
419
408
420
409
impl Persister {
421
410
fn new ( data_dir : String ) -> Self {
422
- Self { data_dir, graph_error : None , manager_error : None }
411
+ let filesystem_persister = FilesystemPersister :: new ( data_dir. clone ( ) ) ;
412
+ Self { data_dir, graph_error : None , manager_error : None , filesystem_persister }
423
413
}
424
414
425
415
fn with_graph_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
@@ -431,25 +421,21 @@ mod tests {
431
421
}
432
422
}
433
423
434
- impl < Signer : Sign , M : Deref , T : Deref , K : Deref , F : Deref , L : Deref > super :: Persister < Signer , M , T , K , F , L > for Persister where
435
- M :: Target : ' static + chain:: Watch < Signer > ,
436
- T :: Target : ' static + BroadcasterInterface ,
437
- K :: Target : ' static + KeysInterface < Signer = Signer > ,
438
- F :: Target : ' static + FeeEstimator ,
439
- L :: Target : ' static + Logger ,
440
- {
441
- fn persist_manager ( & self , channel_manager : & ChannelManager < Signer , M , T , K , F , L > ) -> Result < ( ) , std:: io:: Error > {
442
- match self . manager_error {
443
- None => FilesystemPersister :: persist_manager ( self . data_dir . clone ( ) , channel_manager) ,
444
- Some ( ( error, message) ) => Err ( std:: io:: Error :: new ( error, message) ) ,
424
+ impl KVStorePersister for Persister {
425
+ fn persist < W : Writeable > ( & self , key : & str , object : & W ) -> std:: io:: Result < ( ) > {
426
+ if key == "manager" {
427
+ if let Some ( ( error, message) ) = self . manager_error {
428
+ return Err ( std:: io:: Error :: new ( error, message) )
429
+ }
445
430
}
446
- }
447
431
448
- fn persist_graph ( & self , network_graph : & NetworkGraph ) -> Result < ( ) , std :: io :: Error > {
449
- match self . graph_error {
450
- None => FilesystemPersister :: persist_network_graph ( self . data_dir . clone ( ) , network_graph ) ,
451
- Some ( ( error , message ) ) => Err ( std :: io :: Error :: new ( error , message ) ) ,
432
+ if key == "network_graph" {
433
+ if let Some ( ( error , message ) ) = self . graph_error {
434
+ return Err ( std :: io :: Error :: new ( error , message ) )
435
+ }
452
436
}
437
+
438
+ self . filesystem_persister . persist ( key, object)
453
439
}
454
440
}
455
441
@@ -576,7 +562,7 @@ mod tests {
576
562
577
563
// Initiate the background processors to watch each node.
578
564
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
579
- let persister = Persister :: new ( data_dir) ;
565
+ let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
580
566
let event_handler = |_: & _ | { } ;
581
567
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
582
568
@@ -637,7 +623,7 @@ mod tests {
637
623
// `FRESHNESS_TIMER`.
638
624
let nodes = create_nodes ( 1 , "test_timer_tick_called" . to_string ( ) ) ;
639
625
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
640
- let persister = Persister :: new ( data_dir) ;
626
+ let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
641
627
let event_handler = |_: & _ | { } ;
642
628
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
643
629
loop {
@@ -660,7 +646,7 @@ mod tests {
660
646
open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , 100000 ) ;
661
647
662
648
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
663
- let persister = Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ;
649
+ let persister = Arc :: new ( Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
664
650
let event_handler = |_: & _ | { } ;
665
651
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
666
652
match bg_processor. join ( ) {
@@ -677,7 +663,7 @@ mod tests {
677
663
// Test that if we encounter an error during network graph persistence, an error gets returned.
678
664
let nodes = create_nodes ( 2 , "test_persist_network_graph_error" . to_string ( ) ) ;
679
665
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
680
- let persister = Persister :: new ( data_dir) . with_graph_error ( std:: io:: ErrorKind :: Other , "test" ) ;
666
+ let persister = Arc :: new ( Persister :: new ( data_dir) . with_graph_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
681
667
let event_handler = |_: & _ | { } ;
682
668
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
683
669
@@ -695,7 +681,7 @@ mod tests {
695
681
let mut nodes = create_nodes ( 2 , "test_background_event_handling" . to_string ( ) ) ;
696
682
let channel_value = 100000 ;
697
683
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
698
- let persister = Persister :: new ( data_dir. clone ( ) ) ;
684
+ let persister = Arc :: new ( Persister :: new ( data_dir. clone ( ) ) ) ;
699
685
700
686
// Set up a background event handler for FundingGenerationReady events.
701
687
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
@@ -726,7 +712,8 @@ mod tests {
726
712
// Set up a background event handler for SpendableOutputs events.
727
713
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
728
714
let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
729
- let bg_processor = BackgroundProcessor :: start ( Persister :: new ( data_dir) , event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
715
+ let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
716
+ let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
730
717
731
718
// Force close the channel and check that the SpendableOutputs event was handled.
732
719
nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id ) . unwrap ( ) ;
@@ -752,7 +739,7 @@ mod tests {
752
739
753
740
// Initiate the background processors to watch each node.
754
741
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
755
- let persister = Persister :: new ( data_dir) ;
742
+ let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
756
743
let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
757
744
let router = DefaultRouter :: new ( Arc :: clone ( & nodes[ 0 ] . network_graph ) , Arc :: clone ( & nodes[ 0 ] . logger ) , random_seed_bytes) ;
758
745
let invoice_payer = Arc :: new ( InvoicePayer :: new ( Arc :: clone ( & nodes[ 0 ] . node ) , router, scorer, Arc :: clone ( & nodes[ 0 ] . logger ) , |_: & _ | { } , RetryAttempts ( 2 ) ) ) ;
0 commit comments