@@ -202,20 +202,26 @@ impl PendingOutboundPayment {
202202 }
203203
204204 fn mark_abandoned ( & mut self , reason : PaymentFailureReason ) {
205- if let PendingOutboundPayment :: Retryable { session_privs, payment_hash, .. } = self {
206- let mut our_session_privs = new_hash_set ( ) ;
207- core:: mem:: swap ( & mut our_session_privs, session_privs) ;
208- * self = PendingOutboundPayment :: Abandoned {
209- session_privs : our_session_privs,
210- payment_hash : * payment_hash,
211- reason : Some ( reason)
212- } ;
213- } else if let PendingOutboundPayment :: InvoiceReceived { payment_hash, .. } = self {
214- * self = PendingOutboundPayment :: Abandoned {
215- session_privs : new_hash_set ( ) ,
216- payment_hash : * payment_hash,
217- reason : Some ( reason)
218- } ;
205+ let session_privs = match self {
206+ PendingOutboundPayment :: Retryable { session_privs, .. } => {
207+ let mut our_session_privs = new_hash_set ( ) ;
208+ core:: mem:: swap ( & mut our_session_privs, session_privs) ;
209+ our_session_privs
210+ } ,
211+ _ => new_hash_set ( ) ,
212+ } ;
213+ match self {
214+ Self :: Retryable { payment_hash, .. } |
215+ Self :: InvoiceReceived { payment_hash, .. } |
216+ Self :: StaticInvoiceReceived { payment_hash, .. } =>
217+ {
218+ * self = Self :: Abandoned {
219+ session_privs,
220+ payment_hash : * payment_hash,
221+ reason : Some ( reason) ,
222+ } ;
223+ } ,
224+ _ => { }
219225 }
220226 }
221227
@@ -2627,4 +2633,44 @@ mod tests {
26272633 reason: Some ( PaymentFailureReason :: PaymentExpired ) ,
26282634 } , None ) ) ;
26292635 }
2636+
2637+ #[ test]
2638+ fn abandon_unreleased_async_payment ( ) {
2639+ let pending_events = Mutex :: new ( VecDeque :: new ( ) ) ;
2640+ let outbound_payments = OutboundPayments :: new ( ) ;
2641+ let payment_id = PaymentId ( [ 0 ; 32 ] ) ;
2642+ let absolute_expiry = 60 ;
2643+
2644+ let mut outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2645+ let payment_params = PaymentParameters :: from_node_id ( test_utils:: pubkey ( 42 ) , 0 )
2646+ . with_expiry_time ( absolute_expiry) ;
2647+ let route_params = RouteParameters {
2648+ payment_params,
2649+ final_value_msat : 0 ,
2650+ max_total_routing_fee_msat : None ,
2651+ } ;
2652+ let payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
2653+ let outbound = PendingOutboundPayment :: StaticInvoiceReceived {
2654+ payment_hash,
2655+ keysend_preimage : PaymentPreimage ( [ 0 ; 32 ] ) ,
2656+ retry_strategy : Retry :: Attempts ( 0 ) ,
2657+ payment_release_secret : [ 0 ; 32 ] ,
2658+ route_params,
2659+ } ;
2660+ outbounds. insert ( payment_id, outbound) ;
2661+ core:: mem:: drop ( outbounds) ;
2662+
2663+ outbound_payments. abandon_payment (
2664+ payment_id, PaymentFailureReason :: UserAbandoned , & pending_events
2665+ ) ;
2666+ let outbounds = outbound_payments. pending_outbound_payments . lock ( ) . unwrap ( ) ;
2667+ assert_eq ! ( outbounds. len( ) , 0 ) ;
2668+ let events = pending_events. lock ( ) . unwrap ( ) ;
2669+ assert_eq ! ( events. len( ) , 1 ) ;
2670+ assert_eq ! ( events[ 0 ] , ( Event :: PaymentFailed {
2671+ payment_hash,
2672+ payment_id,
2673+ reason: Some ( PaymentFailureReason :: UserAbandoned ) ,
2674+ } , None ) ) ;
2675+ }
26302676}
0 commit comments