Skip to content

Commit 4c6ba57

Browse files
committed
Listen on all provided addresses
Previously ldk-node would start binding after the first successful bind to an address.
1 parent 65945f8 commit 4c6ba57

File tree

2 files changed

+52
-43
lines changed

2 files changed

+52
-43
lines changed

src/builder.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ use std::default::Default;
7575
use std::fmt;
7676
use std::fs;
7777
use std::path::PathBuf;
78-
use std::sync::atomic::AtomicBool;
7978
use std::sync::{Arc, Mutex, Once, RwLock};
8079
use std::time::SystemTime;
8180
use vss_client::headers::{FixedHeaders, LnurlAuthToJwtProvider, VssHeaderProvider};
@@ -1105,7 +1104,6 @@ fn build_with_store_internal(
11051104
}
11061105

11071106
// Initialize the status fields.
1108-
let is_listening = Arc::new(AtomicBool::new(false));
11091107
let node_metrics = match read_node_metrics(Arc::clone(&kv_store), Arc::clone(&logger)) {
11101108
Ok(metrics) => Arc::new(RwLock::new(metrics)),
11111109
Err(e) => {
@@ -1679,7 +1677,6 @@ fn build_with_store_internal(
16791677
peer_store,
16801678
payment_store,
16811679
is_running,
1682-
is_listening,
16831680
node_metrics,
16841681
})
16851682
}

src/lib.rs

Lines changed: 52 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ use rand::Rng;
167167

168168
use std::default::Default;
169169
use std::net::ToSocketAddrs;
170-
use std::sync::atomic::{AtomicBool, Ordering};
171170
use std::sync::{Arc, Mutex, RwLock};
172171
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
173172

@@ -203,7 +202,6 @@ pub struct Node {
203202
peer_store: Arc<PeerStore<Arc<Logger>>>,
204203
payment_store: Arc<PaymentStore>,
205204
is_running: Arc<RwLock<bool>>,
206-
is_listening: Arc<AtomicBool>,
207205
node_metrics: Arc<RwLock<NodeMetrics>>,
208206
}
209207

@@ -305,9 +303,7 @@ impl Node {
305303
if let Some(listening_addresses) = &self.config.listening_addresses {
306304
// Setup networking
307305
let peer_manager_connection_handler = Arc::clone(&self.peer_manager);
308-
let mut stop_listen = self.stop_sender.subscribe();
309306
let listening_logger = Arc::clone(&self.logger);
310-
let listening_indicator = Arc::clone(&self.is_listening);
311307

312308
let mut bind_addrs = Vec::with_capacity(listening_addresses.len());
313309

@@ -325,45 +321,61 @@ impl Node {
325321
bind_addrs.extend(resolved_address);
326322
}
327323

328-
self.runtime.spawn_cancellable_background_task(async move {
329-
{
330-
let listener =
331-
tokio::net::TcpListener::bind(&*bind_addrs).await
332-
.unwrap_or_else(|e| {
333-
log_error!(listening_logger, "Failed to bind to listen addresses/ports - is something else already listening on it?: {}", e);
334-
panic!(
335-
"Failed to bind to listen address/port - is something else already listening on it?",
336-
);
337-
});
338-
339-
listening_indicator.store(true, Ordering::Release);
340-
341-
loop {
342-
let peer_mgr = Arc::clone(&peer_manager_connection_handler);
343-
tokio::select! {
344-
_ = stop_listen.changed() => {
345-
log_debug!(
346-
listening_logger,
347-
"Stopping listening to inbound connections."
324+
let logger = Arc::clone(&listening_logger);
325+
let listeners = self.runtime.block_on(async move {
326+
let mut listeners = Vec::new();
327+
328+
// Try to bind to all addresses
329+
for addr in &*bind_addrs {
330+
match tokio::net::TcpListener::bind(addr).await {
331+
Ok(listener) => {
332+
log_trace!(logger, "Bound to {}", addr);
333+
listeners.push(listener);
334+
},
335+
Err(e) => {
336+
log_error!(
337+
logger,
338+
"Failed to bind to {}: {} - is something else already listening?",
339+
addr,
340+
e
348341
);
349-
break;
350-
}
351-
res = listener.accept() => {
352-
let tcp_stream = res.unwrap().0;
353-
tokio::spawn(async move {
354-
lightning_net_tokio::setup_inbound(
355-
Arc::clone(&peer_mgr),
356-
tcp_stream.into_std().unwrap(),
357-
)
358-
.await;
359-
});
360-
}
342+
return Err(Error::InvalidSocketAddress);
343+
},
361344
}
362345
}
363-
}
364346

365-
listening_indicator.store(false, Ordering::Release);
366-
});
347+
Ok(listeners)
348+
})?;
349+
350+
for listener in listeners {
351+
let logger = Arc::clone(&listening_logger);
352+
let peer_mgr = Arc::clone(&peer_manager_connection_handler);
353+
let mut stop_listen = self.stop_sender.subscribe();
354+
self.runtime.spawn_cancellable_background_task(async move {
355+
loop {
356+
tokio::select! {
357+
_ = stop_listen.changed() => {
358+
log_debug!(
359+
logger,
360+
"Stopping listening to inbound connections."
361+
);
362+
break;
363+
}
364+
res = listener.accept() => {
365+
let tcp_stream = res.unwrap().0;
366+
let peer_mgr = Arc::clone(&peer_mgr);
367+
tokio::spawn(async move {
368+
lightning_net_tokio::setup_inbound(
369+
Arc::clone(&peer_mgr),
370+
tcp_stream.into_std().unwrap(),
371+
)
372+
.await;
373+
});
374+
}
375+
}
376+
}
377+
});
378+
}
367379
}
368380

369381
// Regularly reconnect to persisted peers.
@@ -675,7 +687,7 @@ impl Node {
675687
/// Returns the status of the [`Node`].
676688
pub fn status(&self) -> NodeStatus {
677689
let is_running = *self.is_running.read().unwrap();
678-
let is_listening = self.is_listening.load(Ordering::Acquire);
690+
let is_listening = is_running;
679691
let current_best_block = self.channel_manager.current_best_block().into();
680692
let locked_node_metrics = self.node_metrics.read().unwrap();
681693
let latest_lightning_wallet_sync_timestamp =

0 commit comments

Comments
 (0)