@@ -40,7 +40,7 @@ use lightning::sign::ChangeDestinationSourceSync;
40
40
use lightning:: sign:: EntropySource ;
41
41
use lightning:: sign:: OutputSpender ;
42
42
use lightning:: util:: logger:: Logger ;
43
- use lightning:: util:: persist:: { KVStoreSync , PersisterSync } ;
43
+ use lightning:: util:: persist:: { KVStoreSync , Persister , PersisterSync } ;
44
44
use lightning:: util:: sweep:: OutputSweeper ;
45
45
#[ cfg( feature = "std" ) ]
46
46
use lightning:: util:: sweep:: OutputSweeperSync ;
@@ -311,6 +311,15 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
311
311
true
312
312
}
313
313
314
+ macro_rules! maybe_await {
315
+ ( true , $e: expr) => {
316
+ $e. await
317
+ } ;
318
+ ( false , $e: expr) => {
319
+ $e
320
+ } ;
321
+ }
322
+
314
323
macro_rules! define_run_body {
315
324
(
316
325
$persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
@@ -319,7 +328,7 @@ macro_rules! define_run_body {
319
328
$peer_manager: ident, $gossip_sync: ident,
320
329
$process_sweeper: expr,
321
330
$logger: ident, $scorer: ident, $loop_exit_check: expr, $await: expr, $get_timer: expr,
322
- $timer_elapsed: expr, $check_slow_await: expr, $time_fetch: expr,
331
+ $timer_elapsed: expr, $check_slow_await: expr, $time_fetch: expr, $async : tt ,
323
332
) => { {
324
333
log_trace!( $logger, "Calling ChannelManager's timer_tick_occurred on startup" ) ;
325
334
$channel_manager. get_cm( ) . timer_tick_occurred( ) ;
@@ -375,7 +384,7 @@ macro_rules! define_run_body {
375
384
376
385
if $channel_manager. get_cm( ) . get_and_clear_needs_persistence( ) {
377
386
log_trace!( $logger, "Persisting ChannelManager..." ) ;
378
- $ persister. persist_manager( & $channel_manager) ?;
387
+ maybe_await! ( $async , $ persister. persist_manager( & $channel_manager) ) ?;
379
388
log_trace!( $logger, "Done persisting ChannelManager." ) ;
380
389
}
381
390
if $timer_elapsed( & mut last_freshness_call, FRESHNESS_TIMER ) {
@@ -436,7 +445,7 @@ macro_rules! define_run_body {
436
445
log_trace!( $logger, "Persisting network graph." ) ;
437
446
}
438
447
439
- if let Err ( e) = $ persister. persist_graph( network_graph) {
448
+ if let Err ( e) = maybe_await! ( $async , $ persister. persist_graph( network_graph) ) {
440
449
log_error!( $logger, "Error: Failed to persist network graph, check your disk and permissions {}" , e)
441
450
}
442
451
@@ -464,8 +473,8 @@ macro_rules! define_run_body {
464
473
} else {
465
474
log_trace!( $logger, "Persisting scorer" ) ;
466
475
}
467
- if let Err ( e) = $ persister. persist_scorer( & scorer) {
468
- log_error!( $logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
476
+ if let Err ( e) = maybe_await! ( $async , $ persister. persist_scorer( & scorer) ) {
477
+ log_error!( $logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
469
478
}
470
479
}
471
480
last_scorer_persist_call = $get_timer( SCORER_PERSIST_TIMER ) ;
@@ -487,16 +496,16 @@ macro_rules! define_run_body {
487
496
// After we exit, ensure we persist the ChannelManager one final time - this avoids
488
497
// some races where users quit while channel updates were in-flight, with
489
498
// ChannelMonitor update(s) persisted without a corresponding ChannelManager update.
490
- $ persister. persist_manager( & $channel_manager) ?;
499
+ maybe_await! ( $async , $ persister. persist_manager( & $channel_manager) ) ?;
491
500
492
501
// Persist Scorer on exit
493
502
if let Some ( ref scorer) = $scorer {
494
- $ persister. persist_scorer( & scorer) ?;
503
+ maybe_await! ( $async , $ persister. persist_scorer( & scorer) ) ?;
495
504
}
496
505
497
506
// Persist NetworkGraph on exit
498
507
if let Some ( network_graph) = $gossip_sync. network_graph( ) {
499
- $ persister. persist_graph( network_graph) ?;
508
+ maybe_await! ( $async , $ persister. persist_graph( network_graph) ) ?;
500
509
}
501
510
502
511
Ok ( ( ) )
@@ -653,7 +662,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
653
662
/// # fn log(&self, _record: lightning::util::logger::Record) {}
654
663
/// # }
655
664
/// # struct Store {}
656
- /// # impl lightning::util::persist::KVStore for Store {
665
+ /// # impl lightning::util::persist::KVStoreSync for Store {
657
666
/// # fn read(&self, primary_namespace: &str, secondary_namespace: &str, key: &str) -> io::Result<Vec<u8>> { Ok(Vec::new()) }
658
667
/// # fn write(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, buf: &[u8]) -> io::Result<()> { Ok(()) }
659
668
/// # fn remove(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, lazy: bool) -> io::Result<()> { Ok(()) }
@@ -684,7 +693,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
684
693
/// # FE: lightning::chain::chaininterface::FeeEstimator + Send + Sync + 'static,
685
694
/// # UL: lightning::routing::utxo::UtxoLookup + Send + Sync + 'static,
686
695
/// # D: lightning::sign::ChangeDestinationSource + Send + Sync + 'static,
687
- /// # K: lightning::util::persist::KVStore + Send + Sync + 'static,
696
+ /// # K: lightning::util::persist::KVStoreSync + Send + Sync + 'static,
688
697
/// # O: lightning::sign::OutputSpender + Send + Sync + 'static,
689
698
/// # > {
690
699
/// # peer_manager: Arc<PeerManager<B, F, FE, UL>>,
@@ -706,10 +715,11 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
706
715
/// # FE: lightning::chain::chaininterface::FeeEstimator + Send + Sync + 'static,
707
716
/// # UL: lightning::routing::utxo::UtxoLookup + Send + Sync + 'static,
708
717
/// # D: lightning::sign::ChangeDestinationSource + Send + Sync + 'static,
709
- /// # K: lightning::util::persist::KVStore + Send + Sync + 'static,
718
+ /// # K: lightning::util::persist::KVStoreSync + Send + Sync + 'static,
710
719
/// # O: lightning::sign::OutputSpender + Send + Sync + 'static,
711
720
/// # >(node: Node<B, F, FE, UL, D, K, O>) {
712
- /// let background_persister = Arc::clone(&node.persister);
721
+ /// let background_persister_sync = Arc::clone(&node.persister);
722
+ /// let background_persister = Arc::new(Arc::new(lightning::util::persist::KVStoreSyncWrapper(background_persister_sync)));
713
723
/// let background_event_handler = Arc::clone(&node.event_handler);
714
724
/// let background_chain_mon = Arc::clone(&node.chain_monitor);
715
725
/// let background_chan_man = Arc::clone(&node.channel_manager);
@@ -814,7 +824,7 @@ where
814
824
F :: Target : ' static + FeeEstimator ,
815
825
L :: Target : ' static + Logger ,
816
826
P :: Target : ' static + Persist < <CM :: Target as AChannelManager >:: Signer > ,
817
- PS :: Target : ' static + PersisterSync < ' a , CM , L , S > ,
827
+ PS :: Target : ' static + Persister < ' a , CM , L , S > ,
818
828
ES :: Target : ' static + EntropySource ,
819
829
CM :: Target : AChannelManager ,
820
830
OM :: Target : AOnionMessenger ,
@@ -841,7 +851,7 @@ where
841
851
if let Some ( duration_since_epoch) = fetch_time ( ) {
842
852
if update_scorer ( scorer, & event, duration_since_epoch) {
843
853
log_trace ! ( logger, "Persisting scorer after update" ) ;
844
- if let Err ( e) = persister. persist_scorer ( & * scorer) {
854
+ if let Err ( e) = persister. persist_scorer ( & * scorer) . await {
845
855
log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e) ;
846
856
// We opt not to abort early on persistence failure here as persisting
847
857
// the scorer is non-critical and we still hope that it will have
@@ -919,6 +929,7 @@ where
919
929
} ,
920
930
mobile_interruptable_platform,
921
931
fetch_time,
932
+ true ,
922
933
)
923
934
}
924
935
@@ -1098,6 +1109,7 @@ impl BackgroundProcessor {
1098
1109
. expect( "Time should be sometime after 1970" ) ,
1099
1110
)
1100
1111
} ,
1112
+ false ,
1101
1113
)
1102
1114
} ) ;
1103
1115
Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
@@ -1186,7 +1198,7 @@ mod tests {
1186
1198
use lightning:: types:: payment:: PaymentHash ;
1187
1199
use lightning:: util:: config:: UserConfig ;
1188
1200
use lightning:: util:: persist:: {
1189
- KVStoreSync , CHANNEL_MANAGER_PERSISTENCE_KEY ,
1201
+ KVStoreSync , KVStoreSyncWrapper , CHANNEL_MANAGER_PERSISTENCE_KEY ,
1190
1202
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
1191
1203
CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_KEY ,
1192
1204
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE ,
@@ -2107,9 +2119,10 @@ mod tests {
2107
2119
open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , 100000 ) ;
2108
2120
2109
2121
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
2110
- let persister = Arc :: new (
2122
+ let persister_sync = Arc :: new (
2111
2123
PersisterSync :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ,
2112
2124
) ;
2125
+ let persister = Arc :: new ( Arc :: new ( KVStoreSyncWrapper ( persister_sync) ) ) ;
2113
2126
2114
2127
let bp_future = super :: process_events_async (
2115
2128
persister,
@@ -2618,8 +2631,9 @@ mod tests {
2618
2631
let ( _, nodes) =
2619
2632
create_nodes ( 2 , "test_not_pruning_network_graph_until_graph_sync_completion_async" ) ;
2620
2633
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
2621
- let persister =
2634
+ let persister_sync =
2622
2635
Arc :: new ( PersisterSync :: new ( data_dir) . with_graph_persistence_notifier ( sender) ) ;
2636
+ let persister = Arc :: new ( Arc :: new ( KVStoreSyncWrapper ( persister_sync) ) ) ;
2623
2637
2624
2638
let ( exit_sender, exit_receiver) = tokio:: sync:: watch:: channel ( ( ) ) ;
2625
2639
let bp_future = super :: process_events_async (
@@ -2835,7 +2849,8 @@ mod tests {
2835
2849
2836
2850
let ( _, nodes) = create_nodes ( 1 , "test_payment_path_scoring_async" ) ;
2837
2851
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
2838
- let persister = Arc :: new ( PersisterSync :: new ( data_dir) ) ;
2852
+ let persister_sync = Arc :: new ( PersisterSync :: new ( data_dir) ) ;
2853
+ let persister = Arc :: new ( Arc :: new ( KVStoreSyncWrapper ( persister_sync) ) ) ;
2839
2854
2840
2855
let ( exit_sender, exit_receiver) = tokio:: sync:: watch:: channel ( ( ) ) ;
2841
2856
0 commit comments