@@ -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 ;
@@ -293,7 +298,8 @@ mod tests {
293
298
let payer = TestPayer :: new ( ) ;
294
299
let router = NullRouter { } ;
295
300
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 ) ;
297
303
298
304
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
299
305
let invoice = invoice ( payment_preimage) ;
@@ -318,7 +324,8 @@ mod tests {
318
324
let payer = TestPayer :: new ( ) ;
319
325
let router = NullRouter { } ;
320
326
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 ) ;
322
329
323
330
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
324
331
let invoice = invoice ( payment_preimage) ;
@@ -347,7 +354,8 @@ mod tests {
347
354
let payer = TestPayer :: new ( ) . fails_on_attempt ( 2 ) ;
348
355
let router = NullRouter { } ;
349
356
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 ) ;
351
359
352
360
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
353
361
let invoice = invoice ( payment_preimage) ;
@@ -368,7 +376,8 @@ mod tests {
368
376
let payer = TestPayer :: new ( ) ;
369
377
let router = NullRouter { } ;
370
378
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 ) ;
372
381
373
382
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
374
383
let invoice = invoice ( payment_preimage) ;
0 commit comments