@@ -113,7 +113,7 @@ use types::{
113
113
pub use types:: { ChannelDetails , ChannelId , PeerDetails , UserChannelId } ;
114
114
use wallet:: Wallet ;
115
115
116
- use logger:: { log_error, log_info, FilesystemLogger , Logger } ;
116
+ use logger:: { log_error, log_info, log_trace , FilesystemLogger , Logger } ;
117
117
118
118
use lightning:: chain:: keysinterface:: EntropySource ;
119
119
use lightning:: chain:: { chainmonitor, BestBlock , Confirm , Watch } ;
@@ -166,9 +166,15 @@ const BDK_CLIENT_STOP_GAP: usize = 20;
166
166
// The number of concurrent requests made against the API provider.
167
167
const BDK_CLIENT_CONCURRENCY : u8 = 8 ;
168
168
169
+ // The default time in-between LDK wallet sync attempts.
170
+ const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
171
+
169
172
// The timeout after which we abandon retrying failed payments.
170
173
const LDK_PAYMENT_RETRY_TIMEOUT : Duration = Duration :: from_secs ( 10 ) ;
171
174
175
+ // The default time in-between LDK wallet sync attempts.
176
+ const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
177
+
172
178
// The time in-between peer reconnection attempts.
173
179
const PEER_RECONNECTION_INTERVAL : Duration = Duration :: from_secs ( 10 ) ;
174
180
@@ -194,6 +200,14 @@ pub struct Config {
194
200
pub listening_address : Option < NetAddress > ,
195
201
/// The default CLTV expiry delta to be used for payments.
196
202
pub default_cltv_expiry_delta : u32 ,
203
+ /// The time in-between background sync attempts of the onchain wallet, in seconds.
204
+ ///
205
+ /// **Note:** A minimum of 10 seconds is always enforced.
206
+ pub onchain_wallet_sync_interval_secs : u64 ,
207
+ /// The time in-between background sync attempts of the LDK wallet, in seconds.
208
+ ///
209
+ /// **Note:** A minimum of 10 seconds is always enforced.
210
+ pub wallet_sync_interval_secs : u64 ,
197
211
}
198
212
199
213
impl Default for Config {
@@ -204,6 +218,8 @@ impl Default for Config {
204
218
network : Network :: Regtest ,
205
219
listening_address : Some ( "0.0.0.0:9735" . parse ( ) . unwrap ( ) ) ,
206
220
default_cltv_expiry_delta : 144 ,
221
+ onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
222
+ wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
207
223
}
208
224
}
209
225
}
@@ -705,31 +721,38 @@ impl Node {
705
721
706
722
let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
707
723
708
- let event_handler = Arc :: new ( EventHandler :: new (
709
- Arc :: clone ( & self . wallet ) ,
710
- Arc :: clone ( & self . event_queue ) ,
711
- Arc :: clone ( & self . channel_manager ) ,
712
- Arc :: clone ( & self . network_graph ) ,
713
- Arc :: clone ( & self . keys_manager ) ,
714
- Arc :: clone ( & self . payment_store ) ,
715
- Arc :: clone ( & self . runtime ) ,
716
- Arc :: clone ( & self . logger ) ,
717
- Arc :: clone ( & self . config ) ,
718
- ) ) ;
719
-
720
724
// Setup wallet sync
721
725
let wallet = Arc :: clone ( & self . wallet ) ;
722
- let tx_sync = Arc :: clone ( & self . tx_sync ) ;
723
- let sync_cman = Arc :: clone ( & self . channel_manager ) ;
724
- let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
725
726
let sync_logger = Arc :: clone ( & self . logger ) ;
726
727
let mut stop_sync = self . stop_receiver . clone ( ) ;
727
728
729
+ runtime. block_on ( async move {
730
+ let now = Instant :: now ( ) ;
731
+ match wallet. sync ( ) . await {
732
+ Ok ( ( ) ) => {
733
+ log_info ! (
734
+ sync_logger,
735
+ "Initial sync of on-chain wallet finished in {}ms." ,
736
+ now. elapsed( ) . as_millis( )
737
+ ) ;
738
+ Ok ( ( ) )
739
+ }
740
+ Err ( e) => {
741
+ log_error ! ( sync_logger, "Intial sync of on-chain wallet failed: {}" , e, ) ;
742
+ Err ( e)
743
+ }
744
+ }
745
+ } ) ?;
746
+
747
+ let sync_logger = Arc :: clone ( & self . logger ) ;
748
+ let wallet = Arc :: clone ( & self . wallet ) ;
728
749
std:: thread:: spawn ( move || {
729
750
tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
730
751
async move {
731
- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 30 ) ) ;
752
+ let interval_secs = DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS . max ( 10 ) ;
753
+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( interval_secs) ) ;
732
754
interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
755
+ interval. reset ( ) ;
733
756
loop {
734
757
let now = Instant :: now ( ) ;
735
758
tokio:: select! {
@@ -738,7 +761,7 @@ impl Node {
738
761
}
739
762
_ = interval. tick( ) => {
740
763
match wallet. sync( ) . await {
741
- Ok ( ( ) ) => log_info !(
764
+ Ok ( ( ) ) => log_trace !(
742
765
sync_logger,
743
766
"Background sync of on-chain wallet finished in {}ms." ,
744
767
now. elapsed( ) . as_millis( )
@@ -758,6 +781,68 @@ impl Node {
758
781
) ;
759
782
} ) ;
760
783
784
+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
785
+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
786
+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
787
+ let sync_logger = Arc :: clone ( & self . logger ) ;
788
+ runtime. block_on ( async move {
789
+ let now = Instant :: now ( ) ;
790
+ let confirmables = vec ! [
791
+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
792
+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
793
+ ] ;
794
+ match tx_sync. sync ( confirmables) . await {
795
+ Ok ( ( ) ) => {
796
+ log_info ! (
797
+ sync_logger,
798
+ "Initial sync of Lightning wallet finished in {}ms." ,
799
+ now. elapsed( ) . as_millis( )
800
+ ) ;
801
+ Ok ( ( ) )
802
+ }
803
+ Err ( e) => {
804
+ log_error ! ( sync_logger, "Initial sync of Lightning wallet failed: {}" , e) ;
805
+ Err ( e)
806
+ }
807
+ }
808
+ } ) ?;
809
+
810
+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
811
+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
812
+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
813
+ let sync_logger = Arc :: clone ( & self . logger ) ;
814
+ let mut stop_sync = self . stop_receiver . clone ( ) ;
815
+ runtime. spawn ( async move {
816
+ let interval_secs = DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS . max ( 10 ) ;
817
+ let mut interval = tokio:: time:: interval ( Duration :: from_secs ( interval_secs) ) ;
818
+ interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
819
+ interval. reset ( ) ;
820
+ loop {
821
+ let now = Instant :: now ( ) ;
822
+ tokio:: select! {
823
+ _ = stop_sync. changed( ) => {
824
+ return ;
825
+ }
826
+ _ = interval. tick( ) => {
827
+ let confirmables = vec![
828
+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
829
+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
830
+ ] ;
831
+ match tx_sync. sync( confirmables) . await {
832
+ Ok ( ( ) ) => log_trace!(
833
+ sync_logger,
834
+ "Background sync of Lightning wallet finished in {}ms." ,
835
+ now. elapsed( ) . as_millis( )
836
+ ) ,
837
+ Err ( e) => {
838
+ log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
839
+ }
840
+ }
841
+ }
842
+ }
843
+ }
844
+ } ) ;
845
+
761
846
if self . gossip_source . is_rgs ( ) {
762
847
let gossip_source = Arc :: clone ( & self . gossip_source ) ;
763
848
let gossip_sync_store = Arc :: clone ( & self . kv_store ) ;
@@ -775,7 +860,7 @@ impl Node {
775
860
let now = Instant :: now( ) ;
776
861
match gossip_source. update_rgs_snapshot( ) . await {
777
862
Ok ( updated_timestamp) => {
778
- log_info !(
863
+ log_trace !(
779
864
gossip_sync_logger,
780
865
"Background sync of RGS gossip data finished in {}ms." ,
781
866
now. elapsed( ) . as_millis( )
@@ -799,37 +884,6 @@ impl Node {
799
884
} ) ;
800
885
}
801
886
802
- let sync_logger = Arc :: clone ( & self . logger ) ;
803
- let mut stop_sync = self . stop_receiver . clone ( ) ;
804
- runtime. spawn ( async move {
805
- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 10 ) ) ;
806
- interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
807
- loop {
808
- let now = Instant :: now ( ) ;
809
- tokio:: select! {
810
- _ = stop_sync. changed( ) => {
811
- return ;
812
- }
813
- _ = interval. tick( ) => {
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 ( ( ) ) => log_info!(
820
- sync_logger,
821
- "Background sync of Lightning wallet finished in {}ms." ,
822
- now. elapsed( ) . as_millis( )
823
- ) ,
824
- Err ( e) => {
825
- log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
826
- }
827
- }
828
- }
829
- }
830
- }
831
- } ) ;
832
-
833
887
if let Some ( listening_address) = & self . config . listening_address {
834
888
// Setup networking
835
889
let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
@@ -963,6 +1017,18 @@ impl Node {
963
1017
}
964
1018
} ) ;
965
1019
1020
+ let event_handler = Arc :: new ( EventHandler :: new (
1021
+ Arc :: clone ( & self . wallet ) ,
1022
+ Arc :: clone ( & self . event_queue ) ,
1023
+ Arc :: clone ( & self . channel_manager ) ,
1024
+ Arc :: clone ( & self . network_graph ) ,
1025
+ Arc :: clone ( & self . keys_manager ) ,
1026
+ Arc :: clone ( & self . payment_store ) ,
1027
+ Arc :: clone ( & self . runtime ) ,
1028
+ Arc :: clone ( & self . logger ) ,
1029
+ Arc :: clone ( & self . config ) ,
1030
+ ) ) ;
1031
+
966
1032
// Setup background processing
967
1033
let background_persister = Arc :: clone ( & self . kv_store ) ;
968
1034
let background_event_handler = Arc :: clone ( & event_handler) ;
0 commit comments