@@ -212,20 +212,26 @@ impl PendingOutboundPayment {
212212 }
213213
214214 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+ _ => { }
229235 }
230236 }
231237
@@ -2580,4 +2586,44 @@ mod tests {
25802586 reason: Some ( PaymentFailureReason :: PaymentExpired ) ,
25812587 } , None ) ) ;
25822588 }
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+ }
25832629}
0 commit comments