@@ -107,7 +107,7 @@ const PING_TIMER: u64 = 1;
107107const NETWORK_PRUNE_TIMER : u64 = 60 * 60 ;
108108
109109#[ cfg( not( test) ) ]
110- const SCORER_PERSIST_TIMER : u64 = 30 ;
110+ const SCORER_PERSIST_TIMER : u64 = 60 * 60 ;
111111#[ cfg( test) ]
112112const SCORER_PERSIST_TIMER : u64 = 1 ;
113113
@@ -235,9 +235,11 @@ fn handle_network_graph_update<L: Deref>(
235235 }
236236}
237237
238+ /// Updates scorer based on event and returns whether an update occurred so we can decide whether
239+ /// to persist.
238240fn update_scorer < ' a , S : ' static + Deref < Target = SC > + Send + Sync , SC : ' a + WriteableScore < ' a > > (
239241 scorer : & ' a S , event : & Event
240- ) {
242+ ) -> bool {
241243 let mut score = scorer. lock ( ) ;
242244 match event {
243245 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
257259 Event :: ProbeFailed { path, short_channel_id : Some ( scid) , .. } => {
258260 score. probe_failed ( path, * scid) ;
259261 } ,
260- _ => { } ,
262+ _ => return false ,
261263 }
264+ true
262265}
263266
264267macro_rules! define_run_body {
@@ -629,12 +632,19 @@ where
629632 let network_graph = gossip_sync. network_graph ( ) ;
630633 let event_handler = & event_handler;
631634 let scorer = & scorer;
635+ let logger = & logger;
636+ let persister = & persister;
632637 async move {
633638 if let Some ( network_graph) = network_graph {
634639 handle_network_graph_update ( network_graph, & event)
635640 }
636641 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+ }
638648 }
639649 event_handler ( event) . await ;
640650 }
@@ -772,7 +782,12 @@ impl BackgroundProcessor {
772782 handle_network_graph_update ( network_graph, & event)
773783 }
774784 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+ }
776791 }
777792 event_handler. handle_event ( event) ;
778793 } ;
@@ -1724,6 +1739,10 @@ mod tests {
17241739 if !std:: thread:: panicking ( ) {
17251740 bg_processor. stop ( ) . unwrap ( ) ;
17261741 }
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 ) ;
17271746 }
17281747
17291748 #[ tokio:: test]
@@ -1766,6 +1785,10 @@ mod tests {
17661785 let t2 = tokio:: spawn ( async move {
17671786 do_test_payment_path_scoring ! ( nodes, receiver. recv( ) . await ) ;
17681787 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 ) ;
17691792 } ) ;
17701793
17711794 let ( r1, r2) = tokio:: join!( t1, t2) ;
0 commit comments