Skip to content

Commit d19d95a

Browse files
committed
refactor(client): pass internal executor to h2 dispatcher
1 parent a4f4553 commit d19d95a

File tree

4 files changed

+45
-44
lines changed

4 files changed

+45
-44
lines changed

src/client/conn.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,12 +425,10 @@ impl Builder {
425425
}
426426
}
427427

428-
/*
429428
pub(super) fn exec(&mut self, exec: Exec) -> &mut Builder {
430429
self.exec = exec;
431430
self
432431
}
433-
*/
434432

435433
pub(super) fn h1_writev(&mut self, enabled: bool) -> &mut Builder {
436434
self.h1_writev = enabled;

src/client/connect.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,16 @@ impl Destination {
6161
pub fn scheme(&self) -> &str {
6262
self.uri
6363
.scheme_part()
64-
.expect("destination uri has scheme")
65-
.as_str()
64+
.map(|s| s.as_str())
65+
.unwrap_or("")
6666
}
6767

6868
/// Get the hostname.
6969
#[inline]
7070
pub fn host(&self) -> &str {
7171
self.uri
7272
.host()
73-
.expect("destination uri has host")
73+
.unwrap_or("")
7474
}
7575

7676
/// Get the port, if specified.
@@ -470,7 +470,6 @@ mod http {
470470

471471
#[cfg(test)]
472472
mod tests {
473-
#![allow(deprecated)]
474473
use std::io;
475474
use futures::Future;
476475
use super::{Connect, Destination, HttpConnector};

src/client/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ where C: Connect + Sync + 'static,
198198
.map_err(::Error::new_connect)
199199
.and_then(move |(io, connected)| {
200200
conn::Builder::new()
201+
.exec(executor.clone())
201202
.h1_writev(h1_writev)
202203
.h1_title_case_headers(h1_title_case_headers)
203204
.http2_only(pool_key.1 == Ver::Http2)

src/client/pool.rs

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ pub(super) enum Reservation<T> {
3737
/// This connection could be used multiple times, the first one will be
3838
/// reinserted into the `idle` pool, and the second will be given to
3939
/// the `Checkout`.
40-
#[allow(unused)]
4140
Shared(T, T),
4241
/// This connection requires unique access. It will be returned after
4342
/// use is complete.
@@ -65,7 +64,7 @@ struct PoolInner<T> {
6564
// this list is checked for any parked Checkouts, and tries to notify
6665
// them that the Conn could be used instead of waiting for a brand new
6766
// connection.
68-
parked: HashMap<Key, VecDeque<oneshot::Sender<T>>>,
67+
waiters: HashMap<Key, VecDeque<oneshot::Sender<T>>>,
6968
timeout: Option<Duration>,
7069
// A oneshot channel is used to allow the interval to be notified when
7170
// the Pool completely drops. That way, the interval can cancel immediately.
@@ -80,7 +79,7 @@ impl<T> Pool<T> {
8079
enabled: enabled,
8180
idle: HashMap::new(),
8281
idle_interval_ref: None,
83-
parked: HashMap::new(),
82+
waiters: HashMap::new(),
8483
timeout: timeout,
8584
})),
8685
}
@@ -94,7 +93,7 @@ impl<T: Poolable> Pool<T> {
9493
Checkout {
9594
key,
9695
pool: self.clone(),
97-
parked: None,
96+
waiter: None,
9897
}
9998
}
10099

@@ -217,10 +216,10 @@ impl<T: Poolable> Pool<T> {
217216
}
218217
}
219218

220-
fn park(&mut self, key: Key, tx: oneshot::Sender<T>) {
219+
fn waiter(&mut self, key: Key, tx: oneshot::Sender<T>) {
221220
trace!("checkout waiting for idle connection: {:?}", key);
222221
self.inner.lock().unwrap()
223-
.parked.entry(key)
222+
.waiters.entry(key)
224223
.or_insert(VecDeque::new())
225224
.push_back(tx);
226225
}
@@ -285,10 +284,10 @@ impl<T: Poolable> PoolInner<T> {
285284
return;
286285
}
287286
trace!("put; add idle connection for {:?}", key);
288-
let mut remove_parked = false;
287+
let mut remove_waiters = false;
289288
let mut value = Some(value);
290-
if let Some(parked) = self.parked.get_mut(&key) {
291-
while let Some(tx) = parked.pop_front() {
289+
if let Some(waiters) = self.waiters.get_mut(&key) {
290+
while let Some(tx) = waiters.pop_front() {
292291
if !tx.is_canceled() {
293292
let reserved = value.take().expect("value already sent");
294293
let reserved = match reserved.reserve() {
@@ -314,10 +313,10 @@ impl<T: Poolable> PoolInner<T> {
314313

315314
trace!("put; removing canceled waiter for {:?}", key);
316315
}
317-
remove_parked = parked.is_empty();
316+
remove_waiters = waiters.is_empty();
318317
}
319-
if remove_parked {
320-
self.parked.remove(&key);
318+
if remove_waiters {
319+
self.waiters.remove(&key);
321320
}
322321

323322
match value {
@@ -345,7 +344,7 @@ impl<T: Poolable> PoolInner<T> {
345344
// cancel any waiters. if there are any, it's because
346345
// this Connecting task didn't complete successfully.
347346
// those waiters would never receive a connection.
348-
self.parked.remove(key);
347+
self.waiters.remove(key);
349348
}
350349
}
351350

@@ -354,16 +353,16 @@ impl<T> PoolInner<T> {
354353
/// and possibly inserted into the pool that it is waiting for an idle
355354
/// connection. If a user ever dropped that future, we need to clean out
356355
/// those parked senders.
357-
fn clean_parked(&mut self, key: &Key) {
358-
let mut remove_parked = false;
359-
if let Some(parked) = self.parked.get_mut(key) {
360-
parked.retain(|tx| {
356+
fn clean_waiters(&mut self, key: &Key) {
357+
let mut remove_waiters = false;
358+
if let Some(waiters) = self.waiters.get_mut(key) {
359+
waiters.retain(|tx| {
361360
!tx.is_canceled()
362361
});
363-
remove_parked = parked.is_empty();
362+
remove_waiters = waiters.is_empty();
364363
}
365-
if remove_parked {
366-
self.parked.remove(key);
364+
if remove_waiters {
365+
self.waiters.remove(key);
367366
}
368367
}
369368
}
@@ -511,13 +510,13 @@ struct Idle<T> {
511510
pub(super) struct Checkout<T> {
512511
key: Key,
513512
pool: Pool<T>,
514-
parked: Option<oneshot::Receiver<T>>,
513+
waiter: Option<oneshot::Receiver<T>>,
515514
}
516515

517516
impl<T: Poolable> Checkout<T> {
518-
fn poll_parked(&mut self) -> Poll<Option<Pooled<T>>, ::Error> {
517+
fn poll_waiter(&mut self) -> Poll<Option<Pooled<T>>, ::Error> {
519518
static CANCELED: &str = "pool checkout failed";
520-
if let Some(ref mut rx) = self.parked {
519+
if let Some(mut rx) = self.waiter.take() {
521520
match rx.poll() {
522521
Ok(Async::Ready(value)) => {
523522
if !value.is_closed() {
@@ -526,20 +525,23 @@ impl<T: Poolable> Checkout<T> {
526525
Err(::Error::new_canceled(Some(CANCELED)))
527526
}
528527
},
529-
Ok(Async::NotReady) => Ok(Async::NotReady),
528+
Ok(Async::NotReady) => {
529+
self.waiter = Some(rx);
530+
Ok(Async::NotReady)
531+
},
530532
Err(_canceled) => Err(::Error::new_canceled(Some(CANCELED))),
531533
}
532534
} else {
533535
Ok(Async::Ready(None))
534536
}
535537
}
536538

537-
fn park(&mut self) {
538-
if self.parked.is_none() {
539+
fn add_waiter(&mut self) {
540+
if self.waiter.is_none() {
539541
let (tx, mut rx) = oneshot::channel();
540542
let _ = rx.poll(); // park this task
541-
self.pool.park(self.key.clone(), tx);
542-
self.parked = Some(rx);
543+
self.pool.waiter(self.key.clone(), tx);
544+
self.waiter = Some(rx);
543545
}
544546
}
545547
}
@@ -549,7 +551,7 @@ impl<T: Poolable> Future for Checkout<T> {
549551
type Error = ::Error;
550552

551553
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
552-
if let Some(pooled) = try_ready!(self.poll_parked()) {
554+
if let Some(pooled) = try_ready!(self.poll_waiter()) {
553555
return Ok(Async::Ready(pooled));
554556
}
555557

@@ -558,17 +560,18 @@ impl<T: Poolable> Future for Checkout<T> {
558560
if let Some(pooled) = entry {
559561
Ok(Async::Ready(pooled))
560562
} else {
561-
self.park();
563+
self.add_waiter();
562564
Ok(Async::NotReady)
563565
}
564566
}
565567
}
566568

567569
impl<T> Drop for Checkout<T> {
568570
fn drop(&mut self) {
569-
self.parked.take();
570-
if let Ok(mut inner) = self.pool.inner.lock() {
571-
inner.clean_parked(&self.key);
571+
if self.waiter.take().is_some() {
572+
if let Ok(mut inner) = self.pool.inner.lock() {
573+
inner.clean_waiters(&self.key);
574+
}
572575
}
573576
}
574577
}
@@ -782,7 +785,7 @@ mod tests {
782785
}
783786

784787
#[test]
785-
fn test_pool_checkout_drop_cleans_up_parked() {
788+
fn test_pool_checkout_drop_cleans_up_waiters() {
786789
future::lazy(|| {
787790
let pool = Pool::<Uniq<i32>>::new(true, Some(Duration::from_secs(10)));
788791
let key = (Arc::new("localhost:12345".to_string()), Ver::Http1);
@@ -792,16 +795,16 @@ mod tests {
792795

793796
// first poll needed to get into Pool's parked
794797
checkout1.poll().unwrap();
795-
assert_eq!(pool.inner.lock().unwrap().parked.get(&key).unwrap().len(), 1);
798+
assert_eq!(pool.inner.lock().unwrap().waiters.get(&key).unwrap().len(), 1);
796799
checkout2.poll().unwrap();
797-
assert_eq!(pool.inner.lock().unwrap().parked.get(&key).unwrap().len(), 2);
800+
assert_eq!(pool.inner.lock().unwrap().waiters.get(&key).unwrap().len(), 2);
798801

799802
// on drop, clean up Pool
800803
drop(checkout1);
801-
assert_eq!(pool.inner.lock().unwrap().parked.get(&key).unwrap().len(), 1);
804+
assert_eq!(pool.inner.lock().unwrap().waiters.get(&key).unwrap().len(), 1);
802805

803806
drop(checkout2);
804-
assert!(pool.inner.lock().unwrap().parked.get(&key).is_none());
807+
assert!(pool.inner.lock().unwrap().waiters.get(&key).is_none());
805808

806809
::futures::future::ok::<(), ()>(())
807810
}).wait().unwrap();

0 commit comments

Comments
 (0)