@@ -230,29 +230,36 @@ fn handle_network_graph_update<L: Deref>(
230
230
}
231
231
}
232
232
233
+ /// Updates scorer based on event and returns whether an update occurred so we can decide whether
234
+ /// to persist.
233
235
fn update_scorer < ' a , S : ' static + Deref < Target = SC > + Send + Sync , SC : ' a + WriteableScore < ' a > > (
234
236
scorer : & ' a S , event : & Event
235
- ) {
237
+ ) -> bool {
236
238
let mut score = scorer. lock ( ) ;
237
239
match event {
238
240
Event :: PaymentPathFailed { ref path, short_channel_id : Some ( scid) , .. } => {
239
241
score. payment_path_failed ( path, * scid) ;
242
+ true
240
243
} ,
241
244
Event :: PaymentPathFailed { ref path, payment_failed_permanently : true , .. } => {
242
245
// Reached if the destination explicitly failed it back. We treat this as a successful probe
243
246
// because the payment made it all the way to the destination with sufficient liquidity.
244
247
score. probe_successful ( path) ;
248
+ true
245
249
} ,
246
250
Event :: PaymentPathSuccessful { path, .. } => {
247
251
score. payment_path_successful ( path) ;
252
+ true
248
253
} ,
249
254
Event :: ProbeSuccessful { path, .. } => {
250
255
score. probe_successful ( path) ;
256
+ true
251
257
} ,
252
258
Event :: ProbeFailed { path, short_channel_id : Some ( scid) , .. } => {
253
259
score. probe_failed ( path, * scid) ;
260
+ true
254
261
} ,
255
- _ => { } ,
262
+ _ => false ,
256
263
}
257
264
}
258
265
@@ -616,12 +623,19 @@ where
616
623
let network_graph = gossip_sync. network_graph ( ) ;
617
624
let event_handler = & event_handler;
618
625
let scorer = & scorer;
626
+ let logger = & logger;
627
+ let persister = & persister;
619
628
async move {
620
629
if let Some ( network_graph) = network_graph {
621
630
handle_network_graph_update ( network_graph, & event)
622
631
}
623
632
if let Some ( ref scorer) = scorer {
624
- update_scorer ( scorer, & event) ;
633
+ if update_scorer ( scorer, & event) {
634
+ log_trace ! ( logger, "Persisting scorer after update" ) ;
635
+ if let Err ( e) = persister. persist_scorer ( & scorer) {
636
+ log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
637
+ }
638
+ }
625
639
}
626
640
event_handler ( event) . await ;
627
641
}
@@ -759,7 +773,12 @@ impl BackgroundProcessor {
759
773
handle_network_graph_update ( network_graph, & event)
760
774
}
761
775
if let Some ( ref scorer) = scorer {
762
- update_scorer ( scorer, & event) ;
776
+ if update_scorer ( scorer, & event) {
777
+ log_trace ! ( logger, "Persisting scorer after update" ) ;
778
+ if let Err ( e) = persister. persist_scorer ( & scorer) {
779
+ log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
780
+ }
781
+ }
763
782
}
764
783
event_handler. handle_event ( event) ;
765
784
} ;
@@ -1711,6 +1730,10 @@ mod tests {
1711
1730
if !std:: thread:: panicking ( ) {
1712
1731
bg_processor. stop ( ) . unwrap ( ) ;
1713
1732
}
1733
+
1734
+ let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
1735
+ let expected_log = "Persisting scorer after update" . to_string ( ) ;
1736
+ assert_eq ! ( * log_entries. get( & ( "lightning_background_processor" . to_string( ) , expected_log) ) . unwrap( ) , 5 ) ;
1714
1737
}
1715
1738
1716
1739
#[ tokio:: test]
@@ -1753,6 +1776,10 @@ mod tests {
1753
1776
let t2 = tokio:: spawn ( async move {
1754
1777
do_test_payment_path_scoring ! ( nodes, receiver. recv( ) . await ) ;
1755
1778
exit_sender. send ( ( ) ) . unwrap ( ) ;
1779
+
1780
+ let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
1781
+ let expected_log = "Persisting scorer after update" . to_string ( ) ;
1782
+ assert_eq ! ( * log_entries. get( & ( "lightning_background_processor" . to_string( ) , expected_log) ) . unwrap( ) , 5 ) ;
1756
1783
} ) ;
1757
1784
1758
1785
let ( r1, r2) = tokio:: join!( t1, t2) ;
0 commit comments