|
12 | 12 | // See the License for the specific language governing permissions and |
13 | 13 | // limitations under the License. |
14 | 14 |
|
15 | | -use std::mem::size_of; |
16 | 15 | use std::sync::Arc; |
17 | 16 |
|
18 | 17 | use common_arrow::arrow_format::flight::data::FlightData; |
19 | 18 |
|
20 | 19 | use crate::exception::ErrorCodeBacktrace; |
21 | 20 | use crate::ErrorCode; |
22 | 21 | use crate::Result; |
| 22 | +use crate::SerializedError; |
23 | 23 |
|
24 | 24 | impl From<ErrorCode> for FlightData { |
25 | 25 | fn from(error: ErrorCode) -> Self { |
26 | | - let error_message = error.message(); |
27 | | - let error_backtrace = error.backtrace_str(); |
28 | | - |
29 | | - let message = error_message.as_bytes(); |
30 | | - let backtrace = error_backtrace.as_bytes(); |
31 | | - |
32 | | - let mut data_body = Vec::with_capacity(16 + message.len() + backtrace.len()); |
33 | | - |
34 | | - data_body.extend((message.len() as u64).to_be_bytes()); |
35 | | - data_body.extend_from_slice(message); |
36 | | - data_body.extend((backtrace.len() as u64).to_be_bytes()); |
37 | | - data_body.extend_from_slice(backtrace); |
| 26 | + let serialized_error = serde_json::to_vec::<SerializedError>(&SerializedError { |
| 27 | + code: error.code(), |
| 28 | + message: error.message(), |
| 29 | + span: error.span(), |
| 30 | + backtrace: error.backtrace_str(), |
| 31 | + }) |
| 32 | + .unwrap(); |
38 | 33 |
|
39 | 34 | FlightData { |
40 | | - data_body, |
| 35 | + data_body: serialized_error, |
41 | 36 | app_metadata: vec![0x02], |
42 | 37 | data_header: error.code().to_be_bytes().to_vec(), |
43 | 38 | flight_descriptor: None, |
44 | 39 | } |
45 | 40 | } |
46 | 41 | } |
47 | 42 |
|
48 | | -fn read_be_u64(bytes: &[u8]) -> u64 { |
49 | | - u64::from_be_bytes(bytes[0..size_of::<u64>()].try_into().unwrap()) |
50 | | -} |
51 | | - |
52 | 43 | impl TryFrom<FlightData> for ErrorCode { |
53 | 44 | type Error = ErrorCode; |
54 | 45 |
|
55 | 46 | fn try_from(flight_data: FlightData) -> Result<Self> { |
56 | | - match flight_data.data_header.try_into() { |
57 | | - Err(_) => Err(ErrorCode::BadBytes("Cannot parse inf usize.")), |
58 | | - Ok(slice) => { |
59 | | - let code = u16::from_be_bytes(slice); |
60 | | - let data_body = flight_data.data_body; |
61 | | - |
62 | | - let mut data_offset = 0; |
63 | | - let message_len = read_be_u64(&data_body) as usize; |
64 | | - data_offset += size_of::<u64>(); |
65 | | - let message = &data_body[data_offset..data_offset + message_len]; |
66 | | - data_offset += message_len; |
67 | | - data_offset += size_of::<u64>(); |
68 | | - let backtrace = &data_body[data_offset..]; |
69 | | - |
70 | | - match backtrace.is_empty() { |
71 | | - true => Ok(ErrorCode::create( |
72 | | - code, |
73 | | - String::from_utf8(message.to_vec())?, |
74 | | - None, |
75 | | - None, |
76 | | - )), |
77 | | - false => Ok(ErrorCode::create( |
78 | | - code, |
79 | | - String::from_utf8(message.to_vec())?, |
80 | | - None, |
81 | | - Some(ErrorCodeBacktrace::Serialized(Arc::new(String::from_utf8( |
82 | | - backtrace.to_vec(), |
83 | | - )?))), |
84 | | - )), |
85 | | - } |
86 | | - } |
| 47 | + match serde_json::from_slice::<SerializedError>(&flight_data.data_body) { |
| 48 | + Err(error) => Ok(ErrorCode::from(error)), |
| 49 | + Ok(serialized_error) => match serialized_error.backtrace.len() { |
| 50 | + 0 => Ok(ErrorCode::create( |
| 51 | + serialized_error.code, |
| 52 | + serialized_error.message, |
| 53 | + None, |
| 54 | + None, |
| 55 | + ) |
| 56 | + .set_span(serialized_error.span)), |
| 57 | + _ => Ok(ErrorCode::create( |
| 58 | + serialized_error.code, |
| 59 | + serialized_error.message, |
| 60 | + None, |
| 61 | + Some(ErrorCodeBacktrace::Serialized(Arc::new( |
| 62 | + serialized_error.backtrace, |
| 63 | + ))), |
| 64 | + ) |
| 65 | + .set_span(serialized_error.span)), |
| 66 | + }, |
87 | 67 | } |
88 | 68 | } |
89 | 69 | } |
0 commit comments