@@ -123,7 +123,8 @@ pub use builder::BuildError;
123
123
pub use builder:: NodeBuilder as Builder ;
124
124
125
125
use config:: {
126
- NODE_ANN_BCAST_INTERVAL , PEER_RECONNECTION_INTERVAL , RGS_SYNC_INTERVAL ,
126
+ NODE_ANN_BCAST_INTERVAL , PEER_RECONNECTION_INTERVAL ,
127
+ RESOLVED_CHANNEL_MONITOR_ARCHIVAL_INTERVAL , RGS_SYNC_INTERVAL ,
127
128
WALLET_SYNC_INTERVAL_MINIMUM_SECS ,
128
129
} ;
129
130
use connection:: ConnectionManager ;
@@ -200,6 +201,7 @@ pub struct Node {
200
201
latest_fee_rate_cache_update_timestamp : Arc < RwLock < Option < u64 > > > ,
201
202
latest_rgs_snapshot_timestamp : Arc < RwLock < Option < u64 > > > ,
202
203
latest_node_announcement_broadcast_timestamp : Arc < RwLock < Option < u64 > > > ,
204
+ latest_channel_monitor_archival_height : Arc < RwLock < Option < u32 > > > ,
203
205
}
204
206
205
207
impl Node {
@@ -345,10 +347,13 @@ impl Node {
345
347
346
348
let tx_sync = Arc :: clone ( & self . tx_sync ) ;
347
349
let sync_cman = Arc :: clone ( & self . channel_manager ) ;
350
+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
348
351
let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
352
+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
349
353
let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
350
354
let sync_logger = Arc :: clone ( & self . logger ) ;
351
355
let sync_wallet_timestamp = Arc :: clone ( & self . latest_wallet_sync_timestamp ) ;
356
+ let sync_monitor_archival_height = Arc :: clone ( & self . latest_channel_monitor_archival_height ) ;
352
357
let mut stop_sync = self . stop_sender . subscribe ( ) ;
353
358
let wallet_sync_interval_secs =
354
359
self . config . wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
@@ -378,6 +383,12 @@ impl Node {
378
383
let unix_time_secs_opt =
379
384
SystemTime :: now( ) . duration_since( UNIX_EPOCH ) . ok( ) . map( |d| d. as_secs( ) ) ;
380
385
* sync_wallet_timestamp. write( ) . unwrap( ) = unix_time_secs_opt;
386
+
387
+ periodically_archive_fully_resolved_monitors(
388
+ Arc :: clone( & archive_cman) ,
389
+ Arc :: clone( & archive_cmon) ,
390
+ Arc :: clone( & sync_monitor_archival_height)
391
+ ) ;
381
392
}
382
393
Err ( e) => {
383
394
log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
@@ -1115,7 +1126,8 @@ impl Node {
1115
1126
}
1116
1127
}
1117
1128
1118
- /// Manually sync the LDK and BDK wallets with the current chain state.
1129
+ /// Manually sync the LDK and BDK wallets with the current chain state and update the fee rate
1130
+ /// cache.
1119
1131
///
1120
1132
/// **Note:** The wallets are regularly synced in the background, which is configurable via
1121
1133
/// [`Config::onchain_wallet_sync_interval_secs`] and [`Config::wallet_sync_interval_secs`].
@@ -1130,14 +1142,22 @@ impl Node {
1130
1142
let wallet = Arc :: clone ( & self . wallet ) ;
1131
1143
let tx_sync = Arc :: clone ( & self . tx_sync ) ;
1132
1144
let sync_cman = Arc :: clone ( & self . channel_manager ) ;
1145
+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
1133
1146
let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
1147
+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
1148
+ let fee_estimator = Arc :: clone ( & self . fee_estimator ) ;
1134
1149
let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
1135
1150
let sync_logger = Arc :: clone ( & self . logger ) ;
1136
1151
let confirmables = vec ! [
1137
1152
& * sync_cman as & ( dyn Confirm + Sync + Send ) ,
1138
1153
& * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
1139
1154
& * sync_sweeper as & ( dyn Confirm + Sync + Send ) ,
1140
1155
] ;
1156
+ let sync_wallet_timestamp = Arc :: clone ( & self . latest_wallet_sync_timestamp ) ;
1157
+ let sync_fee_rate_update_timestamp =
1158
+ Arc :: clone ( & self . latest_fee_rate_cache_update_timestamp ) ;
1159
+ let sync_onchain_wallet_timestamp = Arc :: clone ( & self . latest_onchain_wallet_sync_timestamp ) ;
1160
+ let sync_monitor_archival_height = Arc :: clone ( & self . latest_channel_monitor_archival_height ) ;
1141
1161
1142
1162
tokio:: task:: block_in_place ( move || {
1143
1163
tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
@@ -1150,13 +1170,38 @@ impl Node {
1150
1170
"Sync of on-chain wallet finished in {}ms." ,
1151
1171
now. elapsed( ) . as_millis( )
1152
1172
) ;
1173
+ let unix_time_secs_opt = SystemTime :: now ( )
1174
+ . duration_since ( UNIX_EPOCH )
1175
+ . ok ( )
1176
+ . map ( |d| d. as_secs ( ) ) ;
1177
+ * sync_onchain_wallet_timestamp. write ( ) . unwrap ( ) = unix_time_secs_opt;
1153
1178
} ,
1154
1179
Err ( e) => {
1155
1180
log_error ! ( sync_logger, "Sync of on-chain wallet failed: {}" , e) ;
1156
1181
return Err ( e) ;
1157
1182
} ,
1158
1183
} ;
1159
1184
1185
+ let now = Instant :: now ( ) ;
1186
+ match fee_estimator. update_fee_estimates ( ) . await {
1187
+ Ok ( ( ) ) => {
1188
+ log_info ! (
1189
+ sync_logger,
1190
+ "Fee rate cache update finished in {}ms." ,
1191
+ now. elapsed( ) . as_millis( )
1192
+ ) ;
1193
+ let unix_time_secs_opt = SystemTime :: now ( )
1194
+ . duration_since ( UNIX_EPOCH )
1195
+ . ok ( )
1196
+ . map ( |d| d. as_secs ( ) ) ;
1197
+ * sync_fee_rate_update_timestamp. write ( ) . unwrap ( ) = unix_time_secs_opt;
1198
+ } ,
1199
+ Err ( e) => {
1200
+ log_error ! ( sync_logger, "Fee rate cache update failed: {}" , e, ) ;
1201
+ return Err ( e) ;
1202
+ } ,
1203
+ }
1204
+
1160
1205
let now = Instant :: now ( ) ;
1161
1206
match tx_sync. sync ( confirmables) . await {
1162
1207
Ok ( ( ) ) => {
@@ -1165,6 +1210,18 @@ impl Node {
1165
1210
"Sync of Lightning wallet finished in {}ms." ,
1166
1211
now. elapsed( ) . as_millis( )
1167
1212
) ;
1213
+
1214
+ let unix_time_secs_opt = SystemTime :: now ( )
1215
+ . duration_since ( UNIX_EPOCH )
1216
+ . ok ( )
1217
+ . map ( |d| d. as_secs ( ) ) ;
1218
+ * sync_wallet_timestamp. write ( ) . unwrap ( ) = unix_time_secs_opt;
1219
+
1220
+ periodically_archive_fully_resolved_monitors (
1221
+ archive_cman,
1222
+ archive_cmon,
1223
+ sync_monitor_archival_height,
1224
+ ) ;
1168
1225
Ok ( ( ) )
1169
1226
} ,
1170
1227
Err ( e) => {
@@ -1500,3 +1557,19 @@ pub(crate) fn total_anchor_channels_reserve_sats(
1500
1557
* anchor_channels_config. per_channel_reserve_sats
1501
1558
} )
1502
1559
}
1560
+
1561
+ fn periodically_archive_fully_resolved_monitors (
1562
+ channel_manager : Arc < ChannelManager > , chain_monitor : Arc < ChainMonitor > ,
1563
+ latest_channel_monitor_archival_height : Arc < RwLock < Option < u32 > > > ,
1564
+ ) {
1565
+ let mut latest_archival_height_lock = latest_channel_monitor_archival_height. write ( ) . unwrap ( ) ;
1566
+ let cur_height = channel_manager. current_best_block ( ) . height ;
1567
+ let should_archive = latest_archival_height_lock
1568
+ . as_ref ( )
1569
+ . map_or ( true , |h| cur_height >= h + RESOLVED_CHANNEL_MONITOR_ARCHIVAL_INTERVAL ) ;
1570
+
1571
+ if should_archive {
1572
+ chain_monitor. archive_fully_resolved_channel_monitors ( ) ;
1573
+ * latest_archival_height_lock = Some ( cur_height) ;
1574
+ }
1575
+ }
0 commit comments