@@ -117,33 +117,36 @@ use lightning::ln::{PaymentHash, PaymentSecret};
117
117
use lightning:: ln:: channelmanager:: { ChannelDetails , PaymentId , PaymentSendFailure } ;
118
118
use lightning:: ln:: msgs:: LightningError ;
119
119
use lightning:: routing;
120
+ use lightning:: routing:: Score ;
120
121
use lightning:: routing:: router:: { Payee , Route , RouteParameters } ;
121
122
use lightning:: util:: events:: { Event , EventHandler } ;
122
123
use lightning:: util:: logger:: Logger ;
124
+ //use lightning::util::ser::{Writeable, Writer};
123
125
124
126
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
- pub struct InvoicePayer < P : Deref , R , S , L : Deref , E >
134
+ pub struct InvoicePayer < ' a : ' b , ' b , 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 : routing:: LockableScore < ' a , ' b > ,
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 > > ,
146
148
retry_attempts : RetryAttempts ,
149
+ phantom : std:: marker:: PhantomData < ( & ' a ( ) , & ' b ( ) ) > ,
147
150
}
148
151
149
152
/// A trait defining behavior of an [`Invoice`] payer.
@@ -187,22 +190,11 @@ pub enum PaymentError {
187
190
Sending ( PaymentSendFailure ) ,
188
191
}
189
192
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
- impl < P : Deref , R , S , L : Deref , E > InvoicePayer < P , R , S , L , E >
193
+ impl < ' a : ' b , ' b , P : Deref , R , S , L : Deref , E > InvoicePayer < ' a , ' b , P , R , S , L , E >
202
194
where
203
195
P :: Target : Payer ,
204
196
R : Router ,
205
- S : routing:: Score ,
197
+ S : routing:: LockableScore < ' a , ' b > ,
206
198
L :: Target : Logger ,
207
199
E : EventHandler ,
208
200
{
@@ -216,22 +208,15 @@ where
216
208
Self {
217
209
payer,
218
210
router,
219
- scorer : RwLock :: new ( scorer ) ,
211
+ scorer,
220
212
logger,
221
213
event_handler,
222
214
payment_cache : Mutex :: new ( HashMap :: new ( ) ) ,
223
215
retry_attempts,
216
+ phantom : std:: marker:: PhantomData ,
224
217
}
225
218
}
226
219
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
220
/// Pays the given [`Invoice`], caching it for later use in case a retry is needed.
236
221
pub fn pay_invoice ( & self , invoice : & Invoice ) -> Result < PaymentId , PaymentError > {
237
222
if invoice. amount_milli_satoshis ( ) . is_none ( ) {
@@ -278,7 +263,7 @@ where
278
263
& payer,
279
264
& params,
280
265
Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) ) ,
281
- & * self . scorer . read ( ) . unwrap ( ) ,
266
+ & self . scorer . lock ( ) ,
282
267
) . map_err ( |e| PaymentError :: Routing ( e) ) ?;
283
268
284
269
let payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ;
@@ -299,7 +284,7 @@ where
299
284
let first_hops = self . payer . first_hops ( ) ;
300
285
let route = self . router . find_route (
301
286
& payer, & params, Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) ) ,
302
- & * self . scorer . read ( ) . unwrap ( )
287
+ & self . scorer . lock ( )
303
288
) . map_err ( |e| PaymentError :: Routing ( e) ) ?;
304
289
self . payer . retry_payment ( & route, payment_id) . map_err ( |e| PaymentError :: Sending ( e) )
305
290
}
@@ -322,11 +307,11 @@ fn has_expired(params: &RouteParameters) -> bool {
322
307
Invoice :: is_expired_from_epoch ( & SystemTime :: UNIX_EPOCH , expiry_time)
323
308
}
324
309
325
- impl < P : Deref , R , S , L : Deref , E > EventHandler for InvoicePayer < P , R , S , L , E >
310
+ impl < ' a : ' b , ' b , P : Deref , R , S , L : Deref , E > EventHandler for InvoicePayer < ' a , ' b , P , R , S , L , E >
326
311
where
327
312
P :: Target : Payer ,
328
313
R : Router ,
329
- S : routing:: Score ,
314
+ S : routing:: LockableScore < ' a , ' b > ,
330
315
L :: Target : Logger ,
331
316
E : EventHandler ,
332
317
{
@@ -336,7 +321,7 @@ where
336
321
payment_id, payment_hash, rejected_by_dest, path, short_channel_id, retry, ..
337
322
} => {
338
323
if let Some ( short_channel_id) = short_channel_id {
339
- self . scorer . write ( ) . unwrap ( ) . payment_path_failed ( path, * short_channel_id) ;
324
+ self . scorer . lock ( ) . payment_path_failed ( path, * short_channel_id) ;
340
325
}
341
326
342
327
let mut payment_cache = self . payment_cache . lock ( ) . unwrap ( ) ;
@@ -391,6 +376,51 @@ where
391
376
}
392
377
}
393
378
379
+ /////
380
+ //pub trait WriteableScore: routing::Score + Writeable {}
381
+ //
382
+ /////
383
+ //pub struct ScorePersister<I, P: Deref, R, S, L: Deref, E>
384
+ //where
385
+ // I: Deref<Target=InvoicePayer<P, R, S, L, E>>,
386
+ // P::Target: Payer,
387
+ // R: Router,
388
+ // S: WriteableScore,
389
+ // L::Target: Logger,
390
+ // E: EventHandler,
391
+ //{
392
+ // invoice_payer: I,
393
+ //}
394
+ //
395
+ //impl<I, P: Deref, R, S, L: Deref, E> ScorePersister<I, P, R, S, L, E>
396
+ //where
397
+ // I: Deref<Target=InvoicePayer<P, R, S, L, E>>,
398
+ // P::Target: Payer,
399
+ // R: Router,
400
+ // S: WriteableScore,
401
+ // L::Target: Logger,
402
+ // E: EventHandler,
403
+ //{
404
+ // ///
405
+ // pub fn new(invoice_payer: I) -> Self {
406
+ // Self { invoice_payer }
407
+ // }
408
+ //}
409
+ //
410
+ //impl<I, P: Deref, R, S, L: Deref, E> Writeable for ScorePersister<I, P, R, S, L, E>
411
+ //where
412
+ // I: Deref<Target=InvoicePayer<P, R, S, L, E>>,
413
+ // P::Target: Payer,
414
+ // R: Router,
415
+ // S: WriteableScore,
416
+ // L::Target: Logger,
417
+ // E: EventHandler,
418
+ //{
419
+ // fn write<W: Writer>(&self, writer: &mut W) -> Result<(), std::io::Error> {
420
+ // self.invoice_payer.scorer.read().unwrap().write(writer)
421
+ // }
422
+ //}
423
+
394
424
#[ cfg( test) ]
395
425
mod tests {
396
426
use super :: * ;
0 commit comments