@@ -118,7 +118,7 @@ use types::{
118
118
pub use types:: { ChannelDetails , ChannelId , PeerDetails , UserChannelId } ;
119
119
use wallet:: Wallet ;
120
120
121
- use logger:: { log_error, log_info, FilesystemLogger , Logger } ;
121
+ use logger:: { log_error, log_info, log_trace , FilesystemLogger , Logger } ;
122
122
123
123
use lightning:: chain:: keysinterface:: EntropySource ;
124
124
use lightning:: chain:: { chainmonitor, BestBlock , Confirm , Watch } ;
@@ -183,9 +183,15 @@ const BDK_CLIENT_STOP_GAP: usize = 20;
183
183
// The number of concurrent requests made against the API provider.
184
184
const BDK_CLIENT_CONCURRENCY : u8 = 8 ;
185
185
186
+ // The default time in-between LDK wallet sync attempts.
187
+ const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
188
+
186
189
// The timeout after which we abandon retrying failed payments.
187
190
const LDK_PAYMENT_RETRY_TIMEOUT : Duration = Duration :: from_secs ( 10 ) ;
188
191
192
+ // The default time in-between LDK wallet sync attempts.
193
+ const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
194
+
189
195
// The time in-between peer reconnection attempts.
190
196
const PEER_RECONNECTION_INTERVAL : Duration = Duration :: from_secs ( 10 ) ;
191
197
@@ -203,12 +209,14 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
203
209
///
204
210
/// ### Defaults
205
211
///
206
- /// | Parameter | Value |
207
- /// |-----------------------------|------------------|
208
- /// | `storage_dir_path` | /tmp/ldk_node/ |
209
- /// | `network` | Network::Bitcoin |
210
- /// | `listening_address` | 0.0.0.0:9735 |
211
- /// | `default_cltv_expiry_delta` | 144 |
212
+ /// | Parameter | Value |
213
+ /// |-------------------------------------|------------------|
214
+ /// | `storage_dir_path` | /tmp/ldk_node/ |
215
+ /// | `network` | Network::Bitcoin |
216
+ /// | `listening_address` | 0.0.0.0:9735 |
217
+ /// | `default_cltv_expiry_delta` | 144 |
218
+ /// | `onchain_wallet_sync_interval_secs` | 60 |
219
+ /// | `wallet_sync_interval_secs` | 20 |
212
220
///
213
221
pub struct Config {
214
222
/// The path where the underlying LDK and BDK persist their data.
@@ -219,6 +227,14 @@ pub struct Config {
219
227
pub listening_address : Option < NetAddress > ,
220
228
/// The default CLTV expiry delta to be used for payments.
221
229
pub default_cltv_expiry_delta : u32 ,
230
+ /// The time in-between background sync attempts of the onchain wallet, in seconds.
231
+ ///
232
+ /// **Note:** A minimum of 10 seconds is always enforced.
233
+ pub onchain_wallet_sync_interval_secs : u64 ,
234
+ /// The time in-between background sync attempts of the LDK wallet, in seconds.
235
+ ///
236
+ /// **Note:** A minimum of 10 seconds is always enforced.
237
+ pub wallet_sync_interval_secs : u64 ,
222
238
/// The level at which we log messages.
223
239
///
224
240
/// Any messages below this level will be excluded from the logs.
@@ -232,6 +248,8 @@ impl Default for Config {
232
248
network : DEFAULT_NETWORK ,
233
249
listening_address : Some ( DEFAULT_LISTENING_ADDR . parse ( ) . unwrap ( ) ) ,
234
250
default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
251
+ onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
252
+ wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
235
253
log_level : DEFAULT_LOG_LEVEL ,
236
254
}
237
255
}
@@ -765,31 +783,38 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
765
783
766
784
let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
767
785
768
- let event_handler = Arc :: new ( EventHandler :: new (
769
- Arc :: clone ( & self . wallet ) ,
770
- Arc :: clone ( & self . event_queue ) ,
771
- Arc :: clone ( & self . channel_manager ) ,
772
- Arc :: clone ( & self . network_graph ) ,
773
- Arc :: clone ( & self . keys_manager ) ,
774
- Arc :: clone ( & self . payment_store ) ,
775
- Arc :: clone ( & self . runtime ) ,
776
- Arc :: clone ( & self . logger ) ,
777
- Arc :: clone ( & self . config ) ,
778
- ) ) ;
779
-
780
786
// Setup wallet sync
781
787
let wallet = Arc :: clone ( & self . wallet ) ;
782
- let tx_sync = Arc :: clone ( & self . tx_sync ) ;
783
- let sync_cman = Arc :: clone ( & self . channel_manager ) ;
784
- let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
785
788
let sync_logger = Arc :: clone ( & self . logger ) ;
786
789
let mut stop_sync = self . stop_receiver . clone ( ) ;
787
790
791
+ runtime. block_on ( async move {
792
+ let now = Instant :: now ( ) ;
793
+ match wallet. sync ( ) . await {
794
+ Ok ( ( ) ) => {
795
+ log_info ! (
796
+ sync_logger,
797
+ "Initial sync of on-chain wallet finished in {}ms." ,
798
+ now. elapsed( ) . as_millis( )
799
+ ) ;
800
+ Ok ( ( ) )
801
+ }
802
+ Err ( e) => {
803
+ log_error ! ( sync_logger, "Initial sync of on-chain wallet failed: {}" , e, ) ;
804
+ Err ( e)
805
+ }
806
+ }
807
+ } ) ?;
808
+
809
+ let sync_logger = Arc :: clone ( & self . logger ) ;
810
+ let wallet = Arc :: clone ( & self . wallet ) ;
788
811
std:: thread:: spawn ( move || {
789
812
tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
790
813
async move {
791
- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 30 ) ) ;
814
+ let interval_secs = DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS . max ( 10 ) ;
815
+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( interval_secs) ) ;
792
816
interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
817
+ interval. reset ( ) ;
793
818
loop {
794
819
let now = Instant :: now ( ) ;
795
820
tokio:: select! {
@@ -798,7 +823,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
798
823
}
799
824
_ = interval. tick( ) => {
800
825
match wallet. sync( ) . await {
801
- Ok ( ( ) ) => log_info !(
826
+ Ok ( ( ) ) => log_trace !(
802
827
sync_logger,
803
828
"Background sync of on-chain wallet finished in {}ms." ,
804
829
now. elapsed( ) . as_millis( )
@@ -818,6 +843,68 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
818
843
) ;
819
844
} ) ;
820
845
846
+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
847
+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
848
+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
849
+ let sync_logger = Arc :: clone ( & self . logger ) ;
850
+ runtime. block_on ( async move {
851
+ let now = Instant :: now ( ) ;
852
+ let confirmables = vec ! [
853
+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
854
+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
855
+ ] ;
856
+ match tx_sync. sync ( confirmables) . await {
857
+ Ok ( ( ) ) => {
858
+ log_info ! (
859
+ sync_logger,
860
+ "Initial sync of Lightning wallet finished in {}ms." ,
861
+ now. elapsed( ) . as_millis( )
862
+ ) ;
863
+ Ok ( ( ) )
864
+ }
865
+ Err ( e) => {
866
+ log_error ! ( sync_logger, "Initial sync of Lightning wallet failed: {}" , e) ;
867
+ Err ( e)
868
+ }
869
+ }
870
+ } ) ?;
871
+
872
+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
873
+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
874
+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
875
+ let sync_logger = Arc :: clone ( & self . logger ) ;
876
+ let mut stop_sync = self . stop_receiver . clone ( ) ;
877
+ runtime. spawn ( async move {
878
+ let interval_secs = DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS . max ( 10 ) ;
879
+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( interval_secs) ) ;
880
+ interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
881
+ interval. reset ( ) ;
882
+ loop {
883
+ let now = Instant :: now ( ) ;
884
+ tokio:: select! {
885
+ _ = stop_sync. changed( ) => {
886
+ return ;
887
+ }
888
+ _ = interval. tick( ) => {
889
+ let confirmables = vec![
890
+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
891
+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
892
+ ] ;
893
+ match tx_sync. sync( confirmables) . await {
894
+ Ok ( ( ) ) => log_trace!(
895
+ sync_logger,
896
+ "Background sync of Lightning wallet finished in {}ms." ,
897
+ now. elapsed( ) . as_millis( )
898
+ ) ,
899
+ Err ( e) => {
900
+ log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
901
+ }
902
+ }
903
+ }
904
+ }
905
+ }
906
+ } ) ;
907
+
821
908
if self . gossip_source . is_rgs ( ) {
822
909
let gossip_source = Arc :: clone ( & self . gossip_source ) ;
823
910
let gossip_sync_store = Arc :: clone ( & self . kv_store ) ;
@@ -835,7 +922,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
835
922
let now = Instant :: now( ) ;
836
923
match gossip_source. update_rgs_snapshot( ) . await {
837
924
Ok ( updated_timestamp) => {
838
- log_info !(
925
+ log_trace !(
839
926
gossip_sync_logger,
840
927
"Background sync of RGS gossip data finished in {}ms." ,
841
928
now. elapsed( ) . as_millis( )
@@ -859,37 +946,6 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
859
946
} ) ;
860
947
}
861
948
862
- let sync_logger = Arc :: clone ( & self . logger ) ;
863
- let mut stop_sync = self . stop_receiver . clone ( ) ;
864
- runtime. spawn ( async move {
865
- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 10 ) ) ;
866
- interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
867
- loop {
868
- let now = Instant :: now ( ) ;
869
- tokio:: select! {
870
- _ = stop_sync. changed( ) => {
871
- return ;
872
- }
873
- _ = interval. tick( ) => {
874
- let confirmables = vec![
875
- & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
876
- & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
877
- ] ;
878
- match tx_sync. sync( confirmables) . await {
879
- Ok ( ( ) ) => log_info!(
880
- sync_logger,
881
- "Background sync of Lightning wallet finished in {}ms." ,
882
- now. elapsed( ) . as_millis( )
883
- ) ,
884
- Err ( e) => {
885
- log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
886
- }
887
- }
888
- }
889
- }
890
- }
891
- } ) ;
892
-
893
949
if let Some ( listening_address) = & self . config . listening_address {
894
950
// Setup networking
895
951
let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
@@ -1023,6 +1079,18 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
1023
1079
}
1024
1080
} ) ;
1025
1081
1082
+ let event_handler = Arc :: new ( EventHandler :: new (
1083
+ Arc :: clone ( & self . wallet ) ,
1084
+ Arc :: clone ( & self . event_queue ) ,
1085
+ Arc :: clone ( & self . channel_manager ) ,
1086
+ Arc :: clone ( & self . network_graph ) ,
1087
+ Arc :: clone ( & self . keys_manager ) ,
1088
+ Arc :: clone ( & self . payment_store ) ,
1089
+ Arc :: clone ( & self . runtime ) ,
1090
+ Arc :: clone ( & self . logger ) ,
1091
+ Arc :: clone ( & self . config ) ,
1092
+ ) ) ;
1093
+
1026
1094
// Setup background processing
1027
1095
let background_persister = Arc :: clone ( & self . kv_store ) ;
1028
1096
let background_event_handler = Arc :: clone ( & event_handler) ;
0 commit comments