@@ -18,6 +18,7 @@ use lightning::ln::channelmanager::ChannelManager;
18
18
use lightning:: ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
19
19
use lightning:: ln:: peer_handler:: { CustomMessageHandler , PeerManager , SocketDescriptor } ;
20
20
use lightning:: routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler } ;
21
+ use lightning:: routing:: scoring:: WriteableScore ;
21
22
use lightning:: util:: events:: { Event , EventHandler , EventsProvider } ;
22
23
use lightning:: util:: logger:: Logger ;
23
24
use lightning:: util:: persist:: Persister ;
@@ -151,6 +152,7 @@ impl BackgroundProcessor {
151
152
/// [`NetworkGraph`]: lightning::routing::network_graph::NetworkGraph
152
153
/// [`NetworkGraph::write`]: lightning::routing::network_graph::NetworkGraph#impl-Writeable
153
154
pub fn start <
155
+ ' a ,
154
156
Signer : ' static + Sign ,
155
157
CA : ' static + Deref + Send + Sync ,
156
158
CF : ' static + Deref + Send + Sync ,
@@ -171,9 +173,10 @@ impl BackgroundProcessor {
171
173
NG : ' static + Deref < Target = NetGraphMsgHandler < G , CA , L > > + Send + Sync ,
172
174
UMH : ' static + Deref + Send + Sync ,
173
175
PM : ' static + Deref < Target = PeerManager < Descriptor , CMH , RMH , L , UMH > > + Send + Sync ,
176
+ S : ' static + Deref + Send + Sync ,
174
177
> (
175
178
persister : PS , event_handler : EH , chain_monitor : M , channel_manager : CM ,
176
- net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L
179
+ net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L , scorer : Option < S >
177
180
) -> Self
178
181
where
179
182
CA :: Target : ' static + chain:: Access ,
@@ -187,7 +190,8 @@ impl BackgroundProcessor {
187
190
CMH :: Target : ' static + ChannelMessageHandler ,
188
191
RMH :: Target : ' static + RoutingMessageHandler ,
189
192
UMH :: Target : ' static + CustomMessageHandler ,
190
- PS :: Target : ' static + Persister < Signer , CW , T , K , F , L >
193
+ PS :: Target : ' static + Persister < ' a , Signer , CW , T , K , F , L , S > ,
194
+ S :: Target : WriteableScore < ' a > ,
191
195
{
192
196
let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
193
197
let stop_thread_clone = stop_thread. clone ( ) ;
@@ -277,6 +281,11 @@ impl BackgroundProcessor {
277
281
last_prune_call = Instant :: now ( ) ;
278
282
have_pruned = true ;
279
283
}
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
+ }
280
289
}
281
290
}
282
291
@@ -285,10 +294,16 @@ impl BackgroundProcessor {
285
294
// ChannelMonitor update(s) persisted without a corresponding ChannelManager update.
286
295
persister. persist_manager ( & * channel_manager) ?;
287
296
297
+ // Persist Scorer on exit
298
+ if let Some ( ref scorer) = scorer {
299
+ persister. persist_scorer ( & scorer) ?;
300
+ }
301
+
288
302
// Persist NetworkGraph on exit
289
303
if let Some ( ref handler) = net_graph_msg_handler {
290
304
persister. persist_graph ( handler. network_graph ( ) ) ?;
291
305
}
306
+
292
307
Ok ( ( ) )
293
308
} ) ;
294
309
Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
@@ -411,12 +426,13 @@ mod tests {
411
426
graph_error : Option < ( std:: io:: ErrorKind , & ' static str ) > ,
412
427
manager_error : Option < ( std:: io:: ErrorKind , & ' static str ) > ,
413
428
filesystem_persister : FilesystemPersister ,
429
+ scorer_error : Option < ( std:: io:: ErrorKind , & ' static str ) >
414
430
}
415
431
416
432
impl Persister {
417
433
fn new ( data_dir : String ) -> Self {
418
434
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 }
420
436
}
421
437
422
438
fn with_graph_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
@@ -426,6 +442,10 @@ mod tests {
426
442
fn with_manager_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
427
443
Self { manager_error : Some ( ( error, message) ) , ..self }
428
444
}
445
+
446
+ fn with_scorer_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
447
+ Self { scorer_error : Some ( ( error, message) ) , ..self }
448
+ }
429
449
}
430
450
431
451
impl KVStorePersister for Persister {
@@ -442,6 +462,12 @@ mod tests {
442
462
}
443
463
}
444
464
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
+
445
471
self . filesystem_persister . persist ( key, object)
446
472
}
447
473
}
@@ -571,7 +597,8 @@ mod tests {
571
597
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
572
598
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
573
599
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 ( ) ) ) ;
575
602
576
603
macro_rules! check_persisted_data {
577
604
( $node: expr, $filepath: expr) => {
@@ -597,6 +624,30 @@ mod tests {
597
624
}
598
625
}
599
626
627
+ macro_rules! check_mutex_persisted_data {
628
+ ( $node: expr, $filepath: expr) => {
629
+ let mut expected_bytes = Vec :: new( ) ;
630
+ loop {
631
+ expected_bytes. clear( ) ;
632
+ match $node. lock( ) . unwrap( ) . write( & mut expected_bytes) {
633
+ Ok ( _) => {
634
+ match std:: fs:: read( $filepath) {
635
+ Ok ( bytes) => {
636
+ if bytes == expected_bytes {
637
+ break
638
+ } else {
639
+ continue
640
+ }
641
+ } ,
642
+ Err ( _) => continue
643
+ }
644
+ } ,
645
+ Err ( e) => panic!( "Unexpected error: {}" , e)
646
+ }
647
+ }
648
+ }
649
+ }
650
+
600
651
// Check that the initial channel manager data is persisted as expected.
601
652
let filepath = get_full_filepath ( "test_background_processor_persister_0" . to_string ( ) , "manager" . to_string ( ) ) ;
602
653
check_persisted_data ! ( nodes[ 0 ] . node, filepath. clone( ) ) ;
@@ -621,6 +672,10 @@ mod tests {
621
672
check_persisted_data ! ( network_graph, filepath. clone( ) ) ;
622
673
}
623
674
675
+ // Check scorer is persisted
676
+ let filepath = get_full_filepath ( "test_background_processor_persister_0" . to_string ( ) , "scorer" . to_string ( ) ) ;
677
+ check_mutex_persisted_data ! ( scorer, filepath. clone( ) ) ;
678
+
624
679
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
625
680
}
626
681
@@ -632,7 +687,8 @@ mod tests {
632
687
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
633
688
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
634
689
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 ( ) ) ;
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) ) ;
636
692
loop {
637
693
let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
638
694
let desired_log = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
@@ -655,7 +711,8 @@ mod tests {
655
711
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
656
712
let persister = Arc :: new ( Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
657
713
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 ( ) ) ;
714
+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
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 ( ) , Some ( scorer) ) ;
659
716
match bg_processor. join ( ) {
660
717
Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
661
718
Err ( e) => {
@@ -672,7 +729,8 @@ mod tests {
672
729
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
673
730
let persister = Arc :: new ( Persister :: new ( data_dir) . with_graph_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
674
731
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 ( ) ) ;
732
+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
733
+ 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) ) ;
676
734
677
735
match bg_processor. stop ( ) {
678
736
Ok ( _) => panic ! ( "Expected error persisting network graph" ) ,
@@ -683,6 +741,25 @@ mod tests {
683
741
}
684
742
}
685
743
744
+ #[ test]
745
+ fn test_scorer_persist_error ( ) {
746
+ // Test that if we encounter an error during scorer persistence, an error gets returned.
747
+ let nodes = create_nodes ( 2 , "test_persist_scorer_error" . to_string ( ) ) ;
748
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
749
+ let persister = Arc :: new ( Persister :: new ( data_dir) . with_scorer_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
750
+ let event_handler = |_: & _ | { } ;
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) ) ;
753
+
754
+ match bg_processor. stop ( ) {
755
+ Ok ( _) => panic ! ( "Expected error persisting scorer" ) ,
756
+ Err ( e) => {
757
+ assert_eq ! ( e. kind( ) , std:: io:: ErrorKind :: Other ) ;
758
+ assert_eq ! ( e. get_ref( ) . unwrap( ) . to_string( ) , "test" ) ;
759
+ } ,
760
+ }
761
+ }
762
+
686
763
#[ test]
687
764
fn test_background_event_handling ( ) {
688
765
let mut nodes = create_nodes ( 2 , "test_background_event_handling" . to_string ( ) ) ;
@@ -695,7 +772,8 @@ mod tests {
695
772
let event_handler = move |event : & Event | {
696
773
sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
697
774
} ;
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 ( ) ) ;
775
+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
776
+ 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) ) ;
699
777
700
778
// Open a channel and check that the FundingGenerationReady event was handled.
701
779
begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
@@ -720,7 +798,8 @@ mod tests {
720
798
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
721
799
let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
722
800
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 ( ) ) ;
801
+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
802
+ 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) ) ;
724
803
725
804
// Force close the channel and check that the SpendableOutputs event was handled.
726
805
nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id ) . unwrap ( ) ;
@@ -751,7 +830,8 @@ mod tests {
751
830
let router = DefaultRouter :: new ( Arc :: clone ( & nodes[ 0 ] . network_graph ) , Arc :: clone ( & nodes[ 0 ] . logger ) , random_seed_bytes) ;
752
831
let invoice_payer = Arc :: new ( InvoicePayer :: new ( Arc :: clone ( & nodes[ 0 ] . node ) , router, scorer, Arc :: clone ( & nodes[ 0 ] . logger ) , |_: & _ | { } , RetryAttempts ( 2 ) ) ) ;
753
832
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 ( ) ) ;
833
+ let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
834
+ 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) ) ;
755
835
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
756
836
}
757
837
}
0 commit comments