@@ -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 } ;
@@ -173,6 +173,8 @@ const DEFAULT_STORAGE_DIR_PATH: &str = "/tmp/ldk_node/";
173173const DEFAULT_NETWORK : Network = Network :: Bitcoin ;
174174const DEFAULT_LISTENING_ADDR : & str = "0.0.0.0:9735" ;
175175const DEFAULT_CLTV_EXPIRY_DELTA : u32 = 144 ;
176+ const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
177+ const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
176178const DEFAULT_LOG_LEVEL : LogLevel = LogLevel :: Debug ;
177179
178180// The 'stop gap' parameter used by BDK's wallet sync. This seems to configure the threshold
@@ -205,13 +207,15 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
205207///
206208/// ### Defaults
207209///
208- /// | Parameter | Value |
209- /// |-----------------------------|------------------|
210- /// | `storage_dir_path` | /tmp/ldk_node/ |
211- /// | `network` | `Bitcoin` |
212- /// | `listening_address` | 0.0.0.0:9735 |
213- /// | `default_cltv_expiry_delta` | 144 |
214- /// | `log_level` | `Debug` |
210+ /// | Parameter | Value |
211+ /// |----------------------------------------|------------------|
212+ /// | `storage_dir_path` | /tmp/ldk_node/ |
213+ /// | `network` | `Bitcoin |
214+ /// | `listening_address` | 0.0.0.0:9735 |
215+ /// | `default_cltv_expiry_delta` | 144 |
216+ /// | `onchain_wallet_sync_interval_secs` | 60 |
217+ /// | `wallet_sync_interval_secs` | 20 |
218+ /// | `log_level` | `Debug` |
215219///
216220pub struct Config {
217221 /// The path where the underlying LDK and BDK persist their data.
@@ -222,6 +226,14 @@ pub struct Config {
222226 pub listening_address : Option < NetAddress > ,
223227 /// The default CLTV expiry delta to be used for payments.
224228 pub default_cltv_expiry_delta : u32 ,
229+ /// The time in-between background sync attempts of the onchain wallet, in seconds.
230+ ///
231+ /// **Note:** A minimum of 10 seconds is always enforced.
232+ pub onchain_wallet_sync_interval_secs : u64 ,
233+ /// The time in-between background sync attempts of the LDK wallet, in seconds.
234+ ///
235+ /// **Note:** A minimum of 10 seconds is always enforced.
236+ pub wallet_sync_interval_secs : u64 ,
225237 /// The level at which we log messages.
226238 ///
227239 /// Any messages below this level will be excluded from the logs.
@@ -235,6 +247,8 @@ impl Default for Config {
235247 network : DEFAULT_NETWORK ,
236248 listening_address : Some ( DEFAULT_LISTENING_ADDR . parse ( ) . unwrap ( ) ) ,
237249 default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
250+ onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
251+ wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
238252 log_level : DEFAULT_LOG_LEVEL ,
239253 }
240254 }
@@ -770,26 +784,27 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
770784
771785 // Setup wallet sync
772786 let wallet = Arc :: clone ( & self . wallet ) ;
773- let tx_sync = Arc :: clone ( & self . tx_sync ) ;
774- let sync_cman = Arc :: clone ( & self . channel_manager ) ;
775- let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
776787 let sync_logger = Arc :: clone ( & self . logger ) ;
777788 let mut stop_sync = self . stop_receiver . clone ( ) ;
778-
789+ let onchain_wallet_sync_interval_secs =
790+ self . config . onchain_wallet_sync_interval_secs . max ( 10 ) ;
779791 std:: thread:: spawn ( move || {
780792 tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
781793 async move {
782- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 30 ) ) ;
783- interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
794+ let mut onchain_wallet_sync_interval = tokio:: time:: interval (
795+ Duration :: from_secs ( onchain_wallet_sync_interval_secs) ,
796+ ) ;
797+ onchain_wallet_sync_interval
798+ . set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
784799 loop {
785800 let now = Instant :: now ( ) ;
786801 tokio:: select! {
787802 _ = stop_sync. changed( ) => {
788803 return ;
789804 }
790- _ = interval . tick( ) => {
805+ _ = onchain_wallet_sync_interval . tick( ) => {
791806 match wallet. sync( ) . await {
792- Ok ( ( ) ) => log_info !(
807+ Ok ( ( ) ) => log_trace !(
793808 sync_logger,
794809 "Background sync of on-chain wallet finished in {}ms." ,
795810 now. elapsed( ) . as_millis( )
@@ -809,6 +824,42 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
809824 ) ;
810825 } ) ;
811826
827+ let tx_sync = Arc :: clone ( & self . tx_sync ) ;
828+ let sync_cman = Arc :: clone ( & self . channel_manager ) ;
829+ let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
830+ let sync_logger = Arc :: clone ( & self . logger ) ;
831+ let mut stop_sync = self . stop_receiver . clone ( ) ;
832+ let wallet_sync_interval_secs = self . config . wallet_sync_interval_secs . max ( 10 ) ;
833+ runtime. spawn ( async move {
834+ let mut wallet_sync_interval =
835+ tokio:: time:: interval ( Duration :: from_secs ( wallet_sync_interval_secs) ) ;
836+ wallet_sync_interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
837+ loop {
838+ let now = Instant :: now ( ) ;
839+ tokio:: select! {
840+ _ = stop_sync. changed( ) => {
841+ return ;
842+ }
843+ _ = wallet_sync_interval. tick( ) => {
844+ let confirmables = vec![
845+ & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
846+ & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
847+ ] ;
848+ match tx_sync. sync( confirmables) . await {
849+ Ok ( ( ) ) => log_trace!(
850+ sync_logger,
851+ "Background sync of Lightning wallet finished in {}ms." ,
852+ now. elapsed( ) . as_millis( )
853+ ) ,
854+ Err ( e) => {
855+ log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
856+ }
857+ }
858+ }
859+ }
860+ }
861+ } ) ;
862+
812863 if self . gossip_source . is_rgs ( ) {
813864 let gossip_source = Arc :: clone ( & self . gossip_source ) ;
814865 let gossip_sync_store = Arc :: clone ( & self . kv_store ) ;
@@ -826,7 +877,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
826877 let now = Instant :: now( ) ;
827878 match gossip_source. update_rgs_snapshot( ) . await {
828879 Ok ( updated_timestamp) => {
829- log_info !(
880+ log_trace !(
830881 gossip_sync_logger,
831882 "Background sync of RGS gossip data finished in {}ms." ,
832883 now. elapsed( ) . as_millis( )
@@ -850,37 +901,6 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
850901 } ) ;
851902 }
852903
853- let sync_logger = Arc :: clone ( & self . logger ) ;
854- let mut stop_sync = self . stop_receiver . clone ( ) ;
855- runtime. spawn ( async move {
856- let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 10 ) ) ;
857- interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
858- loop {
859- let now = Instant :: now ( ) ;
860- tokio:: select! {
861- _ = stop_sync. changed( ) => {
862- return ;
863- }
864- _ = interval. tick( ) => {
865- let confirmables = vec![
866- & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
867- & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
868- ] ;
869- match tx_sync. sync( confirmables) . await {
870- Ok ( ( ) ) => log_info!(
871- sync_logger,
872- "Background sync of Lightning wallet finished in {}ms." ,
873- now. elapsed( ) . as_millis( )
874- ) ,
875- Err ( e) => {
876- log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
877- }
878- }
879- }
880- }
881- }
882- } ) ;
883-
884904 if let Some ( listening_address) = & self . config . listening_address {
885905 // Setup networking
886906 let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
0 commit comments