Skip to content

Commit e6027bc

Browse files
committed
fix(client): fix panic from unreachable code
1 parent b5e70a0 commit e6027bc

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/client/pool.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ impl<T: Poolable> Checkout<T> {
592592
}
593593
}
594594

595-
fn checkout(&mut self) -> Option<Pooled<T>> {
595+
fn checkout(&mut self, cx: &mut task::Context<'_>) -> Option<Pooled<T>> {
596596
let entry = {
597597
let mut inner = self.pool.inner.as_ref()?.lock().unwrap();
598598
let expiration = Expiration::new(inner.timeout);
@@ -623,14 +623,16 @@ impl<T: Poolable> Checkout<T> {
623623
}
624624

625625
if entry.is_none() && self.waiter.is_none() {
626-
let (tx, rx) = oneshot::channel();
626+
let (tx, mut rx) = oneshot::channel();
627627
trace!("checkout waiting for idle connection: {:?}", self.key);
628628
inner
629629
.waiters
630630
.entry(self.key.clone())
631631
.or_insert(VecDeque::new())
632632
.push_back(tx);
633633

634+
// register the waker with this oneshot
635+
assert!(Pin::new(&mut rx).poll(cx).is_pending());
634636
self.waiter = Some(rx);
635637
}
636638

@@ -649,14 +651,14 @@ impl<T: Poolable> Future for Checkout<T> {
649651
return Poll::Ready(Ok(pooled));
650652
}
651653

652-
if let Some(pooled) = self.checkout() {
654+
if let Some(pooled) = self.checkout(cx) {
653655
Poll::Ready(Ok(pooled))
654656
} else if !self.pool.is_enabled() {
655657
Poll::Ready(Err(crate::Error::new_canceled().with("pool is disabled")))
656658
} else {
657-
// There's a new waiter, but there's no way it should be ready yet.
658-
// We just need to register the waker.
659-
self.poll_waiter(cx).map(|_| unreachable!())
659+
// There's a new waiter, already registered in self.checkout()
660+
debug_assert!(self.waiter.is_some());
661+
Poll::Pending
660662
}
661663
}
662664
}

0 commit comments

Comments
 (0)