@@ -400,28 +400,34 @@ where
400
400
/// If you have many stale updates stored (such as after a crash with pending lazy deletes), and
401
401
/// would like to get rid of them, consider using the
402
402
/// [`MonitorUpdatingPersister::cleanup_stale_updates`] function.
403
- pub struct MonitorUpdatingPersister < K : Deref , L : Deref , ES : Deref , SP : Deref >
403
+ pub struct MonitorUpdatingPersister < K : Deref , L : Deref , ES : Deref , SP : Deref , BI : Deref , FE : Deref >
404
404
where
405
405
K :: Target : KVStore ,
406
406
L :: Target : Logger ,
407
407
ES :: Target : EntropySource + Sized ,
408
408
SP :: Target : SignerProvider + Sized ,
409
+ BI :: Target : BroadcasterInterface ,
410
+ FE :: Target : FeeEstimator
409
411
{
410
412
kv_store : K ,
411
413
logger : L ,
412
414
maximum_pending_updates : u64 ,
413
415
entropy_source : ES ,
414
416
signer_provider : SP ,
417
+ broadcaster : BI ,
418
+ fee_estimator : FE
415
419
}
416
420
417
421
#[ allow( dead_code) ]
418
- impl < K : Deref , L : Deref , ES : Deref , SP : Deref >
419
- MonitorUpdatingPersister < K , L , ES , SP >
422
+ impl < K : Deref , L : Deref , ES : Deref , SP : Deref , BI : Deref , FE : Deref >
423
+ MonitorUpdatingPersister < K , L , ES , SP , BI , FE >
420
424
where
421
425
K :: Target : KVStore ,
422
426
L :: Target : Logger ,
423
427
ES :: Target : EntropySource + Sized ,
424
428
SP :: Target : SignerProvider + Sized ,
429
+ BI :: Target : BroadcasterInterface ,
430
+ FE :: Target : FeeEstimator
425
431
{
426
432
/// Constructs a new [`MonitorUpdatingPersister`].
427
433
///
@@ -441,14 +447,16 @@ where
441
447
/// [`MonitorUpdatingPersister::cleanup_stale_updates`].
442
448
pub fn new (
443
449
kv_store : K , logger : L , maximum_pending_updates : u64 , entropy_source : ES ,
444
- signer_provider : SP ,
450
+ signer_provider : SP , broadcaster : BI , fee_estimator : FE
445
451
) -> Self {
446
452
MonitorUpdatingPersister {
447
453
kv_store,
448
454
logger,
449
455
maximum_pending_updates,
450
456
entropy_source,
451
457
signer_provider,
458
+ broadcaster,
459
+ fee_estimator
452
460
}
453
461
}
454
462
@@ -639,13 +647,15 @@ where
639
647
}
640
648
}
641
649
642
- impl < ChannelSigner : EcdsaChannelSigner , K : Deref , L : Deref , ES : Deref , SP : Deref >
643
- Persist < ChannelSigner > for MonitorUpdatingPersister < K , L , ES , SP >
650
+ impl < ChannelSigner : EcdsaChannelSigner , K : Deref , L : Deref , ES : Deref , SP : Deref , BI : Deref , FE : Deref >
651
+ Persist < ChannelSigner > for MonitorUpdatingPersister < K , L , ES , SP , BI , FE >
644
652
where
645
653
K :: Target : KVStore ,
646
654
L :: Target : Logger ,
647
655
ES :: Target : EntropySource + Sized ,
648
656
SP :: Target : SignerProvider + Sized ,
657
+ BI :: Target : BroadcasterInterface ,
658
+ FE :: Target : FeeEstimator
649
659
{
650
660
/// Persists a new channel. This means writing the entire monitor to the
651
661
/// parametrized [`KVStore`].
@@ -770,13 +780,53 @@ where
770
780
Ok ( ( _block_hash, monitor) ) => monitor,
771
781
Err ( _) => return
772
782
} ;
783
+
784
+ let mut current_update_id = monitor. get_latest_update_id ( ) ;
785
+ loop {
786
+ current_update_id = match current_update_id. checked_add ( 1 ) {
787
+ Some ( next_update_id) => next_update_id,
788
+ None => break ,
789
+ } ;
790
+ let update_name = UpdateName :: from ( current_update_id) ;
791
+ let update = match self . read_monitor_update ( & monitor_name, & update_name) {
792
+ Ok ( update) => update,
793
+ Err ( err) if err. kind ( ) == io:: ErrorKind :: NotFound => {
794
+ // We can't find any more updates, so we are done.
795
+ break ;
796
+ }
797
+ Err ( err) => {
798
+ log_error ! (
799
+ self . logger,
800
+ "Monitor update read failed. monitor: {} update: {} reason: {:?}" ,
801
+ monitor_name. as_str( ) ,
802
+ update_name. as_str( ) ,
803
+ err
804
+ ) ;
805
+ panic ! ( )
806
+ } ,
807
+ } ;
808
+
809
+ monitor. update_monitor ( & update, & self . broadcaster , & self . fee_estimator , & self . logger )
810
+ . map_err ( |e| {
811
+ log_error ! (
812
+ self . logger,
813
+ "Monitor update failed. monitor: {} update: {} reason: {:?}" ,
814
+ monitor_name. as_str( ) ,
815
+ update_name. as_str( ) ,
816
+ e
817
+ ) ;
818
+ io:: Error :: new ( io:: ErrorKind :: Other , "Monitor update failed" )
819
+ } )
820
+ . expect ( "Could not apply monitor update during archiving" ) ;
821
+ }
822
+
773
823
match self . kv_store . write (
774
824
ARCHIVED_CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ,
775
825
ARCHIVED_CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ,
776
826
monitor_name. as_str ( ) ,
777
- & monitor. encode ( )
827
+ & monitor. encode ( ) ,
778
828
) {
779
- Ok ( ( ) ) => { } ,
829
+ Ok ( ( ) ) => { }
780
830
Err ( _e) => return ,
781
831
} ;
782
832
let _ = self . kv_store . remove (
@@ -788,12 +838,14 @@ where
788
838
}
789
839
}
790
840
791
- impl < K : Deref , L : Deref , ES : Deref , SP : Deref > MonitorUpdatingPersister < K , L , ES , SP >
841
+ impl < K : Deref , L : Deref , ES : Deref , SP : Deref , BI : Deref , FE : Deref > MonitorUpdatingPersister < K , L , ES , SP , BI , FE >
792
842
where
793
843
ES :: Target : EntropySource + Sized ,
794
844
K :: Target : KVStore ,
795
845
L :: Target : Logger ,
796
- SP :: Target : SignerProvider + Sized
846
+ SP :: Target : SignerProvider + Sized ,
847
+ BI :: Target : BroadcasterInterface ,
848
+ FE :: Target : FeeEstimator
797
849
{
798
850
// Cleans up monitor updates for given monitor in range `start..=end`.
799
851
fn cleanup_in_range ( & self , monitor_name : MonitorName , start : u64 , end : u64 ) {
@@ -962,13 +1014,17 @@ mod tests {
962
1014
maximum_pending_updates : persister_0_max_pending_updates,
963
1015
entropy_source : & chanmon_cfgs[ 0 ] . keys_manager ,
964
1016
signer_provider : & chanmon_cfgs[ 0 ] . keys_manager ,
1017
+ broadcaster : & chanmon_cfgs[ 0 ] . tx_broadcaster ,
1018
+ fee_estimator : & chanmon_cfgs[ 0 ] . fee_estimator ,
965
1019
} ;
966
1020
let persister_1 = MonitorUpdatingPersister {
967
1021
kv_store : & TestStore :: new ( false ) ,
968
1022
logger : & TestLogger :: new ( ) ,
969
1023
maximum_pending_updates : persister_1_max_pending_updates,
970
1024
entropy_source : & chanmon_cfgs[ 1 ] . keys_manager ,
971
1025
signer_provider : & chanmon_cfgs[ 1 ] . keys_manager ,
1026
+ broadcaster : & chanmon_cfgs[ 0 ] . tx_broadcaster ,
1027
+ fee_estimator : & chanmon_cfgs[ 0 ] . fee_estimator ,
972
1028
} ;
973
1029
let mut node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
974
1030
let chain_mon_0 = test_utils:: TestChainMonitor :: new (
@@ -1129,6 +1185,8 @@ mod tests {
1129
1185
maximum_pending_updates : 11 ,
1130
1186
entropy_source : node_cfgs[ 0 ] . keys_manager ,
1131
1187
signer_provider : node_cfgs[ 0 ] . keys_manager ,
1188
+ broadcaster : node_cfgs[ 0 ] . tx_broadcaster ,
1189
+ fee_estimator : node_cfgs[ 0 ] . fee_estimator ,
1132
1190
} ;
1133
1191
match ro_persister. persist_new_channel ( test_txo, & added_monitors[ 0 ] . 1 ) {
1134
1192
ChannelMonitorUpdateStatus :: UnrecoverableError => {
@@ -1168,13 +1226,17 @@ mod tests {
1168
1226
maximum_pending_updates : test_max_pending_updates,
1169
1227
entropy_source : & chanmon_cfgs[ 0 ] . keys_manager ,
1170
1228
signer_provider : & chanmon_cfgs[ 0 ] . keys_manager ,
1229
+ broadcaster : & chanmon_cfgs[ 0 ] . tx_broadcaster ,
1230
+ fee_estimator : & chanmon_cfgs[ 0 ] . fee_estimator ,
1171
1231
} ;
1172
1232
let persister_1 = MonitorUpdatingPersister {
1173
1233
kv_store : & TestStore :: new ( false ) ,
1174
1234
logger : & TestLogger :: new ( ) ,
1175
1235
maximum_pending_updates : test_max_pending_updates,
1176
1236
entropy_source : & chanmon_cfgs[ 1 ] . keys_manager ,
1177
1237
signer_provider : & chanmon_cfgs[ 1 ] . keys_manager ,
1238
+ broadcaster : & chanmon_cfgs[ 0 ] . tx_broadcaster ,
1239
+ fee_estimator : & chanmon_cfgs[ 0 ] . fee_estimator ,
1178
1240
} ;
1179
1241
let mut node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
1180
1242
let chain_mon_0 = test_utils:: TestChainMonitor :: new (
0 commit comments