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