@@ -112,7 +112,7 @@ use types::{
112
112
pub use types:: { ChannelDetails , ChannelId , PeerDetails , UserChannelId } ;
113
113
use wallet:: Wallet ;
114
114
115
- use logger:: { log_error, log_info, FilesystemLogger , Logger } ;
115
+ use logger:: { log_error, log_info, log_trace , FilesystemLogger , Logger } ;
116
116
117
117
use lightning:: chain:: keysinterface:: EntropySource ;
118
118
use lightning:: chain:: { chainmonitor, BestBlock , Confirm , Watch } ;
@@ -167,9 +167,15 @@ const BDK_CLIENT_STOP_GAP: usize = 20;
167
167
// The number of concurrent requests made against the API provider.
168
168
const BDK_CLIENT_CONCURRENCY : u8 = 8 ;
169
169
170
+ // The default time in-between LDK wallet sync attempts.
171
+ const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
172
+
170
173
// The timeout after which we abandon retrying failed payments.
171
174
const LDK_PAYMENT_RETRY_TIMEOUT : Duration = Duration :: from_secs ( 10 ) ;
172
175
176
+ // The default time in-between LDK wallet sync attempts.
177
+ const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
178
+
173
179
// The time in-between peer reconnection attempts.
174
180
const PEER_RECONNECTION_INTERVAL : Duration = Duration :: from_secs ( 10 ) ;
175
181
@@ -195,6 +201,14 @@ pub struct Config {
195
201
pub listening_address : Option < NetAddress > ,
196
202
/// The default CLTV expiry delta to be used for payments.
197
203
pub default_cltv_expiry_delta : u32 ,
204
+ /// The time in-between background sync attempts of the onchain wallet, in seconds.
205
+ ///
206
+ /// **Note:** A minimum of 10 seconds is always enforced.
207
+ pub onchain_wallet_sync_interval_secs : u64 ,
208
+ /// The time in-between background sync attempts of the LDK wallet, in seconds.
209
+ ///
210
+ /// **Note:** A minimum of 10 seconds is always enforced.
211
+ pub wallet_sync_interval_secs : u64 ,
198
212
/// The level at which we log messages.
199
213
///
200
214
/// Any messages below this level will be excluded from the logs.
@@ -209,6 +223,8 @@ impl Default for Config {
209
223
network : Network :: Regtest ,
210
224
listening_address : Some ( "0.0.0.0:9735" . parse ( ) . unwrap ( ) ) ,
211
225
default_cltv_expiry_delta : 144 ,
226
+ onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
227
+ wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
212
228
log_level : LogLevel :: Debug ,
213
229
}
214
230
}
@@ -729,31 +745,38 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
729
745
730
746
let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
731
747
732
- let event_handler = Arc :: new ( EventHandler :: new (
733
- Arc :: clone ( & self . wallet ) ,
734
- Arc :: clone ( & self . event_queue ) ,
735
- Arc :: clone ( & self . channel_manager ) ,
736
- Arc :: clone ( & self . network_graph ) ,
737
- Arc :: clone ( & self . keys_manager ) ,
738
- Arc :: clone ( & self . payment_store ) ,
739
- Arc :: clone ( & self . runtime ) ,
740
- Arc :: clone ( & self . logger ) ,
741
- Arc :: clone ( & self . config ) ,
742
- ) ) ;
743
-
744
748
// Setup wallet sync
745
749
let wallet = Arc :: clone ( & self . wallet ) ;
746
- let tx_sync = Arc :: clone ( & self . tx_sync ) ;
747
- let sync_cman = Arc :: clone ( & self . channel_manager ) ;
748
- let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
749
750
let sync_logger = Arc :: clone ( & self . logger ) ;
750
751
let mut stop_sync = self . stop_receiver . clone ( ) ;
751
752
753
+ runtime. block_on ( async move {
754
+ let now = Instant :: now ( ) ;
755
+ match wallet. sync ( ) . await {
756
+ Ok ( ( ) ) => {
757
+ log_info ! (
758
+ sync_logger,
759
+ "Initial sync of on-chain wallet finished in {}ms." ,
760
+ now. elapsed( ) . as_millis( )
761
+ ) ;
762
+ Ok ( ( ) )
763
+ }
764
+ Err ( e) => {
765
+ log_error ! ( sync_logger, "Initial sync of on-chain wallet failed: {}" , e, ) ;
766
+ Err ( e)
767
+ }
768
+ }
769
+ } ) ?;
770
+
771
+ let sync_logger = Arc :: clone ( & self . logger ) ;
772
+ let wallet = Arc :: clone ( & self . wallet ) ;
752
773
std:: thread:: spawn ( move || {
753
774
tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
754
775
async move {
755
- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 30 ) ) ;
776
+ let interval_secs = DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS . max ( 10 ) ;
777
+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( interval_secs) ) ;
756
778
interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
779
+ interval. reset ( ) ;
757
780
loop {
758
781
let now = Instant :: now ( ) ;
759
782
tokio:: select! {
@@ -762,7 +785,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
762
785
}
763
786
_ = interval. tick( ) => {
764
787
match wallet. sync( ) . await {
765
- Ok ( ( ) ) => log_info !(
788
+ Ok ( ( ) ) => log_trace !(
766
789
sync_logger,
767
790
"Background sync of on-chain wallet finished in {}ms." ,
768
791
now. elapsed( ) . as_millis( )
@@ -782,6 +805,68 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
782
805
) ;
783
806
} ) ;
784
807
808
+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
809
+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
810
+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
811
+ let sync_logger = Arc :: clone ( & self . logger ) ;
812
+ runtime. block_on ( async move {
813
+ let now = Instant :: now ( ) ;
814
+ let confirmables = vec ! [
815
+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
816
+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
817
+ ] ;
818
+ match tx_sync. sync ( confirmables) . await {
819
+ Ok ( ( ) ) => {
820
+ log_info ! (
821
+ sync_logger,
822
+ "Initial sync of Lightning wallet finished in {}ms." ,
823
+ now. elapsed( ) . as_millis( )
824
+ ) ;
825
+ Ok ( ( ) )
826
+ }
827
+ Err ( e) => {
828
+ log_error ! ( sync_logger, "Initial sync of Lightning wallet failed: {}" , e) ;
829
+ Err ( e)
830
+ }
831
+ }
832
+ } ) ?;
833
+
834
+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
835
+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
836
+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
837
+ let sync_logger = Arc :: clone ( & self . logger ) ;
838
+ let mut stop_sync = self . stop_receiver . clone ( ) ;
839
+ runtime. spawn ( async move {
840
+ let interval_secs = DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS . max ( 10 ) ;
841
+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( interval_secs) ) ;
842
+ interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
843
+ interval. reset ( ) ;
844
+ loop {
845
+ let now = Instant :: now ( ) ;
846
+ tokio:: select! {
847
+ _ = stop_sync. changed( ) => {
848
+ return ;
849
+ }
850
+ _ = interval. tick( ) => {
851
+ let confirmables = vec![
852
+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
853
+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
854
+ ] ;
855
+ match tx_sync. sync( confirmables) . await {
856
+ Ok ( ( ) ) => log_trace!(
857
+ sync_logger,
858
+ "Background sync of Lightning wallet finished in {}ms." ,
859
+ now. elapsed( ) . as_millis( )
860
+ ) ,
861
+ Err ( e) => {
862
+ log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
863
+ }
864
+ }
865
+ }
866
+ }
867
+ }
868
+ } ) ;
869
+
785
870
if self . gossip_source . is_rgs ( ) {
786
871
let gossip_source = Arc :: clone ( & self . gossip_source ) ;
787
872
let gossip_sync_store = Arc :: clone ( & self . kv_store ) ;
@@ -799,7 +884,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
799
884
let now = Instant :: now( ) ;
800
885
match gossip_source. update_rgs_snapshot( ) . await {
801
886
Ok ( updated_timestamp) => {
802
- log_info !(
887
+ log_trace !(
803
888
gossip_sync_logger,
804
889
"Background sync of RGS gossip data finished in {}ms." ,
805
890
now. elapsed( ) . as_millis( )
@@ -823,37 +908,6 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
823
908
} ) ;
824
909
}
825
910
826
- let sync_logger = Arc :: clone ( & self . logger ) ;
827
- let mut stop_sync = self . stop_receiver . clone ( ) ;
828
- runtime. spawn ( async move {
829
- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 10 ) ) ;
830
- interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
831
- loop {
832
- let now = Instant :: now ( ) ;
833
- tokio:: select! {
834
- _ = stop_sync. changed( ) => {
835
- return ;
836
- }
837
- _ = interval. tick( ) => {
838
- let confirmables = vec![
839
- & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
840
- & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
841
- ] ;
842
- match tx_sync. sync( confirmables) . await {
843
- Ok ( ( ) ) => log_info!(
844
- sync_logger,
845
- "Background sync of Lightning wallet finished in {}ms." ,
846
- now. elapsed( ) . as_millis( )
847
- ) ,
848
- Err ( e) => {
849
- log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
850
- }
851
- }
852
- }
853
- }
854
- }
855
- } ) ;
856
-
857
911
if let Some ( listening_address) = & self . config . listening_address {
858
912
// Setup networking
859
913
let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
@@ -987,6 +1041,18 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
987
1041
}
988
1042
} ) ;
989
1043
1044
+ let event_handler = Arc :: new ( EventHandler :: new (
1045
+ Arc :: clone ( & self . wallet ) ,
1046
+ Arc :: clone ( & self . event_queue ) ,
1047
+ Arc :: clone ( & self . channel_manager ) ,
1048
+ Arc :: clone ( & self . network_graph ) ,
1049
+ Arc :: clone ( & self . keys_manager ) ,
1050
+ Arc :: clone ( & self . payment_store ) ,
1051
+ Arc :: clone ( & self . runtime ) ,
1052
+ Arc :: clone ( & self . logger ) ,
1053
+ Arc :: clone ( & self . config ) ,
1054
+ ) ) ;
1055
+
990
1056
// Setup background processing
991
1057
let background_persister = Arc :: clone ( & self . kv_store ) ;
992
1058
let background_event_handler = Arc :: clone ( & event_handler) ;
0 commit comments