@@ -3728,16 +3728,19 @@ where
3728
3728
// being fully configured. See the docs for `ChannelManagerReadArgs` for more.
3729
3729
match source {
3730
3730
HTLCSource :: OutboundRoute { ref path, ref session_priv, ref payment_id, ref payment_params, .. } => {
3731
- self . pending_outbound_payments . fail_htlc ( source, payment_hash, onion_error, path, session_priv, payment_id, payment_params, self . probing_cookie_secret , & self . secp_ctx , & self . pending_events , & self . logger ) ;
3731
+ if self . pending_outbound_payments . fail_htlc ( source, payment_hash, onion_error, path,
3732
+ session_priv, payment_id, payment_params, self . probing_cookie_secret , & self . secp_ctx ,
3733
+ & self . pending_events , & self . logger ) . is_some ( )
3734
+ { self . push_pending_forwards_ev ( ) ; }
3732
3735
} ,
3733
3736
HTLCSource :: PreviousHopData ( HTLCPreviousHopData { ref short_channel_id, ref htlc_id, ref incoming_packet_shared_secret, ref phantom_shared_secret, ref outpoint } ) => {
3734
3737
log_trace ! ( self . logger, "Failing HTLC with payment_hash {} backwards from us with {:?}" , log_bytes!( payment_hash. 0 ) , onion_error) ;
3735
3738
let err_packet = onion_error. get_encrypted_failure_packet ( incoming_packet_shared_secret, phantom_shared_secret) ;
3736
3739
3737
- let mut forward_event = None ;
3740
+ let mut push_forward_ev = false ;
3738
3741
let mut forward_htlcs = self . forward_htlcs . lock ( ) . unwrap ( ) ;
3739
3742
if forward_htlcs. is_empty ( ) {
3740
- forward_event = Some ( Duration :: from_millis ( MIN_HTLC_RELAY_HOLDING_CELL_MILLIS ) ) ;
3743
+ push_forward_ev = true ;
3741
3744
}
3742
3745
match forward_htlcs. entry ( * short_channel_id) {
3743
3746
hash_map:: Entry :: Occupied ( mut entry) => {
@@ -3748,12 +3751,8 @@ where
3748
3751
}
3749
3752
}
3750
3753
mem:: drop ( forward_htlcs) ;
3754
+ if push_forward_ev { self . push_pending_forwards_ev ( ) ; }
3751
3755
let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
3752
- if let Some ( time) = forward_event {
3753
- pending_events. push ( events:: Event :: PendingHTLCsForwardable {
3754
- time_forwardable : time
3755
- } ) ;
3756
- }
3757
3756
pending_events. push ( events:: Event :: HTLCHandlingFailed {
3758
3757
prev_channel_id : outpoint. to_channel_id ( ) ,
3759
3758
failed_next_destination : destination,
@@ -4830,7 +4829,7 @@ where
4830
4829
#[ inline]
4831
4830
fn forward_htlcs ( & self , per_source_pending_forwards : & mut [ ( u64 , OutPoint , u128 , Vec < ( PendingHTLCInfo , u64 ) > ) ] ) {
4832
4831
for & mut ( prev_short_channel_id, prev_funding_outpoint, prev_user_channel_id, ref mut pending_forwards) in per_source_pending_forwards {
4833
- let mut forward_event = None ;
4832
+ let mut push_forward_event = false ;
4834
4833
let mut new_intercept_events = Vec :: new ( ) ;
4835
4834
let mut failed_intercept_forwards = Vec :: new ( ) ;
4836
4835
if !pending_forwards. is_empty ( ) {
@@ -4888,7 +4887,7 @@ where
4888
4887
// We don't want to generate a PendingHTLCsForwardable event if only intercepted
4889
4888
// payments are being processed.
4890
4889
if forward_htlcs_empty {
4891
- forward_event = Some ( Duration :: from_millis ( MIN_HTLC_RELAY_HOLDING_CELL_MILLIS ) ) ;
4890
+ push_forward_event = true ;
4892
4891
}
4893
4892
entry. insert ( vec ! ( HTLCForwardInfo :: AddHTLC ( PendingAddHTLCInfo {
4894
4893
prev_short_channel_id, prev_funding_outpoint, prev_htlc_id, prev_user_channel_id, forward_info } ) ) ) ;
@@ -4906,16 +4905,21 @@ where
4906
4905
let mut events = self . pending_events . lock ( ) . unwrap ( ) ;
4907
4906
events. append ( & mut new_intercept_events) ;
4908
4907
}
4908
+ if push_forward_event { self . push_pending_forwards_ev ( ) }
4909
+ }
4910
+ }
4909
4911
4910
- match forward_event {
4911
- Some ( time) => {
4912
- let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
4913
- pending_events. push ( events:: Event :: PendingHTLCsForwardable {
4914
- time_forwardable : time
4915
- } ) ;
4916
- }
4917
- None => { } ,
4918
- }
4912
+ // We only want to push a PendingHTLCsForwardable event if no others are queued.
4913
+ fn push_pending_forwards_ev ( & self ) {
4914
+ let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
4915
+ let forward_ev_exists = pending_events. iter ( )
4916
+ . find ( |ev| if let events:: Event :: PendingHTLCsForwardable { .. } = ev { true } else { false } )
4917
+ . is_some ( ) ;
4918
+ if !forward_ev_exists {
4919
+ pending_events. push ( events:: Event :: PendingHTLCsForwardable {
4920
+ time_forwardable :
4921
+ Duration :: from_millis ( MIN_HTLC_RELAY_HOLDING_CELL_MILLIS ) ,
4922
+ } ) ;
4919
4923
}
4920
4924
}
4921
4925
0 commit comments