@@ -107,7 +107,7 @@ const PING_TIMER: u64 = 1;
107
107
const NETWORK_PRUNE_TIMER : u64 = 60 * 60 ;
108
108
109
109
#[ cfg( not( test) ) ]
110
- const SCORER_PERSIST_TIMER : u64 = 30 ;
110
+ const SCORER_PERSIST_TIMER : u64 = 60 * 60 ;
111
111
#[ cfg( test) ]
112
112
const SCORER_PERSIST_TIMER : u64 = 1 ;
113
113
@@ -235,9 +235,11 @@ fn handle_network_graph_update<L: Deref>(
235
235
}
236
236
}
237
237
238
+ /// Updates scorer based on event and returns whether an update occurred so we can decide whether
239
+ /// to persist.
238
240
fn update_scorer < ' a , S : ' static + Deref < Target = SC > + Send + Sync , SC : ' a + WriteableScore < ' a > > (
239
241
scorer : & ' a S , event : & Event
240
- ) {
242
+ ) -> bool {
241
243
let mut score = scorer. lock ( ) ;
242
244
match event {
243
245
Event :: PaymentPathFailed { ref path, short_channel_id : Some ( scid) , .. } => {
@@ -257,8 +259,9 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
257
259
Event :: ProbeFailed { path, short_channel_id : Some ( scid) , .. } => {
258
260
score. probe_failed ( path, * scid) ;
259
261
} ,
260
- _ => { } ,
262
+ _ => return false ,
261
263
}
264
+ true
262
265
}
263
266
264
267
macro_rules! define_run_body {
@@ -629,12 +632,19 @@ where
629
632
let network_graph = gossip_sync. network_graph ( ) ;
630
633
let event_handler = & event_handler;
631
634
let scorer = & scorer;
635
+ let logger = & logger;
636
+ let persister = & persister;
632
637
async move {
633
638
if let Some ( network_graph) = network_graph {
634
639
handle_network_graph_update ( network_graph, & event)
635
640
}
636
641
if let Some ( ref scorer) = scorer {
637
- update_scorer ( scorer, & event) ;
642
+ if update_scorer ( scorer, & event) {
643
+ log_trace ! ( logger, "Persisting scorer after update" ) ;
644
+ if let Err ( e) = persister. persist_scorer ( & scorer) {
645
+ log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
646
+ }
647
+ }
638
648
}
639
649
event_handler ( event) . await ;
640
650
}
@@ -772,7 +782,12 @@ impl BackgroundProcessor {
772
782
handle_network_graph_update ( network_graph, & event)
773
783
}
774
784
if let Some ( ref scorer) = scorer {
775
- update_scorer ( scorer, & event) ;
785
+ if update_scorer ( scorer, & event) {
786
+ log_trace ! ( logger, "Persisting scorer after update" ) ;
787
+ if let Err ( e) = persister. persist_scorer ( & scorer) {
788
+ log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
789
+ }
790
+ }
776
791
}
777
792
event_handler. handle_event ( event) ;
778
793
} ;
@@ -1724,6 +1739,10 @@ mod tests {
1724
1739
if !std:: thread:: panicking ( ) {
1725
1740
bg_processor. stop ( ) . unwrap ( ) ;
1726
1741
}
1742
+
1743
+ let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
1744
+ let expected_log = "Persisting scorer after update" . to_string ( ) ;
1745
+ assert_eq ! ( * log_entries. get( & ( "lightning_background_processor" . to_string( ) , expected_log) ) . unwrap( ) , 5 ) ;
1727
1746
}
1728
1747
1729
1748
#[ tokio:: test]
@@ -1766,6 +1785,10 @@ mod tests {
1766
1785
let t2 = tokio:: spawn ( async move {
1767
1786
do_test_payment_path_scoring ! ( nodes, receiver. recv( ) . await ) ;
1768
1787
exit_sender. send ( ( ) ) . unwrap ( ) ;
1788
+
1789
+ let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
1790
+ let expected_log = "Persisting scorer after update" . to_string ( ) ;
1791
+ assert_eq ! ( * log_entries. get( & ( "lightning_background_processor" . to_string( ) , expected_log) ) . unwrap( ) , 5 ) ;
1769
1792
} ) ;
1770
1793
1771
1794
let ( r1, r2) = tokio:: join!( t1, t2) ;
0 commit comments