mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-27 08:41:00 +00:00
error support
This commit is contained in:
@ -515,3 +515,68 @@ fn conditionally_lookup_for_error_message() {
|
|||||||
assert_eq!(err.to_string(), format!("{} {}", prefix, suffix));
|
assert_eq!(err.to_string(), format!("{} {}", prefix, suffix));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Error {
|
||||||
|
pub fn from_scoped_thread_pool_error(
|
||||||
|
thread_pool: &scoped_thread_pool::ThreadPool<Self>,
|
||||||
|
thread_id: usize,
|
||||||
|
error: scoped_thread_pool::Error<Self>,
|
||||||
|
) -> Self {
|
||||||
|
match error {
|
||||||
|
scoped_thread_pool::Error::Err(error) => error,
|
||||||
|
scoped_thread_pool::Error::Panic(payload)
|
||||||
|
| scoped_thread_pool::Error::ThreadExited(Some(payload)) => {
|
||||||
|
let msg = match payload.downcast_ref::<&'static str>() {
|
||||||
|
Some(s) => *s,
|
||||||
|
None => match payload.downcast_ref::<String>() {
|
||||||
|
Some(s) => &s[..],
|
||||||
|
None => "Box<dyn Any>",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
tracing::error!(
|
||||||
|
thread_name = thread_pool.thread_name(thread_id),
|
||||||
|
"Thread panicked with {msg}"
|
||||||
|
);
|
||||||
|
Error::InternalError(InternalError::PanicInThreadPool(PanicCatched))
|
||||||
|
}
|
||||||
|
scoped_thread_pool::Error::ThreadExited(None) => {
|
||||||
|
Error::InternalError(InternalError::PanicInThreadPool(PanicCatched))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_scoped_thread_pool_errors(
|
||||||
|
thread_pool: &scoped_thread_pool::ThreadPool<Self>,
|
||||||
|
value: scoped_thread_pool::Errors<Error>,
|
||||||
|
) -> Self {
|
||||||
|
// iterate all errors, keeping the "max" one
|
||||||
|
// such that AbortedIndexing < regular error < panic
|
||||||
|
let mut max = None;
|
||||||
|
for (thread_id, error) in value.0 {
|
||||||
|
max = match (max, error) {
|
||||||
|
(None, error) => Some((thread_id, error)),
|
||||||
|
(max @ Some((_, scoped_thread_pool::Error::Panic(_))), _) => max,
|
||||||
|
(_, new @ scoped_thread_pool::Error::Panic(_)) => Some((thread_id, new)),
|
||||||
|
(max @ Some((_, scoped_thread_pool::Error::ThreadExited(Some(_)))), _) => max,
|
||||||
|
(_, new @ scoped_thread_pool::Error::ThreadExited(Some(_))) => {
|
||||||
|
Some((thread_id, new))
|
||||||
|
}
|
||||||
|
(max @ Some((_, scoped_thread_pool::Error::ThreadExited(None))), _) => max,
|
||||||
|
(_, new @ scoped_thread_pool::Error::ThreadExited(None)) => Some((thread_id, new)),
|
||||||
|
(
|
||||||
|
Some((
|
||||||
|
_,
|
||||||
|
scoped_thread_pool::Error::Err(Error::InternalError(
|
||||||
|
InternalError::AbortedIndexation,
|
||||||
|
)),
|
||||||
|
)),
|
||||||
|
new,
|
||||||
|
) => Some((thread_id, new)),
|
||||||
|
(max @ Some((_, scoped_thread_pool::Error::Err(_))), _) => max,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Errors never have an empty list
|
||||||
|
let (thread_id, error) = max.unwrap();
|
||||||
|
Self::from_scoped_thread_pool_error(thread_pool, thread_id, error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user