Skip to content

Commit 4bf0258

Browse files
committed
Make wallet sync intervals configurable
1 parent 9700060 commit 4bf0258

File tree

2 files changed

+75
-49
lines changed

2 files changed

+75
-49
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: 73 additions & 49 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
@@ -196,6 +198,9 @@ const RGS_SYNC_INTERVAL: Duration = Duration::from_secs(60 * 60);
196198
// The time in-between node announcement broadcast attempts.
197199
const 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.
200205
const 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
///
215222
pub 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

Comments
 (0)