@@ -167,7 +167,6 @@ use rand::Rng;
167167
168168use std:: default:: Default ;
169169use std:: net:: ToSocketAddrs ;
170- use std:: sync:: atomic:: { AtomicBool , Ordering } ;
171170use std:: sync:: { Arc , Mutex , RwLock } ;
172171use 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