Return an Error instead of panic if sync Client cannot startup runtime.
The timeout is also increased to 10 seconds from 5. Closes #392
This commit is contained in:
		| @@ -462,14 +462,6 @@ impl ClientHandle { | ||||
|             }; | ||||
|  | ||||
|             let work = rx.for_each(move |(req, tx)| { | ||||
|                 /* | ||||
|                 let tx: oneshot::Sender<::Result<async_impl::Response>> = tx; | ||||
|                 let task = client.execute(req) | ||||
|                     .then(move |r| { | ||||
|                         trace!("result received: {:?}", r); | ||||
|                         tx.send(r).map_err(|_| ()) | ||||
|                     }); | ||||
|                     */ | ||||
|                 let mut tx_opt: Option<oneshot::Sender<::Result<async_impl::Response>>> = Some(tx); | ||||
|                 let mut res_fut = client.execute(req); | ||||
|  | ||||
| @@ -508,10 +500,15 @@ impl ClientHandle { | ||||
|                 .expect("runtime unexpected error"); | ||||
|         })); | ||||
|  | ||||
|         // Wait up to 5 seconds for the background thread to be spawned. | ||||
|         // Wait some seconds for the background thread to be spawned. | ||||
|         // More than that and something bad is up! | ||||
|         wait::timeout(spawn_rx, Some(Duration::from_secs(5))) | ||||
|             .expect("runtime thread cancelled")?; | ||||
|         match wait::timeout(spawn_rx, Some(Duration::from_secs(10))) { | ||||
|             Ok(Ok(())) => (), | ||||
|             Ok(Err(err)) => return Err(err), | ||||
|             Err(wait::Waited::Err(_/*mpsc::Canceled*/)) | | ||||
|             Err(wait::Waited::TimedOut) => return Err(::error::runtime_startup()), | ||||
|         } | ||||
|  | ||||
|  | ||||
|         let inner_handle = Arc::new(InnerClientHandle { | ||||
|             tx: Some(tx), | ||||
|   | ||||
							
								
								
									
										13
									
								
								src/error.rs
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/error.rs
									
									
									
									
									
								
							| @@ -147,7 +147,8 @@ impl Error { | ||||
|             Kind::TooManyRedirects | | ||||
|             Kind::RedirectLoop | | ||||
|             Kind::ClientError(_) | | ||||
|             Kind::ServerError(_) => None, | ||||
|             Kind::ServerError(_) | | ||||
|             Kind::RuntimeStartupFailure => None, | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -250,6 +251,7 @@ impl fmt::Display for Error { | ||||
|                 f.write_str("Server Error: ")?; | ||||
|                 fmt::Display::fmt(code, f) | ||||
|             } | ||||
|             Kind::RuntimeStartupFailure => f.write_str("Client runtime failed to start"), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -275,6 +277,7 @@ impl StdError for Error { | ||||
|             Kind::RedirectLoop => "Infinite redirect loop", | ||||
|             Kind::ClientError(_) => "Client Error", | ||||
|             Kind::ServerError(_) => "Server Error", | ||||
|             Kind::RuntimeStartupFailure => "Client runtime failed to start", | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -298,7 +301,8 @@ impl StdError for Error { | ||||
|             Kind::TooManyRedirects | | ||||
|             Kind::RedirectLoop | | ||||
|             Kind::ClientError(_) | | ||||
|             Kind::ServerError(_) => None, | ||||
|             Kind::ServerError(_) | | ||||
|             Kind::RuntimeStartupFailure => None, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -323,6 +327,7 @@ pub(crate) enum Kind { | ||||
|     RedirectLoop, | ||||
|     ClientError(StatusCode), | ||||
|     ServerError(StatusCode), | ||||
|     RuntimeStartupFailure, | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -489,6 +494,10 @@ pub(crate) fn url_bad_scheme(url: Url) -> Error { | ||||
|     Error::new(Kind::UrlBadScheme, Some(url)) | ||||
| } | ||||
|  | ||||
| pub(crate) fn runtime_startup() -> Error { | ||||
|     Error::new(Kind::RuntimeStartupFailure, None) | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user