@@ -79,6 +79,11 @@ const PING_TIMER: u64 = 1;
79
79
/// Prune the network graph of stale entries hourly.
80
80
const NETWORK_PRUNE_TIMER : u64 = 60 * 60 ;
81
81
82
+ #[ cfg( all( not( test) , debug_assertions) ) ]
83
+ const SCORER_PERSIST_TIMER : u64 = 30 ;
84
+ #[ cfg( test) ]
85
+ const SCORER_PERSIST_TIMER : u64 = 1 ;
86
+
82
87
#[ cfg( not( test) ) ]
83
88
const FIRST_NETWORK_PRUNE_TIMER : u64 = 60 ;
84
89
#[ cfg( test) ]
@@ -144,6 +149,12 @@ impl BackgroundProcessor {
144
149
/// functionality implemented by other handlers.
145
150
/// * [`NetGraphMsgHandler`] if given will update the [`NetworkGraph`] based on payment failures.
146
151
///
152
+ /// # Rapid Gossip Sync
153
+ ///
154
+ /// If a rapid gossip sync is meant to run at startup, pass an optional [`RapidGossipSync`]
155
+ /// to `rapid_gossip_sync` to indicate to [`BackgroundProcessor`] not to prune the
156
+ /// [`NetworkGraph`] instance until the [`RapidGossipSync`] instance completes its first sync.
157
+ ///
147
158
/// [top-level documentation]: BackgroundProcessor
148
159
/// [`join`]: Self::join
149
160
/// [`stop`]: Self::stop
@@ -153,13 +164,6 @@ impl BackgroundProcessor {
153
164
/// [`Persister::persist_graph`]: lightning::util::persist::Persister::persist_graph
154
165
/// [`NetworkGraph`]: lightning::routing::network_graph::NetworkGraph
155
166
/// [`NetworkGraph::write`]: lightning::routing::network_graph::NetworkGraph#impl-Writeable
156
- ///
157
- /// # Rapid Gossip Sync
158
- ///
159
- /// If a rapid gossip sync is meant to run at startup, pass an option with a set
160
- /// [`RapidGossipSync`] reference to `rapid_gossip_sync` to indicate to [`BackgroundProcessor`]
161
- /// not to prune the [`NetworkGraph`] instance until the [`RapidGossipSync`] instance
162
- /// completes its first sync.
163
167
pub fn start <
164
168
' a ,
165
169
Signer : ' static + Sign ,
@@ -215,6 +219,7 @@ impl BackgroundProcessor {
215
219
let mut last_freshness_call = Instant :: now ( ) ;
216
220
let mut last_ping_call = Instant :: now ( ) ;
217
221
let mut last_prune_call = Instant :: now ( ) ;
222
+ let mut last_scorer_persist_call = Instant :: now ( ) ;
218
223
let mut have_pruned = false ;
219
224
220
225
loop {
@@ -309,11 +314,14 @@ impl BackgroundProcessor {
309
314
}
310
315
}
311
316
312
- if let Some ( ref scorer) = scorer {
313
- log_trace ! ( logger, "Persisting scorer" ) ;
314
- if let Err ( e) = persister. persist_scorer ( & scorer) {
315
- log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
317
+ if last_scorer_persist_call. elapsed ( ) . as_secs ( ) > SCORER_PERSIST_TIMER {
318
+ if let Some ( ref scorer) = scorer {
319
+ log_trace ! ( logger, "Persisting scorer" ) ;
320
+ if let Err ( e) = persister. persist_scorer ( & scorer) {
321
+ log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
322
+ }
316
323
}
324
+ last_scorer_persist_call = Instant :: now ( ) ;
317
325
}
318
326
}
319
327
@@ -442,6 +450,7 @@ mod tests {
442
450
logger : Arc < test_utils:: TestLogger > ,
443
451
best_block : BestBlock ,
444
452
scorer : Arc < Mutex < FixedPenaltyScorer > > ,
453
+ rapid_gossip_sync : Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > >
445
454
}
446
455
447
456
impl Drop for Node {
@@ -541,7 +550,8 @@ mod tests {
541
550
let msg_handler = MessageHandler { chan_handler : Arc :: new ( test_utils:: TestChannelMessageHandler :: new ( ) ) , route_handler : Arc :: new ( test_utils:: TestRoutingMessageHandler :: new ( ) ) } ;
542
551
let peer_manager = Arc :: new ( PeerManager :: new ( msg_handler, keys_manager. get_node_secret ( Recipient :: Node ) . unwrap ( ) , & seed, logger. clone ( ) , IgnoringMessageHandler { } ) ) ;
543
552
let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
544
- let node = Node { node : manager, net_graph_msg_handler, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block, scorer } ;
553
+ let rapid_gossip_sync = None ;
554
+ let node = Node { node : manager, net_graph_msg_handler, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block, scorer, rapid_gossip_sync } ;
545
555
nodes. push ( node) ;
546
556
}
547
557
@@ -639,8 +649,7 @@ mod tests {
639
649
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
640
650
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
641
651
let event_handler = |_: & _ | { } ;
642
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
643
- 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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
652
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
644
653
645
654
macro_rules! check_persisted_data {
646
655
( $node: expr, $filepath: expr) => {
@@ -705,8 +714,7 @@ mod tests {
705
714
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
706
715
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
707
716
let event_handler = |_: & _ | { } ;
708
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
717
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
710
718
loop {
711
719
let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
712
720
let desired_log = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
@@ -729,8 +737,7 @@ mod tests {
729
737
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
730
738
let persister = Arc :: new ( Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
731
739
let event_handler = |_: & _ | { } ;
732
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
740
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
734
741
match bg_processor. join ( ) {
735
742
Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
736
743
Err ( e) => {
@@ -747,8 +754,7 @@ mod tests {
747
754
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
748
755
let persister = Arc :: new ( Persister :: new ( data_dir) . with_graph_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
749
756
let event_handler = |_: & _ | { } ;
750
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
751
- 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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
757
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
752
758
753
759
match bg_processor. stop ( ) {
754
760
Ok ( _) => panic ! ( "Expected error persisting network graph" ) ,
@@ -766,8 +772,7 @@ mod tests {
766
772
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
767
773
let persister = Arc :: new ( Persister :: new ( data_dir) . with_scorer_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
768
774
let event_handler = |_: & _ | { } ;
769
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
770
- 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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
775
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
771
776
772
777
match bg_processor. stop ( ) {
773
778
Ok ( _) => panic ! ( "Expected error persisting scorer" ) ,
@@ -790,8 +795,7 @@ mod tests {
790
795
let event_handler = move |event : & Event | {
791
796
sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
792
797
} ;
793
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
794
- 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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
798
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
795
799
796
800
// Open a channel and check that the FundingGenerationReady event was handled.
797
801
begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
@@ -816,8 +820,7 @@ mod tests {
816
820
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
817
821
let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
818
822
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
819
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
820
- 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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
823
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
821
824
822
825
// Force close the channel and check that the SpendableOutputs event was handled.
823
826
nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id , & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
@@ -835,6 +838,25 @@ mod tests {
835
838
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
836
839
}
837
840
841
+ #[ test]
842
+ fn test_scorer_persistence ( ) {
843
+ let nodes = create_nodes ( 2 , "test_scorer_persistence" . to_string ( ) ) ;
844
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
845
+ let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
846
+ let event_handler = |_: & _ | { } ;
847
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
848
+
849
+ loop {
850
+ let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
851
+ let expected_log = "Persisting scorer" . to_string ( ) ;
852
+ if log_entries. get ( & ( "lightning_background_processor" . to_string ( ) , expected_log) ) . is_some ( ) {
853
+ break
854
+ }
855
+ }
856
+
857
+ assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
858
+ }
859
+
838
860
#[ test]
839
861
fn test_not_pruning_network_graph_until_graph_sync_completion ( ) {
840
862
let nodes = create_nodes ( 2 , "test_not_pruning_network_graph_until_graph_sync_completion" . to_string ( ) ) ;
@@ -886,14 +908,9 @@ mod tests {
886
908
let _ = receiver
887
909
. recv_timeout ( Duration :: from_secs ( super :: FIRST_NETWORK_PRUNE_TIMER * 2 ) )
888
910
. expect ( "Network graph not pruned within deadline" ) ;
889
- let current_graph_description = network_graph. to_string ( ) ;
890
911
891
912
background_processor. stop ( ) . unwrap ( ) ;
892
913
893
- assert_ne ! ( current_graph_description, original_graph_description) ;
894
- assert ! ( !current_graph_description. contains( "node_one:" ) ) ;
895
- assert ! ( !current_graph_description. contains( "node_two:" ) ) ;
896
-
897
914
// all channels should now be pruned
898
915
assert_eq ! ( network_graph. read_only( ) . channels( ) . len( ) , 0 ) ;
899
916
}
@@ -910,8 +927,7 @@ mod tests {
910
927
let router = DefaultRouter :: new ( Arc :: clone ( & nodes[ 0 ] . network_graph ) , Arc :: clone ( & nodes[ 0 ] . logger ) , random_seed_bytes) ;
911
928
let invoice_payer = Arc :: new ( InvoicePayer :: new ( Arc :: clone ( & nodes[ 0 ] . node ) , router, Arc :: clone ( & nodes[ 0 ] . scorer ) , Arc :: clone ( & nodes[ 0 ] . logger ) , |_: & _ | { } , Retry :: Attempts ( 2 ) ) ) ;
912
929
let event_handler = Arc :: clone ( & invoice_payer) ;
913
- let rapid_gossip_sync: Option < Arc < RapidGossipSync < Arc < NetworkGraph > > > > = None ;
914
- 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 ( nodes[ 0 ] . scorer . clone ( ) ) , rapid_gossip_sync) ;
930
+ 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 ( nodes[ 0 ] . scorer . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync . clone ( ) ) ;
915
931
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
916
932
}
917
933
}
0 commit comments