refactor(error): remove backtrace, and introduce call-site location for debugging (#1329)

* wip: global replace

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* fix compile

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* fix warnings

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* remove unneeded tests of errors

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* fix ErrorExt trait implementator

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* fix warnings

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* fix format

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* fix pyo3 tests

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

---------

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
This commit is contained in:
Ruihang Xia
2023-04-06 12:06:00 +08:00
committed by GitHub
parent d10de46e03
commit da66138e80
47 changed files with 513 additions and 1496 deletions

View File

@@ -18,6 +18,7 @@ use common_datasource::error::Error as DataSourceError;
use common_error::prelude::*;
use common_procedure::ProcedureId;
use datafusion::parquet;
use snafu::Location;
use storage::error::Error as StorageError;
use table::error::Error as TableError;
use url::ParseError;
@@ -59,7 +60,7 @@ pub enum Error {
},
#[snafu(display("Incorrect internal state: {}", state))]
IncorrectInternalState { state: String, backtrace: Backtrace },
IncorrectInternalState { state: String, location: Location },
#[snafu(display("Failed to create catalog list, source: {}", source))]
NewCatalog {
@@ -68,10 +69,10 @@ pub enum Error {
},
#[snafu(display("Catalog not found: {}", name))]
CatalogNotFound { name: String, backtrace: Backtrace },
CatalogNotFound { name: String, location: Location },
#[snafu(display("Schema not found: {}", name))]
SchemaNotFound { name: String, backtrace: Backtrace },
SchemaNotFound { name: String, location: Location },
#[snafu(display("Failed to create table: {}, source: {}", table_name, source))]
CreateTable {
@@ -111,7 +112,7 @@ pub enum Error {
#[snafu(display("Table not found: {}", table_name))]
TableNotFound {
table_name: String,
backtrace: Backtrace,
location: Location,
},
#[snafu(display("Column {} not found in table {}", column_name, table_name))]
@@ -121,7 +122,7 @@ pub enum Error {
},
#[snafu(display("Missing timestamp column in request"))]
MissingTimestampColumn { backtrace: Backtrace },
MissingTimestampColumn { location: Location },
#[snafu(display(
"Columns and values number mismatch, columns: {}, values: {}",
@@ -137,7 +138,7 @@ pub enum Error {
},
#[snafu(display("Missing insert body"))]
MissingInsertBody { backtrace: Backtrace },
MissingInsertBody { location: Location },
#[snafu(display("Failed to insert value to table: {}, source: {}", table_name, source))]
Insert {
@@ -204,7 +205,7 @@ pub enum Error {
InitBackend {
config: Box<ObjectStoreConfig>,
source: object_store::Error,
backtrace: Backtrace,
location: Location,
},
#[snafu(display("Failed to build backend, source: {}", source))]
@@ -216,7 +217,7 @@ pub enum Error {
#[snafu(display("Failed to parse url, source: {}", source))]
ParseUrl {
source: DataSourceError,
backtrace: Backtrace,
location: Location,
},
#[snafu(display("Runtime resource error, source: {}", source))]
@@ -242,7 +243,7 @@ pub enum Error {
#[snafu(display("Failed to regex, source: {}", source))]
BuildRegex {
backtrace: Backtrace,
location: Location,
source: regex::Error,
},
@@ -268,10 +269,10 @@ pub enum Error {
},
#[snafu(display("Specified timestamp key or primary key column not found: {}", name))]
KeyColumnNotFound { name: String, backtrace: Backtrace },
KeyColumnNotFound { name: String, location: Location },
#[snafu(display("Illegal primary keys definition: {}", msg))]
IllegalPrimaryKeysDef { msg: String, backtrace: Backtrace },
IllegalPrimaryKeysDef { msg: String, location: Location },
#[snafu(display(
"Constraint in CREATE TABLE statement is not supported yet: {}",
@@ -279,7 +280,7 @@ pub enum Error {
))]
ConstraintNotSupported {
constraint: String,
backtrace: Backtrace,
location: Location,
},
#[snafu(display("Failed to insert into system catalog table, source: {}", source))]
@@ -301,7 +302,7 @@ pub enum Error {
},
#[snafu(display("Schema {} already exists", name))]
SchemaExists { name: String, backtrace: Backtrace },
SchemaExists { name: String, location: Location },
#[snafu(display("Failed to convert alter expr to request: {}", source))]
AlterExprToRequest {
@@ -359,7 +360,7 @@ pub enum Error {
#[snafu(display(
"Table id provider not found, cannot execute SQL directly on datanode in distributed mode"
))]
TableIdProviderNotFound { backtrace: Backtrace },
TableIdProviderNotFound { location: Location },
#[snafu(display("Failed to bump table id, source: {}", source))]
BumpTableId {
@@ -374,13 +375,13 @@ pub enum Error {
},
#[snafu(display("Missing node id option in distributed mode"))]
MissingNodeId { backtrace: Backtrace },
MissingNodeId { location: Location },
#[snafu(display("Missing node id option in distributed mode"))]
MissingMetasrvOpts { backtrace: Backtrace },
MissingMetasrvOpts { location: Location },
#[snafu(display("Missing required field: {}", name))]
MissingRequiredField { name: String, backtrace: Backtrace },
MissingRequiredField { name: String, location: Location },
#[snafu(display("Cannot find requested database: {}-{}", catalog, schema))]
DatabaseNotFound { catalog: String, schema: String },
@@ -400,10 +401,7 @@ pub enum Error {
"No valid default value can be built automatically, column: {}",
column,
))]
ColumnNoneDefaultValue {
column: String,
backtrace: Backtrace,
},
ColumnNoneDefaultValue { column: String, location: Location },
#[snafu(display("Failed to describe schema for given statement, source: {}", source))]
DescribeStatement {
@@ -437,32 +435,32 @@ pub enum Error {
#[snafu(display("Failed to read parquet file, source: {}", source))]
ReadParquet {
source: parquet::errors::ParquetError,
backtrace: Backtrace,
location: Location,
},
#[snafu(display("Failed to poll stream, source: {}", source))]
PollStream {
source: datafusion_common::DataFusionError,
backtrace: Backtrace,
location: Location,
},
#[snafu(display("Failed to build parquet record batch stream, source: {}", source))]
BuildParquetRecordBatchStream {
backtrace: Backtrace,
location: Location,
source: parquet::errors::ParquetError,
},
#[snafu(display("Failed to read object in path: {}, source: {}", path, source))]
ReadObject {
path: String,
backtrace: Backtrace,
location: Location,
source: object_store::Error,
},
#[snafu(display("Failed to write object into path: {}, source: {}", path, source))]
WriteObject {
path: String,
backtrace: Backtrace,
location: Location,
source: object_store::Error,
},
@@ -619,10 +617,6 @@ impl ErrorExt for Error {
}
}
fn backtrace_opt(&self) -> Option<&Backtrace> {
ErrorCompat::backtrace(self)
}
fn as_any(&self) -> &dyn Any {
self
}
@@ -636,62 +630,10 @@ impl From<Error> for tonic::Status {
#[cfg(test)]
mod tests {
use std::error::Error as StdError;
use std::str::FromStr;
use common_error::ext::BoxedError;
use common_error::mock::MockError;
use super::*;
fn throw_query_error() -> std::result::Result<(), query::error::Error> {
query::error::CatalogNotFoundSnafu {
catalog: String::new(),
}
.fail()
}
fn throw_catalog_error() -> catalog::error::Result<()> {
Err(catalog::error::Error::SchemaProviderOperation {
source: BoxedError::new(MockError::with_backtrace(StatusCode::Internal)),
})
}
fn assert_internal_error(err: &Error) {
assert!(err.backtrace_opt().is_some());
assert_eq!(StatusCode::Internal, err.status_code());
}
fn assert_invalid_argument_error(err: &Error) {
assert!(err.backtrace_opt().is_some());
assert_eq!(StatusCode::InvalidArguments, err.status_code());
}
fn assert_tonic_internal_error(err: Error) {
let status_code = err.status_code();
let err_string = err.to_string();
let s: tonic::Status = err.into();
assert_eq!(s.code(), tonic::Code::Unknown);
let source = s.source().unwrap().downcast_ref::<Error>().unwrap();
assert_eq!(source.status_code(), status_code);
assert_eq!(source.to_string(), err_string);
}
#[test]
fn test_error() {
let err = throw_query_error().context(ExecuteSqlSnafu).err().unwrap();
assert_invalid_argument_error(&err);
assert_tonic_internal_error(err);
let err = throw_catalog_error()
.context(NewCatalogSnafu)
.err()
.unwrap();
assert_internal_error(&err);
assert_tonic_internal_error(err);
}
#[test]
fn test_parse_timestamp() {
let err = common_time::timestamp::Timestamp::from_str("test")