Classify IsADirectoryError and NotADirectoryError as PermanentError
Both are OSError subclasses caught by the broad timeout/io handler and classified as transient. Pointing at a directory instead of a file or a broken path component will never succeed on retry.
This commit is contained in:
parent
64f2b7b7d2
commit
adf03284ff
2 changed files with 13 additions and 0 deletions
|
|
@ -63,6 +63,9 @@ def _classify(exc: BaseException) -> Exception:
|
|||
if isinstance(exc, PermissionError):
|
||||
return PermanentError(f"permission denied: {exc}")
|
||||
|
||||
if isinstance(exc, IsADirectoryError | NotADirectoryError):
|
||||
return PermanentError(f"path error: {exc}")
|
||||
|
||||
if isinstance(exc, asyncio.TimeoutError | TimeoutError | OSError):
|
||||
return TransientError(f"timeout/io: {exc}")
|
||||
|
||||
|
|
|
|||
|
|
@ -279,3 +279,13 @@ async def test_permission_error_classified_as_permanent():
|
|||
client.create_document_from_source.side_effect = PermissionError("no access")
|
||||
with pytest.raises(PermanentError, match="permission denied"):
|
||||
await run_job(client, _job())
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize("exc_class", [IsADirectoryError, NotADirectoryError])
|
||||
async def test_directory_errors_classified_as_permanent(exc_class):
|
||||
"""Pointing at a directory instead of a file should DLQ immediately."""
|
||||
client = _mock_client()
|
||||
client.create_document_from_source.side_effect = exc_class("not a file")
|
||||
with pytest.raises(PermanentError, match="path error"):
|
||||
await run_job(client, _job())
|
||||
|
|
|
|||
Loading…
Reference in a new issue