@@ -122,8 +122,8 @@ pub use builder::BuildError;
122122pub use builder:: NodeBuilder as Builder ;
123123
124124use 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 ,
127127} ;
128128use connection:: ConnectionManager ;
129129use event:: { EventHandler , EventQueue } ;
@@ -197,6 +197,7 @@ pub struct Node {
197197 latest_fee_rate_cache_update_timestamp : Arc < RwLock < Option < u64 > > > ,
198198 latest_rgs_snapshot_timestamp : Arc < RwLock < Option < u64 > > > ,
199199 latest_node_announcement_broadcast_timestamp : Arc < RwLock < Option < u64 > > > ,
200+ latest_channel_monitor_archival_height : Arc < RwLock < Option < u32 > > > ,
200201}
201202
202203impl Node {
@@ -342,10 +343,13 @@ impl Node {
342343
343344 let tx_sync = Arc :: clone ( & self . tx_sync ) ;
344345 let sync_cman = Arc :: clone ( & self . channel_manager ) ;
346+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
345347 let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
348+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
346349 let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
347350 let sync_logger = Arc :: clone ( & self . logger ) ;
348351 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 ) ;
349353 let mut stop_sync = self . stop_sender . subscribe ( ) ;
350354 let wallet_sync_interval_secs =
351355 self . config . wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
@@ -375,6 +379,12 @@ impl Node {
375379 let unix_time_secs_opt =
376380 SystemTime :: now( ) . duration_since( UNIX_EPOCH ) . ok( ) . map( |d| d. as_secs( ) ) ;
377381 * 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+ ) ;
378388 }
379389 Err ( e) => {
380390 log_error!( sync_logger, "Background sync of Lightning wallet failed: {}" , e)
@@ -1077,14 +1087,17 @@ impl Node {
10771087 let wallet = Arc :: clone ( & self . wallet ) ;
10781088 let tx_sync = Arc :: clone ( & self . tx_sync ) ;
10791089 let sync_cman = Arc :: clone ( & self . channel_manager ) ;
1090+ let archive_cman = Arc :: clone ( & self . channel_manager ) ;
10801091 let sync_cmon = Arc :: clone ( & self . chain_monitor ) ;
1092+ let archive_cmon = Arc :: clone ( & self . chain_monitor ) ;
10811093 let sync_sweeper = Arc :: clone ( & self . output_sweeper ) ;
10821094 let sync_logger = Arc :: clone ( & self . logger ) ;
10831095 let confirmables = vec ! [
10841096 & * sync_cman as & ( dyn Confirm + Sync + Send ) ,
10851097 & * sync_cmon as & ( dyn Confirm + Sync + Send ) ,
10861098 & * sync_sweeper as & ( dyn Confirm + Sync + Send ) ,
10871099 ] ;
1100+ let sync_monitor_archival_height = Arc :: clone ( & self . latest_channel_monitor_archival_height ) ;
10881101
10891102 tokio:: task:: block_in_place ( move || {
10901103 tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
@@ -1112,6 +1125,12 @@ impl Node {
11121125 "Sync of Lightning wallet finished in {}ms." ,
11131126 now. elapsed( ) . as_millis( )
11141127 ) ;
1128+
1129+ periodically_archive_fully_resolved_monitors (
1130+ archive_cman,
1131+ archive_cmon,
1132+ sync_monitor_archival_height,
1133+ ) ;
11151134 Ok ( ( ) )
11161135 } ,
11171136 Err ( e) => {
@@ -1358,3 +1377,19 @@ pub struct NodeStatus {
13581377 /// Will be `None` if we have no public channels or we haven't broadcasted since the [`Node`] was initialized.
13591378 pub latest_node_announcement_broadcast_timestamp : Option < u64 > ,
13601379}
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