@@ -755,13 +755,12 @@ macro_rules! handle_monitor_err {
755
755
( $self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr) => {
756
756
handle_monitor_err!( $self, $err, $channel_state, $entry, $action_type, $resend_raa, $resend_commitment, Vec :: new( ) , Vec :: new( ) )
757
757
} ;
758
- ( $self: ident, $err: expr, $channel_state : expr, $entry : expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr) => {
758
+ ( $self: ident, $err: expr, $short_to_id : expr, $chan : expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr , $chan_id : expr) => {
759
759
match $err {
760
760
ChannelMonitorUpdateErr :: PermanentFailure => {
761
- log_error!( $self. logger, "Closing channel {} due to monitor update PermanentFailure" , log_bytes!( $entry. key( ) [ ..] ) ) ;
762
- let ( channel_id, mut chan) = $entry. remove_entry( ) ;
763
- if let Some ( short_id) = chan. get_short_channel_id( ) {
764
- $channel_state. short_to_id. remove( & short_id) ;
761
+ log_error!( $self. logger, "Closing channel {} due to monitor update ChannelMonitorUpdateErr::PermanentFailure" , log_bytes!( $chan_id[ ..] ) ) ;
762
+ if let Some ( short_id) = $chan. get_short_channel_id( ) {
763
+ $short_to_id. remove( & short_id) ;
765
764
}
766
765
// TODO: $failed_fails is dropped here, which will cause other channels to hit the
767
766
// chain in a confused state! We need to move them into the ChannelMonitor which
@@ -772,12 +771,12 @@ macro_rules! handle_monitor_err {
772
771
// splitting hairs we'd prefer to claim payments that were to us, but we haven't
773
772
// given up the preimage yet, so might as well just wait until the payment is
774
773
// retried, avoiding the on-chain fees.
775
- let res: Result <( ) , _> = Err ( MsgHandleErrInternal :: from_finish_shutdown( "ChannelMonitor storage failure" . to_owned( ) , channel_id , chan. force_shutdown( true ) , $self. get_channel_update( & chan) . ok( ) ) ) ;
776
- res
774
+ let res: Result <( ) , _> = Err ( MsgHandleErrInternal :: from_finish_shutdown( "ChannelMonitor storage failure" . to_owned( ) , * $chan_id , $ chan. force_shutdown( true ) , $self. get_channel_update( & $ chan) . ok( ) ) ) ;
775
+ ( res, true )
777
776
} ,
778
777
ChannelMonitorUpdateErr :: TemporaryFailure => {
779
778
log_info!( $self. logger, "Disabling channel {} due to monitor update TemporaryFailure. On restore will send {} and process {} forwards and {} fails" ,
780
- log_bytes!( $entry . key ( ) [ ..] ) ,
779
+ log_bytes!( $chan_id [ ..] ) ,
781
780
if $resend_commitment && $resend_raa {
782
781
match $action_type {
783
782
RAACommitmentOrder :: CommitmentFirst => { "commitment then RAA" } ,
@@ -794,11 +793,18 @@ macro_rules! handle_monitor_err {
794
793
if !$resend_raa {
795
794
debug_assert!( $action_type == RAACommitmentOrder :: CommitmentFirst || !$resend_commitment) ;
796
795
}
797
- $entry . get_mut ( ) . monitor_update_failed( $resend_raa, $resend_commitment, $failed_forwards, $failed_fails) ;
798
- Err ( MsgHandleErrInternal :: from_chan_no_close( ChannelError :: Ignore ( "Failed to update ChannelMonitor" . to_owned( ) ) , * $entry . key ( ) ) )
796
+ $chan . monitor_update_failed( $resend_raa, $resend_commitment, $failed_forwards, $failed_fails) ;
797
+ ( Err ( MsgHandleErrInternal :: from_chan_no_close( ChannelError :: Ignore ( "Failed to update ChannelMonitor" . to_owned( ) ) , * $chan_id ) ) , false )
799
798
} ,
800
799
}
801
- }
800
+ } ;
801
+ ( $self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr) => { {
802
+ let ( res, drop) = handle_monitor_err!( $self, $err, $channel_state. short_to_id, $entry. get_mut( ) , $action_type, $resend_raa, $resend_commitment, $failed_forwards, $failed_fails, $entry. key( ) ) ;
803
+ if drop {
804
+ $entry. remove_entry( ) ;
805
+ }
806
+ res
807
+ } } ;
802
808
}
803
809
804
810
macro_rules! return_monitor_err {
@@ -3319,6 +3325,57 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3319
3325
}
3320
3326
}
3321
3327
3328
+ /// Check the holding cell in each channel and free any pending HTLCs in them if possible.
3329
+ /// This should only apply to HTLCs which were added to the holding cell because we were
3330
+ /// waiting on a monitor update to finish. In that case, we don't want to free the holding cell
3331
+ /// directly in `channel_monitor_updated` as it may introduce deadlocks calling back into user
3332
+ /// code to inform them of a channel monitor update.
3333
+ fn check_free_holding_cells ( & self ) {
3334
+ let mut forwarding_failed_htlcs = Vec :: new ( ) ;
3335
+ let mut handle_errors = Vec :: new ( ) ;
3336
+ {
3337
+ let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
3338
+ let channel_state = & mut * channel_state_lock;
3339
+ let by_id = & mut channel_state. by_id ;
3340
+ let short_to_id = & mut channel_state. short_to_id ;
3341
+ let pending_msg_events = & mut channel_state. pending_msg_events ;
3342
+
3343
+ by_id. retain ( |channel_id, chan| {
3344
+ match chan. maybe_free_holding_cell_htlcs ( & self . logger ) {
3345
+ Ok ( ( None , ref htlcs) ) if htlcs. is_empty ( ) => true ,
3346
+ Ok ( ( commitment_opt, failed_htlcs) ) => {
3347
+ forwarding_failed_htlcs. push ( ( failed_htlcs, * channel_id) ) ;
3348
+ if let Some ( ( commitment_update, monitor_update) ) = commitment_opt {
3349
+ if let Err ( e) = self . chain_monitor . update_channel ( chan. get_funding_txo ( ) . unwrap ( ) , monitor_update) {
3350
+ let ( res, close_channel) = handle_monitor_err ! ( self , e, short_to_id, chan, RAACommitmentOrder :: CommitmentFirst , false , true , Vec :: new( ) , Vec :: new( ) , channel_id) ;
3351
+ handle_errors. push ( ( chan. get_counterparty_node_id ( ) , res) ) ;
3352
+ if close_channel { return false ; }
3353
+ } else {
3354
+ pending_msg_events. push ( events:: MessageSendEvent :: UpdateHTLCs {
3355
+ node_id : chan. get_counterparty_node_id ( ) ,
3356
+ updates : commitment_update,
3357
+ } ) ;
3358
+ }
3359
+ }
3360
+ true
3361
+ } ,
3362
+ Err ( e) => {
3363
+ let ( close_channel, res) = convert_chan_err ! ( self , e, short_to_id, chan, channel_id) ;
3364
+ handle_errors. push ( ( chan. get_counterparty_node_id ( ) , Err ( res) ) ) ;
3365
+ !close_channel
3366
+ }
3367
+ }
3368
+ } ) ;
3369
+ }
3370
+ for ( failures, channel_id) in forwarding_failed_htlcs. drain ( ..) {
3371
+ self . fail_holding_cell_htlcs ( failures, channel_id) ;
3372
+ }
3373
+
3374
+ for ( counterparty_node_id, err) in handle_errors. drain ( ..) {
3375
+ let _ = handle_error ! ( self , err, counterparty_node_id) ;
3376
+ }
3377
+ }
3378
+
3322
3379
/// Handle a list of channel failures during a block_connected or block_disconnected call,
3323
3380
/// pushing the channel monitor update (if any) to the background events queue and removing the
3324
3381
/// Channel object.
@@ -3355,6 +3412,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> MessageSend
3355
3412
// ChannelMonitors when clearing other events.
3356
3413
self . process_pending_monitor_events ( ) ;
3357
3414
3415
+ self . check_free_holding_cells ( ) ;
3416
+
3358
3417
let mut ret = Vec :: new ( ) ;
3359
3418
let mut channel_state = self . channel_state . lock ( ) . unwrap ( ) ;
3360
3419
mem:: swap ( & mut ret, & mut channel_state. pending_msg_events ) ;
0 commit comments