@@ -18,6 +18,7 @@ use lightning::ln::channelmanager::ChannelManager;
1818use lightning:: ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
1919use lightning:: ln:: peer_handler:: { CustomMessageHandler , PeerManager , SocketDescriptor } ;
2020use lightning:: routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler } ;
21+ use lightning:: routing:: scoring:: WriteableScore ;
2122use lightning:: util:: events:: { Event , EventHandler , EventsProvider } ;
2223use lightning:: util:: logger:: Logger ;
2324use lightning:: util:: persist:: Persister ;
@@ -151,6 +152,7 @@ impl BackgroundProcessor {
151152 /// [`NetworkGraph`]: lightning::routing::network_graph::NetworkGraph
152153 /// [`NetworkGraph::write`]: lightning::routing::network_graph::NetworkGraph#impl-Writeable
153154 pub fn start <
155+ ' a ,
154156 Signer : ' static + Sign ,
155157 CA : ' static + Deref + Send + Sync ,
156158 CF : ' static + Deref + Send + Sync ,
@@ -171,9 +173,11 @@ impl BackgroundProcessor {
171173 NG : ' static + Deref < Target = NetGraphMsgHandler < G , CA , L > > + Send + Sync ,
172174 UMH : ' static + Deref + Send + Sync ,
173175 PM : ' static + Deref < Target = PeerManager < Descriptor , CMH , RMH , L , UMH > > + Send + Sync ,
176+ S : ' static + Deref < Target = SC > + Send + Sync ,
177+ SC : WriteableScore < ' a >
174178 > (
175179 persister : PS , event_handler : EH , chain_monitor : M , channel_manager : CM ,
176- net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L
180+ net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L , scorer : Option < S >
177181 ) -> Self
178182 where
179183 CA :: Target : ' static + chain:: Access ,
@@ -187,7 +191,7 @@ impl BackgroundProcessor {
187191 CMH :: Target : ' static + ChannelMessageHandler ,
188192 RMH :: Target : ' static + RoutingMessageHandler ,
189193 UMH :: Target : ' static + CustomMessageHandler ,
190- PS :: Target : ' static + Persister < Signer , CW , T , K , F , L >
194+ PS :: Target : ' static + Persister < ' a , Signer , CW , T , K , F , L , SC > ,
191195 {
192196 let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
193197 let stop_thread_clone = stop_thread. clone ( ) ;
@@ -277,6 +281,11 @@ impl BackgroundProcessor {
277281 last_prune_call = Instant :: now ( ) ;
278282 have_pruned = true ;
279283 }
284+ if let Some ( ref scorer) = scorer {
285+ if let Err ( e) = persister. persist_scorer ( & scorer) {
286+ log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
287+ }
288+ }
280289 }
281290 }
282291
@@ -285,10 +294,16 @@ impl BackgroundProcessor {
285294 // ChannelMonitor update(s) persisted without a corresponding ChannelManager update.
286295 persister. persist_manager ( & * channel_manager) ?;
287296
297+ // Persist Scorer on exit
298+ if let Some ( ref scorer) = scorer {
299+ persister. persist_scorer ( & scorer) ?;
300+ }
301+
288302 // Persist NetworkGraph on exit
289303 if let Some ( ref handler) = net_graph_msg_handler {
290304 persister. persist_graph ( handler. network_graph ( ) ) ?;
291305 }
306+
292307 Ok ( ( ) )
293308 } ) ;
294309 Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
@@ -411,12 +426,13 @@ mod tests {
411426 graph_error : Option < ( std:: io:: ErrorKind , & ' static str ) > ,
412427 manager_error : Option < ( std:: io:: ErrorKind , & ' static str ) > ,
413428 filesystem_persister : FilesystemPersister ,
429+ scorer_error : Option < ( std:: io:: ErrorKind , & ' static str ) >
414430 }
415431
416432 impl Persister {
417433 fn new ( data_dir : String ) -> Self {
418434 let filesystem_persister = FilesystemPersister :: new ( data_dir. clone ( ) ) ;
419- Self { graph_error : None , manager_error : None , filesystem_persister }
435+ Self { graph_error : None , manager_error : None , scorer_error : None , filesystem_persister }
420436 }
421437
422438 fn with_graph_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
@@ -426,6 +442,10 @@ mod tests {
426442 fn with_manager_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
427443 Self { manager_error : Some ( ( error, message) ) , ..self }
428444 }
445+
446+ fn with_scorer_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
447+ Self { scorer_error : Some ( ( error, message) ) , ..self }
448+ }
429449 }
430450
431451 impl KVStorePersister for Persister {
@@ -442,6 +462,12 @@ mod tests {
442462 }
443463 }
444464
465+ if key == "scorer" {
466+ if let Some ( ( error, message) ) = self . scorer_error {
467+ return Err ( std:: io:: Error :: new ( error, message) )
468+ }
469+ }
470+
445471 self . filesystem_persister . persist ( key, object)
446472 }
447473 }
@@ -571,7 +597,8 @@ mod tests {
571597 let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
572598 let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
573599 let event_handler = |_: & _ | { } ;
574- 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 ( ) ) ;
600+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
601+ 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 ( ) , Some ( scorer. clone ( ) ) ) ;
575602
576603 macro_rules! check_persisted_data {
577604 ( $node: expr, $filepath: expr) => {
@@ -621,6 +648,10 @@ mod tests {
621648 check_persisted_data ! ( network_graph, filepath. clone( ) ) ;
622649 }
623650
651+ // Check scorer is persisted
652+ let filepath = get_full_filepath ( "test_background_processor_persister_0" . to_string ( ) , "scorer" . to_string ( ) ) ;
653+ check_persisted_data ! ( scorer. lock( ) . unwrap( ) , filepath. clone( ) ) ;
654+
624655 assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
625656 }
626657
@@ -632,7 +663,8 @@ mod tests {
632663 let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
633664 let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
634665 let event_handler = |_: & _ | { } ;
635- 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+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
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 ( ) , Some ( scorer) ) ;
636668 loop {
637669 let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
638670 let desired_log = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
@@ -655,7 +687,8 @@ mod tests {
655687 let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
656688 let persister = Arc :: new ( Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
657689 let event_handler = |_: & _ | { } ;
658- 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 ( ) ) ;
690+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
691+ 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 ( ) , Some ( scorer) ) ;
659692 match bg_processor. join ( ) {
660693 Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
661694 Err ( e) => {
@@ -672,7 +705,8 @@ mod tests {
672705 let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
673706 let persister = Arc :: new ( Persister :: new ( data_dir) . with_graph_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
674707 let event_handler = |_: & _ | { } ;
675- 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 ( ) ) ;
708+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
709+ 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 ( ) , Some ( scorer) ) ;
676710
677711 match bg_processor. stop ( ) {
678712 Ok ( _) => panic ! ( "Expected error persisting network graph" ) ,
@@ -683,6 +717,25 @@ mod tests {
683717 }
684718 }
685719
720+ #[ test]
721+ fn test_scorer_persist_error ( ) {
722+ // Test that if we encounter an error during scorer persistence, an error gets returned.
723+ let nodes = create_nodes ( 2 , "test_persist_scorer_error" . to_string ( ) ) ;
724+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
725+ let persister = Arc :: new ( Persister :: new ( data_dir) . with_scorer_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
726+ let event_handler = |_: & _ | { } ;
727+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
728+ 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 ( ) , Some ( scorer) ) ;
729+
730+ match bg_processor. stop ( ) {
731+ Ok ( _) => panic ! ( "Expected error persisting scorer" ) ,
732+ Err ( e) => {
733+ assert_eq ! ( e. kind( ) , std:: io:: ErrorKind :: Other ) ;
734+ assert_eq ! ( e. get_ref( ) . unwrap( ) . to_string( ) , "test" ) ;
735+ } ,
736+ }
737+ }
738+
686739 #[ test]
687740 fn test_background_event_handling ( ) {
688741 let mut nodes = create_nodes ( 2 , "test_background_event_handling" . to_string ( ) ) ;
@@ -695,7 +748,8 @@ mod tests {
695748 let event_handler = move |event : & Event | {
696749 sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
697750 } ;
698- 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 ( ) ) ;
751+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
752+ 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 ( ) , Some ( scorer) ) ;
699753
700754 // Open a channel and check that the FundingGenerationReady event was handled.
701755 begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
@@ -720,7 +774,8 @@ mod tests {
720774 let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
721775 let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
722776 let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
723- 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 ( ) ) ;
777+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
778+ 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 ( ) , Some ( scorer) ) ;
724779
725780 // Force close the channel and check that the SpendableOutputs event was handled.
726781 nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id ) . unwrap ( ) ;
@@ -751,7 +806,8 @@ mod tests {
751806 let router = DefaultRouter :: new ( Arc :: clone ( & nodes[ 0 ] . network_graph ) , Arc :: clone ( & nodes[ 0 ] . logger ) , random_seed_bytes) ;
752807 let invoice_payer = Arc :: new ( InvoicePayer :: new ( Arc :: clone ( & nodes[ 0 ] . node ) , router, scorer, Arc :: clone ( & nodes[ 0 ] . logger ) , |_: & _ | { } , RetryAttempts ( 2 ) ) ) ;
753808 let event_handler = Arc :: clone ( & invoice_payer) ;
754- 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 ( ) ) ;
809+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
810+ 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 ( ) , Some ( scorer) ) ;
755811 assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
756812 }
757813}
0 commit comments