@@ -40,7 +40,9 @@ 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
+ #[ cfg( feature = "std" ) ]
44
+ use lightning:: util:: persist:: PersisterSync ;
45
+ use lightning:: util:: persist:: { KVStoreSync , Persister } ;
44
46
use lightning:: util:: sweep:: OutputSweeper ;
45
47
#[ cfg( feature = "std" ) ]
46
48
use lightning:: util:: sweep:: OutputSweeperSync ;
@@ -311,6 +313,15 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
311
313
true
312
314
}
313
315
316
+ macro_rules! maybe_await {
317
+ ( true , $e: expr) => {
318
+ $e. await
319
+ } ;
320
+ ( false , $e: expr) => {
321
+ $e
322
+ } ;
323
+ }
324
+
314
325
macro_rules! define_run_body {
315
326
(
316
327
$persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
@@ -319,7 +330,7 @@ macro_rules! define_run_body {
319
330
$peer_manager: ident, $gossip_sync: ident,
320
331
$process_sweeper: expr,
321
332
$logger: ident, $scorer: ident, $loop_exit_check: expr, $await: expr, $get_timer: expr,
322
- $timer_elapsed: expr, $check_slow_await: expr, $time_fetch: expr,
333
+ $timer_elapsed: expr, $check_slow_await: expr, $time_fetch: expr, $async : tt ,
323
334
) => { {
324
335
log_trace!( $logger, "Calling ChannelManager's timer_tick_occurred on startup" ) ;
325
336
$channel_manager. get_cm( ) . timer_tick_occurred( ) ;
@@ -375,7 +386,7 @@ macro_rules! define_run_body {
375
386
376
387
if $channel_manager. get_cm( ) . get_and_clear_needs_persistence( ) {
377
388
log_trace!( $logger, "Persisting ChannelManager..." ) ;
378
- $ persister. persist_manager( & $channel_manager) ?;
389
+ maybe_await! ( $async , $ persister. persist_manager( & $channel_manager) ) ?;
379
390
log_trace!( $logger, "Done persisting ChannelManager." ) ;
380
391
}
381
392
if $timer_elapsed( & mut last_freshness_call, FRESHNESS_TIMER ) {
@@ -436,7 +447,7 @@ macro_rules! define_run_body {
436
447
log_trace!( $logger, "Persisting network graph." ) ;
437
448
}
438
449
439
- if let Err ( e) = $ persister. persist_graph( network_graph) {
450
+ if let Err ( e) = maybe_await! ( $async , $ persister. persist_graph( network_graph) ) {
440
451
log_error!( $logger, "Error: Failed to persist network graph, check your disk and permissions {}" , e)
441
452
}
442
453
@@ -464,8 +475,8 @@ macro_rules! define_run_body {
464
475
} else {
465
476
log_trace!( $logger, "Persisting scorer" ) ;
466
477
}
467
- if let Err ( e) = $ persister. persist_scorer( & scorer) {
468
- log_error!( $logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
478
+ if let Err ( e) = maybe_await! ( $async , $ persister. persist_scorer( & scorer) ) {
479
+ log_error!( $logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
469
480
}
470
481
}
471
482
last_scorer_persist_call = $get_timer( SCORER_PERSIST_TIMER ) ;
@@ -487,16 +498,16 @@ macro_rules! define_run_body {
487
498
// After we exit, ensure we persist the ChannelManager one final time - this avoids
488
499
// some races where users quit while channel updates were in-flight, with
489
500
// ChannelMonitor update(s) persisted without a corresponding ChannelManager update.
490
- $ persister. persist_manager( & $channel_manager) ?;
501
+ maybe_await! ( $async , $ persister. persist_manager( & $channel_manager) ) ?;
491
502
492
503
// Persist Scorer on exit
493
504
if let Some ( ref scorer) = $scorer {
494
- $ persister. persist_scorer( & scorer) ?;
505
+ maybe_await! ( $async , $ persister. persist_scorer( & scorer) ) ?;
495
506
}
496
507
497
508
// Persist NetworkGraph on exit
498
509
if let Some ( network_graph) = $gossip_sync. network_graph( ) {
499
- $ persister. persist_graph( network_graph) ?;
510
+ maybe_await! ( $async , $ persister. persist_graph( network_graph) ) ?;
500
511
}
501
512
502
513
Ok ( ( ) )
@@ -643,22 +654,30 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
643
654
/// ```
644
655
/// # use lightning::io;
645
656
/// # use lightning::events::ReplayEvent;
646
- /// # use lightning::util::sweep::OutputSweeper;
647
657
/// # use std::sync::{Arc, RwLock};
648
658
/// # use std::sync::atomic::{AtomicBool, Ordering};
649
659
/// # use std::time::SystemTime;
650
660
/// # use lightning_background_processor::{process_events_async, GossipSync};
661
+ /// # use core::future::Future;
662
+ /// # use core::pin::Pin;
651
663
/// # struct Logger {}
652
664
/// # impl lightning::util::logger::Logger for Logger {
653
665
/// # fn log(&self, _record: lightning::util::logger::Record) {}
654
666
/// # }
655
- /// # struct Store {}
656
- /// # impl lightning::util::persist::KVStore for Store {
667
+ /// # struct StoreSync {}
668
+ /// # impl lightning::util::persist::KVStoreSync for StoreSync {
657
669
/// # fn read(&self, primary_namespace: &str, secondary_namespace: &str, key: &str) -> io::Result<Vec<u8>> { Ok(Vec::new()) }
658
670
/// # fn write(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, buf: &[u8]) -> io::Result<()> { Ok(()) }
659
671
/// # fn remove(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, lazy: bool) -> io::Result<()> { Ok(()) }
660
672
/// # fn list(&self, primary_namespace: &str, secondary_namespace: &str) -> io::Result<Vec<String>> { Ok(Vec::new()) }
661
673
/// # }
674
+ /// # struct Store {}
675
+ /// # impl lightning::util::persist::KVStore for Store {
676
+ /// # fn read(&self, primary_namespace: &str, secondary_namespace: &str, key: &str) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, io::Error>> + 'static + Send>> { todo!() }
677
+ /// # fn write(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, buf: &[u8]) -> Pin<Box<dyn Future<Output = Result<(), io::Error>> + 'static + Send>> { todo!() }
678
+ /// # fn remove(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, lazy: bool) -> io::Result<()> { Ok(()) }
679
+ /// # fn list(&self, primary_namespace: &str, secondary_namespace: &str) -> io::Result<Vec<String>> { Ok(Vec::new()) }
680
+ /// # }
662
681
/// # struct EventHandler {}
663
682
/// # impl EventHandler {
664
683
/// # async fn handle_event(&self, _: lightning::events::Event) -> Result<(), ReplayEvent> { Ok(()) }
@@ -669,22 +688,22 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
669
688
/// # fn send_data(&mut self, _data: &[u8], _resume_read: bool) -> usize { 0 }
670
689
/// # fn disconnect_socket(&mut self) {}
671
690
/// # }
672
- /// # type ChainMonitor<B, F, FE> = lightning::chain::chainmonitor::ChainMonitor<lightning::sign::InMemorySigner, Arc<F>, Arc<B>, Arc<FE>, Arc<Logger>, Arc<Store >, Arc<lightning::sign::KeysManager>>;
691
+ /// # type ChainMonitor<B, F, FE> = lightning::chain::chainmonitor::ChainMonitor<lightning::sign::InMemorySigner, Arc<F>, Arc<B>, Arc<FE>, Arc<Logger>, Arc<StoreSync >, Arc<lightning::sign::KeysManager>>;
673
692
/// # type NetworkGraph = lightning::routing::gossip::NetworkGraph<Arc<Logger>>;
674
693
/// # type P2PGossipSync<UL> = lightning::routing::gossip::P2PGossipSync<Arc<NetworkGraph>, Arc<UL>, Arc<Logger>>;
675
694
/// # type ChannelManager<B, F, FE> = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor<B, F, FE>, B, FE, Logger>;
676
695
/// # type OnionMessenger<B, F, FE> = lightning::onion_message::messenger::OnionMessenger<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<Logger>, Arc<ChannelManager<B, F, FE>>, Arc<lightning::onion_message::messenger::DefaultMessageRouter<Arc<NetworkGraph>, Arc<Logger>, Arc<lightning::sign::KeysManager>>>, Arc<ChannelManager<B, F, FE>>, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler>;
677
696
/// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>>;
678
697
/// # type Scorer = RwLock<lightning::routing::scoring::ProbabilisticScorer<Arc<NetworkGraph>, Arc<Logger>>>;
679
- /// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger, F, Store>;
680
- /// #
698
+ /// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger, F, StoreSync>;
699
+ /// # type OutputSweeper<B, D, FE, F, O> = lightning::util::sweep::OutputSweeper<Arc<B>, Arc<D>, Arc<FE>, Arc<F>, Arc<StoreSync>, Arc<Logger>, Arc<O>>;
700
+ ///
681
701
/// # struct Node<
682
702
/// # B: lightning::chain::chaininterface::BroadcasterInterface + Send + Sync + 'static,
683
703
/// # F: lightning::chain::Filter + Send + Sync + 'static,
684
704
/// # FE: lightning::chain::chaininterface::FeeEstimator + Send + Sync + 'static,
685
705
/// # UL: lightning::routing::utxo::UtxoLookup + Send + Sync + 'static,
686
706
/// # D: lightning::sign::ChangeDestinationSource + Send + Sync + 'static,
687
- /// # K: lightning::util::persist::KVStore + Send + Sync + 'static,
688
707
/// # O: lightning::sign::OutputSpender + Send + Sync + 'static,
689
708
/// # > {
690
709
/// # peer_manager: Arc<PeerManager<B, F, FE, UL>>,
@@ -697,7 +716,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
697
716
/// # persister: Arc<Store>,
698
717
/// # logger: Arc<Logger>,
699
718
/// # scorer: Arc<Scorer>,
700
- /// # sweeper: Arc<OutputSweeper<Arc<B>, Arc<D>, Arc<FE>, Arc<F>, Arc<K>, Arc<Logger>, Arc<O> >>,
719
+ /// # sweeper: Arc<OutputSweeper<B, D, FE, F, O >>,
701
720
/// # }
702
721
/// #
703
722
/// # async fn setup_background_processing<
@@ -706,10 +725,9 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
706
725
/// # FE: lightning::chain::chaininterface::FeeEstimator + Send + Sync + 'static,
707
726
/// # UL: lightning::routing::utxo::UtxoLookup + Send + Sync + 'static,
708
727
/// # D: lightning::sign::ChangeDestinationSource + Send + Sync + 'static,
709
- /// # K: lightning::util::persist::KVStore + Send + Sync + 'static,
710
728
/// # O: lightning::sign::OutputSpender + Send + Sync + 'static,
711
- /// # >(node: Node<B, F, FE, UL, D, K, O>) {
712
- /// let background_persister = Arc::clone(&node.persister);
729
+ /// # >(node: Node<B, F, FE, UL, D, O>) {
730
+ /// let background_persister = Arc::new(Arc:: clone(&node.persister) );
713
731
/// let background_event_handler = Arc::clone(&node.event_handler);
714
732
/// let background_chain_mon = Arc::clone(&node.chain_monitor);
715
733
/// let background_chan_man = Arc::clone(&node.channel_manager);
@@ -814,7 +832,7 @@ where
814
832
F :: Target : ' static + FeeEstimator ,
815
833
L :: Target : ' static + Logger ,
816
834
P :: Target : ' static + Persist < <CM :: Target as AChannelManager >:: Signer > ,
817
- PS :: Target : ' static + PersisterSync < ' a , CM , L , S > ,
835
+ PS :: Target : ' static + Persister < ' a , CM , L , S > ,
818
836
ES :: Target : ' static + EntropySource ,
819
837
CM :: Target : AChannelManager ,
820
838
OM :: Target : AOnionMessenger ,
@@ -841,7 +859,7 @@ where
841
859
if let Some ( duration_since_epoch) = fetch_time ( ) {
842
860
if update_scorer ( scorer, & event, duration_since_epoch) {
843
861
log_trace ! ( logger, "Persisting scorer after update" ) ;
844
- if let Err ( e) = persister. persist_scorer ( & * scorer) {
862
+ if let Err ( e) = persister. persist_scorer ( & * scorer) . await {
845
863
log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e) ;
846
864
// We opt not to abort early on persistence failure here as persisting
847
865
// the scorer is non-critical and we still hope that it will have
@@ -919,6 +937,7 @@ where
919
937
} ,
920
938
mobile_interruptable_platform,
921
939
fetch_time,
940
+ true ,
922
941
)
923
942
}
924
943
@@ -1098,6 +1117,7 @@ impl BackgroundProcessor {
1098
1117
. expect( "Time should be sometime after 1970" ) ,
1099
1118
)
1100
1119
} ,
1120
+ false ,
1101
1121
)
1102
1122
} ) ;
1103
1123
Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
@@ -1162,6 +1182,8 @@ mod tests {
1162
1182
use bitcoin:: transaction:: Version ;
1163
1183
use bitcoin:: transaction:: { Transaction , TxOut } ;
1164
1184
use bitcoin:: { Amount , ScriptBuf , Txid } ;
1185
+ use core:: future:: Future ;
1186
+ use core:: pin:: Pin ;
1165
1187
use core:: sync:: atomic:: { AtomicBool , Ordering } ;
1166
1188
use lightning:: chain:: channelmonitor:: ANTI_REORG_DELAY ;
1167
1189
use lightning:: chain:: transaction:: OutPoint ;
@@ -1186,7 +1208,7 @@ mod tests {
1186
1208
use lightning:: types:: payment:: PaymentHash ;
1187
1209
use lightning:: util:: config:: UserConfig ;
1188
1210
use lightning:: util:: persist:: {
1189
- KVStoreSync , CHANNEL_MANAGER_PERSISTENCE_KEY ,
1211
+ KVStore , KVStoreSync , CHANNEL_MANAGER_PERSISTENCE_KEY ,
1190
1212
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
1191
1213
CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_KEY ,
1192
1214
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE ,
@@ -1483,6 +1505,42 @@ mod tests {
1483
1505
}
1484
1506
}
1485
1507
1508
+ struct PersisterSyncWrapper ( PersisterSync ) ;
1509
+
1510
+ impl KVStore for PersisterSyncWrapper {
1511
+ fn read (
1512
+ & self , primary_namespace : & str , secondary_namespace : & str , key : & str ,
1513
+ ) -> Pin < Box < dyn Future < Output = Result < Vec < u8 > , lightning:: io:: Error > > + ' static + Send > > {
1514
+ let res = self . 0 . read ( primary_namespace, secondary_namespace, key) ;
1515
+
1516
+ Box :: pin ( async move { res } )
1517
+ }
1518
+
1519
+ fn write (
1520
+ & self , primary_namespace : & str , secondary_namespace : & str , key : & str , buf : & [ u8 ] ,
1521
+ ) -> Pin < Box < dyn Future < Output = Result < ( ) , lightning:: io:: Error > > + ' static + Send > > {
1522
+ let res = self . 0 . write ( primary_namespace, secondary_namespace, key, buf) ;
1523
+
1524
+ Box :: pin ( async move { res } )
1525
+ }
1526
+
1527
+ fn remove (
1528
+ & self , primary_namespace : & str , secondary_namespace : & str , key : & str , lazy : bool ,
1529
+ ) -> Result < ( ) , lightning:: io:: Error > {
1530
+ let res = self . 0 . remove ( primary_namespace, secondary_namespace, key, lazy) ;
1531
+
1532
+ return res;
1533
+ }
1534
+
1535
+ fn list (
1536
+ & self , primary_namespace : & str , secondary_namespace : & str ,
1537
+ ) -> Result < Vec < String > , lightning:: io:: Error > {
1538
+ let res = self . 0 . list ( primary_namespace, secondary_namespace) ;
1539
+
1540
+ return res;
1541
+ }
1542
+ }
1543
+
1486
1544
struct TestScorer {
1487
1545
event_expectations : Option < VecDeque < TestResult > > ,
1488
1546
}
@@ -2107,9 +2165,9 @@ mod tests {
2107
2165
open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , 100000 ) ;
2108
2166
2109
2167
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
2110
- let persister = Arc :: new (
2111
- PersisterSync :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ,
2112
- ) ;
2168
+ let persister_sync =
2169
+ PersisterSync :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ;
2170
+ let persister = Arc :: new ( Arc :: new ( PersisterSyncWrapper ( persister_sync ) ) ) ;
2113
2171
2114
2172
let bp_future = super :: process_events_async (
2115
2173
persister,
@@ -2618,8 +2676,8 @@ mod tests {
2618
2676
let ( _, nodes) =
2619
2677
create_nodes ( 2 , "test_not_pruning_network_graph_until_graph_sync_completion_async" ) ;
2620
2678
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
2621
- let persister =
2622
- Arc :: new ( PersisterSync :: new ( data_dir ) . with_graph_persistence_notifier ( sender ) ) ;
2679
+ let persister_sync = PersisterSync :: new ( data_dir ) . with_graph_persistence_notifier ( sender ) ;
2680
+ let persister = Arc :: new ( Arc :: new ( PersisterSyncWrapper ( persister_sync ) ) ) ;
2623
2681
2624
2682
let ( exit_sender, exit_receiver) = tokio:: sync:: watch:: channel ( ( ) ) ;
2625
2683
let bp_future = super :: process_events_async (
@@ -2835,7 +2893,8 @@ mod tests {
2835
2893
2836
2894
let ( _, nodes) = create_nodes ( 1 , "test_payment_path_scoring_async" ) ;
2837
2895
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
2838
- let persister = Arc :: new ( PersisterSync :: new ( data_dir) ) ;
2896
+ let persister_sync = PersisterSync :: new ( data_dir) ;
2897
+ let persister = Arc :: new ( Arc :: new ( PersisterSyncWrapper ( persister_sync) ) ) ;
2839
2898
2840
2899
let ( exit_sender, exit_receiver) = tokio:: sync:: watch:: channel ( ( ) ) ;
2841
2900
0 commit comments