Skip to content

Commit c292b48

Browse files
f don't wrap ChanMan router, use one-shot router
1 parent 87390d5 commit c292b48

File tree

2 files changed

+37
-38
lines changed

2 files changed

+37
-38
lines changed

lightning/src/ln/channelmanager.rs

+13-13
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use crate::ln::channel_state::ChannelDetails;
5555
use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
5656
#[cfg(any(feature = "_test_utils", test))]
5757
use crate::types::features::Bolt11InvoiceFeatures;
58-
use crate::routing::router::{BlindedTail, CachingRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
58+
use crate::routing::router::{BlindedTail, FixedRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
5959
use 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};
6060
use crate::ln::msgs;
6161
use crate::ln::onion_utils;
@@ -2391,7 +2391,7 @@ where
23912391
fee_estimator: LowerBoundedFeeEstimator<F>,
23922392
chain_monitor: M,
23932393
tx_broadcaster: T,
2394-
router: CachingRouter<R>,
2394+
router: R,
23952395
message_router: MR,
23962396

23972397
/// See `ChannelManager` struct-level documentation for lock order requirements.
@@ -3498,7 +3498,7 @@ where
34983498
fee_estimator: LowerBoundedFeeEstimator::new(fee_est),
34993499
chain_monitor,
35003500
tx_broadcaster,
3501-
router: CachingRouter::new(router),
3501+
router,
35023502
message_router,
35033503

35043504
best_block: RwLock::new(params.best_block),
@@ -4616,12 +4616,12 @@ where
46164616
RouteParameters::from_payment_params_and_value(payment_params, route.get_total_amount())
46174617
});
46184618
if route.route_params.is_none() { route.route_params = Some(route_params.clone()); }
4619-
self.router.route_cache.lock().unwrap().insert(payment_id, route);
4619+
let router = FixedRouter::new(route);
46204620
self.pending_outbound_payments
46214621
.send_payment(payment_hash, recipient_onion, payment_id, Retry::Attempts(0),
4622-
route_params, &self.router, self.list_usable_channels(), ||
4623-
self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
4624-
&self.logger, &self.pending_events, |args| self.send_payment_along_path(args))
4622+
route_params, &router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
4623+
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
4624+
&self.pending_events, |args| self.send_payment_along_path(args))
46254625
}
46264626

46274627
/// Sends a payment to the route found using the provided [`RouteParameters`], retrying failed
@@ -4666,7 +4666,7 @@ where
46664666
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
46674667
self.pending_outbound_payments
46684668
.send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params,
4669-
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
4669+
&*self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
46704670
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
46714671
&self.pending_events, |args| self.send_payment_along_path(args))
46724672
}
@@ -4743,7 +4743,7 @@ where
47434743
let features = self.bolt12_invoice_features();
47444744
self.pending_outbound_payments
47454745
.send_payment_for_bolt12_invoice(
4746-
invoice, payment_id, &self.router, self.list_usable_channels(), features,
4746+
invoice, payment_id, &*self.router, self.list_usable_channels(), features,
47474747
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, &self,
47484748
&self.secp_ctx, best_block_height, &self.logger, &self.pending_events,
47494749
|args| self.send_payment_along_path(args)
@@ -4818,7 +4818,7 @@ where
48184818
let mut res = Ok(());
48194819
PersistenceNotifierGuard::optionally_notify(self, || {
48204820
let outbound_pmts_res = self.pending_outbound_payments.send_payment_for_static_invoice(
4821-
payment_id, &self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
4821+
payment_id, &*self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
48224822
&self.entropy_source, &self.node_signer, &self, &self.secp_ctx, best_block_height,
48234823
&self.logger, &self.pending_events, |args| self.send_payment_along_path(args)
48244824
);
@@ -4894,7 +4894,7 @@ where
48944894
let best_block_height = self.best_block.read().unwrap().height;
48954895
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
48964896
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, recipient_onion,
4897-
payment_id, retry_strategy, route_params, &self.router, self.list_usable_channels(),
4897+
payment_id, retry_strategy, route_params, &*self.router, self.list_usable_channels(),
48984898
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
48994899
&self.logger, &self.pending_events, |args| self.send_payment_along_path(args))
49004900
}
@@ -6273,7 +6273,7 @@ where
62736273
}
62746274

