fix(client): check for drained stream in Response::drop
This commit is contained in:
		| @@ -116,7 +116,6 @@ impl<C: NetworkConnector<Stream=S>, S: NetworkStream + Send> NetworkConnector fo | ||||
|         Ok(PooledStream { | ||||
|             inner: Some((key, conn)), | ||||
|             is_closed: false, | ||||
|             is_drained: false, | ||||
|             pool: self.inner.clone() | ||||
|         }) | ||||
|     } | ||||
| @@ -130,20 +129,13 @@ impl<C: NetworkConnector<Stream=S>, S: NetworkStream + Send> NetworkConnector fo | ||||
| pub struct PooledStream<S> { | ||||
|     inner: Option<(Key, S)>, | ||||
|     is_closed: bool, | ||||
|     is_drained: bool, | ||||
|     pool: Arc<Mutex<PoolImpl<S>>> | ||||
| } | ||||
|  | ||||
| impl<S: NetworkStream> Read for PooledStream<S> { | ||||
|     #[inline] | ||||
|     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { | ||||
|         match self.inner.as_mut().unwrap().1.read(buf) { | ||||
|             Ok(0) => { | ||||
|                 self.is_drained = true; | ||||
|                 Ok(0) | ||||
|             } | ||||
|             r => r | ||||
|         } | ||||
|         self.inner.as_mut().unwrap().1.read(buf) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -174,8 +166,8 @@ impl<S: NetworkStream> NetworkStream for PooledStream<S> { | ||||
|  | ||||
| impl<S> Drop for PooledStream<S> { | ||||
|     fn drop(&mut self) { | ||||
|         trace!("PooledStream.drop, is_closed={}, is_drained={}", self.is_closed, self.is_drained); | ||||
|         if !self.is_closed && self.is_drained { | ||||
|         trace!("PooledStream.drop, is_closed={}", self.is_closed); | ||||
|         if !self.is_closed { | ||||
|             self.inner.take().map(|(key, conn)| { | ||||
|                 if let Ok(mut pool) = self.pool.lock() { | ||||
|                     pool.reuse(key, conn); | ||||
| @@ -205,13 +197,13 @@ mod tests { | ||||
|     fn test_connect_and_drop() { | ||||
|         let pool = mocked!(); | ||||
|         let key = key("127.0.0.1", 3000, "http"); | ||||
|         pool.connect("127.0.0.1", 3000, "http").unwrap().is_drained = true; | ||||
|         pool.connect("127.0.0.1", 3000, "http").unwrap(); | ||||
|         { | ||||
|             let locked = pool.inner.lock().unwrap(); | ||||
|             assert_eq!(locked.conns.len(), 1); | ||||
|             assert_eq!(locked.conns.get(&key).unwrap().len(), 1); | ||||
|         } | ||||
|         pool.connect("127.0.0.1", 3000, "http").unwrap().is_drained = true; //reused | ||||
|         pool.connect("127.0.0.1", 3000, "http").unwrap(); //reused | ||||
|         { | ||||
|             let locked = pool.inner.lock().unwrap(); | ||||
|             assert_eq!(locked.conns.len(), 1); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user