@@ -48,10 +48,6 @@ use std::collections::hash_map::{self, HashMap};
48
48
use std:: ops:: Deref ;
49
49
use std:: sync:: Mutex ;
50
50
51
- /// The maximum number of payment attempts before forwarding the [`Event::PaymentFailed`] to be
52
- /// handled.
53
- const MAX_PAYMENT_ATTEMPTS : usize = 3 ;
54
-
55
51
/// A utility for paying [`Invoice]`s.
56
52
pub struct InvoicePayer < P : Deref , R , L : Deref , E >
57
53
where
67
63
// Lock order: payment_attempts -> invoice_cache
68
64
invoice_cache : Mutex < HashMap < PaymentHash , Invoice > > ,
69
65
payment_attempts : Mutex < HashMap < PaymentHash , usize > > ,
66
+ retry_attempts : usize ,
70
67
}
71
68
72
69
/// A trait defining behavior of an [`Invoice`] payer.
@@ -126,9 +123,16 @@ where
126
123
event_handler,
127
124
invoice_cache : Mutex :: new ( HashMap :: new ( ) ) ,
128
125
payment_attempts : Mutex :: new ( HashMap :: new ( ) ) ,
126
+ retry_attempts : 0 ,
129
127
}
130
128
}
131
129
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
+
132
136
/// Pays the given [`Invoice`], caching it for later use if a retry is needed.
133
137
pub fn pay_invoice ( & self , invoice : & Invoice ) -> Result < ( ) , PaymentError > {
134
138
let payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ;
@@ -201,7 +205,8 @@ where
201
205
. and_modify ( |attempts| * attempts += 1 )
202
206
. or_insert ( 1 ) ;
203
207
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 {
205
210
if self . pay_cached_invoice ( payment_hash) . is_ok ( ) {
206
211
log_trace ! ( self . logger, "Payment {} failed; retrying (attempts: {})" , log_bytes!( payment_hash. 0 ) , attempts) ;
207
212
return ;
@@ -292,7 +297,8 @@ mod tests {
292
297
let payer = TestPayer :: new ( ) ;
293
298
let router = NullRouter { } ;
294
299
let logger = TestLogger :: new ( ) ;
295
- let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler) ;
300
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler)
301
+ . with_retry_attempts ( 2 ) ;
296
302
297
303
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
298
304
let invoice = invoice ( payment_preimage) ;
@@ -317,7 +323,8 @@ mod tests {
317
323
let payer = TestPayer :: new ( ) ;
318
324
let router = NullRouter { } ;
319
325
let logger = TestLogger :: new ( ) ;
320
- let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler) ;
326
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler)
327
+ . with_retry_attempts ( 2 ) ;
321
328
322
329
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
323
330
let invoice = invoice ( payment_preimage) ;
@@ -346,7 +353,8 @@ mod tests {
346
353
let payer = TestPayer :: new ( ) . fails_on_attempt ( 2 ) ;
347
354
let router = NullRouter { } ;
348
355
let logger = TestLogger :: new ( ) ;
349
- let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler) ;
356
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler)
357
+ . with_retry_attempts ( 2 ) ;
350
358
351
359
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
352
360
let invoice = invoice ( payment_preimage) ;
@@ -367,7 +375,8 @@ mod tests {
367
375
let payer = TestPayer :: new ( ) ;
368
376
let router = NullRouter { } ;
369
377
let logger = TestLogger :: new ( ) ;
370
- let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler) ;
378
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & logger, event_handler)
379
+ . with_retry_attempts ( 2 ) ;
371
380
372
381
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
373
382
let invoice = invoice ( payment_preimage) ;
0 commit comments