Following up on #62 (the retry/timeout fix you shipped in v1.14.1 — thank you, it lands the common case cleanly). This is a design question about the sustained-throttle tail, framed against DGP's own readiness-signal goals — your call on the trade-off, not a request for a specific change.
Observation
/_/ready performs a live ListBuckets against the object backend on every probe. When our storage provider (Hetzner hel1) throttles or has a long latency tail, that list 503s ("Backend throttled") and readiness flips to a paging 503 — even though the data plane keeps serving normally (only the probe fails; zero customer-facing impact both times).
We've now hit this twice:
- 2026-07-10 —
hel1 degradation, /_/ready 503s at the list timeout, data plane unaffected.
- 2026-07-26 — recurrence, same signature ("Backend throttled" on the list call).
v1.14.1's retry (DGP_READY_RETRIES) + tunable timeout (DGP_READY_TIMEOUT_SECS) absorb a short throttle well. The open question is the sustained case: retry rides out a blip, but a multi-minute provider degradation still flips readiness, because the readiness signal is structurally coupled to a heavyweight, throttle-prone ListBuckets.
The question
Is a live ListBuckets the right primitive for readiness under provider stress, or would something lighter reflect "can we serve?" more faithfully without being hostage to list-throttling — e.g.:
- a cheaper probe like
HeadBucket, or
- a short-TTL cached last-known-good, so a transient/sustained list-throttle doesn't immediately downgrade readiness while the data plane is demonstrably fine?
The trade-off (readiness freshness vs. resilience to provider list-throttling) is yours to weigh — you know the readiness contract's intent better than we do. Retry (#62) may well be judged sufficient; if so, a "won't change, retry is the answer" is a perfectly good outcome for us to document.
Evidence available
Happy to share the two incident write-ups (503-at-list-timeout signature + "Backend throttled" backend logs) if useful as input.
🦀 sent by Claude Code
Following up on #62 (the retry/timeout fix you shipped in v1.14.1 — thank you, it lands the common case cleanly). This is a design question about the sustained-throttle tail, framed against DGP's own readiness-signal goals — your call on the trade-off, not a request for a specific change.
Observation
/_/readyperforms a liveListBucketsagainst the object backend on every probe. When our storage provider (Hetznerhel1) throttles or has a long latency tail, that list 503s ("Backend throttled") and readiness flips to a paging 503 — even though the data plane keeps serving normally (only the probe fails; zero customer-facing impact both times).We've now hit this twice:
hel1degradation,/_/ready503s at the list timeout, data plane unaffected.v1.14.1's retry (
DGP_READY_RETRIES) + tunable timeout (DGP_READY_TIMEOUT_SECS) absorb a short throttle well. The open question is the sustained case: retry rides out a blip, but a multi-minute provider degradation still flips readiness, because the readiness signal is structurally coupled to a heavyweight, throttle-proneListBuckets.The question
Is a live
ListBucketsthe right primitive for readiness under provider stress, or would something lighter reflect "can we serve?" more faithfully without being hostage to list-throttling — e.g.:HeadBucket, orThe trade-off (readiness freshness vs. resilience to provider list-throttling) is yours to weigh — you know the readiness contract's intent better than we do. Retry (#62) may well be judged sufficient; if so, a "won't change, retry is the answer" is a perfectly good outcome for us to document.
Evidence available
Happy to share the two incident write-ups (503-at-list-timeout signature + "Backend throttled" backend logs) if useful as input.