39
39
//! # use lightning_invoice::payment::{InvoicePayer, Payer, RetryAttempts, Router};
40
40
//! # use secp256k1::key::PublicKey;
41
41
//! # use std::ops::Deref;
42
+ //! # use std::sync::Mutex;
42
43
//! #
43
44
//! # struct FakeEventProvider {}
44
45
//! # impl EventsProvider for FakeEventProvider {
88
89
//! };
89
90
//! # let payer = FakePayer {};
90
91
//! # let router = FakeRouter {};
91
- //! # let scorer = FakeScorer {};
92
+ //! # let scorer = Mutex::new( FakeScorer {}) ;
92
93
//! # let logger = FakeLogger {};
93
- //! let invoice_payer = InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
94
+ //! let invoice_payer = InvoicePayer::new(&payer, router, & scorer, &logger, event_handler, RetryAttempts(2));
94
95
//!
95
96
//! let invoice = "...";
96
97
//! let invoice = invoice.parse::<Invoice>().unwrap();
@@ -117,6 +118,7 @@ use lightning::ln::{PaymentHash, PaymentSecret};
117
118
use lightning:: ln:: channelmanager:: { ChannelDetails , PaymentId , PaymentSendFailure } ;
118
119
use lightning:: ln:: msgs:: LightningError ;
119
120
use lightning:: routing;
121
+ use lightning:: routing:: Score ;
120
122
use lightning:: routing:: router:: { Payee , Route , RouteParameters } ;
121
123
use lightning:: util:: events:: { Event , EventHandler } ;
122
124
use lightning:: util:: logger:: Logger ;
@@ -125,21 +127,21 @@ use secp256k1::key::PublicKey;
125
127
126
128
use std:: collections:: hash_map:: { self , HashMap } ;
127
129
use std:: ops:: Deref ;
128
- use std:: sync:: { Mutex , RwLock } ;
130
+ use std:: sync:: Mutex ;
129
131
use std:: time:: { Duration , SystemTime } ;
130
132
131
133
/// A utility for paying [`Invoice]`s.
132
134
pub struct InvoicePayer < P : Deref , R , S , L : Deref , E >
133
135
where
134
136
P :: Target : Payer ,
135
137
R : Router ,
136
- S : routing:: Score ,
138
+ S : for < ' a > routing:: LockableScore < ' a > ,
137
139
L :: Target : Logger ,
138
140
E : EventHandler ,
139
141
{
140
142
payer : P ,
141
143
router : R ,
142
- scorer : RwLock < S > ,
144
+ scorer : S ,
143
145
logger : L ,
144
146
event_handler : E ,
145
147
payment_cache : Mutex < HashMap < PaymentHash , usize > > ,
@@ -187,22 +189,11 @@ pub enum PaymentError {
187
189
Sending ( PaymentSendFailure ) ,
188
190
}
189
191
190
- /// A read-only version of the scorer.
191
- pub struct ReadOnlyScorer < ' a , S : routing:: Score > ( std:: sync:: RwLockReadGuard < ' a , S > ) ;
192
-
193
- impl < ' a , S : routing:: Score > Deref for ReadOnlyScorer < ' a , S > {
194
- type Target = S ;
195
-
196
- fn deref ( & self ) -> & Self :: Target {
197
- & * self . 0
198
- }
199
- }
200
-
201
192
impl < P : Deref , R , S , L : Deref , E > InvoicePayer < P , R , S , L , E >
202
193
where
203
194
P :: Target : Payer ,
204
195
R : Router ,
205
- S : routing:: Score ,
196
+ S : for < ' a > routing:: LockableScore < ' a > ,
206
197
L :: Target : Logger ,
207
198
E : EventHandler ,
208
199
{
@@ -216,22 +207,14 @@ where
216
207
Self {
217
208
payer,
218
209
router,
219
- scorer : RwLock :: new ( scorer ) ,
210
+ scorer,
220
211
logger,
221
212
event_handler,
222
213
payment_cache : Mutex :: new ( HashMap :: new ( ) ) ,
223
214
retry_attempts,
224
215
}
225
216
}
226
217
227
- /// Returns a read-only reference to the parameterized [`routing::Score`].
228
- ///
229
- /// Useful if the scorer needs to be persisted. Be sure to drop the returned guard immediately
230
- /// after use since retrying failed payment paths require write access.
231
- pub fn scorer ( & ' _ self ) -> ReadOnlyScorer < ' _ , S > {
232
- ReadOnlyScorer ( self . scorer . read ( ) . unwrap ( ) )
233
- }
234
-
235
218
/// Pays the given [`Invoice`], caching it for later use in case a retry is needed.
236
219
pub fn pay_invoice ( & self , invoice : & Invoice ) -> Result < PaymentId , PaymentError > {
237
220
if invoice. amount_milli_satoshis ( ) . is_none ( ) {
@@ -278,7 +261,7 @@ where
278
261
& payer,
279
262
& params,
280
263
Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) ) ,
281
- & * self . scorer . read ( ) . unwrap ( ) ,
264
+ & self . scorer . lock ( ) ,
282
265
) . map_err ( |e| PaymentError :: Routing ( e) ) ?;
283
266
284
267
let payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ;
@@ -299,7 +282,7 @@ where
299
282
let first_hops = self . payer . first_hops ( ) ;
300
283
let route = self . router . find_route (
301
284
& payer, & params, Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) ) ,
302
- & * self . scorer . read ( ) . unwrap ( )
285
+ & self . scorer . lock ( )
303
286
) . map_err ( |e| PaymentError :: Routing ( e) ) ?;
304
287
self . payer . retry_payment ( & route, payment_id) . map_err ( |e| PaymentError :: Sending ( e) )
305
288
}
@@ -326,7 +309,7 @@ impl<P: Deref, R, S, L: Deref, E> EventHandler for InvoicePayer<P, R, S, L, E>
326
309
where
327
310
P :: Target : Payer ,
328
311
R : Router ,
329
- S : routing:: Score ,
312
+ S : for < ' a > routing:: LockableScore < ' a > ,
330
313
L :: Target : Logger ,
331
314
E : EventHandler ,
332
315
{
@@ -336,7 +319,7 @@ where
336
319
payment_id, payment_hash, rejected_by_dest, path, short_channel_id, retry, ..
337
320
} => {
338
321
if let Some ( short_channel_id) = short_channel_id {
339
- self . scorer . write ( ) . unwrap ( ) . payment_path_failed ( path, * short_channel_id) ;
322
+ self . scorer . lock ( ) . payment_path_failed ( path, * short_channel_id) ;
340
323
}
341
324
342
325
let mut payment_cache = self . payment_cache . lock ( ) . unwrap ( ) ;
@@ -468,10 +451,10 @@ mod tests {
468
451
469
452
let payer = TestPayer :: new ( ) ;
470
453
let router = TestRouter { } ;
471
- let scorer = TestScorer :: new ( ) ;
454
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
472
455
let logger = TestLogger :: new ( ) ;
473
456
let invoice_payer =
474
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
457
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
475
458
476
459
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
477
460
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -497,10 +480,10 @@ mod tests {
497
480
. expect_value_msat ( final_value_msat)
498
481
. expect_value_msat ( final_value_msat / 2 ) ;
499
482
let router = TestRouter { } ;
500
- let scorer = TestScorer :: new ( ) ;
483
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
501
484
let logger = TestLogger :: new ( ) ;
502
485
let invoice_payer =
503
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
486
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
504
487
505
488
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
506
489
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -538,10 +521,10 @@ mod tests {
538
521
539
522
let payer = TestPayer :: new ( ) ;
540
523
let router = TestRouter { } ;
541
- let scorer = TestScorer :: new ( ) ;
524
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
542
525
let logger = TestLogger :: new ( ) ;
543
526
let invoice_payer =
544
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
527
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
545
528
546
529
let payment_id = Some ( PaymentId ( [ 1 ; 32 ] ) ) ;
547
530
let event = Event :: PaymentPathFailed {
@@ -583,10 +566,10 @@ mod tests {
583
566
. expect_value_msat ( final_value_msat / 2 )
584
567
. expect_value_msat ( final_value_msat / 2 ) ;
585
568
let router = TestRouter { } ;
586
- let scorer = TestScorer :: new ( ) ;
569
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
587
570
let logger = TestLogger :: new ( ) ;
588
571
let invoice_payer =
589
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
572
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
590
573
591
574
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
592
575
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -633,10 +616,10 @@ mod tests {
633
616
634
617
let payer = TestPayer :: new ( ) ;
635
618
let router = TestRouter { } ;
636
- let scorer = TestScorer :: new ( ) ;
619
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
637
620
let logger = TestLogger :: new ( ) ;
638
621
let invoice_payer =
639
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
622
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
640
623
641
624
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
642
625
let invoice = invoice ( payment_preimage) ;
@@ -665,10 +648,10 @@ mod tests {
665
648
666
649
let payer = TestPayer :: new ( ) ;
667
650
let router = TestRouter { } ;
668
- let scorer = TestScorer :: new ( ) ;
651
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
669
652
let logger = TestLogger :: new ( ) ;
670
653
let invoice_payer =
671
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
654
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
672
655
673
656
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
674
657
let invoice = expired_invoice ( payment_preimage) ;
@@ -703,10 +686,10 @@ mod tests {
703
686
. fails_on_attempt ( 2 )
704
687
. expect_value_msat ( final_value_msat) ;
705
688
let router = TestRouter { } ;
706
- let scorer = TestScorer :: new ( ) ;
689
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
707
690
let logger = TestLogger :: new ( ) ;
708
691
let invoice_payer =
709
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
692
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
710
693
711
694
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
712
695
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -733,10 +716,10 @@ mod tests {
733
716
734
717
let payer = TestPayer :: new ( ) ;
735
718
let router = TestRouter { } ;
736
- let scorer = TestScorer :: new ( ) ;
719
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
737
720
let logger = TestLogger :: new ( ) ;
738
721
let invoice_payer =
739
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
722
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
740
723
741
724
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
742
725
let invoice = invoice ( payment_preimage) ;
@@ -765,10 +748,10 @@ mod tests {
765
748
766
749
let payer = TestPayer :: new ( ) ;
767
750
let router = TestRouter { } ;
768
- let scorer = TestScorer :: new ( ) ;
751
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
769
752
let logger = TestLogger :: new ( ) ;
770
753
let invoice_payer =
771
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
754
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
772
755
773
756
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
774
757
let invoice = invoice ( payment_preimage) ;
@@ -806,10 +789,10 @@ mod tests {
806
789
fn fails_paying_invoice_with_routing_errors ( ) {
807
790
let payer = TestPayer :: new ( ) ;
808
791
let router = FailingRouter { } ;
809
- let scorer = TestScorer :: new ( ) ;
792
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
810
793
let logger = TestLogger :: new ( ) ;
811
794
let invoice_payer =
812
- InvoicePayer :: new ( & payer, router, scorer, & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
795
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
813
796
814
797
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
815
798
let invoice = invoice ( payment_preimage) ;
@@ -824,10 +807,10 @@ mod tests {
824
807
fn fails_paying_invoice_with_sending_errors ( ) {
825
808
let payer = TestPayer :: new ( ) . fails_on_attempt ( 1 ) ;
826
809
let router = TestRouter { } ;
827
- let scorer = TestScorer :: new ( ) ;
810
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
828
811
let logger = TestLogger :: new ( ) ;
829
812
let invoice_payer =
830
- InvoicePayer :: new ( & payer, router, scorer, & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
813
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
831
814
832
815
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
833
816
let invoice = invoice ( payment_preimage) ;
@@ -850,10 +833,10 @@ mod tests {
850
833
851
834
let payer = TestPayer :: new ( ) . expect_value_msat ( final_value_msat) ;
852
835
let router = TestRouter { } ;
853
- let scorer = TestScorer :: new ( ) ;
836
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
854
837
let logger = TestLogger :: new ( ) ;
855
838
let invoice_payer =
856
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
839
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
857
840
858
841
let payment_id =
859
842
Some ( invoice_payer. pay_zero_value_invoice ( & invoice, final_value_msat) . unwrap ( ) ) ;
@@ -873,10 +856,10 @@ mod tests {
873
856
874
857
let payer = TestPayer :: new ( ) ;
875
858
let router = TestRouter { } ;
876
- let scorer = TestScorer :: new ( ) ;
859
+ let scorer = Mutex :: new ( TestScorer :: new ( ) ) ;
877
860
let logger = TestLogger :: new ( ) ;
878
861
let invoice_payer =
879
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
862
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 0 ) ) ;
880
863
881
864
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
882
865
let invoice = invoice ( payment_preimage) ;
@@ -903,10 +886,10 @@ mod tests {
903
886
904
887
let payer = TestPayer :: new ( ) ;
905
888
let router = TestRouter { } ;
906
- let scorer = TestScorer :: new ( ) . expect_channel_failure ( short_channel_id. unwrap ( ) ) ;
889
+ let scorer = Mutex :: new ( TestScorer :: new ( ) . expect_channel_failure ( short_channel_id. unwrap ( ) ) ) ;
907
890
let logger = TestLogger :: new ( ) ;
908
891
let invoice_payer =
909
- InvoicePayer :: new ( & payer, router, scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
892
+ InvoicePayer :: new ( & payer, router, & scorer, & logger, event_handler, RetryAttempts ( 2 ) ) ;
910
893
911
894
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
912
895
let event = Event :: PaymentPathFailed {
0 commit comments