refactor(client): only spawn pooled in executor if not ready when response recieved
This commit is contained in:
@@ -243,20 +243,27 @@ where C: Connect,
|
||||
} else {
|
||||
ClientError::Normal(err)
|
||||
}
|
||||
})
|
||||
.map(move |res| {
|
||||
// when pooled is dropped, it will try to insert back into the
|
||||
// pool. To delay that, spawn a future that completes once the
|
||||
// sender is ready again.
|
||||
//
|
||||
// This *should* only be once the related `Connection` has polled
|
||||
// for a new request to start.
|
||||
//
|
||||
// It won't be ready if there is a body to stream.
|
||||
if let Ok(Async::NotReady) = pooled.tx.poll_ready() {
|
||||
// If the executor doesn't have room, oh well. Things will likely
|
||||
// be blowing up soon, but this specific task isn't required.
|
||||
let _ = executor.execute(future::poll_fn(move || {
|
||||
pooled.tx.poll_ready().map_err(|_| ())
|
||||
}));
|
||||
}
|
||||
|
||||
res
|
||||
});
|
||||
|
||||
// when pooled is dropped, it will try to insert back into the
|
||||
// pool. To delay that, spawn a future that completes once the
|
||||
// sender is ready again.
|
||||
//
|
||||
// This *should* only be once the related `Connection` has polled
|
||||
// for a new request to start.
|
||||
//
|
||||
// If the executor doesn't have room, oh well. Things will likely
|
||||
// be blowing up soon, but this specific task isn't required.
|
||||
let _ = executor.execute(future::poll_fn(move || {
|
||||
pooled.tx.poll_ready().map_err(|_| ())
|
||||
}));
|
||||
|
||||
fut
|
||||
});
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
extern crate pretty_env_logger;
|
||||
|
||||
use std::time::Duration;
|
||||
|
||||
use futures::Async;
|
||||
use futures::future::poll_fn;
|
||||
use tokio::reactor::{Core, Timeout};
|
||||
use tokio::reactor::Core;
|
||||
|
||||
use mock::MockConnector;
|
||||
use super::*;
|
||||
@@ -70,11 +68,6 @@ fn conn_reset_after_write() {
|
||||
Ok(Async::Ready(()))
|
||||
});
|
||||
core.run(res1.join(srv1)).expect("res1");
|
||||
|
||||
// run a tiny timeout just to spin the core, so that the pool
|
||||
// can tell the socket is ready again
|
||||
let timeout = Timeout::new(Duration::from_millis(50), &core.handle()).unwrap();
|
||||
core.run(timeout).unwrap();
|
||||
}
|
||||
|
||||
let res2 = client.get("http://mock.local/a".parse().unwrap());
|
||||
|
||||
Reference in New Issue
Block a user