Skip to content

feat(dds_ingestion): tell the user when DDS cannot write to S3, in it… - #42

Merged
oskaresparza merged 1 commit into
developmentfrom
eea_bliki
Aug 27, 2026
Merged

feat(dds_ingestion): tell the user when DDS cannot write to S3, in it…#42
oskaresparza merged 1 commit into
developmentfrom
eea_bliki

Conversation

@oskaresparza

Copy link
Copy Markdown
Collaborator

…s words

Pairs with EEALakeHouse@46cc872, where the server learned to refuse a transfer its storage self-test has already shown will fail: 503 with {"error": "storage_unavailable"} and a message written for whoever is about to read it — that DDS cannot write to the S3 behind the catalog, that this is a dependency problem for an administrator rather than anything the caller did, and that nothing has been uploaded.

Arriving here as a bare IngestApiError, that message came out wrapped as "DDS ingest API error 503 on POST /api/v1/ingest/begin: …", which buries the explanation behind plumbing and reads, in a notebook traceback, like the caller broke something.

  • StorageUnavailableError — a subclass, so existing except IngestApiError handling still catches it — raised on DDS's own storage_unavailable slug and nothing else. A 503 from a proxy or load balancer in front of the service has no such body and stays a plain IngestApiError, rather than being mislabelled as a storage fault.
  • Its str() is the server's message verbatim; the class name carries what the prefix used to. status_code, message and where stay available for code that handles it programmatically.
  • _error_slug() reads the machine-readable half of the {error, message, path} body, which _error_message() was throwing away.

FolderIngest.run() therefore stops at begin with an error that explains itself, having uploaded nothing — the point of the server-side pre-flight, and what the new folder test asserts.

51 passed; mypy clean on the changed modules.

Claude-Session: https://claude.ai/code/session_01HFZRQnGnYw8mBCVsp9seds

…s words

Pairs with EEALakeHouse@46cc872, where the server learned to refuse a transfer
its storage self-test has already shown will fail: `503` with
`{"error": "storage_unavailable"}` and a message written for whoever is about to
read it — that DDS cannot write to the S3 behind the catalog, that this is a
dependency problem for an administrator rather than anything the caller did, and
that nothing has been uploaded.

Arriving here as a bare `IngestApiError`, that message came out wrapped as "DDS
ingest API error 503 on POST /api/v1/ingest/begin: …", which buries the
explanation behind plumbing and reads, in a notebook traceback, like the caller
broke something.

* `StorageUnavailableError` — a subclass, so existing `except IngestApiError`
  handling still catches it — raised on DDS's own `storage_unavailable` slug and
  nothing else. A 503 from a proxy or load balancer in front of the service has
  no such body and stays a plain `IngestApiError`, rather than being mislabelled
  as a storage fault.
* Its `str()` is the server's message verbatim; the class name carries what the
  prefix used to. `status_code`, `message` and `where` stay available for code
  that handles it programmatically.
* `_error_slug()` reads the machine-readable half of the `{error, message, path}`
  body, which `_error_message()` was throwing away.

`FolderIngest.run()` therefore stops at `begin` with an error that explains
itself, having uploaded nothing — the point of the server-side pre-flight, and
what the new folder test asserts.

51 passed; mypy clean on the changed modules.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HFZRQnGnYw8mBCVsp9seds
@oskaresparza
oskaresparza merged commit bfbc8eb into development Aug 27, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants