Skip to content

Commit 6d52376

Browse files
committed
Make wallet sync intervals configurable
1 parent 9700060 commit 6d52376

File tree

2 files changed

+70
-48
lines changed

2 files changed

+70
-48
lines changed

bindings/ldk_node.udl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ dictionary Config {
66
Network network;
77
NetAddress? listening_address;
88
u32 default_cltv_expiry_delta;
9+
u64 onchain_wallet_sync_interval_secs;
10+
u64 wallet_sync_interval_secs;
911
LogLevel log_level;
1012
};
1113

src/lib.rs

Lines changed: 68 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ use types::{
118118
pub use types::{ChannelDetails, ChannelId, PeerDetails, UserChannelId};
119119
use wallet::Wallet;
120120

121-
use logger::{log_error, log_info, FilesystemLogger, Logger};
121+
use logger::{log_error, log_info, log_trace, FilesystemLogger, Logger};
122122

123123
use lightning::chain::keysinterface::EntropySource;
124124
use lightning::chain::{chainmonitor, BestBlock, Confirm, Watch};
@@ -172,6 +172,8 @@ const DEFAULT_STORAGE_DIR_PATH: &str = "/tmp/ldk_node/";
172172
const DEFAULT_NETWORK: Network = Network::Bitcoin;
173173
const DEFAULT_LISTENING_ADDR: &str = "0.0.0.0:9735";
174174
const 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;
175177
const DEFAULT_LOG_LEVEL: LogLevel = LogLevel::Debug;
176178

177179
// The 'stop gap' parameter used by BDK's wallet sync. This seems to configure the threshold
@@ -204,13 +206,15 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
204206
///
205207
/// ### Defaults
206208
///
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` |
209+
/// | Parameter | Value |
210+
/// |----------------------------------------|------------------|
211+
/// | `storage_dir_path` | /tmp/ldk_node/ |
212+
/// | `network` | `Bitcoin |
213+
/// | `listening_address` | 0.0.0.0:9735 |
214+
/// | `default_cltv_expiry_delta` | 144 |
215+
/// | `onchain_wallet_sync_interval_secs` | 60 |
216+
/// | `wallet_sync_interval_secs` | 20 |
217+
/// | `log_level` | `Debug` |
214218
///
215219
pub struct Config {
216220
/// The path where the underlying LDK and BDK persist their data.
@@ -221,6 +225,14 @@ pub struct Config {
221225
pub listening_address: Option<NetAddress>,
222226
/// The default CLTV expiry delta to be used for payments.
223227
pub default_cltv_expiry_delta: u32,
228+
/// The time in-between background sync attempts of the onchain wallet, in seconds.
229+
///
230+
/// **Note:** A minimum of 10 seconds is always enforced.
231+
pub onchain_wallet_sync_interval_secs: u64,
232+
/// The time in-between background sync attempts of the LDK wallet, in seconds.
233+
///
234+
/// **Note:** A minimum of 10 seconds is always enforced.
235+
pub wallet_sync_interval_secs: u64,
224236
/// The level at which we log messages.
225237
///
226238
/// Any messages below this level will be excluded from the logs.
@@ -234,6 +246,8 @@ impl Default for Config {
234246
network: DEFAULT_NETWORK,
235247
listening_address: Some(DEFAULT_LISTENING_ADDR.parse().unwrap()),
236248
default_cltv_expiry_delta: DEFAULT_CLTV_EXPIRY_DELTA,
249+
onchain_wallet_sync_interval_secs: DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS,
250+
wallet_sync_interval_secs: DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS,
237251
log_level: DEFAULT_LOG_LEVEL,
238252
}
239253
}
@@ -769,26 +783,27 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
769783

770784
// Setup wallet sync
771785
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);
775786
let sync_logger = Arc::clone(&self.logger);
776787
let mut stop_sync = self.stop_receiver.clone();
777-
788+
let onchain_wallet_sync_interval_secs =
789+
self.config.onchain_wallet_sync_interval_secs.max(10);
778790
std::thread::spawn(move || {
779791
tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(
780792
async move {
781-
let mut interval = tokio::time::interval(Duration::from_secs(30));
782-
interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
793+
let mut onchain_wallet_sync_interval = tokio::time::interval(
794+
Duration::from_secs(onchain_wallet_sync_interval_secs),
795+
);
796+
onchain_wallet_sync_interval
797+
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
783798
loop {
784799
let now = Instant::now();
785800
tokio::select! {
786801
_ = stop_sync.changed() => {
787802
return;
788803
}
789-
_ = interval.tick() => {
804+
_ = onchain_wallet_sync_interval.tick() => {
790805
match wallet.sync().await {
791-
Ok(()) => log_info!(
806+
Ok(()) => log_trace!(
792807
sync_logger,
793808
"Background sync of on-chain wallet finished in {}ms.",
794809
now.elapsed().as_millis()
@@ -808,6 +823,42 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
808823
);
809824
});
810825

826+
let tx_sync = Arc::clone(&self.tx_sync);
827+
let sync_cman = Arc::clone(&self.channel_manager);
828+
let sync_cmon = Arc::clone(&self.chain_monitor);
829+
let sync_logger = Arc::clone(&self.logger);
830+
let mut stop_sync = self.stop_receiver.clone();
831+
let wallet_sync_interval_secs = self.config.wallet_sync_interval_secs.max(10);
832+
runtime.spawn(async move {
833+
let mut wallet_sync_interval =
834+
tokio::time::interval(Duration::from_secs(wallet_sync_interval_secs));
835+
wallet_sync_interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
836+
loop {
837+
let now = Instant::now();
838+
tokio::select! {
839+
_ = stop_sync.changed() => {
840+
return;
841+
}
842+
_ = wallet_sync_interval.tick() => {
843+
let confirmables = vec![
844+
&*sync_cman as &(dyn Confirm + Sync + Send),
845+
&*sync_cmon as &(dyn Confirm + Sync + Send),
846+
];
847+
match tx_sync.sync(confirmables).await {
848+
Ok(()) => log_trace!(
849+
sync_logger,
850+
"Background sync of Lightning wallet finished in {}ms.",
851+
now.elapsed().as_millis()
852+
),
853+
Err(e) => {
854+
log_error!(sync_logger, "Background sync of Lightning wallet failed: {}", e)
855+
}
856+
}
857+
}
858+
}
859+
}
860+
});
861+
811862
if self.gossip_source.is_rgs() {
812863
let gossip_source = Arc::clone(&self.gossip_source);
813864
let gossip_sync_store = Arc::clone(&self.kv_store);
@@ -825,7 +876,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
825876
let now = Instant::now();
826877
match gossip_source.update_rgs_snapshot().await {
827878
Ok(updated_timestamp) => {
828-
log_info!(
879+
log_trace!(
829880
gossip_sync_logger,
830881
"Background sync of RGS gossip data finished in {}ms.",
831882
now.elapsed().as_millis()
@@ -849,37 +900,6 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
849900
});
850901
}
851902

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-
883903
if let Some(listening_address) = &self.config.listening_address {
884904
// Setup networking
885905
let peer_manager_connection_handler = Arc::clone(&self.peer_manager);

0 commit comments

Comments
 (0)