@@ -55,9 +55,7 @@ use crate::ln::channel_state::ChannelDetails;
5555use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
5656#[cfg(any(feature = "_test_utils", test))]
5757use crate::types::features::Bolt11InvoiceFeatures;
58- use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, RouteParameters, Router};
59- #[cfg(test)]
60- use crate::routing::router::Route;
58+ use crate::routing::router::{BlindedTail, CachingRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
6159use crate::ln::onion_payment::{check_incoming_htlc_cltv, create_recv_pending_htlc_info, create_fwd_pending_htlc_info, decode_incoming_update_add_htlc_onion, InboundHTLCErr, NextPacketDetails};
6260use crate::ln::msgs;
6361use crate::ln::onion_utils;
@@ -2390,10 +2388,7 @@ where
23902388 fee_estimator: LowerBoundedFeeEstimator<F>,
23912389 chain_monitor: M,
23922390 tx_broadcaster: T,
2393- #[cfg(fuzzing)]
2394- pub router: R,
2395- #[cfg(not(fuzzing))]
2396- router: R,
2391+ router: CachingRouter<R>,
23972392 message_router: MR,
23982393
23992394 /// See `ChannelManager` struct-level documentation for lock order requirements.
@@ -3503,7 +3498,7 @@ where
35033498 fee_estimator: LowerBoundedFeeEstimator::new(fee_est),
35043499 chain_monitor,
35053500 tx_broadcaster,
3506- router,
3501+ router: CachingRouter::new(router) ,
35073502 message_router,
35083503
35093504 best_block: RwLock::new(params.best_block),
@@ -4606,21 +4601,21 @@ where
46064601 }
46074602 }
46084603
4609- // Deprecated send method, for testing use [`Self::send_payment`] and
4610- // [`TestRouter::expect_find_route`] instead.
4611- //
4612- // [`TestRouter::expect_find_route`]: crate::util::test_utils::TestRouter::expect_find_route
4613- #[cfg(test)]
4614- pub(crate) fn send_payment_with_route(
4604+ /// Sends a payment along a given route. See [`Self::send_payment`] for more info.
4605+ /// [`Route::route_params`] is required to be `Some`.
4606+ pub fn send_payment_with_route(
46154607 &self, route: Route, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields,
46164608 payment_id: PaymentId
4617- ) -> Result<(), PaymentSendFailure > {
4609+ ) -> Result<(), RetryableSendFailure > {
46184610 let best_block_height = self.best_block.read().unwrap().height;
46194611 let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
4612+ let route_params = route.route_params.clone().ok_or(RetryableSendFailure::RouteNotFound)?;
4613+ self.router.route_cache.lock().unwrap().insert(payment_id, route);
46204614 self.pending_outbound_payments
4621- .send_payment_with_route(&route, payment_hash, recipient_onion, payment_id,
4622- &self.entropy_source, &self.node_signer, best_block_height,
4623- |args| self.send_payment_along_path(args))
4615+ .send_payment(payment_hash, recipient_onion, payment_id, Retry::Attempts(0),
4616+ route_params, &self.router, self.list_usable_channels(), ||
4617+ self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
4618+ &self.logger, &self.pending_events, |args| self.send_payment_along_path(args))
46244619 }
46254620
46264621 /// Sends a payment to the route found using the provided [`RouteParameters`], retrying failed
@@ -4649,7 +4644,8 @@ where
46494644 /// [`ChannelManager::list_recent_payments`] for more information.
46504645 ///
46514646 /// Routes are automatically found using the [`Router] provided on startup. To fix a route for a
4652- /// particular payment, match the [`PaymentId`] passed to [`Router::find_route_with_id`].
4647+ /// particular payment, use [`Self::send_payment_with_route`] or match the [`PaymentId`] passed to
4648+ /// [`Router::find_route_with_id`].
46534649 ///
46544650 /// [`Event::PaymentSent`]: events::Event::PaymentSent
46554651 /// [`Event::PaymentFailed`]: events::Event::PaymentFailed
@@ -4664,7 +4660,7 @@ where
46644660 let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
46654661 self.pending_outbound_payments
46664662 .send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params,
4667- &* self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
4663+ &self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
46684664 &self.entropy_source, &self.node_signer, best_block_height, &self.logger,
46694665 &self.pending_events, |args| self.send_payment_along_path(args))
46704666 }
@@ -4741,7 +4737,7 @@ where
47414737 let features = self.bolt12_invoice_features();
47424738 self.pending_outbound_payments
47434739 .send_payment_for_bolt12_invoice(
4744- invoice, payment_id, &* self.router, self.list_usable_channels(), features,
4740+ invoice, payment_id, &self.router, self.list_usable_channels(), features,
47454741 || self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, &self,
47464742 &self.secp_ctx, best_block_height, &self.logger, &self.pending_events,
47474743 |args| self.send_payment_along_path(args)
@@ -4816,7 +4812,7 @@ where
48164812 let mut res = Ok(());
48174813 PersistenceNotifierGuard::optionally_notify(self, || {
48184814 let outbound_pmts_res = self.pending_outbound_payments.send_payment_for_static_invoice(
4819- payment_id, &* self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
4815+ payment_id, &self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
48204816 &self.entropy_source, &self.node_signer, &self, &self.secp_ctx, best_block_height,
48214817 &self.logger, &self.pending_events, |args| self.send_payment_along_path(args)
48224818 );
@@ -4892,7 +4888,7 @@ where
48924888 let best_block_height = self.best_block.read().unwrap().height;
48934889 let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
48944890 self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, recipient_onion,
4895- payment_id, retry_strategy, route_params, &* self.router, self.list_usable_channels(),
4891+ payment_id, retry_strategy, route_params, &self.router, self.list_usable_channels(),
48964892 || self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
48974893 &self.logger, &self.pending_events, |args| self.send_payment_along_path(args))
48984894 }
@@ -6266,7 +6262,7 @@ where
62666262 }
62676263
62686264 let best_block_height = self.best_block.read().unwrap().height;
6269- self.pending_outbound_payments.check_retry_payments(&* self.router, || self.list_usable_channels(),
6265+ self.pending_outbound_payments.check_retry_payments(&self.router, || self.list_usable_channels(),
62706266 || self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
62716267 &self.pending_events, &self.logger, |args| self.send_payment_along_path(args));
62726268
@@ -14084,7 +14080,7 @@ where
1408414080 fee_estimator: bounded_fee_estimator,
1408514081 chain_monitor: args.chain_monitor,
1408614082 tx_broadcaster: args.tx_broadcaster,
14087- router: args.router,
14083+ router: CachingRouter::new( args.router) ,
1408814084 message_router: args.message_router,
1408914085
1409014086 best_block: RwLock::new(BestBlock::new(best_block_hash, best_block_height)),
@@ -14331,7 +14327,7 @@ mod tests {
1433114327 use crate::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
1433214328 use crate::ln::types::ChannelId;
1433314329 use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14334- use crate::ln::channelmanager::{create_recv_pending_htlc_info, HTLCForwardInfo, inbound_payment, PaymentId, PaymentSendFailure, RecipientOnionFields, InterceptId};
14330+ use crate::ln::channelmanager::{create_recv_pending_htlc_info, HTLCForwardInfo, inbound_payment, PaymentId, RecipientOnionFields, InterceptId};
1433514331 use crate::ln::functional_test_utils::*;
1433614332 use crate::ln::msgs::{self, ErrorAction};
1433714333 use crate::ln::msgs::ChannelMessageHandler;
@@ -14757,14 +14753,17 @@ mod tests {
1475714753 route.paths[1].hops[0].short_channel_id = chan_2_id;
1475814754 route.paths[1].hops[1].short_channel_id = chan_4_id;
1475914755
14760- match nodes[0].node.send_payment_with_route(route, payment_hash,
14761- RecipientOnionFields::spontaneous_empty(), PaymentId(payment_hash.0))
14762- .unwrap_err() {
14763- PaymentSendFailure::ParameterError(APIError::APIMisuseError { ref err }) => {
14764- assert!(regex::Regex::new(r"Payment secret is required for multi-path payments").unwrap().is_match(err))
14765- },
14766- _ => panic!("unexpected error")
14756+ nodes[0].node.send_payment_with_route(route, payment_hash,
14757+ RecipientOnionFields::spontaneous_empty(), PaymentId(payment_hash.0)).unwrap();
14758+ let events = nodes[0].node.get_and_clear_pending_events();
14759+ assert_eq!(events.len(), 1);
14760+ match events[0] {
14761+ Event::PaymentFailed { reason, .. } => {
14762+ assert_eq!(reason.unwrap(), crate::events::PaymentFailureReason::UnexpectedError);
14763+ }
14764+ _ => panic!()
1476714765 }
14766+ nodes[0].logger.assert_log_contains("lightning::ln::outbound_payment", "Payment secret is required for multi-path payments", 2);
1476814767 assert!(nodes[0].node.pending_outbound_payments.pending_outbound_payments.lock().unwrap().is_empty());
1476914768 }
1477014769
0 commit comments