- Shipped
- September 27, 2026 at 4:25 PM UTC
- Author
- Kamo
- Commit
- e8d1d6a
Completes 279a389. After it shipped, production logged the same YugabyteDB 40001 "Restart read required" on Exec2Exec's roster (09-27 16:00Z, and three times earlier that morning on the roster and the participant list): Exec2Exec conversations are chats, but their transactions live in Exec2ExecService rather than the controllers 279a389 covered, so a conflict there still reached the member as a 500. Every public @Transactional Exec2ExecService operation now carries @RetryOnDbConflict — the page of history, the send, the roster, participants, the unread counts, joining on open, the greeting. The controller calls them through the proxy and none of them catches the conflict, so each is re-run in a new transaction. Safe: announcements (the session frame, the fan-out, the push) are all after-commit, so a rolled-back attempt told nobody anything. ChatDbConflictRetryRatchetTest now holds Exec2ExecService to the same rule.
