Repository navigation
endpoint: a provably never-published endpoint has no withdrawal obligation to capture - #22
Merged
Merged
Conversation
…ation to capture DEP-0003 (#17) holds retirement capture whenever no publication Zone resolves for a retired hostname/address pair. Any ERS that changes hostname or address before a matching Zone exists therefore never captures: the endpoint controller returns early on pending retirements, observedGeneration freezes, active hostnames keep stale diagnostics, and the gateway endpoint controller never releases the HTTPRoute finalizer. On a platform without a DNS Provider this blocks every HTTPPublish from ever reaching its terminal state and every owning Project from deleting. Capture is now vacuous for a pair only after an explicit ZoneNotResolved result and authoritative proof that the endpoint was never published: no retained hostname Zone binding or generated-record reference/count, no sticky WithdrawalProtected=True, an uncached read finding no suffix-matching Zone, and an uncached source-label-bound read finding no generated RecordSet. Everything else keeps capture pending and retains finalizers: an unusable matching Zone, conversion/capability rejection, any existing or deleting child, incomplete lists, a missing reader, or a read error. A Zone that disappears after publication stays fail-closed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Since DEP-0003 (#17, v0.3.0) retirement capture holds whenever no publication Zone resolves for a retired hostname/address pair (
withdrawal.go→WithdrawalCapturePending: no publication Zone binding resolved for …). An ERS whose hostnames or addresses change before any matching Zone exists therefore never captures. Consequences observed on appthrust/platform Kind lanes (no DNS Provider):status.observedGenerationfreezes (generation 12, observed 1) and active hostnames keep stale diagnostics; HTTPPublish never reaches itsZoneNotResolvedterminal.RetireOrDelete→ capture, so thegateway.endpoint.dns.appthrust.io/httproute-finalizeris never released and the owning Project cannot be deleted.Evidence: platform CI runs 41305702992 (identity lane) and 41305716631 (pooled lane); appthrust/platform#5581.
Change
Capture is vacuous for a pair only after an explicit
Resolved=False/ZoneNotResolvedresult and authoritative proof that the endpoint was never published:WithdrawalProtected=True;APIReader) Zone read finds no suffix-matching Zone (ZoneNotResolved also covers conversion/capability rejection, so reason alone is not enough);Everything else keeps capture pending and retains finalizers. A Zone that disappears after prior publication stays fail-closed. No provider/environment special case.
endpoint-api.mdand DEP-0003 updated.Verification
withdrawal_no_zone_test.gofails on the previous source with the exactWithdrawalCapturePendingmessage; passes with the change. Cases: never-published pair completes; generated RecordSet present (even only via uncached read) pends; lost prior Zone binding pends; sticky protection pends; read error / incomplete list / missing reader pend; active-status convergence; retire-only cleanup; direct deletion.go test ./internal/go/apps/endpoint/controllers/endpointrecordset -count=1,go veton the package: pass.