Skip to content

Commit 297ae84

Browse files
authored
Merge pull request #887 from chuksys/add-support-for-hrn-resolution-follow-up
HRN resolution refinement and architectural clean-up
2 parents 8c081d6 + e29ae44 commit 297ae84

5 files changed

Lines changed: 35 additions & 44 deletions

File tree

src/builder.rs

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use std::convert::TryInto;
1010
use std::default::Default;
1111
use std::net::ToSocketAddrs;
1212
use std::path::PathBuf;
13-
use std::sync::{Arc, Mutex, Once, RwLock, Weak};
13+
use std::sync::{Arc, Mutex, Once, RwLock};
1414
use std::time::SystemTime;
1515
use std::{fmt, fs};
1616

@@ -1735,15 +1735,8 @@ fn build_with_store_internal(
17351735
})?;
17361736
}
17371737

1738-
// This hook resolves a circular dependency:
1739-
// 1. PeerManager requires OnionMessenger (via MessageHandler).
1740-
// 2. OnionMessenger (via HRN resolver) needs to call PeerManager::process_events.
1741-
//
1742-
// We provide the resolver with a Weak pointer via this Mutex-protected "hook."
1743-
// This allows us to initialize the resolver before the PeerManager exists,
1744-
// and prevents a reference cycle (memory leak).
1745-
let peer_manager_hook: Arc<Mutex<Option<Weak<PeerManager>>>> = Arc::new(Mutex::new(None));
17461738
let hrn_resolver;
1739+
let mut blip32_resolver = None;
17471740

17481741
let runtime_handle = runtime.handle();
17491742

@@ -1755,24 +1748,16 @@ fn build_with_store_internal(
17551748
let hrn_res =
17561749
Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph)));
17571750
hrn_resolver = HRNResolver::Onion(Arc::clone(&hrn_res));
1751+
blip32_resolver = Some(Arc::clone(&hrn_res));
17581752

1759-
// We clone the hook because it's moved into a Send + Sync closure that outlives this scope.
1760-
let pm_hook_clone = Arc::clone(&peer_manager_hook);
1761-
hrn_res.register_post_queue_action(Box::new(move || {
1762-
if let Ok(guard) = pm_hook_clone.lock() {
1763-
if let Some(pm) = guard.as_ref().and_then(|weak| weak.upgrade()) {
1764-
pm.process_events();
1765-
}
1766-
}
1767-
}));
17681753
hrn_res as Arc<dyn DNSResolverMessageHandler + Send + Sync>
17691754
},
17701755
HRNResolverConfig::Dns { dns_server_address, enable_hrn_resolution_service, .. } => {
17711756
let addr = dns_server_address
17721757
.to_socket_addrs()
17731758
.map_err(|_| BuildError::DNSResolverSetupFailed)?
17741759
.next()
1775-
.ok_or({
1760+
.ok_or_else(|| {
17761761
log_error!(logger, "No valid address found for: {}", dns_server_address);
17771762
BuildError::DNSResolverSetupFailed
17781763
})?;
@@ -1945,8 +1930,13 @@ fn build_with_store_internal(
19451930
Arc::clone(&keys_manager),
19461931
));
19471932

1948-
if let Ok(mut guard) = peer_manager_hook.lock() {
1949-
*guard = Some(Arc::downgrade(&peer_manager));
1933+
if let Some(res) = blip32_resolver {
1934+
let pm_weak = Arc::downgrade(&peer_manager);
1935+
res.register_post_queue_action(Box::new(move || {
1936+
if let Some(upgraded_pm) = pm_weak.upgrade() {
1937+
upgraded_pm.process_events();
1938+
}
1939+
}));
19501940
}
19511941

19521942
liquidity_source.as_ref().map(|l| l.set_peer_manager(Arc::downgrade(&peer_manager)));
@@ -2061,7 +2051,7 @@ fn build_with_store_internal(
20612051
node_metrics,
20622052
om_mailbox,
20632053
async_payments_role,
2064-
hrn_resolver: Arc::new(hrn_resolver),
2054+
hrn_resolver,
20652055
#[cfg(cycle_tests)]
20662056
_leak_checker,
20672057
})

src/config.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,18 +118,18 @@ pub(crate) const LNURL_AUTH_TIMEOUT_SECS: u64 = 15;
118118
/// ### Defaults
119119
///
120120
/// | Parameter | Value |
121-
/// |----------------------------------------|--------------------|
122-
/// | `storage_dir_path` | /tmp/ldk_node/ |
123-
/// | `network` | Bitcoin |
124-
/// | `listening_addresses` | None |
125-
/// | `announcement_addresses` | None |
126-
/// | `node_alias` | None |
127-
/// | `trusted_peers_0conf` | [] |
128-
/// | `probing_liquidity_limit_multiplier` | 3 |
129-
/// | `anchor_channels_config` | Some(..) |
130-
/// | `route_parameters` | None |
131-
/// | `tor_config` | None |
132-
/// | `hrn_config` | HumanReadableNamesConfig::default() |
121+
/// |----------------------------------------|--------------------------------------|
122+
/// | `storage_dir_path` | /tmp/ldk_node/ |
123+
/// | `network` | Bitcoin |
124+
/// | `listening_addresses` | None |
125+
/// | `announcement_addresses` | None |
126+
/// | `node_alias` | None |
127+
/// | `trusted_peers_0conf` | [] |
128+
/// | `probing_liquidity_limit_multiplier` | 3 |
129+
/// | `anchor_channels_config` | Some(..) |
130+
/// | `route_parameters` | None |
131+
/// | `tor_config` | None |
132+
/// | `hrn_config` | HumanReadableNamesConfig::default() |
133133
///
134134
/// See [`AnchorChannelsConfig`] and [`RouteParametersConfig`] for more information regarding their
135135
/// respective default values.
@@ -264,7 +264,7 @@ pub struct HumanReadableNamesConfig {
264264
///
265265
/// By default, this uses the `Dns` variant with the following settings:
266266
/// * **DNS Server**: `8.8.8.8:53` (Google Public DNS)
267-
/// * **Resolution Service**: Enabled (`false`)
267+
/// * **Resolution Service**: Disabled (`false`)
268268
pub resolution_config: HRNResolverConfig,
269269
}
270270

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ pub struct Node {
238238
node_metrics: Arc<RwLock<NodeMetrics>>,
239239
om_mailbox: Option<Arc<OnionMessageMailbox>>,
240240
async_payments_role: Option<AsyncPaymentsRole>,
241-
hrn_resolver: Arc<HRNResolver>,
241+
hrn_resolver: HRNResolver,
242242
#[cfg(cycle_tests)]
243243
_leak_checker: LeakChecker,
244244
}
@@ -1006,7 +1006,7 @@ impl Node {
10061006
self.bolt12_payment().into(),
10071007
Arc::clone(&self.config),
10081008
Arc::clone(&self.logger),
1009-
Arc::clone(&self.hrn_resolver),
1009+
self.hrn_resolver.clone(),
10101010
)
10111011
}
10121012

@@ -1027,7 +1027,7 @@ impl Node {
10271027
self.bolt12_payment(),
10281028
Arc::clone(&self.config),
10291029
Arc::clone(&self.logger),
1030-
Arc::clone(&self.hrn_resolver),
1030+
self.hrn_resolver.clone(),
10311031
))
10321032
}
10331033

