@@ -20,6 +20,7 @@ use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescr
2020use lightning:: routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler } ;
2121use lightning:: util:: events:: { Event , EventHandler , EventsProvider } ;
2222use lightning:: util:: logger:: Logger ;
23+ use lightning:: util:: persist:: Persister ;
2324use std:: sync:: Arc ;
2425use std:: sync:: atomic:: { AtomicBool , Ordering } ;
2526use std:: thread;
@@ -80,22 +81,7 @@ const FIRST_NETWORK_PRUNE_TIMER: u64 = 60;
8081#[ cfg( test) ]
8182const FIRST_NETWORK_PRUNE_TIMER : u64 = 1 ;
8283
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- }
84+
9985
10086/// Decorates an [`EventHandler`] with common functionality provided by standard [`EventHandler`]s.
10187struct DecoratingEventHandler <
@@ -133,7 +119,7 @@ impl BackgroundProcessor {
133119 /// The thread runs indefinitely unless the object is dropped, [`stop`] is called, or
134120 /// [`Persister::persist_manager`] returns an error. In case of an error, the error is retrieved by calling
135121 /// either [`join`] or [`stop`].
136- ///
122+ ///
137123 /// # Data Persistence
138124 ///
139125 /// [`Persister::persist_manager`] is responsible for writing out the [`ChannelManager`] to disk, and/or
@@ -142,7 +128,7 @@ impl BackgroundProcessor {
142128 /// provided implementation.
143129 ///
144130 /// [`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 `]
131+ /// [`NetworkGraph::write`] for writing out a [`NetworkGraph`]. See [`FilesystemPersister::persist_graph `]
146132 /// for Rust-Lightning's provided implementation.
147133 ///
148134 /// Typically, users should either implement [`Persister::persist_manager`] to never return an
@@ -161,8 +147,8 @@ impl BackgroundProcessor {
161147 /// [`stop`]: Self::stop
162148 /// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
163149 /// [`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+ /// [`FilesystemPersister::persist_manager`]: lightning_persister::FilesystemPersister#impl-Persister
151+ /// [`FilesystemPersister::persist_graph `]: lightning_persister::FilesystemPersister#impl-Persister
166152 /// [`NetworkGraph`]: lightning::routing::network_graph::NetworkGraph
167153 /// [`NetworkGraph::write`]: lightning::routing::network_graph::NetworkGraph#impl-Writeable
168154 pub fn start <
@@ -180,7 +166,7 @@ impl BackgroundProcessor {
180166 CMH : ' static + Deref + Send + Sync ,
181167 RMH : ' static + Deref + Send + Sync ,
182168 EH : ' static + EventHandler + Send ,
183- PS : ' static + Send + Persister < Signer , CW , T , K , F , L > ,
169+ PS : ' static + Deref + Send ,
184170 M : ' static + Deref < Target = ChainMonitor < Signer , CF , T , F , L , P > > + Send + Sync ,
185171 CM : ' static + Deref < Target = ChannelManager < Signer , CW , T , K , F , L > > + Send + Sync ,
186172 NG : ' static + Deref < Target = NetGraphMsgHandler < G , CA , L > > + Send + Sync ,
@@ -202,6 +188,7 @@ impl BackgroundProcessor {
202188 CMH :: Target : ' static + ChannelMessageHandler ,
203189 RMH :: Target : ' static + RoutingMessageHandler ,
204190 UMH :: Target : ' static + CustomMessageHandler ,
191+ PS :: Target : ' static + Persister < Signer , CW , T , K , F , L >
205192 {
206193 let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
207194 let stop_thread_clone = stop_thread. clone ( ) ;
@@ -365,10 +352,11 @@ mod tests {
365352 use lightning:: util:: logger:: Logger ;
366353 use lightning:: util:: ser:: Writeable ;
367354 use lightning:: util:: test_utils;
355+ use lightning:: util:: persist:: KVStorePersister ;
368356 use lightning_invoice:: payment:: { InvoicePayer , RetryAttempts } ;
369357 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 } ;
372360 use std:: ops:: Deref ;
373361 use std:: path:: PathBuf ;
374362 use std:: sync:: { Arc , Mutex } ;
@@ -414,12 +402,14 @@ mod tests {
414402 struct Persister {
415403 data_dir : String ,
416404 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
418407 }
419408
420409 impl Persister {
421410 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 }
423413 }
424414
425415 fn with_graph_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
@@ -431,25 +421,21 @@ mod tests {
431421 }
432422 }
433423
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+ }
445430 }
446- }
447431
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+ }
452436 }
437+
438+ self . filesystem_persister . persist ( key, object)
453439 }
454440 }
455441
@@ -576,7 +562,7 @@ mod tests {
576562
577563 // Initiate the background processors to watch each node.
578564 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) ) ;
580566 let event_handler = |_: & _ | { } ;
581567 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 ( ) ) ;
582568
@@ -637,7 +623,7 @@ mod tests {
637623 // `FRESHNESS_TIMER`.
638624 let nodes = create_nodes ( 1 , "test_timer_tick_called" . to_string ( ) ) ;
639625 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) ) ;
641627 let event_handler = |_: & _ | { } ;
642628 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 ( ) ) ;
643629 loop {
@@ -660,7 +646,7 @@ mod tests {
660646 open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , 100000 ) ;
661647
662648 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" ) ) ;
664650 let event_handler = |_: & _ | { } ;
665651 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 ( ) ) ;
666652 match bg_processor. join ( ) {
@@ -677,7 +663,7 @@ mod tests {
677663 // Test that if we encounter an error during network graph persistence, an error gets returned.
678664 let nodes = create_nodes ( 2 , "test_persist_network_graph_error" . to_string ( ) ) ;
679665 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" ) ) ;
681667 let event_handler = |_: & _ | { } ;
682668 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 ( ) ) ;
683669
@@ -695,7 +681,7 @@ mod tests {
695681 let mut nodes = create_nodes ( 2 , "test_background_event_handling" . to_string ( ) ) ;
696682 let channel_value = 100000 ;
697683 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 ( ) ) ) ;
699685
700686 // Set up a background event handler for FundingGenerationReady events.
701687 let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
@@ -726,7 +712,8 @@ mod tests {
726712 // Set up a background event handler for SpendableOutputs events.
727713 let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
728714 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 ( ) ) ;
730717
731718 // Force close the channel and check that the SpendableOutputs event was handled.
732719 nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id ) . unwrap ( ) ;
@@ -752,7 +739,7 @@ mod tests {
752739
753740 // Initiate the background processors to watch each node.
754741 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) ) ;
756743 let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
757744 let router = DefaultRouter :: new ( Arc :: clone ( & nodes[ 0 ] . network_graph ) , Arc :: clone ( & nodes[ 0 ] . logger ) , random_seed_bytes) ;
758745 let invoice_payer = Arc :: new ( InvoicePayer :: new ( Arc :: clone ( & nodes[ 0 ] . node ) , router, scorer, Arc :: clone ( & nodes[ 0 ] . logger ) , |_: & _ | { } , RetryAttempts ( 2 ) ) ) ;
0 commit comments