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