Skip to content

Commit 4106d43

Browse files
authored
fix: surface the correct kernel objectstore error (#3888)
# Description ;) Signed-off-by: Ion Koutsouris <[email protected]>
1 parent d2c8429 commit 4106d43

File tree

1 file changed

+32
-30
lines changed

1 file changed

+32
-30
lines changed

python/src/error.rs

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use arrow_schema::ArrowError;
22
use deltalake::datafusion::error::DataFusionError;
3-
use deltalake::kernel::Error as KernelError;
43
use deltalake::{errors::DeltaTableError, ObjectStoreError};
54
use pyo3::exceptions::{
65
PyException, PyFileNotFoundError, PyIOError, PyNotImplementedError, PyRuntimeError,
@@ -38,10 +37,14 @@ fn inner_to_py_err(err: DeltaTableError) -> PyErr {
3837
// python exceptions
3938
DeltaTableError::ObjectStore { source } => object_store_to_py(source, None),
4039
DeltaTableError::Kernel { source } => match source {
41-
KernelError::ObjectStore(e) => object_store_to_py(e, Some("Kernel error".to_string())),
40+
deltalake::kernel::Error::ObjectStore(e) => object_store_to_py(e, Some("Kernel error")),
4241
other => DeltaError::new_err(DeltaTableError::Kernel { source: other }.to_string()),
4342
},
44-
43+
// delta-kernel-rs error propagation
44+
DeltaTableError::KernelError(source) => match source {
45+
delta_kernel::Error::ObjectStore(e) => object_store_to_py(e, Some("Kernel error")),
46+
other => DeltaError::new_err(DeltaTableError::KernelError(other).to_string()),
47+
},
4548
DeltaTableError::Io { source } => PyIOError::new_err(source.to_string()),
4649

4750
DeltaTableError::Arrow { source } => arrow_to_py(source),
@@ -97,36 +100,35 @@ impl<T: Error + 'static> Display for DisplaySourceChain<T> {
97100
}
98101
}
99102

100-
fn object_store_to_py(err: ObjectStoreError, source_error: Option<String>) -> PyErr {
101-
if let Some(source_error) = source_error {
102-
PyIOError::new_err(
103-
DisplaySourceChain {
103+
fn object_store_to_py(err: ObjectStoreError, source_error_name: Option<&str>) -> PyErr {
104+
match err {
105+
ObjectStoreError::NotFound { .. } => {
106+
let mut error = DisplaySourceChain {
104107
err,
105-
error_name: format!("{} -> IOError", source_error),
108+
error_name: "FileNotFoundError".to_string(),
106109
}
107-
.to_string(),
108-
)
109-
} else {
110-
match err {
111-
ObjectStoreError::NotFound { .. } => PyFileNotFoundError::new_err(
112-
DisplaySourceChain {
113-
err,
114-
error_name: "FileNotFoundError".to_string(),
115-
}
116-
.to_string(),
117-
),
118-
ObjectStoreError::Generic { source, .. }
119-
if source.to_string().contains("AWS_S3_ALLOW_UNSAFE_RENAME") =>
120-
{
121-
DeltaProtocolError::new_err(source.to_string())
110+
.to_string();
111+
if let Some(source_error_name) = source_error_name {
112+
error = format!("{} -> {}", source_error_name, error)
122113
}
123-
_ => PyIOError::new_err(
124-
DisplaySourceChain {
125-
err,
126-
error_name: "IOError".to_string(),
127-
}
128-
.to_string(),
129-
),
114+
PyFileNotFoundError::new_err(error)
115+
}
116+
117+
ObjectStoreError::Generic { source, .. }
118+
if source.to_string().contains("AWS_S3_ALLOW_UNSAFE_RENAME") =>
119+
{
120+
DeltaProtocolError::new_err(source.to_string())
121+
}
122+
_ => {
123+
let mut error = DisplaySourceChain {
124+
err,
125+
error_name: "IOError".to_string(),
126+
}
127+
.to_string();
128+
if let Some(source_error_name) = source_error_name {
129+
error = format!("{} -> {}", source_error_name, error)
130+
}
131+
PyIOError::new_err(error)
130132
}
131133
}
132134
}

0 commit comments

Comments
 (0)