@@ -122,8 +122,8 @@ pub use builder::BuildError;
122
122
pub use builder:: NodeBuilder as Builder ;
123
123
124
124
use config:: {
125
- NODE_ANN_BCAST_INTERVAL , PEER_RECONNECTION_INTERVAL , RGS_SYNC_INTERVAL ,
126
- WALLET_SYNC_INTERVAL_MINIMUM_SECS ,
125
+ LDK_CHANNEL_MONITOR_ARCHIVAL_INTERVAL , NODE_ANN_BCAST_INTERVAL , PEER_RECONNECTION_INTERVAL ,
126
+ RGS_SYNC_INTERVAL , WALLET_SYNC_INTERVAL_MINIMUM_SECS ,
127
127
} ;
128
128
use connection:: ConnectionManager ;
129
129
use event:: { EventHandler , EventQueue } ;
@@ -198,6 +198,7 @@ pub struct Node {
198
198
latest_fee_rate_cache_update_timestamp : Arc < RwLock < Option < u64 > > > ,
199
199
latest_rgs_snapshot_timestamp : Arc < RwLock < Option < u64 > > > ,
200
200
latest_node_announcement_broadcast_timestamp : Arc < RwLock < Option < u64 > > > ,
201
+ latest_channel_monitor_archival_height : Arc < RwLock < Option < u32 > > > ,
201
202
}
202
203
203
204
impl Node {
@@ -343,10 +344,13 @@ impl Node {
343
344
344
345
let tx_sync = Arc :: clone ( & self . tx_sync ) ;
345
346
let sync_cman = Arc :: clone ( & self . channel_manager ) ;
347
+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
346
348
let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
349
+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
347
350
let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
348
351
let sync_logger = Arc :: clone ( & self . logger ) ;
349
352
let sync_wallet_timestamp = Arc :: clone ( & self . latest_wallet_sync_timestamp ) ;
353
+ let sync_monitor_archival_height = Arc :: clone ( & self . latest_channel_monitor_archival_height ) ;
350
354
let mut stop_sync = self . stop_sender . subscribe ( ) ;
351
355
let wallet_sync_interval_secs =
352
356
self . config . wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
@@ -376,6 +380,12 @@ impl Node {
376
380
let unix_time_secs_opt =
377
381
SystemTime :: now( ) . duration_since( UNIX_EPOCH ) . ok( ) . map( |d| d. as_secs( ) ) ;
378
382
* sync_wallet_timestamp. write( ) . unwrap( ) = unix_time_secs_opt;
383
+
384
+ periodically_archive_fully_resolved_monitors(
385
+ Arc :: clone( & archive_cman) ,
386
+ Arc :: clone( & archive_cmon) ,
387
+ Arc :: clone( & sync_monitor_archival_height)
388
+ ) ;
379
389
}
380
390
Err ( e) => {
381
391
log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
@@ -1128,14 +1138,17 @@ impl Node {
1128
1138
let wallet = Arc :: clone ( & self . wallet ) ;
1129
1139
let tx_sync = Arc :: clone ( & self . tx_sync ) ;
1130
1140
let sync_cman = Arc :: clone ( & self . channel_manager ) ;
1141
+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
1131
1142
let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
1143
+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
1132
1144
let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
1133
1145
let sync_logger = Arc :: clone ( & self . logger ) ;
1134
1146
let confirmables = vec ! [
1135
1147
& * sync_cman as & ( dyn Confirm + Sync + Send ) ,
1136
1148
& * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
1137
1149
& * sync_sweeper as & ( dyn Confirm + Sync + Send ) ,
1138
1150
] ;
1151
+ let sync_monitor_archival_height = Arc :: clone ( & self . latest_channel_monitor_archival_height ) ;
1139
1152
1140
1153
tokio:: task:: block_in_place ( move || {
1141
1154
tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
@@ -1163,6 +1176,12 @@ impl Node {
1163
1176
"Sync of Lightning wallet finished in {}ms." ,
1164
1177
now. elapsed( ) . as_millis( )
1165
1178
) ;
1179
+
1180
+ periodically_archive_fully_resolved_monitors (
1181
+ archive_cman,
1182
+ archive_cmon,
1183
+ sync_monitor_archival_height,
1184
+ ) ;
1166
1185
Ok ( ( ) )
1167
1186
} ,
1168
1187
Err ( e) => {
@@ -1486,3 +1505,19 @@ pub(crate) fn total_anchor_channels_reserve_sats(
1486
1505
* anchor_channels_config. per_channel_reserve_sats
1487
1506
} )
1488
1507
}
1508
+
1509
+ fn periodically_archive_fully_resolved_monitors (
1510
+ channel_manager : Arc < ChannelManager > , chain_monitor : Arc < ChainMonitor > ,
1511
+ latest_channel_monitor_archival_height : Arc < RwLock < Option < u32 > > > ,
1512
+ ) {
1513
+ let mut latest_archival_height_lock = latest_channel_monitor_archival_height. write ( ) . unwrap ( ) ;
1514
+ let cur_height = channel_manager. current_best_block ( ) . height ;
1515
+ let should_archive = latest_archival_height_lock
1516
+ . as_ref ( )
1517
+ . map_or ( true , |h| cur_height >= h + LDK_CHANNEL_MONITOR_ARCHIVAL_INTERVAL ) ;
1518
+
1519
+ if should_archive {
1520
+ chain_monitor. archive_fully_resolved_channel_monitors ( ) ;
1521
+ * latest_archival_height_lock = Some ( cur_height) ;
1522
+ }
1523
+ }
0 commit comments