@@ -101,7 +101,6 @@ mod wallet;
101
101
102
102
use std:: default:: Default ;
103
103
use std:: net:: ToSocketAddrs ;
104
- use std:: sync:: atomic:: { AtomicBool , Ordering } ;
105
104
use std:: sync:: { Arc , Mutex , RwLock } ;
106
105
use std:: time:: { Duration , Instant , SystemTime , UNIX_EPOCH } ;
107
106
@@ -189,7 +188,6 @@ pub struct Node {
189
188
peer_store : Arc < PeerStore < Arc < Logger > > > ,
190
189
payment_store : Arc < PaymentStore > ,
191
190
is_running : Arc < RwLock < bool > > ,
192
- is_listening : Arc < AtomicBool > ,
193
191
node_metrics : Arc < RwLock < NodeMetrics > > ,
194
192
om_mailbox : Option < Arc < OnionMessageMailbox > > ,
195
193
async_payments_role : Option < AsyncPaymentsRole > ,
@@ -293,9 +291,7 @@ impl Node {
293
291
if let Some ( listening_addresses) = & self . config . listening_addresses {
294
292
// Setup networking
295
293
let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
296
- let mut stop_listen = self . stop_sender . subscribe ( ) ;
297
294
let listening_logger = Arc :: clone ( & self . logger ) ;
298
- let listening_indicator = Arc :: clone ( & self . is_listening ) ;
299
295
300
296
let mut bind_addrs = Vec :: with_capacity ( listening_addresses. len ( ) ) ;
301
297
@@ -313,45 +309,62 @@ impl Node {
313
309
bind_addrs. extend ( resolved_address) ;
314
310
}
315
311
316
- self . runtime . spawn_cancellable_background_task ( async move {
317
- {
318
- let listener =
319
- tokio:: net:: TcpListener :: bind ( & * bind_addrs) . await
320
- . unwrap_or_else ( |e| {
321
- log_error ! ( listening_logger, "Failed to bind to listen addresses/ports - is something else already listening on it?: {}" , e) ;
322
- panic ! (
323
- "Failed to bind to listen address/port - is something else already listening on it?" ,
324
- ) ;
325
- } ) ;
326
-
327
- listening_indicator. store ( true , Ordering :: Release ) ;
328
-
329
- loop {
330
- let peer_mgr = Arc :: clone ( & peer_manager_connection_handler) ;
331
- tokio:: select! {
332
- _ = stop_listen. changed( ) => {
333
- log_debug!(
334
- listening_logger,
335
- "Stopping listening to inbound connections."
312
+ let logger = Arc :: clone ( & listening_logger) ;
313
+ let listeners = self . runtime . block_on ( async move {
314
+ let mut listeners = Vec :: new ( ) ;
315
+
316
+ // Try to bind to all addresses
317
+ for addr in & * bind_addrs {
318
+ match tokio:: net:: TcpListener :: bind ( addr) . await {
319
+ Ok ( listener) => {
320
+ log_trace ! ( logger, "Listener bound to {}" , addr) ;
321
+ listeners. push ( listener) ;
322
+ } ,
323
+ Err ( e) => {
324
+ log_error ! (
325
+ logger,
326
+ "Failed to bind to {}: {} - is something else already listening?" ,
327
+ addr,
328
+ e
336
329
) ;
337
- break ;
338
- }
339
- res = listener. accept( ) => {
340
- let tcp_stream = res. unwrap( ) . 0 ;
341
- tokio:: spawn( async move {
342
- lightning_net_tokio:: setup_inbound(
343
- Arc :: clone( & peer_mgr) ,
344
- tcp_stream. into_std( ) . unwrap( ) ,
345
- )
346
- . await ;
347
- } ) ;
348
- }
330
+ return Err ( Error :: InvalidSocketAddress ) ;
331
+ } ,
349
332
}
350
333
}
351
- }
352
334
353
- listening_indicator. store ( false , Ordering :: Release ) ;
354
- } ) ;
335
+ Ok ( listeners)
336
+ } ) ?;
337
+
338
+ for listener in listeners {
339
+ let logger = Arc :: clone ( & listening_logger) ;
340
+ let peer_mgr = Arc :: clone ( & peer_manager_connection_handler) ;
341
+ let mut stop_listen = self . stop_sender . subscribe ( ) ;
342
+ let runtime = Arc :: clone ( & self . runtime ) ;
343
+ self . runtime . spawn_cancellable_background_task ( async move {
344
+ loop {
345
+ tokio:: select! {
346
+ _ = stop_listen. changed( ) => {
347
+ log_debug!(
348
+ logger,
349
+ "Stopping listening to inbound connections."
350
+ ) ;
351
+ break ;
352
+ }
353
+ res = listener. accept( ) => {
354
+ let tcp_stream = res. unwrap( ) . 0 ;
355
+ let peer_mgr = Arc :: clone( & peer_mgr) ;
356
+ runtime. spawn_cancellable_background_task( async move {
357
+ lightning_net_tokio:: setup_inbound(
358
+ Arc :: clone( & peer_mgr) ,
359
+ tcp_stream. into_std( ) . unwrap( ) ,
360
+ )
361
+ . await ;
362
+ } ) ;
363
+ }
364
+ }
365
+ }
366
+ } ) ;
367
+ }
355
368
}
356
369
357
370
// Regularly reconnect to persisted peers.
@@ -666,7 +679,6 @@ impl Node {
666
679
/// Returns the status of the [`Node`].
667
680
pub fn status ( & self ) -> NodeStatus {
668
681
let is_running = * self . is_running . read ( ) . unwrap ( ) ;
669
- let is_listening = self . is_listening . load ( Ordering :: Acquire ) ;
670
682
let current_best_block = self . channel_manager . current_best_block ( ) . into ( ) ;
671
683
let locked_node_metrics = self . node_metrics . read ( ) . unwrap ( ) ;
672
684
let latest_lightning_wallet_sync_timestamp =
@@ -684,7 +696,6 @@ impl Node {
684
696
685
697
NodeStatus {
686
698
is_running,
687
- is_listening,
688
699
current_best_block,
689
700
latest_lightning_wallet_sync_timestamp,
690
701
latest_onchain_wallet_sync_timestamp,
@@ -1495,9 +1506,6 @@ impl Drop for Node {
1495
1506
pub struct NodeStatus {
1496
1507
/// Indicates whether the [`Node`] is running.
1497
1508
pub is_running : bool ,
1498
- /// Indicates whether the [`Node`] is listening for incoming connections on the addresses
1499
- /// configured via [`Config::listening_addresses`].
1500
- pub is_listening : bool ,
1501
1509
/// The best block to which our Lightning wallet is currently synced.
1502
1510
pub current_best_block : BestBlock ,
1503
1511
/// The timestamp, in seconds since start of the UNIX epoch, when we last successfully synced
0 commit comments