@@ -212,20 +212,26 @@ impl PendingOutboundPayment {
212
212
}
213
213
214
214
fn mark_abandoned ( & mut self , reason : PaymentFailureReason ) {
215
- if let PendingOutboundPayment :: Retryable { session_privs, payment_hash, .. } = self {
216
- let mut our_session_privs = new_hash_set ( ) ;
217
- core:: mem:: swap ( & mut our_session_privs, session_privs) ;
218
- * self = PendingOutboundPayment :: Abandoned {
219
- session_privs : our_session_privs,
220
- payment_hash : * payment_hash,
221
- reason : Some ( reason)
222
- } ;
223
- } else if let PendingOutboundPayment :: InvoiceReceived { payment_hash, .. } = self {
224
- * self = PendingOutboundPayment :: Abandoned {
225
- session_privs : new_hash_set ( ) ,
226
- payment_hash : * payment_hash,
227
- reason : Some ( reason)
228
- } ;
215
+ let session_privs = match self {
216
+ PendingOutboundPayment :: Retryable { session_privs, .. } => {
217
+ let mut our_session_privs = new_hash_set ( ) ;
218
+ core:: mem:: swap ( & mut our_session_privs, session_privs) ;
219
+ our_session_privs
220
+ } ,
221
+ _ => new_hash_set ( ) ,
222
+ } ;
223
+ match self {
224
+ Self :: Retryable { payment_hash, .. } |
225
+ Self :: InvoiceReceived { payment_hash, .. } |
226
+ Self :: StaticInvoiceReceived { payment_hash, .. } =>
227
+ {
228
+ * self = Self :: Abandoned {
229
+ session_privs,
230
+ payment_hash : * payment_hash,
231
+ reason : Some ( reason) ,
232
+ } ;
233
+ } ,
234
+ _ => { }
229
235
}
230
236
}
231
237
@@ -2580,4 +2586,44 @@ mod tests {
2580
2586
reason: Some ( PaymentFailureReason :: PaymentExpired ) ,
2581
2587
} , None ) ) ;
2582
2588
}
2589
+
2590
+ #[ test]
2591
+ fn abandon_unreleased_async_payment ( ) {
2592
+ let pending_events = Mutex :: new ( VecDeque :: new ( ) ) ;
2593
+ let outbound_payments = OutboundPayments :: new ( ) ;
2594
+ let payment_id = PaymentId ( [ 0 ; 32 ] ) ;
2595
+ let absolute_expiry = 60 ;
2596
+
2597
+ let mut outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2598
+ let payment_params = PaymentParameters :: from_node_id ( test_utils:: pubkey ( 42 ) , 0 )
2599
+ . with_expiry_time ( absolute_expiry) ;
2600
+ let route_params = RouteParameters {
2601
+ payment_params,
2602
+ final_value_msat : 0 ,
2603
+ max_total_routing_fee_msat : None ,
2604
+ } ;
2605
+ let payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
2606
+ let outbound = PendingOutboundPayment :: StaticInvoiceReceived {
2607
+ payment_hash,
2608
+ keysend_preimage : PaymentPreimage ( [ 0 ; 32 ] ) ,
2609
+ retry_strategy : Retry :: Attempts ( 0 ) ,
2610
+ payment_release_secret : [ 0 ; 32 ] ,
2611
+ route_params,
2612
+ } ;
2613
+ outbounds. insert ( payment_id, outbound) ;
2614
+ core:: mem:: drop ( outbounds) ;
2615
+
2616
+ outbound_payments. abandon_payment (
2617
+ payment_id, PaymentFailureReason :: UserAbandoned , & pending_events
2618
+ ) ;
2619
+ let outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2620
+ assert_eq ! ( outbounds. len( ) , 0 ) ;
2621
+ let events = pending_events. lock ( ) . unwrap ( ) ;
2622
+ assert_eq ! ( events. len( ) , 1 ) ;
2623
+ assert_eq ! ( events[ 0 ] , ( Event :: PaymentFailed {
2624
+ payment_hash,
2625
+ payment_id,
2626
+ reason: Some ( PaymentFailureReason :: UserAbandoned ) ,
2627
+ } , None ) ) ;
2628
+ }
2583
2629
}
0 commit comments