@@ -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 } ;
@@ -197,6 +197,7 @@ pub struct Node {
197
197
latest_fee_rate_cache_update_timestamp : Arc < RwLock < Option < u64 > > > ,
198
198
latest_rgs_snapshot_timestamp : Arc < RwLock < Option < u64 > > > ,
199
199
latest_node_announcement_broadcast_timestamp : Arc < RwLock < Option < u64 > > > ,
200
+ latest_channel_monitor_archival_height : Arc < RwLock < Option < u32 > > > ,
200
201
}
201
202
202
203
impl Node {
@@ -342,10 +343,13 @@ impl Node {
342
343
343
344
let tx_sync = Arc :: clone ( & self . tx_sync ) ;
344
345
let sync_cman = Arc :: clone ( & self . channel_manager ) ;
346
+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
345
347
let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
348
+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
346
349
let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
347
350
let sync_logger = Arc :: clone ( & self . logger ) ;
348
351
let sync_wallet_timestamp = Arc :: clone ( & self . latest_wallet_sync_timestamp ) ;
352
+ let sync_monitor_archival_height = Arc :: clone ( & self . latest_channel_monitor_archival_height ) ;
349
353
let mut stop_sync = self . stop_sender . subscribe ( ) ;
350
354
let wallet_sync_interval_secs =
351
355
self . config . wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
@@ -375,6 +379,12 @@ impl Node {
375
379
let unix_time_secs_opt =
376
380
SystemTime :: now( ) . duration_since( UNIX_EPOCH ) . ok( ) . map( |d| d. as_secs( ) ) ;
377
381
* sync_wallet_timestamp. write( ) . unwrap( ) = unix_time_secs_opt;
382
+
383
+ periodically_archive_fully_resolved_monitors(
384
+ Arc :: clone( & archive_cman) ,
385
+ Arc :: clone( & archive_cmon) ,
386
+ Arc :: clone( & sync_monitor_archival_height)
387
+ ) ;
378
388
}
379
389
Err ( e) => {
380
390
log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
@@ -1077,14 +1087,17 @@ impl Node {
1077
1087
let wallet = Arc :: clone ( & self . wallet ) ;
1078
1088
let tx_sync = Arc :: clone ( & self . tx_sync ) ;
1079
1089
let sync_cman = Arc :: clone ( & self . channel_manager ) ;
1090
+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
1080
1091
let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
1092
+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
1081
1093
let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
1082
1094
let sync_logger = Arc :: clone ( & self . logger ) ;
1083
1095
let confirmables = vec ! [
1084
1096
& * sync_cman as & ( dyn Confirm + Sync + Send ) ,
1085
1097
& * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
1086
1098
& * sync_sweeper as & ( dyn Confirm + Sync + Send ) ,
1087
1099
] ;
1100
+ let sync_monitor_archival_height = Arc :: clone ( & self . latest_channel_monitor_archival_height ) ;
1088
1101
1089
1102
tokio:: task:: block_in_place ( move || {
1090
1103
tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
@@ -1112,6 +1125,12 @@ impl Node {
1112
1125
"Sync of Lightning wallet finished in {}ms." ,
1113
1126
now. elapsed( ) . as_millis( )
1114
1127
) ;
1128
+
1129
+ periodically_archive_fully_resolved_monitors (
1130
+ archive_cman,
1131
+ archive_cmon,
1132
+ sync_monitor_archival_height,
1133
+ ) ;
1115
1134
Ok ( ( ) )
1116
1135
} ,
1117
1136
Err ( e) => {
@@ -1358,3 +1377,19 @@ pub struct NodeStatus {
1358
1377
/// Will be `None` if we have no public channels or we haven't broadcasted since the [`Node`] was initialized.
1359
1378
pub latest_node_announcement_broadcast_timestamp : Option < u64 > ,
1360
1379
}
1380
+
1381
+ fn periodically_archive_fully_resolved_monitors (
1382
+ channel_manager : Arc < ChannelManager > , chain_monitor : Arc < ChainMonitor > ,
1383
+ latest_channel_monitor_archival_height : Arc < RwLock < Option < u32 > > > ,
1384
+ ) {
1385
+ let mut latest_archival_height_lock = latest_channel_monitor_archival_height. write ( ) . unwrap ( ) ;
1386
+ let cur_height = channel_manager. current_best_block ( ) . height ;
1387
+ let should_archive = latest_archival_height_lock
1388
+ . as_ref ( )
1389
+ . map_or ( true , |h| cur_height >= h + LDK_CHANNEL_MONITOR_ARCHIVAL_INTERVAL ) ;
1390
+
1391
+ if should_archive {
1392
+ chain_monitor. archive_fully_resolved_channel_monitors ( ) ;
1393
+ * latest_archival_height_lock = Some ( cur_height) ;
1394
+ }
1395
+ }
0 commit comments