Skip to content

Commit 3859b4c

Browse files
When processing pending htlcs, abandon outbounds that are not retryable
1 parent fd0f982 commit 3859b4c

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

lightning/src/ln/outbound_payment.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -505,10 +505,12 @@ impl OutboundPayments {
505505
loop {
506506
let mut outbounds = self.pending_outbound_payments.lock().unwrap();
507507
let mut retry_id_route_params = None;
508-
for (pmt_id, pmt) in outbounds.iter_mut() {
509-
if pmt.is_auto_retryable_now() {
510-
if let PendingOutboundPayment::Retryable { pending_amt_msat, total_msat, payment_params: Some(params), .. } = pmt {
511-
if pending_amt_msat < total_msat {
508+
outbounds.retain(|pmt_id, pmt| {
509+
let mut retain = true;
510+
let auto_retryable = pmt.is_auto_retryable_now();
511+
if let PendingOutboundPayment::Retryable { pending_amt_msat, total_msat, payment_params: Some(params), .. } = pmt {
512+
if pending_amt_msat < total_msat {
513+
if auto_retryable {
512514
retry_id_route_params = Some((*pmt_id, RouteParameters {
513515
final_value_msat: *total_msat - *pending_amt_msat,
514516
final_cltv_expiry_delta:
@@ -517,13 +519,19 @@ impl OutboundPayments {
517519
debug_assert!(false, "We always set the final_cltv_expiry_delta when a path fails");
518520
LDK_DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA.into()
519521
},
520-
payment_params: params.clone(),
522+
payment_params: params.clone(),
521523
}));
522-
break
524+
} else if pmt.mark_abandoned().is_ok() && pmt.remaining_parts() == 0 {
525+
pending_events.lock().unwrap().push(events::Event::PaymentFailed {
526+
payment_id: *pmt_id,
527+
payment_hash: pmt.payment_hash().expect("PendingOutboundPayments::RetriesExceeded always has a payment hash set"),
528+
});
529+
retain = false;
523530
}
524531
}
525532
}
526-
}
533+
retain
534+
});
527535
core::mem::drop(outbounds);
528536
if let Some((payment_id, route_params)) = retry_id_route_params {
529537
if let Err(e) = self.pay_internal(payment_id, None, route_params, router, first_hops(), inflight_htlcs(), entropy_source, node_signer, best_block_height, logger, &send_payment_along_path) {

lightning/src/ln/payment_tests.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1682,7 +1682,6 @@ fn do_automatic_retries(test: AutoRetry) {
16821682
let mut msg_events = nodes[0].node.get_and_clear_pending_msg_events();
16831683
assert_eq!(msg_events.len(), 0);
16841684

1685-
nodes[0].node.abandon_payment(PaymentId(payment_hash.0));
16861685
let mut events = nodes[0].node.get_and_clear_pending_events();
16871686
assert_eq!(events.len(), 1);
16881687
match events[0] {
@@ -1717,7 +1716,6 @@ fn do_automatic_retries(test: AutoRetry) {
17171716
let mut msg_events = nodes[0].node.get_and_clear_pending_msg_events();
17181717
assert_eq!(msg_events.len(), 0);
17191718

1720-
nodes[0].node.abandon_payment(PaymentId(payment_hash.0));
17211719
let mut events = nodes[0].node.get_and_clear_pending_events();
17221720
assert_eq!(events.len(), 1);
17231721
match events[0] {

0 commit comments

Comments
 (0)