9
9
#![ cfg_attr( docsrs, feature( doc_auto_cfg) ) ]
10
10
11
11
#[ macro_use] extern crate lightning;
12
+ extern crate lightning_rapid_gossip_sync;
12
13
13
14
use lightning:: chain;
14
15
use lightning:: chain:: chaininterface:: { BroadcasterInterface , FeeEstimator } ;
@@ -28,6 +29,7 @@ use std::thread;
28
29
use std:: thread:: JoinHandle ;
29
30
use std:: time:: { Duration , Instant } ;
30
31
use std:: ops:: Deref ;
32
+ use lightning_rapid_gossip_sync:: RapidGossipSync ;
31
33
32
34
/// `BackgroundProcessor` takes care of tasks that (1) need to happen periodically to keep
33
35
/// Rust-Lightning running properly, and (2) either can or should be run in the background. Its
@@ -56,8 +58,7 @@ use std::ops::Deref;
56
58
#[ must_use = "BackgroundProcessor will immediately stop on drop. It should be stored until shutdown." ]
57
59
pub struct BackgroundProcessor {
58
60
stop_thread : Arc < AtomicBool > ,
59
- thread_handle : Option < JoinHandle < Result < ( ) , std:: io:: Error > > > ,
60
- is_awaiting_rapid_sync_completion : Arc < AtomicBool >
61
+ thread_handle : Option < JoinHandle < Result < ( ) , std:: io:: Error > > >
61
62
}
62
63
63
64
#[ cfg( not( test) ) ]
@@ -184,7 +185,8 @@ impl BackgroundProcessor {
184
185
SC : WriteableScore < ' a > ,
185
186
> (
186
187
persister : PS , event_handler : EH , chain_monitor : M , channel_manager : CM ,
187
- net_graph_msg_handler : Option < NG > , peer_manager : PM , await_rapid_gossip_sync_completion : bool , logger : L , scorer : Option < S >
188
+ net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L , scorer : Option < S > ,
189
+ rapid_gossip_sync : Option < Arc < RapidGossipSync < G > > >
188
190
) -> Self
189
191
where
190
192
CA :: Target : ' static + chain:: Access ,
@@ -202,8 +204,11 @@ impl BackgroundProcessor {
202
204
{
203
205
let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
204
206
let stop_thread_clone = stop_thread. clone ( ) ;
205
- let is_awaiting_graph_sync_completion = Arc :: new ( AtomicBool :: new ( await_rapid_gossip_sync_completion) ) ;
206
- let is_awaiting_graph_sync_completion_clone = is_awaiting_graph_sync_completion. clone ( ) ;
207
+ let is_initial_sync_complete = if let Some ( rapid_sync) = rapid_gossip_sync {
208
+ rapid_sync. is_initial_sync_complete . clone ( )
209
+ } else {
210
+ Arc :: new ( AtomicBool :: new ( true ) )
211
+ } ;
207
212
let handle = thread:: spawn ( move || -> Result < ( ) , std:: io:: Error > {
208
213
let event_handler = DecoratingEventHandler { event_handler, net_graph_msg_handler : net_graph_msg_handler. as_ref ( ) . map ( |t| t. deref ( ) ) } ;
209
214
@@ -284,7 +289,7 @@ impl BackgroundProcessor {
284
289
if let Some ( ref handler) = net_graph_msg_handler {
285
290
log_trace ! ( logger, "Assessing prunability of network graph" ) ;
286
291
// The network graph must not be pruned while rapid sync completion is pending
287
- let is_currently_awaiting_graph_sync = is_awaiting_graph_sync_completion_clone . load ( Ordering :: Acquire ) ;
292
+ let is_currently_awaiting_graph_sync = !is_initial_sync_complete . load ( Ordering :: Acquire ) ;
288
293
if is_currently_awaiting_graph_sync {
289
294
log_trace ! ( logger, "Not pruning network graph due to pending gossip sync" ) ;
290
295
continue ;
@@ -324,7 +329,7 @@ impl BackgroundProcessor {
324
329
325
330
Ok ( ( ) )
326
331
} ) ;
327
- Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) , is_awaiting_rapid_sync_completion : is_awaiting_graph_sync_completion }
332
+ Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
328
333
}
329
334
330
335
/// Join `BackgroundProcessor`'s thread, returning any error that occurred while persisting
@@ -355,14 +360,6 @@ impl BackgroundProcessor {
355
360
self . stop_and_join_thread ( )
356
361
}
357
362
358
- /// Signal to [`BackgroundProcessor`] that the initial rapid gossip sync has completed.
359
- ///
360
- /// This function can only be called usefully once, so there is an implicit understanding
361
- /// that running rapid sync multiple times after startup is API misuse.
362
- pub fn rapid_gossip_sync_complete ( & self ) {
363
- self . is_awaiting_rapid_sync_completion . store ( false , Ordering :: Release )
364
- }
365
-
366
363
fn stop_and_join_thread ( & mut self ) -> Result < ( ) , std:: io:: Error > {
367
364
self . stop_thread . store ( true , Ordering :: Release ) ;
368
365
self . join_thread ( )
@@ -412,6 +409,7 @@ mod tests {
412
409
use std:: sync:: mpsc:: SyncSender ;
413
410
use std:: time:: Duration ;
414
411
use lightning:: routing:: scoring:: { FixedPenaltyScorer } ;
412
+ use lightning_rapid_gossip_sync:: RapidGossipSync ;
415
413
use super :: { BackgroundProcessor , FRESHNESS_TIMER } ;
416
414
417
415
const EVENT_DEADLINE : u64 = 5 * FRESHNESS_TIMER ;
@@ -636,7 +634,7 @@ mod tests {
636
634
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
637
635
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
638
636
let event_handler = |_: & _ | { } ;
639
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
637
+ 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 ( ) ) , None ) ;
640
638
641
639
macro_rules! check_persisted_data {
642
640
( $node: expr, $filepath: expr) => {
@@ -701,7 +699,7 @@ mod tests {
701
699
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
702
700
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
703
701
let event_handler = |_: & _ | { } ;
704
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
702
+ 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 ( ) ) , None ) ;
705
703
loop {
706
704
let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
707
705
let desired_log = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
@@ -724,7 +722,7 @@ mod tests {
724
722
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
725
723
let persister = Arc :: new ( Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
726
724
let event_handler = |_: & _ | { } ;
727
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
725
+ 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 ( ) ) , None ) ;
728
726
match bg_processor. join ( ) {
729
727
Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
730
728
Err ( e) => {
@@ -741,7 +739,7 @@ mod tests {
741
739
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
742
740
let persister = Arc :: new ( Persister :: new ( data_dir) . with_graph_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
743
741
let event_handler = |_: & _ | { } ;
744
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
742
+ 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 ( ) ) , None ) ;
745
743
746
744
match bg_processor. stop ( ) {
747
745
Ok ( _) => panic ! ( "Expected error persisting network graph" ) ,
@@ -759,7 +757,7 @@ mod tests {
759
757
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
760
758
let persister = Arc :: new ( Persister :: new ( data_dir) . with_scorer_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
761
759
let event_handler = |_: & _ | { } ;
762
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
760
+ 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 ( ) ) , None ) ;
763
761
764
762
match bg_processor. stop ( ) {
765
763
Ok ( _) => panic ! ( "Expected error persisting scorer" ) ,
@@ -782,7 +780,7 @@ mod tests {
782
780
let event_handler = move |event : & Event | {
783
781
sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
784
782
} ;
785
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
783
+ 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 ( ) ) , None ) ;
786
784
787
785
// Open a channel and check that the FundingGenerationReady event was handled.
788
786
begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
@@ -807,7 +805,7 @@ mod tests {
807
805
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
808
806
let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
809
807
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
810
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
808
+ 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 ( ) ) , None ) ;
811
809
812
810
// Force close the channel and check that the SpendableOutputs event was handled.
813
811
nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id , & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
@@ -832,14 +830,16 @@ mod tests {
832
830
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
833
831
let persister = Arc :: new ( Persister :: new ( data_dir. clone ( ) ) . with_graph_persistence_notifier ( sender) ) ;
834
832
let network_graph = nodes[ 0 ] . network_graph . clone ( ) ;
833
+ let rapid_sync = Arc :: new ( RapidGossipSync :: new ( network_graph. clone ( ) ) ) ;
835
834
let features = ChannelFeatures :: empty ( ) ;
836
835
network_graph. add_channel_from_partial_announcement ( 42 , 53 , features, nodes[ 0 ] . node . get_our_node_id ( ) , nodes[ 1 ] . node . get_our_node_id ( ) )
837
836
. expect ( "Failed to update channel from partial announcement" ) ;
838
837
let original_graph_description = network_graph. to_string ( ) ;
839
838
assert ! ( original_graph_description. contains( "42: features: 0000, node_one:" ) ) ;
839
+ assert_eq ! ( network_graph. read_only( ) . channels( ) . len( ) , 1 ) ;
840
840
841
841
let event_handler = |_: & _ | { } ;
842
- 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 ( ) , true , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
842
+ let background_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 ( ) ) , Some ( rapid_sync . clone ( ) ) ) ;
843
843
844
844
loop {
845
845
let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
@@ -851,16 +851,39 @@ mod tests {
851
851
}
852
852
}
853
853
854
- bg_processor. rapid_gossip_sync_complete ( ) ;
854
+ let initialization_input = vec ! [
855
+ 76 , 68 , 75 , 1 , 111 , 226 , 140 , 10 , 182 , 241 , 179 , 114 , 193 , 166 , 162 , 70 , 174 , 99 , 247 ,
856
+ 79 , 147 , 30 , 131 , 101 , 225 , 90 , 8 , 156 , 104 , 214 , 25 , 0 , 0 , 0 , 0 , 0 , 97 , 227 , 98 , 218 ,
857
+ 0 , 0 , 0 , 4 , 2 , 22 , 7 , 207 , 206 , 25 , 164 , 197 , 231 , 230 , 231 , 56 , 102 , 61 , 250 , 251 ,
858
+ 187 , 172 , 38 , 46 , 79 , 247 , 108 , 44 , 155 , 48 , 219 , 238 , 252 , 53 , 192 , 6 , 67 , 2 , 36 , 125 ,
859
+ 157 , 176 , 223 , 175 , 234 , 116 , 94 , 248 , 201 , 225 , 97 , 235 , 50 , 47 , 115 , 172 , 63 , 136 ,
860
+ 88 , 216 , 115 , 11 , 111 , 217 , 114 , 84 , 116 , 124 , 231 , 107 , 2 , 158 , 1 , 242 , 121 , 152 , 106 ,
861
+ 204 , 131 , 186 , 35 , 93 , 70 , 216 , 10 , 237 , 224 , 183 , 89 , 95 , 65 , 3 , 83 , 185 , 58 , 138 ,
862
+ 181 , 64 , 187 , 103 , 127 , 68 , 50 , 2 , 201 , 19 , 17 , 138 , 136 , 149 , 185 , 226 , 156 , 137 , 175 ,
863
+ 110 , 32 , 237 , 0 , 217 , 90 , 31 , 100 , 228 , 149 , 46 , 219 , 175 , 168 , 77 , 4 , 143 , 38 , 128 ,
864
+ 76 , 97 , 0 , 0 , 0 , 2 , 0 , 0 , 255 , 8 , 153 , 192 , 0 , 2 , 27 , 0 , 0 , 0 , 1 , 0 , 0 , 255 , 2 , 68 ,
865
+ 226 , 0 , 6 , 11 , 0 , 1 , 2 , 3 , 0 , 0 , 0 , 2 , 0 , 40 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 232 , 0 , 0 , 3 , 232 ,
866
+ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 58 , 85 , 116 , 216 , 255 , 8 , 153 , 192 , 0 , 2 , 27 , 0 , 0 , 25 , 0 , 0 ,
867
+ 0 , 1 , 0 , 0 , 0 , 125 , 255 , 2 , 68 , 226 , 0 , 6 , 11 , 0 , 1 , 5 , 0 , 0 , 0 , 0 , 29 , 129 , 25 , 192 ,
868
+ ] ;
869
+ rapid_sync. update_network_graph ( & initialization_input[ ..] ) . unwrap ( ) ;
870
+
871
+ // this should have added two channels
872
+ assert_eq ! ( network_graph. read_only( ) . channels( ) . len( ) , 3 ) ;
855
873
856
874
let _ = receiver
857
875
. recv_timeout ( Duration :: from_secs ( super :: FIRST_NETWORK_PRUNE_TIMER * 2 ) )
858
876
. expect ( "Network graph not pruned within deadline" ) ;
859
877
let current_graph_description = network_graph. to_string ( ) ;
878
+
879
+ background_processor. stop ( ) . unwrap ( ) ;
880
+
860
881
assert_ne ! ( current_graph_description, original_graph_description) ;
861
- assert_eq ! ( current_graph_description. len( ) , 31 ) ;
862
882
assert ! ( !current_graph_description. contains( "node_one:" ) ) ;
863
883
assert ! ( !current_graph_description. contains( "node_two:" ) ) ;
884
+
885
+ // all channels should now be pruned
886
+ assert_eq ! ( network_graph. read_only( ) . channels( ) . len( ) , 0 ) ;
864
887
}
865
888
866
889
#[ test]
@@ -875,7 +898,7 @@ mod tests {
875
898
let router = DefaultRouter :: new ( Arc :: clone ( & nodes[ 0 ] . network_graph ) , Arc :: clone ( & nodes[ 0 ] . logger ) , random_seed_bytes) ;
876
899
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 ) ) ) ;
877
900
let event_handler = Arc :: clone ( & invoice_payer) ;
878
- 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 ( ) , false , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
901
+ 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 ( ) ) , None ) ;
879
902
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
880
903
}
881
904
}
0 commit comments