Skip to content

Commit 31e1e05

Browse files
fix(volume): retain local filenames in filesystem exceptions
Signed-off-by: Aakash Saravanan <aakash.saravanan@databricks.com>
1 parent 6fa0c01 commit 31e1e05

2 files changed

Lines changed: 10 additions & 6 deletions

File tree

‎src/databricks/sql/backend/kernel/_errors.py‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
``OperationalError`` here.
1818
1919
Local missing transfer files use the built-in ``FileNotFoundError`` class;
20-
the original OS error code is preserved when available. The ``filename``
21-
attribute is unavailable.
20+
the original OS error code and requested local filename are preserved
21+
when available.
2222
2323
These primitives live in their own module so both ``client.py``
2424
(which orchestrates PyO3 calls) and ``result_set.py`` (which calls
@@ -163,13 +163,14 @@ def reraise_kernel_error(
163163
}
164164
message = getattr(exc, "message", str(exc))
165165
os_error_code = getattr(exc, "os_error_code", None)
166+
os_error_filename = getattr(exc, "os_error_filename", None)
166167
file_error_args: tuple
167168
if os_error_code is None:
168169
file_error_args = (message,)
169170
elif os.name == "nt":
170-
file_error_args = (0, message, None, os_error_code)
171+
file_error_args = (0, message, os_error_filename, os_error_code)
171172
else:
172-
file_error_args = (os_error_code, message)
173+
file_error_args = (os_error_code, message, os_error_filename)
173174
new: Union[Error, OSError]
174175
# Local missing files have no HTTP status; remote missing files carry 404.
175176
if (
@@ -192,6 +193,7 @@ def reraise_kernel_error(
192193
"error_code",
193194
"vendor_code",
194195
"os_error_code",
196+
"os_error_filename",
195197
"http_status",
196198
"retryable",
197199
"query_id",
@@ -211,7 +213,7 @@ def wrap_kernel_exception(what: str, exc: BaseException) -> "Union[Error, OSErro
211213
212214
- ``KernelError`` → mapped class with structured attrs forwarded.
213215
A local missing transfer file maps to ``FileNotFoundError`` with
214-
its original OS error code when available, without ``filename``.
216+
its original OS error code and requested filename when available.
215217
- Already-mapped PEP 249 or local transfer errors → passed through
216218
unchanged so nested callers preserve their class and attributes.
217219
- Anything else (``TypeError`` / ``ValueError`` / etc. from PyO3

‎tests/unit/test_kernel_client.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2756,6 +2756,7 @@ def test_file_transfer_error_matches_thrift_exception(
27562756
assert result.http_status == http_status
27572757
if issubclass(expected, OSError):
27582758
assert result.errno is None
2759+
assert result.filename is None
27592760

27602761

27612762
@pytest.mark.parametrize(
@@ -2782,10 +2783,11 @@ def test_local_transfer_error_preserves_os_code(code, error_code, raw, expected)
27822783
if os.name == "nt":
27832784
raw = 2 if expected is FileNotFoundError else 5
27842785
error.os_error_code = raw
2786+
error.os_error_filename = "local-file.bin"
27852787
result = kernel_client._reraise_kernel_error(error)
27862788
assert type(result) is expected
27872789
assert result.os_error_code == raw
2788-
assert result.filename is None
2790+
assert result.filename == "local-file.bin"
27892791
if os.name == "nt":
27902792
assert result.winerror == raw
27912793
assert result.errno == (errno.ENOENT if raw == 2 else errno.EACCES)

0 commit comments

Comments
 (0)