perf(client): dont keep Pool mutex locked during getaddrinfo

This commit is contained in:
Sean McArthur
2016-04-25 15:36:55 -07:00
parent 4828437551
commit 5fcc04a6cd

View File

@@ -102,22 +102,21 @@ impl<C: NetworkConnector<Stream=S>, S: NetworkStream + Send> NetworkConnector fo
type Stream = PooledStream<S>; type Stream = PooledStream<S>;
fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<PooledStream<S>> { fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<PooledStream<S>> {
let key = key(host, port, scheme); let key = key(host, port, scheme);
let mut locked = self.inner.lock().unwrap();
let mut should_remove = false; let mut should_remove = false;
let inner = match locked.conns.get_mut(&key) { let inner = match self.inner.lock().unwrap().conns.get_mut(&key) {
Some(ref mut vec) => { Some(ref mut vec) => {
trace!("Pool had connection, using"); trace!("Pool had connection, using");
should_remove = vec.len() == 1; should_remove = vec.len() == 1;
vec.pop().unwrap() vec.pop().unwrap()
} }
_ => PooledStreamInner { None => PooledStreamInner {
key: key.clone(), key: key.clone(),
stream: try!(self.connector.connect(host, port, scheme)), stream: try!(self.connector.connect(host, port, scheme)),
previous_response_expected_no_content: false, previous_response_expected_no_content: false,
} }
}; };
if should_remove { if should_remove {
locked.conns.remove(&key); self.inner.lock().unwrap().conns.remove(&key);
} }
Ok(PooledStream { Ok(PooledStream {
inner: Some(inner), inner: Some(inner),