fix(client): fix panic from unreachable code
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user