Files
buzz/crates
Matt Toohey 2da7cac273 test(db): cover the kind:9000 archive race and tighten the archive-race waits
Address the review of af4730a54 on #8594. The lock order holds; these
are the comment, coverage and doc gaps it found.

- `put_member_waits_for_a_concurrent_archive` now drives
  `put_members_with_event` against a second uncommitted archive. The
  kind:9000 add waits for it, then returns `Refused` with one
  `AccessDenied("channel is archived")` and stores no event. It gets its
  own archive because a write queued behind the join's membership lock
  would wait whether or not its own call site took the row lock.
  Reverting that call site to the membership lock alone fails the test
  (verified by mutation): the add never waits.
- The re-add refusal in the same test is pinned to
  `"channel is archived"`, not any `AccessDenied`.
- `auto_join_skips_a_default_channel_archived_while_it_joins` waits for a
  `Lock` wait on the `SELECT archived_at FROM channels ... FOR NO KEY
  UPDATE` statement, not for any session the archive blocks.
- The `CHANNEL_MEMBERSHIP_LOCK_NAMESPACE` rationale says admissions also
  lock the channel row (`lock_channel_for_member_put`) so an archive is
  ordered against them, and that only removals take just this key.
- NOSTR.md "Default channels": the auto-join paragraph is rewrapped, and
  its dangling "It" now says "The relay".

Verified: fmt; clippy -D warnings --all-targets on buzz-db and
buzz-relay; the buzz-db `channel_members` Postgres tests (32 passed) and
the four buzz-relay auto_join Postgres tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
2026-10-30 16:58:54 +11:00
..