@@ -1027,6 +1027,21 @@ impl OutboundPayments {
1027
1027
let mut session_priv_bytes = [ 0 ; 32 ] ;
1028
1028
session_priv_bytes. copy_from_slice ( & session_priv[ ..] ) ;
1029
1029
let mut outbounds = self . pending_outbound_payments . lock ( ) . unwrap ( ) ;
1030
+
1031
+ // If any payments already need retry, there's no need to generate a redundant
1032
+ // `PendingHTLCsForwardable`.
1033
+ let already_awaiting_retry = outbounds. iter ( ) . any ( |( _, pmt) | {
1034
+ let mut awaiting_retry = false ;
1035
+ if pmt. is_auto_retryable_now ( ) {
1036
+ if let PendingOutboundPayment :: Retryable { pending_amt_msat, total_msat, .. } = pmt {
1037
+ if pending_amt_msat < total_msat {
1038
+ awaiting_retry = true ;
1039
+ }
1040
+ }
1041
+ }
1042
+ awaiting_retry
1043
+ } ) ;
1044
+
1030
1045
let mut all_paths_failed = false ;
1031
1046
let mut full_failure_ev = None ;
1032
1047
let mut pending_retry_ev = None ;
@@ -1120,7 +1135,7 @@ impl OutboundPayments {
1120
1135
}
1121
1136
// If we miss abandoning the payment above, we *must* generate an event here or else the
1122
1137
// payment will sit in our outbounds forever.
1123
- if attempts_remaining {
1138
+ if attempts_remaining && !already_awaiting_retry {
1124
1139
debug_assert ! ( full_failure_ev. is_none( ) ) ;
1125
1140
pending_retry_ev = Some ( events:: Event :: PendingHTLCsForwardable {
1126
1141
time_forwardable : Duration :: from_millis ( MIN_HTLC_RELAY_HOLDING_CELL_MILLIS ) ,
0 commit comments