Skip to content

fix(wal): create answers 409 for an existing repository, warm handle or not - #101

Open
jonasgrosch wants to merge 1 commit into
tobi:mainfrom
conxai-technologies:conxai/create-conflict
Open

jonasgrosch wants to merge 1 commit into
tobi:mainfrom
conxai-technologies:conxai/create-conflict

Conversation

@jonasgrosch

Copy link
Copy Markdown

PUT /{owner}/{repo} answered 201 for an existing repository whenever the instance held its
handle: Registry::create returned the cached handle before the manifest Create PUT. A cold
instance answered 409 for the same repository.

  • The Create PUT is the only authority (ROUNDTRIPS §3, "let the conditional write be the read"):
    its 412 is AlreadyExists → 409 on every instance. A warm handle no longer masks a repository
    deleted by another host.
  • open_or_create (auto_create_on_push, import) treats losing the create race as success and
    opens the winner's repository; the warm-handle shortcut used to absorb the same-instance race.
  • Round trips: create of a new repository 1 → 1; of an existing one 0 (warm) / 1 (cold) → 1.
    Pinned in healthy_request_round_trip_budgets and the ROUNDTRIPS table.

Tests: create twice → 201 then 409 (warm and cold instance), re-create after a delete on another
host → 201, concurrent creates → one 201 and one 409 (one instance and across two), auto-create
push works and a later create is 409; registry-level equivalents in walgit-wal. e2e 40 passed;
sim 19 passed. (wal::test_serve_level_links_base_from_store_mount fails only when the suite runs
as root, which ignores chmod 000; unrelated.)

🤖 Generated with Claude Code

…or not

`PUT /{owner}/{repo}` answered 201 for a repository that already existed
whenever this instance held its handle: `Registry::create` returned the
cached handle before the manifest Create PUT. A cold instance answered 409
for the same repository, so the answer depended on which host you hit.

The Create PUT is now the only authority (ROUNDTRIPS §3, "let the
conditional write be the read"): its 412 is AlreadyExists on every
instance, and a warm handle no longer masks a repository deleted by
another host (the create succeeds and replaces the stale handle).
`open_or_create` (auto_create_on_push, import) treats losing the create
race as success and opens the winner's repository — the same-instance
race used to be absorbed by the warm-handle shortcut.

Round trips: create of a new repository 1 → 1 (Create PUT); create of an
existing one 0 (warm) / 1 (cold) → 1 on both; auto-create unchanged, its
lost race adds only the open it needs. Pinned in the sim's
healthy_request_round_trip_budgets and the ROUNDTRIPS table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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