@@ -21,6 +21,10 @@ extern crate core;
21
21
22
22
#[ cfg( not( feature = "std" ) ) ]
23
23
extern crate alloc;
24
+ #[ cfg( not( feature = "std" ) ) ]
25
+ use alloc:: format;
26
+ #[ cfg( not( feature = "std" ) ) ]
27
+ use alloc:: vec:: Vec ;
24
28
25
29
#[ macro_use]
26
30
extern crate lightning;
@@ -70,9 +74,13 @@ use lightning_rapid_gossip_sync::RapidGossipSync;
70
74
71
75
use lightning_liquidity:: ALiquidityManager ;
72
76
77
+ use core:: future:: Future ;
73
78
use core:: ops:: Deref ;
79
+ use core:: pin:: Pin ;
74
80
use core:: time:: Duration ;
75
81
82
+ use lightning:: util:: async_poll:: { MaybeSync , MultiResultFuturePoller , ResultFuture } ;
83
+
76
84
#[ cfg( feature = "std" ) ]
77
85
use core:: sync:: atomic:: { AtomicBool , Ordering } ;
78
86
#[ cfg( feature = "std" ) ]
@@ -617,11 +625,11 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
617
625
pub async fn process_events_async <
618
626
' a ,
619
627
UL : ' static + Deref ,
620
- CF : ' static + Deref ,
621
- T : ' static + Deref ,
622
- F : ' static + Deref ,
628
+ CF : ' static + Deref + Send + Sync ,
629
+ T : ' static + Deref + Send + Sync ,
630
+ F : ' static + Deref + Send + Sync ,
623
631
G : ' static + Deref < Target = NetworkGraph < L > > ,
624
- L : ' static + Deref ,
632
+ L : ' static + Deref + Send + Sync ,
625
633
P : ' static + Deref ,
626
634
EventHandlerFuture : core:: future:: Future < Output = Result < ( ) , ReplayEvent > > ,
627
635
EventHandler : Fn ( Event ) -> EventHandlerFuture ,
@@ -636,10 +644,10 @@ pub async fn process_events_async<
636
644
RGS : ' static + Deref < Target = RapidGossipSync < G , L > > ,
637
645
PM : ' static + Deref ,
638
646
LM : ' static + Deref ,
639
- D : ' static + Deref ,
640
- O : ' static + Deref ,
641
- K : ' static + Deref ,
642
- OS : ' static + Deref < Target = OutputSweeper < T , D , F , CF , K , L , O > > ,
647
+ D : ' static + Deref + Send + Sync ,
648
+ O : ' static + Deref + Send + Sync ,
649
+ K : ' static + Deref + Send + Sync ,
650
+ OS : ' static + Deref < Target = OutputSweeper < T , D , F , CF , K , L , O > > + Clone + Send ,
643
651
S : ' static + Deref < Target = SC > + Send + Sync ,
644
652
SC : for < ' b > WriteableScore < ' b > ,
645
653
SleepFuture : core:: future:: Future < Output = bool > + core:: marker:: Unpin ,
@@ -664,7 +672,7 @@ where
664
672
PM :: Target : APeerManager ,
665
673
LM :: Target : ALiquidityManager ,
666
674
O :: Target : ' static + OutputSpender ,
667
- D :: Target : ' static + ChangeDestinationSource ,
675
+ D :: Target : ' static + ChangeDestinationSource + MaybeSync ,
668
676
K :: Target : ' static + KVStore ,
669
677
{
670
678
let async_event_handler = |event| {
@@ -808,17 +816,24 @@ where
808
816
None => { } ,
809
817
}
810
818
819
+ let mut futures = Vec :: new ( ) ;
820
+
811
821
// Persist channel manager.
812
822
if channel_manager. get_cm ( ) . get_and_clear_needs_persistence ( ) {
813
823
log_trace ! ( logger, "Persisting ChannelManager..." ) ;
814
- kv_store
815
- . write (
816
- CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
817
- CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE ,
818
- CHANNEL_MANAGER_PERSISTENCE_KEY ,
819
- & channel_manager. get_cm ( ) . encode ( ) ,
820
- )
821
- . await ?;
824
+ let res = kv_store. write (
825
+ CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
826
+ CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE ,
827
+ CHANNEL_MANAGER_PERSISTENCE_KEY ,
828
+ & channel_manager. get_cm ( ) . encode ( ) ,
829
+ ) ;
830
+
831
+ let fut: Pin <
832
+ Box < dyn Future < Output = Result < ( ) , ( lightning:: io:: Error , bool ) > > + Send + ' static > ,
833
+ > = Box :: pin ( async move { res. await . map_err ( |e| ( e, true ) ) } ) ;
834
+
835
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
836
+
822
837
log_trace ! ( logger, "Done persisting ChannelManager." ) ;
823
838
}
824
839
@@ -846,17 +861,29 @@ where
846
861
log_warn ! ( logger, "Not pruning network graph, consider implementing the fetch_time argument or calling remove_stale_channels_and_tracking_with_time manually." ) ;
847
862
log_trace ! ( logger, "Persisting network graph." ) ;
848
863
}
849
- if let Err ( e) = kv_store
850
- . write (
851
- NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE ,
852
- NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE ,
853
- NETWORK_GRAPH_PERSISTENCE_KEY ,
854
- & network_graph. encode ( ) ,
855
- )
856
- . await
857
- {
858
- log_error ! ( logger, "Error: Failed to persist network graph, check your disk and permissions {}" , e) ;
859
- }
864
+ let res = kv_store. write (
865
+ NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE ,
866
+ NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE ,
867
+ NETWORK_GRAPH_PERSISTENCE_KEY ,
868
+ & network_graph. encode ( ) ,
869
+ ) ;
870
+ let fut: Pin <
871
+ Box <
872
+ dyn Future < Output = Result < ( ) , ( lightning:: io:: Error , bool ) > >
873
+ + Send
874
+ + ' static ,
875
+ > ,
876
+ > = Box :: pin ( async move {
877
+ res. await . map_err ( |e| {
878
+ ( lightning:: io:: Error :: new (
879
+ lightning:: io:: ErrorKind :: Other ,
880
+ format ! ( "failed to persist network graph, check your disk and permissions {}" , e) ) ,
881
+ false )
882
+ } )
883
+ } ) ;
884
+
885
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
886
+
860
887
have_pruned = true ;
861
888
}
862
889
let prune_timer =
@@ -883,21 +910,28 @@ where
883
910
} else {
884
911
log_trace ! ( logger, "Persisting scorer" ) ;
885
912
}
886
- if let Err ( e) = kv_store
887
- . write (
888
- SCORER_PERSISTENCE_PRIMARY_NAMESPACE ,
889
- SCORER_PERSISTENCE_SECONDARY_NAMESPACE ,
890
- SCORER_PERSISTENCE_KEY ,
891
- & scorer. encode ( ) ,
892
- )
893
- . await
894
- {
895
- log_error ! (
896
- logger,
897
- "Error: Failed to persist scorer, check your disk and permissions {}" ,
898
- e
899
- ) ;
900
- }
913
+ let res = kv_store. write (
914
+ SCORER_PERSISTENCE_PRIMARY_NAMESPACE ,
915
+ SCORER_PERSISTENCE_SECONDARY_NAMESPACE ,
916
+ SCORER_PERSISTENCE_KEY ,
917
+ & scorer. encode ( ) ,
918
+ ) ;
919
+ let fut: Pin <
920
+ Box <
921
+ dyn Future < Output = Result < ( ) , ( lightning:: io:: Error , bool ) > >
922
+ + Send
923
+ + ' static ,
924
+ > ,
925
+ > = Box :: pin ( async move {
926
+ res. await . map_err ( |e| {
927
+ ( lightning:: io:: Error :: new (
928
+ lightning:: io:: ErrorKind :: Other ,
929
+ format ! ( "failed to persist scorer, check your disk and permissions {}" , e) ) ,
930
+ false )
931
+ } )
932
+ } ) ;
933
+
934
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
901
935
}
902
936
last_scorer_persist_call = sleeper ( SCORER_PERSIST_TIMER ) ;
903
937
} ,
@@ -910,14 +944,46 @@ where
910
944
Some ( false ) => {
911
945
log_trace ! ( logger, "Regenerating sweeper spends if necessary" ) ;
912
946
if let Some ( ref sweeper) = sweeper {
913
- let _ = sweeper. regenerate_and_broadcast_spend_if_necessary ( ) . await ;
947
+ let sweeper = sweeper. clone ( ) ;
948
+ let fut: Pin <
949
+ Box <
950
+ dyn Future < Output = Result < ( ) , ( lightning:: io:: Error , bool ) > >
951
+ + Send
952
+ + ' static ,
953
+ > ,
954
+ > = Box :: pin ( async move {
955
+ sweeper. regenerate_and_broadcast_spend_if_necessary ( ) . await . map_err ( |_| {
956
+ (
957
+ lightning:: io:: Error :: new (
958
+ lightning:: io:: ErrorKind :: Other ,
959
+ "failed to persist sweeper, check your disk and permissions" ,
960
+ ) ,
961
+ false ,
962
+ )
963
+ } )
964
+ } ) ;
965
+
966
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
914
967
}
915
968
last_sweeper_call = sleeper ( SWEEPER_TIMER ) ;
916
969
} ,
917
970
Some ( true ) => break ,
918
971
None => { } ,
919
972
}
920
973
974
+ // Run persistence tasks in parallel.
975
+ let multi_res = MultiResultFuturePoller :: new ( futures) . await ;
976
+ for res in multi_res {
977
+ if let Err ( ( e, exit) ) = res {
978
+ log_error ! ( logger, "Error: {}" , e) ;
979
+
980
+ if exit {
981
+ log_error ! ( logger, "Exiting background processor" ) ;
982
+ return Err ( e) ;
983
+ }
984
+ }
985
+ }
986
+
921
987
// Onion messenger timer tick.
922
988
match check_sleeper ( & mut last_onion_message_handler_call) {
923
989
Some ( false ) => {
@@ -1007,9 +1073,9 @@ fn check_sleeper<SleepFuture: core::future::Future<Output = bool> + core::marker
1007
1073
/// synchronous background persistence.
1008
1074
pub async fn process_events_async_with_kv_store_sync <
1009
1075
UL : ' static + Deref ,
1010
- CF : ' static + Deref ,
1011
- T : ' static + Deref ,
1012
- F : ' static + Deref ,
1076
+ CF : ' static + Deref + Send + Sync ,
1077
+ T : ' static + Deref + Send + Sync ,
1078
+ F : ' static + Deref + Send + Sync ,
1013
1079
G : ' static + Deref < Target = NetworkGraph < L > > ,
1014
1080
L : ' static + Deref + Send + Sync ,
1015
1081
P : ' static + Deref ,
@@ -1026,10 +1092,13 @@ pub async fn process_events_async_with_kv_store_sync<
1026
1092
RGS : ' static + Deref < Target = RapidGossipSync < G , L > > ,
1027
1093
PM : ' static + Deref ,
1028
1094
LM : ' static + Deref ,
1029
- D : ' static + Deref ,
1030
- O : ' static + Deref ,
1031
- K : ' static + Deref ,
1032
- OS : ' static + Deref < Target = OutputSweeper < T , D , F , CF , KVStoreSyncWrapper < K > , L , O > > ,
1095
+ D : ' static + Deref + Send + Sync ,
1096
+ O : ' static + Deref + Send + Sync ,
1097
+ K : ' static + Deref + Send + Sync ,
1098
+ OS : ' static
1099
+ + Deref < Target = OutputSweeper < T , D , F , CF , KVStoreSyncWrapper < K > , L , O > >
1100
+ + Clone
1101
+ + Send ,
1033
1102
S : ' static + Deref < Target = SC > + Send + Sync ,
1034
1103
SC : for < ' b > WriteableScore < ' b > ,
1035
1104
SleepFuture : core:: future:: Future < Output = bool > + core:: marker:: Unpin ,
@@ -1054,7 +1123,7 @@ where
1054
1123
PM :: Target : APeerManager ,
1055
1124
LM :: Target : ALiquidityManager ,
1056
1125
O :: Target : ' static + OutputSpender ,
1057
- D :: Target : ' static + ChangeDestinationSource ,
1126
+ D :: Target : ' static + ChangeDestinationSource + MaybeSync ,
1058
1127
K :: Target : ' static + KVStoreSync ,
1059
1128
{
1060
1129
let kv_store = KVStoreSyncWrapper ( kv_store) ;
0 commit comments