@@ -17,17 +17,6 @@ use tokio::net::TcpListener;
1717use tonic:: transport:: { Channel , Server } ;
1818use url:: Url ;
1919
20- pub fn get_free_ports ( n : usize ) -> Vec < u16 > {
21- let listeners = ( 0 ..n)
22- . map ( |_| std:: net:: TcpListener :: bind ( "127.0.0.1:0" ) )
23- . collect :: < Result < Vec < _ > , _ > > ( )
24- . expect ( "Failed to bind to address" ) ;
25- listeners
26- . iter ( )
27- . map ( |listener| listener. local_addr ( ) . unwrap ( ) . port ( ) )
28- . collect ( )
29- }
30-
3120pub async fn start_localhost_context < B > (
3221 num_workers : usize ,
3322 session_builder : B ,
3625 B : DistributedSessionBuilder + Send + Sync + ' static ,
3726 B : Clone ,
3827{
39- let ports = get_free_ports ( num_workers) ;
28+ let listeners = futures:: future:: try_join_all (
29+ ( 0 ..num_workers)
30+ . map ( |_| TcpListener :: bind ( "127.0.0.1:0" ) )
31+ . collect :: < Vec < _ > > ( ) ,
32+ )
33+ . await
34+ . expect ( "Failed to bind to address" ) ;
35+
36+ let ports: Vec < u16 > = listeners
37+ . iter ( )
38+ . map ( |listener| {
39+ listener
40+ . local_addr ( )
41+ . expect ( "Failed to get local address" )
42+ . port ( )
43+ } )
44+ . collect ( ) ;
4045
4146 let channel_resolver = LocalHostChannelResolver :: new ( ports. clone ( ) ) ;
4247 let session_builder = session_builder. map ( move |builder : SessionStateBuilder | {
4651 . build ( ) )
4752 } ) ;
4853 let mut join_set = JoinSet :: new ( ) ;
49- for port in ports {
54+ for listener in listeners {
5055 let session_builder = session_builder. clone ( ) ;
51- let listener = TcpListener :: bind ( format ! ( "127.0.0.1:{port}" ) )
52- . await
53- . unwrap ( ) ;
5456 join_set. spawn ( async move {
5557 spawn_flight_service ( session_builder, listener)
5658 . await
0 commit comments