@@ -167,7 +167,6 @@ use rand::Rng;
167
167
168
168
use std:: default:: Default ;
169
169
use std:: net:: ToSocketAddrs ;
170
- use std:: sync:: atomic:: { AtomicBool , Ordering } ;
171
170
use std:: sync:: { Arc , Mutex , RwLock } ;
172
171
use std:: time:: { Duration , Instant , SystemTime , UNIX_EPOCH } ;
173
172
@@ -203,7 +202,6 @@ pub struct Node {
203
202
peer_store : Arc < PeerStore < Arc < Logger > > > ,
204
203
payment_store : Arc < PaymentStore > ,
205
204
is_running : Arc < RwLock < bool > > ,
206
- is_listening : Arc < AtomicBool > ,
207
205
node_metrics : Arc < RwLock < NodeMetrics > > ,
208
206
}
209
207
@@ -305,9 +303,7 @@ impl Node {
305
303
if let Some ( listening_addresses) = & self . config . listening_addresses {
306
304
// Setup networking
307
305
let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
308
- let mut stop_listen = self . stop_sender . subscribe ( ) ;
309
306
let listening_logger = Arc :: clone ( & self . logger ) ;
310
- let listening_indicator = Arc :: clone ( & self . is_listening ) ;
311
307
312
308
let mut bind_addrs = Vec :: with_capacity ( listening_addresses. len ( ) ) ;
313
309
@@ -325,46 +321,62 @@ impl Node {
325
321
bind_addrs. extend ( resolved_address) ;
326
322
}
327
323
328
- let runtime = Arc :: clone ( & self . runtime ) ;
329
- self . runtime . spawn_cancellable_background_task ( async move {
330
- {
331
- let listener =
332
- tokio:: net:: TcpListener :: bind ( & * bind_addrs) . await
333
- . unwrap_or_else ( |e| {
334
- log_error ! ( listening_logger, "Failed to bind to listen addresses/ports - is something else already listening on it?: {}" , e) ;
335
- panic ! (
336
- "Failed to bind to listen address/port - is something else already listening on it?" ,
337
- ) ;
338
- } ) ;
339
-
340
- listening_indicator. store ( true , Ordering :: Release ) ;
341
-
342
- loop {
343
- let peer_mgr = Arc :: clone ( & peer_manager_connection_handler) ;
344
- tokio:: select! {
345
- _ = stop_listen. changed( ) => {
346
- log_debug!(
347
- listening_logger,
348
- "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, "Listener 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
349
341
) ;
350
- break ;
351
- }
352
- res = listener. accept( ) => {
353
- let tcp_stream = res. unwrap( ) . 0 ;
354
- runtime. spawn_cancellable_background_task( async move {
355
- lightning_net_tokio:: setup_inbound(
356
- Arc :: clone( & peer_mgr) ,
357
- tcp_stream. into_std( ) . unwrap( ) ,
358
- )
359
- . await ;
360
- } ) ;
361
- }
342
+ return Err ( Error :: InvalidSocketAddress ) ;
343
+ } ,
362
344
}
363
345
}
364
- }
365
346
366
- listening_indicator. store ( false , Ordering :: Release ) ;
367
- } ) ;
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
+ let runtime = Arc :: clone ( & self . runtime ) ;
355
+ self . runtime . spawn_cancellable_background_task ( async move {
356
+ loop {
357
+ tokio:: select! {
358
+ _ = stop_listen. changed( ) => {
359
+ log_debug!(
360
+ logger,
361
+ "Stopping listening to inbound connections."
362
+ ) ;
363
+ break ;
364
+ }
365
+ res = listener. accept( ) => {
366
+ let tcp_stream = res. unwrap( ) . 0 ;
367
+ let peer_mgr = Arc :: clone( & peer_mgr) ;
368
+ runtime. spawn_cancellable_background_task( async move {
369
+ lightning_net_tokio:: setup_inbound(
370
+ Arc :: clone( & peer_mgr) ,
371
+ tcp_stream. into_std( ) . unwrap( ) ,
372
+ )
373
+ . await ;
374
+ } ) ;
375
+ }
376
+ }
377
+ }
378
+ } ) ;
379
+ }
368
380
}
369
381
370
382
// Regularly reconnect to persisted peers.
@@ -676,7 +688,8 @@ impl Node {
676
688
/// Returns the status of the [`Node`].
677
689
pub fn status ( & self ) -> NodeStatus {
678
690
let is_running = * self . is_running . read ( ) . unwrap ( ) ;
679
- let is_listening = self . is_listening . load ( Ordering :: Acquire ) ;
691
+ let is_listening =
692
+ is_running && self . config . listening_addresses . as_ref ( ) . map_or ( false , |v| !v. is_empty ( ) ) ;
680
693
let current_best_block = self . channel_manager . current_best_block ( ) . into ( ) ;
681
694
let locked_node_metrics = self . node_metrics . read ( ) . unwrap ( ) ;
682
695
let latest_lightning_wallet_sync_timestamp =
0 commit comments