@@ -796,13 +796,12 @@ macro_rules! handle_monitor_err {
796
796
( $self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr) => {
797
797
handle_monitor_err!( $self, $err, $channel_state, $entry, $action_type, $resend_raa, $resend_commitment, Vec :: new( ) , Vec :: new( ) )
798
798
} ;
799
- ( $self: ident, $err: expr, $channel_state : expr, $entry : expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr) => {
799
+ ( $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) => {
800
800
match $err {
801
801
ChannelMonitorUpdateErr :: PermanentFailure => {
802
- log_error!( $self. logger, "Closing channel {} due to monitor update PermanentFailure" , log_bytes!( $entry. key( ) [ ..] ) ) ;
803
- let ( channel_id, mut chan) = $entry. remove_entry( ) ;
804
- if let Some ( short_id) = chan. get_short_channel_id( ) {
805
- $channel_state. short_to_id. remove( & short_id) ;
802
+ log_error!( $self. logger, "Closing channel {} due to monitor update ChannelMonitorUpdateErr::PermanentFailure" , log_bytes!( $chan_id[ ..] ) ) ;
803
+ if let Some ( short_id) = $chan. get_short_channel_id( ) {
804
+ $short_to_id. remove( & short_id) ;
806
805
}
807
806
// TODO: $failed_fails is dropped here, which will cause other channels to hit the
808
807
// chain in a confused state! We need to move them into the ChannelMonitor which
@@ -813,12 +812,12 @@ macro_rules! handle_monitor_err {
813
812
// splitting hairs we'd prefer to claim payments that were to us, but we haven't
814
813
// given up the preimage yet, so might as well just wait until the payment is
815
814
// retried, avoiding the on-chain fees.
816
- 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( ) ) ) ;
817
- res
815
+ 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( ) ) ) ;
816
+ ( res, true )
818
817
} ,
819
818
ChannelMonitorUpdateErr :: TemporaryFailure => {
820
819
log_info!( $self. logger, "Disabling channel {} due to monitor update TemporaryFailure. On restore will send {} and process {} forwards and {} fails" ,
821
- log_bytes!( $entry . key ( ) [ ..] ) ,
820
+ log_bytes!( $chan_id [ ..] ) ,
822
821
if $resend_commitment && $resend_raa {
823
822
match $action_type {
824
823
RAACommitmentOrder :: CommitmentFirst => { "commitment then RAA" } ,
@@ -835,11 +834,18 @@ macro_rules! handle_monitor_err {
835
834
if !$resend_raa {
836
835
debug_assert!( $action_type == RAACommitmentOrder :: CommitmentFirst || !$resend_commitment) ;
837
836
}
838
- $entry . get_mut ( ) . monitor_update_failed( $resend_raa, $resend_commitment, $failed_forwards, $failed_fails) ;
839
- Err ( MsgHandleErrInternal :: from_chan_no_close( ChannelError :: Ignore ( "Failed to update ChannelMonitor" . to_owned( ) ) , * $entry . key ( ) ) )
837
+ $chan . monitor_update_failed( $resend_raa, $resend_commitment, $failed_forwards, $failed_fails) ;
838
+ ( Err ( MsgHandleErrInternal :: from_chan_no_close( ChannelError :: Ignore ( "Failed to update ChannelMonitor" . to_owned( ) ) , * $chan_id ) ) , false )
840
839
} ,
841
840
}
842
- }
841
+ } ;
842
+ ( $self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr) => { {
843
+ 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( ) ) ;
844
+ if drop {
845
+ $entry. remove_entry( ) ;
846
+ }
847
+ res
848
+ } } ;
843
849
}
844
850
845
851
macro_rules! return_monitor_err {
@@ -3406,6 +3412,57 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3406
3412
}
3407
3413
}
3408
3414
3415
+ /// Check the holding cell in each channel and free any pending HTLCs in them if possible.
3416
+ /// This should only apply to HTLCs which were added to the holding cell because we were
3417
+ /// waiting on a monitor update to finish. In that case, we don't want to free the holding cell
3418
+ /// directly in `channel_monitor_updated` as it may introduce deadlocks calling back into user
3419
+ /// code to inform them of a channel monitor update.
3420
+ fn check_free_holding_cells ( & self ) {
3421
+ let mut forwarding_failed_htlcs = Vec :: new ( ) ;
3422
+ let mut handle_errors = Vec :: new ( ) ;
3423
+ {
3424
+ let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
3425
+ let channel_state = & mut * channel_state_lock;
3426
+ let by_id = & mut channel_state. by_id ;
3427
+ let short_to_id = & mut channel_state. short_to_id ;
3428
+ let pending_msg_events = & mut channel_state. pending_msg_events ;
3429
+
3430
+ by_id. retain ( |channel_id, chan| {
3431
+ match chan. maybe_free_holding_cell_htlcs ( & self . logger ) {
3432
+ Ok ( ( None , ref htlcs) ) if htlcs. is_empty ( ) => true ,
3433
+ Ok ( ( commitment_opt, failed_htlcs) ) => {
3434
+ forwarding_failed_htlcs. push ( ( failed_htlcs, * channel_id) ) ;
3435
+ if let Some ( ( commitment_update, monitor_update) ) = commitment_opt {
3436
+ if let Err ( e) = self . chain_monitor . update_channel ( chan. get_funding_txo ( ) . unwrap ( ) , monitor_update) {
3437
+ let ( res, close_channel) = handle_monitor_err ! ( self , e, short_to_id, chan, RAACommitmentOrder :: CommitmentFirst , false , true , Vec :: new( ) , Vec :: new( ) , channel_id) ;
3438
+ handle_errors. push ( ( chan. get_counterparty_node_id ( ) , res) ) ;
3439
+ if close_channel { return false ; }
3440
+ } else {
3441
+ pending_msg_events. push ( events:: MessageSendEvent :: UpdateHTLCs {
3442
+ node_id : chan. get_counterparty_node_id ( ) ,
3443
+ updates : commitment_update,
3444
+ } ) ;
3445
+ }
3446
+ }
3447
+ true
3448
+ } ,
3449
+ Err ( e) => {
3450
+ let ( close_channel, res) = convert_chan_err ! ( self , e, short_to_id, chan, channel_id) ;
3451
+ handle_errors. push ( ( chan. get_counterparty_node_id ( ) , Err ( res) ) ) ;
3452
+ !close_channel
3453
+ }
3454
+ }
3455
+ } ) ;
3456
+ }
3457
+ for ( failures, channel_id) in forwarding_failed_htlcs. drain ( ..) {
3458
+ self . fail_holding_cell_htlcs ( failures, channel_id) ;
3459
+ }
3460
+
3461
+ for ( counterparty_node_id, err) in handle_errors. drain ( ..) {
3462
+ let _ = handle_error ! ( self , err, counterparty_node_id) ;
3463
+ }
3464
+ }
3465
+
3409
3466
/// Handle a list of channel failures during a block_connected or block_disconnected call,
3410
3467
/// pushing the channel monitor update (if any) to the background events queue and removing the
3411
3468
/// Channel object.
@@ -3542,6 +3599,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> MessageSend
3542
3599
// ChannelMonitors when clearing other events.
3543
3600
self . process_pending_monitor_events ( ) ;
3544
3601
3602
+ self . check_free_holding_cells ( ) ;
3603
+
3545
3604
let mut ret = Vec :: new ( ) ;
3546
3605
let mut channel_state = self . channel_state . lock ( ) . unwrap ( ) ;
3547
3606
mem:: swap ( & mut ret, & mut channel_state. pending_msg_events ) ;
0 commit comments