@@ -118,7 +118,7 @@ use types::{
118118pub use types:: { ChannelDetails , ChannelId , PeerDetails , UserChannelId } ;
119119use wallet:: Wallet ;
120120
121- use logger:: { log_error, log_info, FilesystemLogger , Logger } ;
121+ use logger:: { log_error, log_info, log_trace , FilesystemLogger , Logger } ;
122122
123123use lightning:: chain:: keysinterface:: EntropySource ;
124124use lightning:: chain:: { chainmonitor, BestBlock , Confirm , Watch } ;
@@ -172,6 +172,8 @@ const DEFAULT_STORAGE_DIR_PATH: &str = "/tmp/ldk_node/";
172172const DEFAULT_NETWORK : Network = Network :: Bitcoin ;
173173const DEFAULT_LISTENING_ADDR : & str = "0.0.0.0:9735" ;
174174const DEFAULT_CLTV_EXPIRY_DELTA : u32 = 144 ;
175+ const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
176+ const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
175177const DEFAULT_LOG_LEVEL : LogLevel = LogLevel :: Debug ;
176178
177179// The 'stop gap' parameter used by BDK's wallet sync. This seems to configure the threshold
@@ -196,6 +198,9 @@ const RGS_SYNC_INTERVAL: Duration = Duration::from_secs(60 * 60);
196198// The time in-between node announcement broadcast attempts.
197199const NODE_ANN_BCAST_INTERVAL : Duration = Duration :: from_secs ( 60 * 60 ) ;
198200
201+ // The lower limit which we apply to any configured wallet sync intervals.
202+ const WALLET_SYNC_INTERVAL_MINIMUM_SECS : u64 = 10 ;
203+
199204// The length in bytes of our wallets' keys seed.
200205const WALLET_KEYS_SEED_LEN : usize = 64 ;
201206
@@ -204,13 +209,15 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
204209///
205210/// ### Defaults
206211///
207- /// | Parameter | Value |
208- /// |-----------------------------|------------------|
209- /// | `storage_dir_path` | /tmp/ldk_node/ |
210- /// | `network` | `Bitcoin` |
211- /// | `listening_address` | 0.0.0.0:9735 |
212- /// | `default_cltv_expiry_delta` | 144 |
213- /// | `log_level` | `Debug` |
212+ /// | Parameter | Value |
213+ /// |----------------------------------------|------------------|
214+ /// | `storage_dir_path` | /tmp/ldk_node/ |
215+ /// | `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 |
220+ /// | `log_level` | `Debug` |
214221///
215222pub struct Config {
216223 /// The path where the underlying LDK and BDK persist their data.
@@ -221,6 +228,14 @@ pub struct Config {
221228 pub listening_address : Option < NetAddress > ,
222229 /// The default CLTV expiry delta to be used for payments.
223230 pub default_cltv_expiry_delta : u32 ,
231+ /// The time in-between background sync attempts of the onchain wallet, in seconds.
232+ ///
233+ /// **Note:** A minimum of 10 seconds is always enforced.
234+ pub onchain_wallet_sync_interval_secs : u64 ,
235+ /// The time in-between background sync attempts of the LDK wallet, in seconds.
236+ ///
237+ /// **Note:** A minimum of 10 seconds is always enforced.
238+ pub wallet_sync_interval_secs : u64 ,
224239 /// The level at which we log messages.
225240 ///
226241 /// Any messages below this level will be excluded from the logs.
@@ -234,6 +249,8 @@ impl Default for Config {
234249 network : DEFAULT_NETWORK ,
235250 listening_address : Some ( DEFAULT_LISTENING_ADDR . parse ( ) . unwrap ( ) ) ,
236251 default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
252+ onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
253+ wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
237254 log_level : DEFAULT_LOG_LEVEL ,
238255 }
239256 }
@@ -769,26 +786,27 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
769786
770787 // Setup wallet sync
771788 let wallet = Arc :: clone ( & self . wallet ) ;
772- let tx_sync = Arc :: clone ( & self . tx_sync ) ;
773- let sync_cman = Arc :: clone ( & self . channel_manager ) ;
774- let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
775789 let sync_logger = Arc :: clone ( & self . logger ) ;
776790 let mut stop_sync = self . stop_receiver . clone ( ) ;
777-
791+ let onchain_wallet_sync_interval_secs =
792+ self . config . onchain_wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
778793 std:: thread:: spawn ( move || {
779794 tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
780795 async move {
781- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 30 ) ) ;
782- interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
796+ let mut onchain_wallet_sync_interval = tokio:: time:: interval (
797+ Duration :: from_secs ( onchain_wallet_sync_interval_secs) ,
798+ ) ;
799+ onchain_wallet_sync_interval
800+ . set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
783801 loop {
784- let now = Instant :: now ( ) ;
785802 tokio:: select! {
786803 _ = stop_sync. changed( ) => {
787804 return ;
788805 }
789- _ = interval. tick( ) => {
806+ _ = onchain_wallet_sync_interval. tick( ) => {
807+ let now = Instant :: now( ) ;
790808 match wallet. sync( ) . await {
791- Ok ( ( ) ) => log_info !(
809+ Ok ( ( ) ) => log_trace !(
792810 sync_logger,
793811 "Background sync of on-chain wallet finished in {}ms." ,
794812 now. elapsed( ) . as_millis( )
@@ -808,6 +826,43 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
808826 ) ;
809827 } ) ;
810828
829+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
830+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
831+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
832+ let sync_logger = Arc :: clone ( & self . logger ) ;
833+ let mut stop_sync = self . stop_receiver . clone ( ) ;
834+ let wallet_sync_interval_secs =
835+ self . config . wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
836+ runtime. spawn ( async move {
837+ let mut wallet_sync_interval =
838+ tokio:: time:: interval ( Duration :: from_secs ( wallet_sync_interval_secs) ) ;
839+ wallet_sync_interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
840+ loop {
841+ tokio:: select! {
842+ _ = stop_sync. changed( ) => {
843+ return ;
844+ }
845+ _ = wallet_sync_interval. tick( ) => {
846+ let confirmables = vec![
847+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
848+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
849+ ] ;
850+ let now = Instant :: now( ) ;
851+ match tx_sync. sync( confirmables) . await {
852+ Ok ( ( ) ) => log_trace!(
853+ sync_logger,
854+ "Background sync of Lightning wallet finished in {}ms." ,
855+ now. elapsed( ) . as_millis( )
856+ ) ,
857+ Err ( e) => {
858+ log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
859+ }
860+ }
861+ }
862+ }
863+ }
864+ } ) ;
865+
811866 if self . gossip_source . is_rgs ( ) {
812867 let gossip_source = Arc :: clone ( & self . gossip_source ) ;
813868 let gossip_sync_store = Arc :: clone ( & self . kv_store ) ;
@@ -825,7 +880,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
825880 let now = Instant :: now( ) ;
826881 match gossip_source. update_rgs_snapshot( ) . await {
827882 Ok ( updated_timestamp) => {
828- log_info !(
883+ log_trace !(
829884 gossip_sync_logger,
830885 "Background sync of RGS gossip data finished in {}ms." ,
831886 now. elapsed( ) . as_millis( )
@@ -849,37 +904,6 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
849904 } ) ;
850905 }
851906
852- let sync_logger = Arc :: clone ( & self . logger ) ;
853- let mut stop_sync = self . stop_receiver . clone ( ) ;
854- runtime. spawn ( async move {
855- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 10 ) ) ;
856- interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
857- loop {
858- let now = Instant :: now ( ) ;
859- tokio:: select! {
860- _ = stop_sync. changed( ) => {
861- return ;
862- }
863- _ = interval. tick( ) => {
864- let confirmables = vec![
865- & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
866- & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
867- ] ;
868- match tx_sync. sync( confirmables) . await {
869- Ok ( ( ) ) => log_info!(
870- sync_logger,
871- "Background sync of Lightning wallet finished in {}ms." ,
872- now. elapsed( ) . as_millis( )
873- ) ,
874- Err ( e) => {
875- log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
876- }
877- }
878- }
879- }
880- }
881- } ) ;
882-
883907 if let Some ( listening_address) = & self . config . listening_address {
884908 // Setup networking
885909 let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
0 commit comments