@@ -7,7 +7,7 @@ use futures_util::stream::FuturesUnordered;
77use futures_util:: { FutureExt , Stream } ;
88use std:: future:: Future ;
99use std:: pin:: Pin ;
10- use std:: task:: { Context , Poll } ;
10+ use std:: task:: { Context , Poll , ready } ;
1111
1212feature_use ! ( cfg( feature = "telemetry-server" ) , {
1313 use super :: server:: TelemetryServerFuture ;
@@ -89,25 +89,23 @@ impl Future for TelemetryDriver {
8989 type Output = BootstrapResult < ( ) > ;
9090
9191 fn poll ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Self :: Output > {
92- let mut ready_res = vec ! [ ] ;
92+ #[ cfg_attr( not( feature = "telemetry-server" ) , allow( unused_mut) ) ]
93+ let mut server_res = Poll :: Ready ( Ok ( ( ) ) ) ;
9394
9495 #[ cfg( feature = "telemetry-server" ) ]
9596 if let Some ( server_fut) = & mut self . server_fut {
96- if let Poll :: Ready ( res ) = Pin :: new ( server_fut ) . poll ( cx ) {
97- match res { }
98- }
97+ // This future is always pending
98+ let Poll :: Pending = Pin :: new ( server_fut ) . poll ( cx ) ;
99+ server_res = Poll :: Pending ;
99100 }
100101
101- let tele_futures_poll = Pin :: new ( & mut self . tele_futures ) . poll_next ( cx) ;
102-
103- if let Poll :: Ready ( Some ( res) ) = tele_futures_poll {
104- ready_res. push ( res) ;
105- }
106-
107- if ready_res. is_empty ( ) {
108- Poll :: Pending
109- } else {
110- Poll :: Ready ( ready_res. into_iter ( ) . collect ( ) )
102+ loop {
103+ // Keep polling tele_futures until it becomes pending, empty, or a future errors
104+ let tele_res = ready ! ( Pin :: new( & mut self . tele_futures) . poll_next( cx) ?) ;
105+ if tele_res. is_none ( ) {
106+ // tele_futures is done, but we may still need to poll server_fut
107+ return server_res;
108+ }
111109 }
112110 }
113111}
0 commit comments