@@ -70,9 +70,13 @@ use lightning_rapid_gossip_sync::RapidGossipSync;
70
70
71
71
use lightning_liquidity:: ALiquidityManager ;
72
72
73
+ use core:: future:: Future ;
73
74
use core:: ops:: Deref ;
75
+ use core:: pin:: Pin ;
74
76
use core:: time:: Duration ;
75
77
78
+ use lightning:: util:: async_poll:: { MultiResultFuturePoller , ResultFuture } ;
79
+
76
80
#[ cfg( feature = "std" ) ]
77
81
use core:: sync:: atomic:: { AtomicBool , Ordering } ;
78
82
#[ cfg( feature = "std" ) ]
@@ -627,11 +631,11 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
627
631
pub async fn process_events_async <
628
632
' a ,
629
633
UL : ' static + Deref ,
630
- CF : ' static + Deref ,
631
- T : ' static + Deref ,
632
- F : ' static + Deref ,
634
+ CF : ' static + Deref + Sync ,
635
+ T : ' static + Deref + Sync ,
636
+ F : ' static + Deref + Sync ,
633
637
G : ' static + Deref < Target = NetworkGraph < L > > ,
634
- L : ' static + Deref ,
638
+ L : ' static + Deref + Sync ,
635
639
P : ' static + Deref ,
636
640
EventHandlerFuture : core:: future:: Future < Output = Result < ( ) , ReplayEvent > > ,
637
641
EventHandler : Fn ( Event ) -> EventHandlerFuture ,
@@ -646,10 +650,10 @@ pub async fn process_events_async<
646
650
RGS : ' static + Deref < Target = RapidGossipSync < G , L > > ,
647
651
PM : ' static + Deref ,
648
652
LM : ' static + Deref ,
649
- D : ' static + Deref ,
650
- O : ' static + Deref ,
651
- K : ' static + Deref ,
652
- OS : ' static + Deref < Target = OutputSweeper < T , D , F , CF , K , L , O > > ,
653
+ D : ' static + Deref + Sync ,
654
+ O : ' static + Deref + Sync ,
655
+ K : ' static + Deref + Sync ,
656
+ OS : ' static + Deref < Target = OutputSweeper < T , D , F , CF , K , L , O > > + Clone + Send ,
653
657
S : ' static + Deref < Target = SC > + Send + Sync ,
654
658
SC : for < ' b > WriteableScore < ' b > ,
655
659
SleepFuture : core:: future:: Future < Output = bool > + core:: marker:: Unpin ,
@@ -826,17 +830,27 @@ where
826
830
None => { } ,
827
831
}
828
832
833
+ let mut futures = Vec :: new ( ) ;
834
+
829
835
// Persist channel manager.
830
836
if channel_manager. get_cm ( ) . get_and_clear_needs_persistence ( ) {
831
837
log_trace ! ( logger, "Persisting ChannelManager..." ) ;
832
- kv_store
833
- . write (
834
- CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
835
- CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE ,
836
- CHANNEL_MANAGER_PERSISTENCE_KEY ,
837
- & channel_manager. get_cm ( ) . encode ( ) ,
838
- )
839
- . await ?;
838
+ let res = kv_store. write (
839
+ CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
840
+ CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE ,
841
+ CHANNEL_MANAGER_PERSISTENCE_KEY ,
842
+ & channel_manager. get_cm ( ) . encode ( ) ,
843
+ ) ;
844
+
845
+ let fut: Pin < Box < dyn Future < Output = Result < ( ) , ( String , bool ) > > + Send + ' static > > =
846
+ Box :: pin ( async move {
847
+ res. await . map_err ( |e| {
848
+ ( format ! ( "failed to persist channel manager, check your disk and permissions {}" , e) , true )
849
+ } )
850
+ } ) ;
851
+
852
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
853
+
840
854
log_trace ! ( logger, "Done persisting ChannelManager." ) ;
841
855
}
842
856
@@ -864,17 +878,22 @@ where
864
878
log_warn ! ( logger, "Not pruning network graph, consider implementing the fetch_time argument or calling remove_stale_channels_and_tracking_with_time manually." ) ;
865
879
log_trace ! ( logger, "Persisting network graph." ) ;
866
880
}
867
- if let Err ( e) = kv_store
868
- . write (
869
- NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE ,
870
- NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE ,
871
- NETWORK_GRAPH_PERSISTENCE_KEY ,
872
- & network_graph. encode ( ) ,
873
- )
874
- . await
875
- {
876
- log_error ! ( logger, "Error: Failed to persist network graph, check your disk and permissions {}" , e) ;
877
- }
881
+ let res = kv_store. write (
882
+ NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE ,
883
+ NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE ,
884
+ NETWORK_GRAPH_PERSISTENCE_KEY ,
885
+ & network_graph. encode ( ) ,
886
+ ) ;
887
+ let fut: Pin <
888
+ Box < dyn Future < Output = Result < ( ) , ( String , bool ) > > + Send + ' static > ,
889
+ > = Box :: pin ( async move {
890
+ res. await . map_err ( |e| {
891
+ ( format ! ( "failed to persist network graph, check your disk and permissions {}" , e) , false )
892
+ } )
893
+ } ) ;
894
+
895
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
896
+
878
897
have_pruned = true ;
879
898
}
880
899
let prune_timer =
@@ -901,21 +920,22 @@ where
901
920
} else {
902
921
log_trace ! ( logger, "Persisting scorer" ) ;
903
922
}
904
- if let Err ( e) = kv_store
905
- . write (
906
- SCORER_PERSISTENCE_PRIMARY_NAMESPACE ,
907
- SCORER_PERSISTENCE_SECONDARY_NAMESPACE ,
908
- SCORER_PERSISTENCE_KEY ,
909
- & scorer. encode ( ) ,
910
- )
911
- . await
912
- {
913
- log_error ! (
914
- logger,
915
- "Error: Failed to persist scorer, check your disk and permissions {}" ,
916
- e
917
- ) ;
918
- }
923
+ let res = kv_store. write (
924
+ SCORER_PERSISTENCE_PRIMARY_NAMESPACE ,
925
+ SCORER_PERSISTENCE_SECONDARY_NAMESPACE ,
926
+ SCORER_PERSISTENCE_KEY ,
927
+ & scorer. encode ( ) ,
928
+ ) ;
929
+ let fut: Pin <
930
+ Box < dyn Future < Output = Result < ( ) , ( String , bool ) > > + Send + ' static > ,
931
+ > =
932
+ Box :: pin ( async move {
933
+ res. await . map_err ( |e| {
934
+ ( format ! ( "failed to persist scorer, check your disk and permissions {}" , e) , false )
935
+ } )
936
+ } ) ;
937
+
938
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
919
939
}
920
940
last_scorer_persist_call = sleeper ( SCORER_PERSIST_TIMER ) ;
921
941
} ,
@@ -928,14 +948,36 @@ where
928
948
Some ( false ) => {
929
949
log_trace ! ( logger, "Regenerating sweeper spends if necessary" ) ;
930
950
if let Some ( ref sweeper) = sweeper {
931
- let _ = sweeper. regenerate_and_broadcast_spend_if_necessary ( ) . await ;
951
+ let sweeper = sweeper. clone ( ) ;
952
+ let fut: Pin <
953
+ Box < dyn Future < Output = Result < ( ) , ( String , bool ) > > + Send + ' static > ,
954
+ > = Box :: pin ( async move {
955
+ sweeper. regenerate_and_broadcast_spend_if_necessary ( ) . await . map_err ( |_| {
956
+ ( format ! ( "sweeper failed to regenerate and broadcast spends" ) , false )
957
+ } )
958
+ } ) ;
959
+
960
+ futures. push ( ResultFuture :: Pending ( fut) ) ;
932
961
}
933
962
last_sweeper_call = sleeper ( SWEEPER_TIMER ) ;
934
963
} ,
935
964
Some ( true ) => break ,
936
965
None => { } ,
937
966
}
938
967
968
+ // Run persistence tasks in parallel.
969
+ let multi_res = MultiResultFuturePoller :: new ( futures) . await ;
970
+ for res in multi_res {
971
+ if let Err ( ( msg, exit) ) = res {
972
+ log_error ! ( logger, "Error: {}" , msg) ;
973
+
974
+ if exit {
975
+ log_error ! ( logger, "Exiting background processor" ) ;
976
+ return Err ( lightning:: io:: Error :: new ( lightning:: io:: ErrorKind :: Other , msg) ) ;
977
+ }
978
+ }
979
+ }
980
+
939
981
// Onion messenger timer tick.
940
982
match check_sleeper ( & mut last_onion_message_handler_call) {
941
983
Some ( false ) => {
@@ -1025,9 +1067,9 @@ fn check_sleeper<SleepFuture: core::future::Future<Output = bool> + core::marker
1025
1067
/// synchronous background persistence.
1026
1068
pub async fn process_events_async_with_kv_store_sync <
1027
1069
UL : ' static + Deref ,
1028
- CF : ' static + Deref ,
1029
- T : ' static + Deref ,
1030
- F : ' static + Deref ,
1070
+ CF : ' static + Deref + Sync ,
1071
+ T : ' static + Deref + Sync ,
1072
+ F : ' static + Deref + Sync ,
1031
1073
G : ' static + Deref < Target = NetworkGraph < L > > ,
1032
1074
L : ' static + Deref + Send + Sync ,
1033
1075
P : ' static + Deref ,
@@ -1044,10 +1086,13 @@ pub async fn process_events_async_with_kv_store_sync<
1044
1086
RGS : ' static + Deref < Target = RapidGossipSync < G , L > > ,
1045
1087
PM : ' static + Deref ,
1046
1088
LM : ' static + Deref ,
1047
- D : ' static + Deref ,
1048
- O : ' static + Deref ,
1049
- K : ' static + Deref ,
1050
- OS : ' static + Deref < Target = OutputSweeper < T , D , F , CF , KVStoreSyncWrapper < K > , L , O > > ,
1089
+ D : ' static + Deref + Sync ,
1090
+ O : ' static + Deref + Sync ,
1091
+ K : ' static + Deref + Sync ,
1092
+ OS : ' static
1093
+ + Deref < Target = OutputSweeper < T , D , F , CF , KVStoreSyncWrapper < K > , L , O > >
1094
+ + Clone
1095
+ + Send ,
1051
1096
S : ' static + Deref < Target = SC > + Send + Sync ,
1052
1097
SC : for < ' b > WriteableScore < ' b > ,
1053
1098
SleepFuture : core:: future:: Future < Output = bool > + core:: marker:: Unpin ,
0 commit comments