fix(client): fix panic from unreachable code

This commit is contained in:
Sean McArthur
2019-10-30 13:28:16 -07:00
parent b5e70a0dd1
commit e6027bc02d

View File

@@ -592,7 +592,7 @@ impl<T: Poolable> Checkout<T> {
} }
} }
fn checkout(&mut self) -> Option<Pooled<T>> { fn checkout(&mut self, cx: &mut task::Context<'_>) -> Option<Pooled<T>> {
let entry = { let entry = {
let mut inner = self.pool.inner.as_ref()?.lock().unwrap(); let mut inner = self.pool.inner.as_ref()?.lock().unwrap();
let expiration = Expiration::new(inner.timeout); let expiration = Expiration::new(inner.timeout);
@@ -623,7 +623,7 @@ impl<T: Poolable> Checkout<T> {
} }
if entry.is_none() && self.waiter.is_none() { if entry.is_none() && self.waiter.is_none() {
let (tx, rx) = oneshot::channel(); let (tx, mut rx) = oneshot::channel();
trace!("checkout waiting for idle connection: {:?}", self.key); trace!("checkout waiting for idle connection: {:?}", self.key);
inner inner
.waiters .waiters
@@ -631,6 +631,8 @@ impl<T: Poolable> Checkout<T> {
.or_insert(VecDeque::new()) .or_insert(VecDeque::new())
.push_back(tx); .push_back(tx);
// register the waker with this oneshot
assert!(Pin::new(&mut rx).poll(cx).is_pending());
self.waiter = Some(rx); self.waiter = Some(rx);
} }
@@ -649,14 +651,14 @@ impl<T: Poolable> Future for Checkout<T> {
return Poll::Ready(Ok(pooled)); return Poll::Ready(Ok(pooled));
} }
if let Some(pooled) = self.checkout() { if let Some(pooled) = self.checkout(cx) {
Poll::Ready(Ok(pooled)) Poll::Ready(Ok(pooled))
} else if !self.pool.is_enabled() { } else if !self.pool.is_enabled() {
Poll::Ready(Err(crate::Error::new_canceled().with("pool is disabled"))) Poll::Ready(Err(crate::Error::new_canceled().with("pool is disabled")))
} else { } else {
// There's a new waiter, but there's no way it should be ready yet. // There's a new waiter, already registered in self.checkout()
// We just need to register the waker. debug_assert!(self.waiter.is_some());
self.poll_waiter(cx).map(|_| unreachable!()) Poll::Pending
} }
} }
} }