Skip to content

Commit 4f51848

Browse files
committed
f - Parameterize maximum payment retry attempts
1 parent b0f1f5a commit 4f51848

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

lightning-invoice/src/payment.rs

Lines changed: 18 additions & 9 deletions
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);
@@ -322,7 +328,8 @@ mod tests {
322328
let payer = TestPayer::new();
323329
let router = NullRouter {};
324330
let logger = TestLogger::new();
325-
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler);
331+
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler)
332+
.with_retry_attempts(2);
326333

327334
let payment_preimage = PaymentPreimage([1; 32]);
328335
let invoice = invoice(payment_preimage);
@@ -355,7 +362,8 @@ mod tests {
355362
let payer = TestPayer::new().fails_on_attempt(2);
356363
let router = NullRouter {};
357364
let logger = TestLogger::new();
358-
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler);
365+
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler)
366+
.with_retry_attempts(2);
359367

360368
let payment_preimage = PaymentPreimage([1; 32]);
361369
let invoice = invoice(payment_preimage);
@@ -380,7 +388,8 @@ mod tests {
380388
let payer = TestPayer::new();
381389
let router = NullRouter {};
382390
let logger = TestLogger::new();
383-
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler);
391+
let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler)
392+
.with_retry_attempts(2);
384393

385394
let payment_preimage = PaymentPreimage([1; 32]);
386395
let invoice = invoice(payment_preimage);

0 commit comments

Comments
 (0)