happy_eyeballs: don't retain errored connects

Astro created

Change summary

src/happy_eyeballs.rs | 26 ++++++++++++++++++++------
src/stream_start.rs   |  2 +-
2 files changed, 21 insertions(+), 7 deletions(-)

Detailed changes

src/happy_eyeballs.rs 🔗

@@ -80,15 +80,29 @@ impl Future for Connecter {
                 return Err(format!("{}", e)),
         }
 
-        for mut connect in self.connects.values_mut() {
+        let mut connected_stream = None;
+        self.connects.retain(|_, connect| {
+            if connected_stream.is_some() {
+                return false;
+            }
+
             match connect.poll() {
-                Ok(Async::NotReady) => (),
-                Ok(Async::Ready(tcp_stream)) =>
+                Ok(Async::NotReady) => true,
+                Ok(Async::Ready(tcp_stream)) => {
                     // Success!
-                    return Ok(Async::Ready(tcp_stream)),
-                Err(e) =>
-                    println!("{}", e),
+                    connected_stream = Some(tcp_stream);
+                    false
+                },
+                Err(e) => {
+                    println!("{}", e);
+                    false
+                },
             }
+        });
+        match connected_stream {
+            Some(tcp_stream) =>
+                return Ok(Async::Ready(tcp_stream)),
+            None => (),
         }
 
         if  self.lookup.is_none() &&

src/stream_start.rs 🔗

@@ -89,7 +89,7 @@ impl<S: AsyncRead + AsyncWrite> Future for StreamStart<S> {
                         } else {
                             (StreamStartState::RecvFeatures(stream, stream_ns), Ok(Async::NotReady))
                         },
-                    Ok(Async::Ready(item)) =>
+                    Ok(Async::Ready(_)) =>
                         (StreamStartState::RecvFeatures(stream, stream_ns), Ok(Async::NotReady)),
                     Ok(Async::NotReady) =>
                         (StreamStartState::RecvFeatures(stream, stream_ns), Ok(Async::NotReady)),