Skip to content

Commit 01c26f8

Browse files
committed
f - Parameterize maximum payment retry attempts
1 parent 81dc4b5 commit 01c26f8

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

lightning-invoice/src/payment.rs

+18-9
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ use std::collections::hash_map::{self, HashMap};
4848
use std::ops::Deref;
4949
use std::sync::Mutex;
5050

51-
/// The maximum number of payment attempts before forwarding the [`Event::PaymentFailed`] to be
52-
/// handled.
53-
const MAX_PAYMENT_ATTEMPTS: usize = 3;
54-
5551
/// A utility for paying [`Invoice]`s.
5652
pub struct InvoicePayer<P: Deref, R, L: Deref, E>
5753
where
@@ -67,6 +63,7 @@ where
6763
// Lock order: payment_attempts -> invoice_cache
6864
invoice_cache: Mutex<HashMap<PaymentHash, Invoice>>,
6965
payment_attempts: Mutex<HashMap<PaymentHash, usize>>,
66+
retry_attempts: usize,
7067
}
7168

7269
/// A trait defining behavior of an [`Invoice`] payer.
@@ -126,9 +123,16 @@ where
126123
event_handler,
127124
invoice_cache: Mutex::new(HashMap::new()),
128125
payment_attempts: Mutex::new(HashMap::new()),
126+
retry_attempts: 0,
129127
}
130128
}
131129

130+
/// Sets the maximum number of payment retry attempts before forwarding the
131+
/// [`Event::PaymentFailed`] event to be handled by the decorated [`EventHandler`].
132+
pub fn with_retry_attempts(self, retry_attempts: usize) -> Self {
133+
Self { retry_attempts, ..self }
134+
}
135+
132136
/// Pays the given [`Invoice`], caching it for later use if a retry is needed.
133137
pub fn pay_invoice(&self, invoice: &Invoice) -> Result<(), PaymentError> {
134138
let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
@@ -201,7 +205,8 @@ where
201205
.and_modify(|attempts| *attempts += 1)
202206
.or_insert(1);
203207
if !rejected_by_dest {
204-
if *attempts < MAX_PAYMENT_ATTEMPTS {
208+
let max_payment_attempts = self.retry_attempts + 1;
209+
if *attempts < max_payment_attempts {
205210
if self.pay_cached_invoice(payment_hash).is_ok() {
206211
log_trace!(self.logger, "Payment {} failed; retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
207212
return;
@@ -293,7 +298,8 @@ mod tests {
293298
let payer = TestPayer::new();
294299
let router = NullRouter {};
295300
let logger = TestLogger::new();
296-
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler);
301+
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler)
302+
.with_retry_attempts(2);
297303

298304
let payment_preimage = PaymentPreimage([1; 32]);
299305
let invoice = invoice(payment_preimage);
@@ -318,7 +324,8 @@ mod tests {
318324
let payer = TestPayer::new();
319325
let router = NullRouter {};
320326
let logger = TestLogger::new();
321-
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler);
327+
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler)
328+
.with_retry_attempts(2);
322329

323330
let payment_preimage = PaymentPreimage([1; 32]);
324331
let invoice = invoice(payment_preimage);
@@ -347,7 +354,8 @@ mod tests {
347354
let payer = TestPayer::new().fails_on_attempt(2);
348355
let router = NullRouter {};
349356
let logger = TestLogger::new();
350-
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler);
357+
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler)
358+
.with_retry_attempts(2);
351359

352360
let payment_preimage = PaymentPreimage([1; 32]);
353361
let invoice = invoice(payment_preimage);
@@ -368,7 +376,8 @@ mod tests {
368376
let payer = TestPayer::new();
369377
let router = NullRouter {};
370378
let logger = TestLogger::new();
371-
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler);
379+
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler)
380+
.with_retry_attempts(2);
372381

373382
let payment_preimage = PaymentPreimage([1; 32]);
374383
let invoice = invoice(payment_preimage);

0 commit comments

Comments
 (0)