src/payment/unified.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub struct UnifiedPayment {
7474
bolt12_payment: Arc<Bolt12Payment>,
7575
config: Arc<Config>,
7676
logger: Arc<Logger>,
77-
hrn_resolver: Arc<HRNResolver>,
77+
hrn_resolver: HRNResolver,
7878
#[cfg(hrn_tests)]
7979
test_offer: std::sync::Mutex<Option<Offer>>,
8080
}
@@ -83,7 +83,7 @@ impl UnifiedPayment {
8383
pub(crate) fn new(
8484
onchain_payment: Arc<OnchainPayment>, bolt11_invoice: Arc<Bolt11Payment>,
8585
bolt12_payment: Arc<Bolt12Payment>, config: Arc<Config>, logger: Arc<Logger>,
86-
hrn_resolver: Arc<HRNResolver>,
86+
hrn_resolver: HRNResolver,
8787
) -> Self {
8888
Self {
8989
onchain_payment,
@@ -197,7 +197,7 @@ impl UnifiedPayment {
197197
}
198198

199199
let parse_fut =
200-
PaymentInstructions::parse(uri_str, target_network, self.hrn_resolver.as_ref(), false);
200+
PaymentInstructions::parse(uri_str, target_network, &self.hrn_resolver, false);
201201

202202
let instructions =
203203
tokio::time::timeout(Duration::from_secs(HRN_RESOLUTION_TIMEOUT_SECS), parse_fut)
@@ -223,7 +223,7 @@ impl UnifiedPayment {
223223
Error::InvalidAmount
224224
})?;
225225

226-
let fut = instr.set_amount(amt, self.hrn_resolver.as_ref());
226+
let fut = instr.set_amount(amt, &self.hrn_resolver);
227227

228228
tokio::time::timeout(Duration::from_secs(HRN_RESOLUTION_TIMEOUT_SECS), fut)
229229
.await
@@ -350,8 +350,8 @@ impl UnifiedPayment {
350350
/// offers allow us to bypass this resolution step and test the subsequent payment flow.
351351
///
352352
/// [BIP 353]: https://github.com/bitcoin/bips/blob/master/bip-0353.mediawiki
353-
pub fn set_test_offer(&self, _offer: Offer) {
354-
let _ = self.test_offer.lock().map(|mut guard| *guard = Some(_offer)).map_err(|e| {
353+
pub fn set_test_offer(&self, offer: Offer) {
354+
let _ = self.test_offer.lock().map(|mut guard| *guard = Some(offer)).map_err(|e| {
355355
log_error!(self.logger, "Failed to set test offer due to poisoned lock: {:?}", e)
356356
});
357357
}

src/types.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse
328328
IgnoringMessageHandler,
329329
>;
330330

331+
#[derive(Clone)]
331332
pub enum HRNResolver {
332333
Onion(Arc<LDKOnionMessageDNSSECHrnResolver<Arc<Graph>, Arc<Logger>>>),
333334
Local(Arc<DNSHrnResolver>),

0 commit comments

Comments
 (0)