@@ -107,6 +107,25 @@ ChannelManagerPersister<Signer, M, T, K, F, L> for Fun where
107
107
}
108
108
}
109
109
110
+ /// Trait which handles persisting a [`NetworkGraph`] to disk.
111
+ ///
112
+ /// [`NetworkGraph`]: lightning::routing::network_graph::NetworkGraph
113
+ pub trait NetworkGraphPersister {
114
+ /// Persist the given [`NetworkGraph`] to disk, returning an error if persistence failed
115
+ /// which will cause the [`BackgroundProcessor`] which called this method to exit
116
+ ///
117
+ /// [`NetworkGraph`]: lightning::routing::network_graph::NetworkGraph
118
+ fn persist_graph ( & self , network_graph : & NetworkGraph ) -> Result < ( ) , std:: io:: Error > ;
119
+ }
120
+
121
+ impl < Fun > NetworkGraphPersister for Fun where
122
+ Fun : Fn ( & NetworkGraph ) -> Result < ( ) , std:: io:: Error > ,
123
+ {
124
+ fn persist_graph ( & self , network_graph : & NetworkGraph ) -> Result < ( ) , std:: io:: Error > {
125
+ self ( network_graph)
126
+ }
127
+ }
128
+
110
129
/// Decorates an [`EventHandler`] with common functionality provided by standard [`EventHandler`]s.
111
130
struct DecoratingEventHandler <
112
131
E : EventHandler ,
@@ -190,8 +209,9 @@ impl BackgroundProcessor {
190
209
NG : ' static + Deref < Target = NetGraphMsgHandler < G , CA , L > > + Send + Sync ,
191
210
UMH : ' static + Deref + Send + Sync ,
192
211
PM : ' static + Deref < Target = PeerManager < Descriptor , CMH , RMH , L , UMH > > + Send + Sync ,
212
+ NGP : ' static + Send + NetworkGraphPersister ,
193
213
> (
194
- persister : CMP , event_handler : EH , chain_monitor : M , channel_manager : CM ,
214
+ channel_manager_persister : CMP , network_graph_persister : NGP , event_handler : EH , chain_monitor : M , channel_manager : CM ,
195
215
net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L
196
216
) -> Self
197
217
where
@@ -234,7 +254,13 @@ impl BackgroundProcessor {
234
254
235
255
if updates_available {
236
256
log_trace ! ( logger, "Persisting ChannelManager..." ) ;
237
- persister. persist_manager ( & * channel_manager) ?;
257
+ channel_manager_persister. persist_manager ( & * channel_manager) ?;
258
+ if let Some ( ref handler) = net_graph_msg_handler {
259
+ if network_graph_persister. persist_graph ( handler. network_graph ( ) ) . is_err ( ) {
260
+ log_warn ! ( logger, "Warning: Failed to persist network graph, check your disk and permissions" ) ;
261
+ }
262
+ }
263
+
238
264
log_trace ! ( logger, "Done persisting ChannelManager." ) ;
239
265
}
240
266
// Exit the loop if the background processor was requested to stop.
@@ -277,6 +303,9 @@ impl BackgroundProcessor {
277
303
if let Some ( ref handler) = net_graph_msg_handler {
278
304
log_trace ! ( logger, "Pruning network graph of stale entries" ) ;
279
305
handler. network_graph ( ) . remove_stale_channels ( ) ;
306
+ if network_graph_persister. persist_graph ( handler. network_graph ( ) ) . is_err ( ) {
307
+ log_warn ! ( logger, "Warning: Failed to persist network graph, check your disk and permissions" ) ;
308
+ }
280
309
last_prune_call = Instant :: now ( ) ;
281
310
have_pruned = true ;
282
311
}
@@ -285,7 +314,7 @@ impl BackgroundProcessor {
285
314
// After we exit, ensure we persist the ChannelManager one final time - this avoids
286
315
// some races where users quit while channel updates were in-flight, with
287
316
// ChannelMonitor update(s) persisted without a corresponding ChannelManager update.
288
- persister . persist_manager ( & * channel_manager)
317
+ channel_manager_persister . persist_manager ( & * channel_manager)
289
318
} ) ;
290
319
Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
291
320
}
@@ -525,9 +554,11 @@ mod tests {
525
554
526
555
// Initiate the background processors to watch each node.
527
556
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
528
- let persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
557
+ let channel_manager_persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
558
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
559
+ let network_graph_persister = move |graph : & NetworkGraph | FilesystemPersister :: persist_network_graph ( data_dir. clone ( ) , graph) ;
529
560
let event_handler = |_: & _ | { } ;
530
- 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 ( ) ) ;
561
+ let bg_processor = BackgroundProcessor :: start ( channel_manager_persister , network_graph_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 ( ) ) ;
531
562
532
563
macro_rules! check_persisted_data {
533
564
( $node: expr, $filepath: expr, $expected_bytes: expr) => {
@@ -556,6 +587,7 @@ mod tests {
556
587
let filepath = get_full_filepath ( "test_background_processor_persister_0" . to_string ( ) , "manager" . to_string ( ) ) ;
557
588
let mut expected_bytes = Vec :: new ( ) ;
558
589
check_persisted_data ! ( nodes[ 0 ] . node, filepath. clone( ) , expected_bytes) ;
590
+
559
591
loop {
560
592
if !nodes[ 0 ] . node . get_persistence_condvar_value ( ) { break }
561
593
}
@@ -570,6 +602,14 @@ mod tests {
570
602
if !nodes[ 0 ] . node . get_persistence_condvar_value ( ) { break }
571
603
}
572
604
605
+ // Check network graph is persisted
606
+ let filepath = get_full_filepath ( "test_background_processor_persister_0" . to_string ( ) , "network_graph" . to_string ( ) ) ;
607
+ let mut expected_bytes = Vec :: new ( ) ;
608
+ if let Some ( handler) = nodes[ 0 ] . net_graph_msg_handler . clone ( ) {
609
+ let network_graph = handler. network_graph ( ) ;
610
+ check_persisted_data ! ( network_graph, filepath. clone( ) , expected_bytes) ;
611
+ }
612
+
573
613
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
574
614
}
575
615
@@ -579,9 +619,11 @@ mod tests {
579
619
// `FRESHNESS_TIMER`.
580
620
let nodes = create_nodes ( 1 , "test_timer_tick_called" . to_string ( ) ) ;
581
621
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
582
- let persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
622
+ let channel_manager_persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
623
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
624
+ let network_graph_persister = move |graph : & NetworkGraph | FilesystemPersister :: persist_network_graph ( data_dir. clone ( ) , graph) ;
583
625
let event_handler = |_: & _ | { } ;
584
- 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 ( ) ) ;
626
+ let bg_processor = BackgroundProcessor :: start ( channel_manager_persister , network_graph_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 ( ) ) ;
585
627
loop {
586
628
let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
587
629
let desired_log = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
@@ -596,14 +638,16 @@ mod tests {
596
638
}
597
639
598
640
#[ test]
599
- fn test_persist_error ( ) {
641
+ fn test_channel_manager_persist_error ( ) {
600
642
// Test that if we encounter an error during manager persistence, the thread panics.
601
643
let nodes = create_nodes ( 2 , "test_persist_error" . to_string ( ) ) ;
602
644
open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , 100000 ) ;
603
645
604
- let persister = |_: & _ | Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , "test" ) ) ;
646
+ let channel_manager_persister = |_: & _ | Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , "test" ) ) ;
647
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
648
+ let network_graph_persister = move |graph : & NetworkGraph | FilesystemPersister :: persist_network_graph ( data_dir. clone ( ) , graph) ;
605
649
let event_handler = |_: & _ | { } ;
606
- 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 ( ) ) ;
650
+ let bg_processor = BackgroundProcessor :: start ( channel_manager_persister , network_graph_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 ( ) ) ;
607
651
match bg_processor. join ( ) {
608
652
Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
609
653
Err ( e) => {
@@ -618,14 +662,16 @@ mod tests {
618
662
let mut nodes = create_nodes ( 2 , "test_background_event_handling" . to_string ( ) ) ;
619
663
let channel_value = 100000 ;
620
664
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
621
- let persister = move |node : & _ | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
665
+ let channel_manager_persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
666
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
667
+ let network_graph_persister = move |graph : & NetworkGraph | FilesystemPersister :: persist_network_graph ( data_dir. clone ( ) , graph) ;
622
668
623
669
// Set up a background event handler for FundingGenerationReady events.
624
670
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
625
671
let event_handler = move |event : & Event | {
626
672
sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
627
673
} ;
628
- let bg_processor = BackgroundProcessor :: start ( persister . clone ( ) , 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 ( ) ) ;
674
+ let bg_processor = BackgroundProcessor :: start ( channel_manager_persister . clone ( ) , network_graph_persister . clone ( ) , 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 ( ) ) ;
629
675
630
676
// Open a channel and check that the FundingGenerationReady event was handled.
631
677
begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
@@ -649,7 +695,7 @@ mod tests {
649
695
// Set up a background event handler for SpendableOutputs events.
650
696
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
651
697
let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
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 ( ) ) ;
698
+ let bg_processor = BackgroundProcessor :: start ( channel_manager_persister , network_graph_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 ( ) ) ;
653
699
654
700
// Force close the channel and check that the SpendableOutputs event was handled.
655
701
nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id ) . unwrap ( ) ;
@@ -675,12 +721,14 @@ mod tests {
675
721
676
722
// Initiate the background processors to watch each node.
677
723
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
678
- let persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
724
+ let channel_manager_persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
725
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
726
+ let network_graph_persister = move |graph : & NetworkGraph | FilesystemPersister :: persist_network_graph ( data_dir. clone ( ) , graph) ;
679
727
let scorer = Arc :: new ( Mutex :: new ( test_utils:: TestScorer :: with_penalty ( 0 ) ) ) ;
680
728
let router = DefaultRouter :: new ( Arc :: clone ( & nodes[ 0 ] . network_graph ) , Arc :: clone ( & nodes[ 0 ] . logger ) , random_seed_bytes) ;
681
729
let invoice_payer = Arc :: new ( InvoicePayer :: new ( Arc :: clone ( & nodes[ 0 ] . node ) , router, scorer, Arc :: clone ( & nodes[ 0 ] . logger ) , |_: & _ | { } , RetryAttempts ( 2 ) ) ) ;
682
730
let event_handler = Arc :: clone ( & invoice_payer) ;
683
- 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 ( ) ) ;
731
+ let bg_processor = BackgroundProcessor :: start ( channel_manager_persister , network_graph_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 ( ) ) ;
684
732
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
685
733
}
686
734
}
0 commit comments