Skip to content

Commit bf03d4c

Browse files
On retryable update_fail, don't queue redundant PendingHTLCsForwardable
1 parent 5ea433f commit bf03d4c

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

lightning/src/ln/outbound_payment.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,21 @@ impl OutboundPayments {
10271027
let mut session_priv_bytes = [0; 32];
10281028
session_priv_bytes.copy_from_slice(&session_priv[..]);
10291029
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+
10301045
let mut all_paths_failed = false;
10311046
let mut full_failure_ev = None;
10321047
let mut pending_retry_ev = None;
@@ -1120,7 +1135,7 @@ impl OutboundPayments {
11201135
}
11211136
// If we miss abandoning the payment above, we *must* generate an event here or else the
11221137
// payment will sit in our outbounds forever.
1123-
if attempts_remaining {
1138+
if attempts_remaining && !already_awaiting_retry {
11241139
debug_assert!(full_failure_ev.is_none());
11251140
pending_retry_ev = Some(events::Event::PendingHTLCsForwardable {
11261141
time_forwardable: Duration::from_millis(MIN_HTLC_RELAY_HOLDING_CELL_MILLIS),

lightning/src/ln/payment_tests.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2349,7 +2349,7 @@ fn no_extra_retries_on_back_to_back_fail() {
23492349
// Because we now retry payments as a batch, we simply return a single-path route in the
23502350
// second, batched, request, have that fail, ensure the payment was abandoned.
23512351
let mut events = nodes[0].node.get_and_clear_pending_events();
2352-
assert_eq!(events.len(), 4);
2352+
assert_eq!(events.len(), 3);
23532353
match events[0] {
23542354
Event::PaymentPathFailed { payment_hash: ev_payment_hash, payment_failed_permanently, .. } => {
23552355
assert_eq!(payment_hash, ev_payment_hash);
@@ -2368,10 +2368,6 @@ fn no_extra_retries_on_back_to_back_fail() {
23682368
},
23692369
_ => panic!("Unexpected event"),
23702370
}
2371-
match events[3] {
2372-
Event::PendingHTLCsForwardable { .. } => {},
2373-
_ => panic!("Unexpected event"),
2374-
}
23752371

23762372
nodes[0].node.process_pending_htlc_forwards();
23772373
let retry_htlc_updates = SendEvent::from_node(&nodes[0]);

0 commit comments

Comments
 (0)