feat(client): DNS worker count is configurable
When loading up a client suddenly with thousands of connections, the default DNS worker count of four cannot keep up and many requests timeout as a result. Most people don't need a large pool, so making this configurable is a natural choice.
This commit is contained in:
@@ -24,6 +24,9 @@ pub trait Connect {
|
|||||||
/// Returns a connected socket and associated host.
|
/// Returns a connected socket and associated host.
|
||||||
fn connected(&mut self) -> Option<(Self::Key, io::Result<Self::Output>)>;
|
fn connected(&mut self) -> Option<(Self::Key, io::Result<Self::Output>)>;
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
/// Configure number of dns workers to use.
|
||||||
|
fn dns_workers(&mut self, usize);
|
||||||
|
#[doc(hidden)]
|
||||||
fn register(&mut self, Registration);
|
fn register(&mut self, Registration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +74,10 @@ impl Connect for HttpConnector {
|
|||||||
type Output = HttpStream;
|
type Output = HttpStream;
|
||||||
type Key = (&'static str, String, u16);
|
type Key = (&'static str, String, u16);
|
||||||
|
|
||||||
|
fn dns_workers(&mut self, count: usize) {
|
||||||
|
self.threads = count;
|
||||||
|
}
|
||||||
|
|
||||||
fn key(&self, url: &Url) -> Option<Self::Key> {
|
fn key(&self, url: &Url) -> Option<Self::Key> {
|
||||||
if url.scheme() == "http" {
|
if url.scheme() == "http" {
|
||||||
Some((
|
Some((
|
||||||
@@ -119,7 +126,7 @@ impl Connect for HttpConnector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn register(&mut self, reg: Registration) {
|
fn register(&mut self, reg: Registration) {
|
||||||
self.dns = Some(Dns::new(reg.notify, 4));
|
self.dns = Some(Dns::new(reg.notify, self.threads));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +151,10 @@ impl<S: SslClient> Connect for HttpsConnector<S> {
|
|||||||
type Output = HttpsStream<S::Stream>;
|
type Output = HttpsStream<S::Stream>;
|
||||||
type Key = (&'static str, String, u16);
|
type Key = (&'static str, String, u16);
|
||||||
|
|
||||||
|
fn dns_workers(&mut self, count: usize) {
|
||||||
|
self.http.dns_workers(count)
|
||||||
|
}
|
||||||
|
|
||||||
fn key(&self, url: &Url) -> Option<Self::Key> {
|
fn key(&self, url: &Url) -> Option<Self::Key> {
|
||||||
let scheme = match url.scheme() {
|
let scheme = match url.scheme() {
|
||||||
"http" => "http",
|
"http" => "http",
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ impl<H: Send> Client<H> {
|
|||||||
let mut loop_ = try!(rotor::Loop::new(&rotor_config));
|
let mut loop_ = try!(rotor::Loop::new(&rotor_config));
|
||||||
let mut notifier = None;
|
let mut notifier = None;
|
||||||
let mut connector = config.connector;
|
let mut connector = config.connector;
|
||||||
|
connector.dns_workers(config.dns_workers);
|
||||||
{
|
{
|
||||||
let not = &mut notifier;
|
let not = &mut notifier;
|
||||||
loop_.add_machine_with(move |scope| {
|
loop_.add_machine_with(move |scope| {
|
||||||
@@ -150,6 +151,7 @@ pub struct Config<C> {
|
|||||||
//TODO: make use of max_idle config
|
//TODO: make use of max_idle config
|
||||||
max_idle: usize,
|
max_idle: usize,
|
||||||
max_sockets: usize,
|
max_sockets: usize,
|
||||||
|
dns_workers: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C> Config<C> where C: Connect + Send + 'static {
|
impl<C> Config<C> where C: Connect + Send + 'static {
|
||||||
@@ -163,6 +165,7 @@ impl<C> Config<C> where C: Connect + Send + 'static {
|
|||||||
keep_alive_timeout: Some(Duration::from_secs(60 * 2)),
|
keep_alive_timeout: Some(Duration::from_secs(60 * 2)),
|
||||||
max_idle: self.max_idle,
|
max_idle: self.max_idle,
|
||||||
max_sockets: self.max_sockets,
|
max_sockets: self.max_sockets,
|
||||||
|
dns_workers: self.dns_workers,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,6 +207,15 @@ impl<C> Config<C> where C: Connect + Send + 'static {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set number of Dns workers to use for this client
|
||||||
|
///
|
||||||
|
/// Default is 4
|
||||||
|
#[inline]
|
||||||
|
pub fn dns_workers(mut self, workers: usize) -> Config<C> {
|
||||||
|
self.dns_workers = workers;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Construct the Client with this configuration.
|
/// Construct the Client with this configuration.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn build<H: Handler<C::Output>>(self) -> ::Result<Client<H>> {
|
pub fn build<H: Handler<C::Output>>(self) -> ::Result<Client<H>> {
|
||||||
@@ -220,6 +232,7 @@ impl Default for Config<DefaultConnector> {
|
|||||||
keep_alive_timeout: Some(Duration::from_secs(60 * 2)),
|
keep_alive_timeout: Some(Duration::from_secs(60 * 2)),
|
||||||
max_idle: 5,
|
max_idle: 5,
|
||||||
max_sockets: 1024,
|
max_sockets: 1024,
|
||||||
|
dns_workers: 4,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user