@@ -147,7 +147,6 @@ use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
147147use  lightning:: ln:: channelmanager:: { ChannelDetails ,  PaymentId ,  PaymentSendFailure } ; 
148148use  lightning:: ln:: msgs:: LightningError ; 
149149use  lightning:: routing:: router:: { InFlightHtlcs ,  PaymentParameters ,  Route ,  RouteHop ,  RouteParameters ,  Router } ; 
150- use  lightning:: util:: errors:: APIError ; 
151150use  lightning:: util:: events:: { Event ,  EventHandler } ; 
152151use  lightning:: util:: logger:: Logger ; 
153152use  crate :: time_utils:: Time ; 
@@ -200,26 +199,10 @@ pub struct InvoicePayerUsingTime<
200199	logger :  L , 
201200	event_handler :  E , 
202201	/// Caches the overall attempts at making a payment, which is updated prior to retrying. 
203-  	payment_cache :  Mutex < HashMap < PaymentHash ,  PaymentInfo < T > > > , 
202+  	payment_cache :  Mutex < HashMap < PaymentHash ,  PaymentAttempts < T > > > , 
204203	retry :  Retry , 
205204} 
206205
207- /// Used by [`InvoicePayerUsingTime::payment_cache`] to track the payments that are either 
208- /// currently being made, or have outstanding paths that need retrying. 
209- struct  PaymentInfo < T :  Time >  { 
210- 	attempts :  PaymentAttempts < T > , 
211- 	paths :  Vec < Vec < RouteHop > > , 
212- } 
213- 
214- impl < T :  Time >  PaymentInfo < T >  { 
215- 	fn  new ( )  -> Self  { 
216- 		PaymentInfo  { 
217- 			attempts :  PaymentAttempts :: new ( ) , 
218- 			paths :  vec ! [ ] , 
219- 		} 
220- 	} 
221- } 
222- 
223206/// Storing minimal payment attempts information required for determining if a outbound payment can 
224207/// be retried. 
225208#[ derive( Clone ,  Copy ) ]  
@@ -459,7 +442,7 @@ where
459442		let  payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ; 
460443		match  self . payment_cache . lock ( ) . unwrap ( ) . entry ( payment_hash)  { 
461444			hash_map:: Entry :: Occupied ( _)  => return  Err ( PaymentError :: Invoice ( "payment pending" ) ) , 
462- 			hash_map:: Entry :: Vacant ( entry)  => entry. insert ( PaymentInfo :: new ( ) ) , 
445+ 			hash_map:: Entry :: Vacant ( entry)  => entry. insert ( PaymentAttempts :: new ( ) ) , 
463446		} ; 
464447
465448		let  payment_secret = Some ( invoice. payment_secret ( ) . clone ( ) ) ; 
@@ -523,7 +506,7 @@ where
523506	)  -> Result < ( ) ,  PaymentError >  { 
524507		match  self . payment_cache . lock ( ) . unwrap ( ) . entry ( payment_hash)  { 
525508			hash_map:: Entry :: Occupied ( _)  => return  Err ( PaymentError :: Invoice ( "payment pending" ) ) , 
526- 			hash_map:: Entry :: Vacant ( entry)  => entry. insert ( PaymentInfo :: new ( ) ) , 
509+ 			hash_map:: Entry :: Vacant ( entry)  => entry. insert ( PaymentAttempts :: new ( ) ) , 
527510		} ; 
528511
529512		let  route_params = RouteParameters  { 
@@ -557,40 +540,23 @@ where
557540		) . map_err ( |e| PaymentError :: Routing ( e) ) ?; 
558541
559542		match  send_payment ( & route)  { 
560- 			Ok ( ( ) )  => { 
561- 				for  path in  route. paths  { 
562- 					self . process_path_inflight_htlcs ( payment_hash,  path) ; 
563- 				} 
564- 				Ok ( ( ) ) 
565- 			} , 
543+ 			Ok ( ( ) )  => Ok ( ( ) ) , 
566544			Err ( e)  => match  e { 
567545				PaymentSendFailure :: ParameterError ( _)  => Err ( e) , 
568546				PaymentSendFailure :: PathParameterError ( _)  => Err ( e) , 
569547				PaymentSendFailure :: DuplicatePayment  => Err ( e) , 
570548				PaymentSendFailure :: AllFailedResendSafe ( _)  => { 
571549					let  mut  payment_cache = self . payment_cache . lock ( ) . unwrap ( ) ; 
572- 					let  payment_info  = payment_cache. get_mut ( & payment_hash) . unwrap ( ) ; 
573- 					payment_info . attempts . count  += 1 ; 
574- 					if  self . retry . is_retryable_now ( & payment_info . attempts )  { 
550+ 					let  payment_attempts  = payment_cache. get_mut ( & payment_hash) . unwrap ( ) ; 
551+ 					payment_attempts . count  += 1 ; 
552+ 					if  self . retry . is_retryable_now ( payment_attempts )  { 
575553						core:: mem:: drop ( payment_cache) ; 
576554						Ok ( self . pay_internal ( params,  payment_hash,  send_payment) ?) 
577555					}  else  { 
578556						Err ( e) 
579557					} 
580558				} , 
581- 				PaymentSendFailure :: PartialFailure  {  failed_paths_retry,  payment_id,  results }  => { 
582- 					// If a `PartialFailure` event returns a result that is an `Ok()`, it means that 
583- 					// part of our payment is retried. When we receive `MonitorUpdateInProgress`, it 
584- 					// means that we are still waiting for our channel monitor update to be completed. 
585- 					for  ( result,  path)  in  results. iter ( ) . zip ( route. paths . into_iter ( ) )  { 
586- 						match  result { 
587- 							Ok ( _)  | Err ( APIError :: MonitorUpdateInProgress )  => { 
588- 								self . process_path_inflight_htlcs ( payment_hash,  path) ; 
589- 							} , 
590- 							_ => { } , 
591- 						} 
592- 					} 
593- 
559+ 				PaymentSendFailure :: PartialFailure  {  failed_paths_retry,  payment_id,  .. }  => { 
594560					if  let  Some ( retry_data)  = failed_paths_retry { 
595561						// Some paths were sent, even if we failed to send the full MPP value our 
596562						// recipient may misbehave and claim the funds, at which point we have to 
@@ -610,36 +576,16 @@ where
610576		} . map_err ( |e| PaymentError :: Sending ( e) ) 
611577	} 
612578
613- 	// Takes in a path to have its information stored in `payment_cache`. This is done for paths 
614- 	// that are pending retry. 
615- 	fn  process_path_inflight_htlcs ( & self ,  payment_hash :  PaymentHash ,  path :  Vec < RouteHop > )  { 
616- 		self . payment_cache . lock ( ) . unwrap ( ) . entry ( payment_hash) 
617- 			. or_insert_with ( || PaymentInfo :: new ( ) ) 
618- 			. paths . push ( path) ; 
619- 	} 
620- 
621- 	// Find the path we want to remove in `payment_cache`. If it doesn't exist, do nothing. 
622- 	fn  remove_path_inflight_htlcs ( & self ,  payment_hash :  PaymentHash ,  path :  & Vec < RouteHop > )  { 
623- 		self . payment_cache . lock ( ) . unwrap ( ) . entry ( payment_hash) 
624- 			. and_modify ( |payment_info| { 
625- 				if  let  Some ( idx)  = payment_info. paths . iter ( ) . position ( |p| p == path)  { 
626- 					payment_info. paths . swap_remove ( idx) ; 
627- 				} 
628- 			} ) ; 
629- 	} 
630- 
631579	fn  retry_payment ( 
632580		& self ,  payment_id :  PaymentId ,  payment_hash :  PaymentHash ,  params :  & RouteParameters 
633581	)  -> Result < ( ) ,  ( ) >  { 
634- 		let  attempts =  self . payment_cache . lock ( ) . unwrap ( ) . entry ( payment_hash ) 
635- 			. and_modify ( |info| info . attempts . count  +=  1   ) 
636- 			. or_insert_with ( ||  PaymentInfo   { 
637- 				attempts :   PaymentAttempts  { 
582+ 		let  attempts =
583+ 			* self . payment_cache . lock ( ) . unwrap ( ) . entry ( payment_hash ) 
584+ 				 . and_modify ( |attempts| attempts . count  +=  1 ) 
585+ 				. or_insert ( PaymentAttempts  { 
638586					count :  1 , 
639- 					first_attempted_at :  T :: now ( ) , 
640- 				} , 
641- 				paths :  vec ! [ ] , 
642- 			} ) . attempts ; 
587+ 					first_attempted_at :  T :: now ( ) 
588+ 				} ) ; 
643589
644590		if  !self . retry . is_retryable_now ( & attempts)  { 
645591			log_trace ! ( self . logger,  "Payment {} exceeded maximum attempts; not retrying ({})" ,  log_bytes!( payment_hash. 0 ) ,  attempts) ; 
@@ -667,12 +613,7 @@ where
667613		} 
668614
669615		match  self . payer . retry_payment ( & route. as_ref ( ) . unwrap ( ) ,  payment_id)  { 
670- 			Ok ( ( ) )  => { 
671- 				for  path in  route. unwrap ( ) . paths . into_iter ( )  { 
672- 					self . process_path_inflight_htlcs ( payment_hash,  path) ; 
673- 				} 
674- 				Ok ( ( ) ) 
675- 			} , 
616+ 			Ok ( ( ) )  => Ok ( ( ) ) , 
676617			Err ( PaymentSendFailure :: ParameterError ( _) )  |
677618			Err ( PaymentSendFailure :: PathParameterError ( _) )  => { 
678619				log_trace ! ( self . logger,  "Failed to retry for payment {} due to bogus route/payment data, not retrying." ,  log_bytes!( payment_hash. 0 ) ) ; 
@@ -685,19 +626,7 @@ where
685626				log_error ! ( self . logger,  "Got a DuplicatePayment error when attempting to retry a payment, this shouldn't happen." ) ; 
686627				Err ( ( ) ) 
687628			} 
688- 			Err ( PaymentSendFailure :: PartialFailure  {  failed_paths_retry,  results,  .. } )  => { 
689- 				// If a `PartialFailure` error contains a result that is an `Ok()`, it means that 
690- 				// part of our payment is retried. When we receive `MonitorUpdateInProgress`, it 
691- 				// means that we are still waiting for our channel monitor update to complete. 
692- 				for  ( result,  path)  in  results. iter ( ) . zip ( route. unwrap ( ) . paths . into_iter ( ) )  { 
693- 					match  result { 
694- 						Ok ( _)  | Err ( APIError :: MonitorUpdateInProgress )  => { 
695- 							self . process_path_inflight_htlcs ( payment_hash,  path) ; 
696- 						} , 
697- 						_ => { } , 
698- 					} 
699- 				} 
700- 
629+ 			Err ( PaymentSendFailure :: PartialFailure  {  failed_paths_retry,  .. } )  => { 
701630				if  let  Some ( retry)  = failed_paths_retry { 
702631					// Always return Ok for the same reason as noted in pay_internal. 
703632					let  _ = self . retry_payment ( payment_id,  payment_hash,  & retry) ; 
@@ -736,16 +665,6 @@ where
736665	/// Returns a bool indicating whether the processed event should be forwarded to a user-provided 
737666 	/// event handler. 
738667 	fn  handle_event_internal ( & self ,  event :  & Event )  -> bool  { 
739- 		match  event { 
740- 			Event :: PaymentPathFailed  {  payment_hash,  path,  ..  } 
741- 			| Event :: PaymentPathSuccessful  {  path,  payment_hash :  Some ( payment_hash) ,  .. } 
742- 			| Event :: ProbeSuccessful  {  payment_hash,  path,  .. } 
743- 			| Event :: ProbeFailed  {  payment_hash,  path,  .. }  => { 
744- 				self . remove_path_inflight_htlcs ( * payment_hash,  path) ; 
745- 			} , 
746- 			_ => { } , 
747- 		} 
748- 
749668		match  event { 
750669			Event :: PaymentPathFailed  { 
751670				payment_id,  payment_hash,  payment_failed_permanently,  path,  short_channel_id,  retry,  ..
@@ -781,7 +700,7 @@ where
781700				let  mut  payment_cache = self . payment_cache . lock ( ) . unwrap ( ) ; 
782701				let  attempts = payment_cache
783702					. remove ( payment_hash) 
784- 					. map_or ( 1 ,  |payment_info| payment_info . attempts . count  + 1 ) ; 
703+ 					. map_or ( 1 ,  |attempts|  attempts. count  + 1 ) ; 
785704				log_trace ! ( self . logger,  "Payment {} succeeded (attempts: {})" ,  log_bytes!( payment_hash. 0 ) ,  attempts) ; 
786705			} , 
787706			Event :: ProbeSuccessful  {  payment_hash,  path,  .. }  => { 
0 commit comments