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