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