62756275
let best_block_height = self.best_block.read().unwrap().height;
6276-
self.pending_outbound_payments.check_retry_payments(&self.router, || self.list_usable_channels(),
6276+
self.pending_outbound_payments.check_retry_payments(&*self.router, || self.list_usable_channels(),
62776277
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
62786278
&self.pending_events, &self.logger, |args| self.send_payment_along_path(args));
62796279

@@ -14184,7 +14184,7 @@ where
1418414184
fee_estimator: bounded_fee_estimator,
1418514185
chain_monitor: args.chain_monitor,
1418614186
tx_broadcaster: args.tx_broadcaster,
14187-
router: CachingRouter::new(args.router),
14187+
router: args.router,
1418814188
message_router: args.message_router,
1418914189

1419014190
best_block: RwLock::new(BestBlock::new(best_block_hash, best_block_height)),

lightning/src/routing/router.rs

+24-25
Original file line numberDiff line numberDiff line change
@@ -186,50 +186,49 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, ES: Deref, S: Deref, SP: Size
186186
}
187187
}
188188

189-
/// A wrapper around a `Router` that can cache routes intended to be used with specific
190-
/// `PaymentId`s. Useful for `ChannelManager::send_payment_with_route` to support sending to
191-
/// specific routes without requiring a custom `Router` implementation to be used.
192-
pub(crate) struct CachingRouter<R: Deref> where R::Target: Router {
193-
pub(crate) route_cache: Mutex<HashMap<PaymentId, Route>>,
194-
router: R,
189+
/// A `Router` that returns a fixed route one time, erroring otherwise. Useful for
190+
/// `ChannelManager::send_payment_with_route` to support sending to specific routes without
191+
/// requiring a custom `Router` implementation.
192+
pub(crate) struct FixedRouter {
193+
// Use an `Option` to avoid needing to clone the route when `find_route` is called.
194+
route: Mutex<Option<Route>>,
195195
}
196196

197-
impl<R: Deref> CachingRouter<R> where R::Target: Router {
198-
pub(crate) fn new(router: R) -> Self {
199-
Self { route_cache: Mutex::new(new_hash_map()), router }
197+
impl FixedRouter {
198+
pub(crate) fn new(route: Route) -> Self {
199+
Self { route: Mutex::new(Some(route)) }
200200
}
201201
}
202202

203-
impl<R: Deref> Router for CachingRouter<R> where R::Target: Router {
203+
impl Router for FixedRouter {
204204
fn find_route(
205-
&self, payer: &PublicKey, route_params: &RouteParameters,
206-
first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs
205+
&self, _payer: &PublicKey, _route_params: &RouteParameters,
206+
_first_hops: Option<&[&ChannelDetails]>, _inflight_htlcs: InFlightHtlcs
207207
) -> Result<Route, LightningError> {
208-
self.router.find_route(payer, route_params, first_hops, inflight_htlcs)
208+
self.route.lock().unwrap().take().ok_or_else(|| {
209+
LightningError {
210+
err: "Can't use this router to return multiple routes".to_owned(),
211+
action: ErrorAction::IgnoreError,
212+
}
213+
})
209214
}
210215

211216
fn find_route_with_id(
212217
&self, payer: &PublicKey, route_params: &RouteParameters,
213218
first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs,
214-
payment_hash: PaymentHash, payment_id: PaymentId
219+
_payment_hash: PaymentHash, _payment_id: PaymentId
215220
) -> Result<Route, LightningError> {
216-
let mut cache = self.route_cache.lock().unwrap();
217-
if let Some(route) = cache.remove(&payment_id) {
218-
return Ok(route)
219-
}
220-
core::mem::drop(cache);
221-
self.router.find_route_with_id(
222-
payer, route_params, first_hops, inflight_htlcs, payment_hash, payment_id
223-
)
221+
self.find_route(payer, route_params, first_hops, inflight_htlcs)
224222
}
225223

226224
fn create_blinded_payment_paths<
227225
T: secp256k1::Signing + secp256k1::Verification
228226
> (
229-
&self, recipient: PublicKey, first_hops: Vec<ChannelDetails>, tlvs: ReceiveTlvs,
230-
amount_msats: u64, secp_ctx: &Secp256k1<T>
227+
&self, _recipient: PublicKey, _first_hops: Vec<ChannelDetails>, _tlvs: ReceiveTlvs,
228+
_amount_msats: Option<u64>, _secp_ctx: &Secp256k1<T>
231229
) -> Result<Vec<BlindedPaymentPath>, ()> {
232-
self.router.create_blinded_payment_paths(recipient, first_hops, tlvs, amount_msats, secp_ctx)
230+
debug_assert!(false);
231+
Err(())
233232
}
234233
}
235234

0 commit comments

Comments
 (0)