@@ -49,7 +49,7 @@ use crate::chain::Filter;
49
49
use crate :: util:: logger:: Logger ;
50
50
use crate :: util:: ser:: { Readable , ReadableArgs , RequiredWrapper , MaybeReadable , UpgradableRequired , Writer , Writeable , U48 } ;
51
51
use crate :: util:: byte_utils;
52
- use crate :: events:: Event ;
52
+ use crate :: events:: { Event , EventHandler } ;
53
53
use crate :: events:: bump_transaction:: { AnchorDescriptor , HTLCDescriptor , BumpTransactionEvent } ;
54
54
55
55
use crate :: prelude:: * ;
@@ -738,11 +738,6 @@ impl Readable for IrrevocablyResolvedHTLC {
738
738
/// You MUST ensure that no ChannelMonitors for a given channel anywhere contain out-of-date
739
739
/// information and are actively monitoring the chain.
740
740
///
741
- /// Pending Events or updated HTLCs which have not yet been read out by
742
- /// get_and_clear_pending_monitor_events or get_and_clear_pending_events are serialized to disk and
743
- /// reloaded at deserialize-time. Thus, you must ensure that, when handling events, all events
744
- /// gotten are fully handled before re-serializing the new state.
745
- ///
746
741
/// Note that the deserializer is only implemented for (BlockHash, ChannelMonitor), which
747
742
/// tells you the last block hash which was block_connect()ed. You MUST rescan any blocks along
748
743
/// the "reorg path" (ie disconnecting blocks until you find a common ancestor from both the
@@ -752,7 +747,7 @@ pub struct ChannelMonitor<Signer: WriteableEcdsaChannelSigner> {
752
747
#[ cfg( test) ]
753
748
pub ( crate ) inner : Mutex < ChannelMonitorImpl < Signer > > ,
754
749
#[ cfg( not( test) ) ]
755
- inner : Mutex < ChannelMonitorImpl < Signer > > ,
750
+ pub ( super ) inner : Mutex < ChannelMonitorImpl < Signer > > ,
756
751
}
757
752
758
753
#[ derive( PartialEq ) ]
@@ -829,7 +824,8 @@ pub(crate) struct ChannelMonitorImpl<Signer: WriteableEcdsaChannelSigner> {
829
824
// we further MUST NOT generate events during block/transaction-disconnection.
830
825
pending_monitor_events : Vec < MonitorEvent > ,
831
826
832
- pending_events : Vec < Event > ,
827
+ pub ( super ) pending_events : Vec < Event > ,
828
+ pub ( super ) is_processing_pending_events : bool ,
833
829
834
830
// Used to track on-chain events (i.e., transactions part of channels confirmed on chain) on
835
831
// which to take actions once they reach enough confirmations. Each entry includes the
@@ -1088,6 +1084,42 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for ChannelMonitorImpl<Signe
1088
1084
}
1089
1085
}
1090
1086
1087
+ macro_rules! _process_events_body {
1088
+ ( $self_opt: expr, $event_to_handle: expr, $handle_event: expr) => {
1089
+ loop {
1090
+ let ( pending_events, repeated_events) ;
1091
+ if let Some ( us) = $self_opt {
1092
+ let mut inner = us. inner. lock( ) . unwrap( ) ;
1093
+ if inner. is_processing_pending_events {
1094
+ break ;
1095
+ }
1096
+ inner. is_processing_pending_events = true ;
1097
+
1098
+ pending_events = inner. pending_events. clone( ) ;
1099
+ repeated_events = inner. get_repeated_events( ) ;
1100
+ } else { break ; }
1101
+ let num_events = pending_events. len( ) ;
1102
+
1103
+ for event in pending_events. into_iter( ) . chain( repeated_events. into_iter( ) ) {
1104
+ $event_to_handle = event;
1105
+ $handle_event;
1106
+ }
1107
+
1108
+ if let Some ( us) = $self_opt {
1109
+ let mut inner = us. inner. lock( ) . unwrap( ) ;
1110
+ inner. pending_events. drain( ..num_events) ;
1111
+ inner. is_processing_pending_events = false ;
1112
+ if !inner. pending_events. is_empty( ) {
1113
+ // If there's more events to process, go ahead and do so.
1114
+ continue ;
1115
+ }
1116
+ }
1117
+ break ;
1118
+ }
1119
+ }
1120
+ }
1121
+ pub ( super ) use _process_events_body as process_events_body;
1122
+
1091
1123
impl < Signer : WriteableEcdsaChannelSigner > ChannelMonitor < Signer > {
1092
1124
/// For lockorder enforcement purposes, we need to have a single site which constructs the
1093
1125
/// `inner` mutex, otherwise cases where we lock two monitors at the same time (eg in our
@@ -1179,6 +1211,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitor<Signer> {
1179
1211
payment_preimages : HashMap :: new ( ) ,
1180
1212
pending_monitor_events : Vec :: new ( ) ,
1181
1213
pending_events : Vec :: new ( ) ,
1214
+ is_processing_pending_events : false ,
1182
1215
1183
1216
onchain_events_awaiting_threshold_conf : Vec :: new ( ) ,
1184
1217
outputs_to_watch,
@@ -1306,16 +1339,41 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitor<Signer> {
1306
1339
self . inner . lock ( ) . unwrap ( ) . get_and_clear_pending_monitor_events ( )
1307
1340
}
1308
1341
1309
- /// Gets the list of pending events which were generated by previous actions, clearing the list
1310
- /// in the process.
1342
+ /// Processes [`SpendableOutputs`] events produced from each [`ChannelMonitor`] upon maturity.
1343
+ ///
1344
+ /// For channels featuring anchor outputs, this method will also process [`BumpTransaction`]
1345
+ /// events produced from each [`ChannelMonitor`] while there is a balance to claim onchain
1346
+ /// within each channel. As the confirmation of a commitment transaction may be critical to the
1347
+ /// safety of funds, we recommend invoking this every 30 seconds, or lower if running in an
1348
+ /// environment with spotty connections, like on mobile.
1311
1349
///
1312
- /// This is called by the [`EventsProvider::process_pending_events`] implementation for
1313
- /// [`ChainMonitor`].
1350
+ /// An [`EventHandler`] may safely call back to the provider, though this shouldn't be needed in
1351
+ /// order to handle these events.
1352
+ ///
1353
+ /// [`SpendableOutputs`]: crate::events::Event::SpendableOutputs
1354
+ /// [`BumpTransaction`]: crate::events::Event::BumpTransaction
1355
+ pub fn process_pending_events < H : Deref > ( & self , handler : & H ) where H :: Target : EventHandler {
1356
+ let mut ev;
1357
+ process_events_body ! ( Some ( self ) , ev, handler. handle_event( ev) ) ;
1358
+ }
1359
+
1360
+ /// Processes any events asynchronously.
1314
1361
///
1315
- /// [`EventsProvider::process_pending_events`]: crate::events::EventsProvider::process_pending_events
1316
- /// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor
1362
+ /// See [`Self::process_pending_events`] for more information.
1363
+ pub async fn process_pending_events_async < Future : core:: future:: Future , H : Fn ( Event ) -> Future > (
1364
+ & self , handler : & H
1365
+ ) {
1366
+ let mut ev;
1367
+ process_events_body ! ( Some ( self ) , ev, { handler( ev) . await } ) ;
1368
+ }
1369
+
1370
+ #[ cfg( test) ]
1317
1371
pub fn get_and_clear_pending_events ( & self ) -> Vec < Event > {
1318
- self . inner . lock ( ) . unwrap ( ) . get_and_clear_pending_events ( )
1372
+ let mut ret = Vec :: new ( ) ;
1373
+ let mut lck = self . inner . lock ( ) . unwrap ( ) ;
1374
+ mem:: swap ( & mut ret, & mut lck. pending_events ) ;
1375
+ ret. append ( & mut lck. get_repeated_events ( ) ) ;
1376
+ ret
1319
1377
}
1320
1378
1321
1379
pub ( crate ) fn get_min_seen_secret ( & self ) -> u64 {
@@ -2531,10 +2589,13 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
2531
2589
ret
2532
2590
}
2533
2591
2534
- pub fn get_and_clear_pending_events ( & mut self ) -> Vec < Event > {
2535
- let mut ret = Vec :: new ( ) ;
2536
- mem:: swap ( & mut ret, & mut self . pending_events ) ;
2537
- for ( claim_id, claim_event) in self . onchain_tx_handler . get_and_clear_pending_claim_events ( ) . drain ( ..) {
2592
+ /// Gets the set of events that are repeated regularly (e.g. those which RBF bump
2593
+ /// transactions). We're okay if we lose these on restart as they'll be regenerated for us at
2594
+ /// some regular interval via [`ChannelMonitor::rebroadcast_pending_claims`].
2595
+ pub ( super ) fn get_repeated_events ( & mut self ) -> Vec < Event > {
2596
+ let pending_claim_events = self . onchain_tx_handler . get_and_clear_pending_claim_events ( ) ;
2597
+ let mut ret = Vec :: with_capacity ( pending_claim_events. len ( ) ) ;
2598
+ for ( claim_id, claim_event) in pending_claim_events {
2538
2599
match claim_event {
2539
2600
ClaimEvent :: BumpCommitment {
2540
2601
package_target_feerate_sat_per_1000_weight, commitment_tx, anchor_output_idx,
@@ -4096,6 +4157,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
4096
4157
payment_preimages,
4097
4158
pending_monitor_events : pending_monitor_events. unwrap ( ) ,
4098
4159
pending_events,
4160
+ is_processing_pending_events : false ,
4099
4161
4100
4162
onchain_events_awaiting_threshold_conf,
4101
4163
outputs_to_watch,
0 commit comments