1use std::any::Any;
16
17use common_error::ext::{BoxedError, ErrorExt};
18use common_error::status_code::StatusCode;
19use common_macro::stack_trace_debug;
20use snafu::{Location, Snafu};
21
22#[derive(Snafu)]
23#[snafu(visibility(pub))]
24#[stack_trace_debug]
25pub enum Error {
26 #[snafu(display("Failed to install ring crypto provider: {}", msg))]
27 InitTlsProvider {
28 #[snafu(implicit)]
29 location: Location,
30 msg: String,
31 },
32 #[snafu(display("Failed to create default catalog and schema"))]
33 InitMetadata {
34 #[snafu(implicit)]
35 location: Location,
36 source: common_meta::error::Error,
37 },
38
39 #[snafu(display("Failed to init DDL manager"))]
40 InitDdlManager {
41 #[snafu(implicit)]
42 location: Location,
43 source: common_meta::error::Error,
44 },
45
46 #[snafu(display("Failed to init default timezone"))]
47 InitTimezone {
48 #[snafu(implicit)]
49 location: Location,
50 source: common_time::error::Error,
51 },
52
53 #[snafu(display("Failed to start procedure manager"))]
54 StartProcedureManager {
55 #[snafu(implicit)]
56 location: Location,
57 source: common_procedure::error::Error,
58 },
59
60 #[snafu(display("Failed to stop procedure manager"))]
61 StopProcedureManager {
62 #[snafu(implicit)]
63 location: Location,
64 source: common_procedure::error::Error,
65 },
66
67 #[snafu(display("Failed to start wal provider"))]
68 StartWalProvider {
69 #[snafu(implicit)]
70 location: Location,
71 source: common_meta::error::Error,
72 },
73
74 #[snafu(display("Failed to start datanode"))]
75 StartDatanode {
76 #[snafu(implicit)]
77 location: Location,
78 source: datanode::error::Error,
79 },
80
81 #[snafu(display("Failed to shutdown datanode"))]
82 ShutdownDatanode {
83 #[snafu(implicit)]
84 location: Location,
85 source: datanode::error::Error,
86 },
87
88 #[snafu(display("Failed to start flownode"))]
89 StartFlownode {
90 #[snafu(implicit)]
91 location: Location,
92 source: flow::Error,
93 },
94
95 #[snafu(display("Failed to shutdown flownode"))]
96 ShutdownFlownode {
97 #[snafu(implicit)]
98 location: Location,
99 source: flow::Error,
100 },
101
102 #[snafu(display("Failed to start frontend"))]
103 StartFrontend {
104 #[snafu(implicit)]
105 location: Location,
106 source: frontend::error::Error,
107 },
108
109 #[snafu(display("Failed to shutdown frontend"))]
110 ShutdownFrontend {
111 #[snafu(implicit)]
112 location: Location,
113 source: frontend::error::Error,
114 },
115
116 #[snafu(display("Failed to build cli"))]
117 BuildCli {
118 #[snafu(implicit)]
119 location: Location,
120 source: BoxedError,
121 },
122
123 #[snafu(display("Failed to start cli"))]
124 StartCli {
125 #[snafu(implicit)]
126 location: Location,
127 source: BoxedError,
128 },
129
130 #[snafu(display("Failed to build meta server"))]
131 BuildMetaServer {
132 #[snafu(implicit)]
133 location: Location,
134 source: meta_srv::error::Error,
135 },
136
137 #[snafu(display("Failed to start meta server"))]
138 StartMetaServer {
139 #[snafu(implicit)]
140 location: Location,
141 source: meta_srv::error::Error,
142 },
143
144 #[snafu(display("Failed to shutdown meta server"))]
145 ShutdownMetaServer {
146 #[snafu(implicit)]
147 location: Location,
148 source: meta_srv::error::Error,
149 },
150
151 #[snafu(display("Missing config, msg: {}", msg))]
152 MissingConfig {
153 msg: String,
154 #[snafu(implicit)]
155 location: Location,
156 },
157
158 #[snafu(display("Illegal config: {}", msg))]
159 IllegalConfig {
160 msg: String,
161 #[snafu(implicit)]
162 location: Location,
163 },
164
165 #[snafu(display("Failed to daemonize: {msg}"))]
166 Daemonize {
167 msg: String,
168 #[snafu(implicit)]
169 location: Location,
170 },
171
172 #[snafu(display("Unsupported selector type: {}", selector_type))]
173 UnsupportedSelectorType {
174 selector_type: String,
175 #[snafu(implicit)]
176 location: Location,
177 source: meta_srv::error::Error,
178 },
179
180 #[snafu(display("Failed to parse SQL: {}", sql))]
181 ParseSql {
182 sql: String,
183 #[snafu(implicit)]
184 location: Location,
185 source: query::error::Error,
186 },
187
188 #[snafu(display("Failed to plan statement"))]
189 PlanStatement {
190 #[snafu(implicit)]
191 location: Location,
192 source: query::error::Error,
193 },
194
195 #[snafu(display("Failed to load layered config"))]
196 LoadLayeredConfig {
197 #[snafu(source(from(common_config::error::Error, Box::new)))]
198 source: Box<common_config::error::Error>,
199 #[snafu(implicit)]
200 location: Location,
201 },
202
203 #[snafu(display("Failed to connect to Etcd at {etcd_addr}"))]
204 ConnectEtcd {
205 etcd_addr: String,
206 #[snafu(source)]
207 error: etcd_client::Error,
208 #[snafu(implicit)]
209 location: Location,
210 },
211
212 #[snafu(display("Failed to serde json"))]
213 SerdeJson {
214 #[snafu(source)]
215 error: serde_json::error::Error,
216 #[snafu(implicit)]
217 location: Location,
218 },
219
220 #[snafu(display("Failed to run http request: {reason}"))]
221 HttpQuerySql {
222 reason: String,
223 #[snafu(source)]
224 error: reqwest::Error,
225 #[snafu(implicit)]
226 location: Location,
227 },
228
229 #[snafu(display("Empty result from output"))]
230 EmptyResult {
231 #[snafu(implicit)]
232 location: Location,
233 },
234
235 #[snafu(display("Failed to manipulate file"))]
236 FileIo {
237 #[snafu(implicit)]
238 location: Location,
239 #[snafu(source)]
240 error: std::io::Error,
241 },
242
243 #[snafu(display("Failed to create directory {}", dir))]
244 CreateDir {
245 dir: String,
246 #[snafu(source)]
247 error: std::io::Error,
248 },
249
250 #[snafu(display("Failed to spawn thread"))]
251 SpawnThread {
252 #[snafu(source)]
253 error: std::io::Error,
254 },
255
256 #[snafu(display("Other error"))]
257 Other {
258 source: BoxedError,
259 #[snafu(implicit)]
260 location: Location,
261 },
262
263 #[snafu(display("Failed to build runtime"))]
264 BuildRuntime {
265 #[snafu(implicit)]
266 location: Location,
267 source: common_runtime::error::Error,
268 },
269
270 #[snafu(display("Failed to get cache from cache registry: {}", name))]
271 CacheRequired {
272 #[snafu(implicit)]
273 location: Location,
274 name: String,
275 },
276
277 #[snafu(display("Failed to build cache registry"))]
278 BuildCacheRegistry {
279 #[snafu(implicit)]
280 location: Location,
281 source: cache::error::Error,
282 },
283
284 #[snafu(display("Failed to initialize meta client"))]
285 MetaClientInit {
286 #[snafu(implicit)]
287 location: Location,
288 source: meta_client::error::Error,
289 },
290
291 #[snafu(display("Cannot find schema {schema} in catalog {catalog}"))]
292 SchemaNotFound {
293 catalog: String,
294 schema: String,
295 #[snafu(implicit)]
296 location: Location,
297 },
298
299 #[snafu(display("Failed to build wal provider"))]
300 BuildWalProvider {
301 #[snafu(implicit)]
302 location: Location,
303 source: common_meta::error::Error,
304 },
305
306 #[snafu(display("Failed to build metadata kvbackend"))]
307 BuildMetadataKvbackend {
308 #[snafu(implicit)]
309 location: Location,
310 source: standalone::error::Error,
311 },
312
313 #[snafu(display("Failed to setup standalone plugins"))]
314 SetupStandalonePlugins {
315 #[snafu(implicit)]
316 location: Location,
317 source: standalone::error::Error,
318 },
319
320 #[snafu(display("Invalid WAL provider"))]
321 InvalidWalProvider {
322 #[snafu(implicit)]
323 location: Location,
324 source: common_wal::error::Error,
325 },
326}
327
328pub type Result<T> = std::result::Result<T, Error>;
329
330impl ErrorExt for Error {
331 fn status_code(&self) -> StatusCode {
332 match self {
333 Error::StartDatanode { source, .. } => source.status_code(),
334 Error::StartFrontend { source, .. } => source.status_code(),
335 Error::ShutdownDatanode { source, .. } => source.status_code(),
336 Error::ShutdownFrontend { source, .. } => source.status_code(),
337 Error::StartMetaServer { source, .. } => source.status_code(),
338 Error::ShutdownMetaServer { source, .. } => source.status_code(),
339 Error::BuildMetaServer { source, .. } => source.status_code(),
340 Error::UnsupportedSelectorType { source, .. } => source.status_code(),
341 Error::BuildCli { source, .. } => source.status_code(),
342 Error::StartCli { source, .. } => source.status_code(),
343 Error::BuildMetadataKvbackend { source, .. } => source.status_code(),
344 Error::SetupStandalonePlugins { source, .. } => source.status_code(),
345
346 Error::InitMetadata { source, .. } | Error::InitDdlManager { source, .. } => {
347 source.status_code()
348 }
349
350 Error::MissingConfig { .. }
351 | Error::LoadLayeredConfig { .. }
352 | Error::IllegalConfig { .. }
353 | Error::InitTimezone { .. }
354 | Error::ConnectEtcd { .. }
355 | Error::CreateDir { .. }
356 | Error::EmptyResult { .. } => StatusCode::InvalidArguments,
357
358 Error::StartProcedureManager { source, .. }
359 | Error::StopProcedureManager { source, .. } => source.status_code(),
360 Error::BuildWalProvider { source, .. } | Error::StartWalProvider { source, .. } => {
361 source.status_code()
362 }
363 Error::HttpQuerySql { .. } => StatusCode::Internal,
364 Error::ParseSql { source, .. } | Error::PlanStatement { source, .. } => {
365 source.status_code()
366 }
367
368 Error::SerdeJson { .. }
369 | Error::FileIo { .. }
370 | Error::SpawnThread { .. }
371 | Error::InitTlsProvider { .. }
372 | Error::Daemonize { .. } => StatusCode::Unexpected,
373
374 Error::Other { source, .. } => source.status_code(),
375
376 Error::BuildRuntime { source, .. } => source.status_code(),
377
378 Error::CacheRequired { .. } | Error::BuildCacheRegistry { .. } => StatusCode::Internal,
379 Self::StartFlownode { source, .. } | Self::ShutdownFlownode { source, .. } => {
380 source.status_code()
381 }
382 Error::MetaClientInit { source, .. } => source.status_code(),
383 Error::SchemaNotFound { .. } => StatusCode::DatabaseNotFound,
384 Error::InvalidWalProvider { .. } => StatusCode::InvalidArguments,
385 }
386 }
387
388 fn as_any(&self) -> &dyn Any {
389 self
390 }
391}