@@ -397,7 +397,8 @@ impl OutboundPayments {
397
397
& self , payment_hash : PaymentHash , payment_secret : & Option < PaymentSecret > , payment_id : PaymentId ,
398
398
retry_strategy : Retry , route_params : RouteParameters , router : & R ,
399
399
first_hops : Vec < ChannelDetails > , compute_inflight_htlcs : IH , entropy_source : & ES ,
400
- node_signer : & NS , best_block_height : u32 , logger : & L , send_payment_along_path : SP ,
400
+ node_signer : & NS , best_block_height : u32 , logger : & L ,
401
+ pending_events : & Mutex < Vec < events:: Event > > , send_payment_along_path : SP ,
401
402
) -> Result < ( ) , PaymentSendFailure >
402
403
where
403
404
R :: Target : Router ,
@@ -410,7 +411,7 @@ impl OutboundPayments {
410
411
{
411
412
self . pay_internal ( payment_id, payment_hash, Some ( ( payment_secret, None , retry_strategy) ) ,
412
413
route_params, router, first_hops, & compute_inflight_htlcs, entropy_source, node_signer,
413
- best_block_height, logger, & send_payment_along_path)
414
+ best_block_height, logger, pending_events , & send_payment_along_path)
414
415
. map_err ( |e| { self . remove_outbound_if_all_failed ( payment_id, & e) ; e } )
415
416
}
416
417
@@ -435,7 +436,8 @@ impl OutboundPayments {
435
436
& self , payment_preimage : Option < PaymentPreimage > , payment_id : PaymentId ,
436
437
retry_strategy : Retry , route_params : RouteParameters , router : & R ,
437
438
first_hops : Vec < ChannelDetails > , inflight_htlcs : IH , entropy_source : & ES ,
438
- node_signer : & NS , best_block_height : u32 , logger : & L , send_payment_along_path : SP
439
+ node_signer : & NS , best_block_height : u32 , logger : & L ,
440
+ pending_events : & Mutex < Vec < events:: Event > > , send_payment_along_path : SP
439
441
) -> Result < PaymentHash , PaymentSendFailure >
440
442
where
441
443
R :: Target : Router ,
@@ -451,7 +453,7 @@ impl OutboundPayments {
451
453
let payment_hash = PaymentHash ( Sha256 :: hash ( & preimage. 0 ) . into_inner ( ) ) ;
452
454
self . pay_internal ( payment_id, payment_hash, Some ( ( & None , Some ( preimage) , retry_strategy) ) ,
453
455
route_params, router, first_hops, & inflight_htlcs, entropy_source, node_signer,
454
- best_block_height, logger, & send_payment_along_path)
456
+ best_block_height, logger, pending_events , & send_payment_along_path)
455
457
. map ( |( ) | payment_hash)
456
458
. map_err ( |e| { self . remove_outbound_if_all_failed ( payment_id, & e) ; e } )
457
459
}
@@ -520,7 +522,7 @@ impl OutboundPayments {
520
522
}
521
523
core:: mem:: drop ( outbounds) ;
522
524
if let Some ( ( payment_id, payment_hash, route_params) ) = retry_id_route_params {
523
- if let Err ( e) = self . pay_internal ( payment_id, payment_hash, None , route_params, router, first_hops ( ) , & inflight_htlcs, entropy_source, node_signer, best_block_height, logger, & send_payment_along_path) {
525
+ if let Err ( e) = self . pay_internal ( payment_id, payment_hash, None , route_params, router, first_hops ( ) , & inflight_htlcs, entropy_source, node_signer, best_block_height, logger, pending_events , & send_payment_along_path) {
524
526
log_info ! ( logger, "Errored retrying payment: {:?}" , e) ;
525
527
// If we error on retry, there is no chance of the payment succeeding and no HTLCs have
526
528
// been irrevocably committed to, so we can safely abandon.
@@ -557,7 +559,7 @@ impl OutboundPayments {
557
559
initial_send_info : Option < ( & Option < PaymentSecret > , Option < PaymentPreimage > , Retry ) > ,
558
560
route_params : RouteParameters , router : & R , first_hops : Vec < ChannelDetails > ,
559
561
inflight_htlcs : & IH , entropy_source : & ES , node_signer : & NS , best_block_height : u32 ,
560
- logger : & L , send_payment_along_path : & SP ,
562
+ logger : & L , pending_events : & Mutex < Vec < events :: Event > > , send_payment_along_path : & SP ,
561
563
) -> Result < ( ) , PaymentSendFailure >
562
564
where
563
565
R :: Target : Router ,
@@ -591,7 +593,7 @@ impl OutboundPayments {
591
593
} ;
592
594
match res {
593
595
Err ( PaymentSendFailure :: AllFailedResendSafe ( _) ) => {
594
- let retry_res = self . pay_internal ( payment_id, payment_hash, None , route_params, router, first_hops, inflight_htlcs, entropy_source, node_signer, best_block_height, logger, send_payment_along_path) ;
596
+ let retry_res = self . pay_internal ( payment_id, payment_hash, None , route_params, router, first_hops, inflight_htlcs, entropy_source, node_signer, best_block_height, logger, pending_events , send_payment_along_path) ;
595
597
log_info ! ( logger, "Result retrying payment id {}: {:?}" , log_bytes!( payment_id. 0 ) , retry_res) ;
596
598
if let Err ( PaymentSendFailure :: ParameterError ( APIError :: APIMisuseError { err } ) ) = & retry_res {
597
599
if err. starts_with ( "Retries exhausted " ) { return res; }
@@ -602,7 +604,7 @@ impl OutboundPayments {
602
604
// Some paths were sent, even if we failed to send the full MPP value our recipient may
603
605
// misbehave and claim the funds, at which point we have to consider the payment sent, so
604
606
// return `Ok()` here, ignoring any retry errors.
605
- let retry_res = self . pay_internal ( payment_id, payment_hash, None , retry, router, first_hops, inflight_htlcs, entropy_source, node_signer, best_block_height, logger, send_payment_along_path) ;
607
+ let retry_res = self . pay_internal ( payment_id, payment_hash, None , retry, router, first_hops, inflight_htlcs, entropy_source, node_signer, best_block_height, logger, pending_events , send_payment_along_path) ;
606
608
log_info ! ( logger, "Result retrying payment id {}: {:?}" , log_bytes!( payment_id. 0 ) , retry_res) ;
607
609
Ok ( ( ) )
608
610
} ,
@@ -1277,16 +1279,17 @@ mod tests {
1277
1279
final_value_msat : 0 ,
1278
1280
final_cltv_expiry_delta : 0 ,
1279
1281
} ;
1282
+ let pending_events = Mutex :: new ( Vec :: new ( ) ) ;
1280
1283
let err = if on_retry {
1281
1284
outbound_payments. pay_internal (
1282
1285
PaymentId ( [ 0 ; 32 ] ) , PaymentHash ( [ 0 ; 32 ] ) , None , expired_route_params, & & router, vec ! [ ] ,
1283
- & || InFlightHtlcs :: new ( ) , & & keys_manager, & & keys_manager, 0 , & & logger,
1286
+ & || InFlightHtlcs :: new ( ) , & & keys_manager, & & keys_manager, 0 , & & logger, & pending_events ,
1284
1287
& |_, _, _, _, _, _, _, _, _| Ok ( ( ) ) ) . unwrap_err ( )
1285
1288
} else {
1286
1289
outbound_payments. send_payment (
1287
1290
PaymentHash ( [ 0 ; 32 ] ) , & None , PaymentId ( [ 0 ; 32 ] ) , Retry :: Attempts ( 0 ) , expired_route_params,
1288
1291
& & router, vec ! [ ] , || InFlightHtlcs :: new ( ) , & & keys_manager, & & keys_manager, 0 , & & logger,
1289
- |_, _, _, _, _, _, _, _, _| Ok ( ( ) ) ) . unwrap_err ( )
1292
+ & pending_events , |_, _, _, _, _, _, _, _, _| Ok ( ( ) ) ) . unwrap_err ( )
1290
1293
} ;
1291
1294
if let PaymentSendFailure :: ParameterError ( APIError :: APIMisuseError { err } ) = err {
1292
1295
assert ! ( err. contains( "Invoice expired" ) ) ;
@@ -1318,19 +1321,20 @@ mod tests {
1318
1321
router. expect_find_route ( route_params. clone ( ) ,
1319
1322
Err ( LightningError { err : String :: new ( ) , action : ErrorAction :: IgnoreError } ) ) ;
1320
1323
1324
+ let pending_events = Mutex :: new ( Vec :: new ( ) ) ;
1321
1325
let err = if on_retry {
1322
1326
outbound_payments. add_new_pending_payment ( PaymentHash ( [ 0 ; 32 ] ) , None , PaymentId ( [ 0 ; 32 ] ) , None ,
1323
1327
& Route { paths : vec ! [ ] , payment_params : None } , Some ( Retry :: Attempts ( 1 ) ) ,
1324
1328
Some ( route_params. payment_params . clone ( ) ) , & & keys_manager, 0 ) . unwrap ( ) ;
1325
1329
outbound_payments. pay_internal (
1326
1330
PaymentId ( [ 0 ; 32 ] ) , PaymentHash ( [ 0 ; 32 ] ) , None , route_params, & & router, vec ! [ ] ,
1327
- & || InFlightHtlcs :: new ( ) , & & keys_manager, & & keys_manager, 0 , & & logger,
1331
+ & || InFlightHtlcs :: new ( ) , & & keys_manager, & & keys_manager, 0 , & & logger, & pending_events ,
1328
1332
& |_, _, _, _, _, _, _, _, _| Ok ( ( ) ) ) . unwrap_err ( )
1329
1333
} else {
1330
1334
outbound_payments. send_payment (
1331
1335
PaymentHash ( [ 0 ; 32 ] ) , & None , PaymentId ( [ 0 ; 32 ] ) , Retry :: Attempts ( 0 ) , route_params,
1332
1336
& & router, vec ! [ ] , || InFlightHtlcs :: new ( ) , & & keys_manager, & & keys_manager, 0 , & & logger,
1333
- |_, _, _, _, _, _, _, _, _| Ok ( ( ) ) ) . unwrap_err ( )
1337
+ & pending_events , |_, _, _, _, _, _, _, _, _| Ok ( ( ) ) ) . unwrap_err ( )
1334
1338
} ;
1335
1339
if let PaymentSendFailure :: ParameterError ( APIError :: APIMisuseError { err } ) = err {
1336
1340
assert ! ( err. contains( "Failed to find a route" ) ) ;
0 commit comments