Skip to content

perf(coderd): authorize chat calls from a cached chat RBAC object - #30887

Open
cstyan wants to merge 1 commit into
mainfrom
callum/chatd-rbac-cache
Open

cstyan wants to merge 1 commit into
mainfrom
callum/chatd-rbac-cache

Conversation

@cstyan

@cstyan cstyan commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

The change in this PR is to allow reuse of a chat RBAC object by caching it on the Go context object, as we've done in a number of PRs earlier this year for other dbauthz calls. Chat-ID-scoped dbauthz methods read the chat through chats_expanded just ensure proper authorization by the caller, and many of these dbauthz calls execute queries that run under the chat row lock.

Following the pattern from other PRs, we can cache the chat's RBAC object (which only contains ID, owner, org) on the context and authorize against it, falling back to the read on any failure or a different chat ID. Every chat-ID-scoped method whose read only served authorization uses it; UpdateChatACLByID keeps its read because it rejects sub-chats.

ChatMachine.Update caches the object from the lock's own row, the chat HTTP middleware and the worker runner cache it up front, chat creation caches it from the inserted row, and acquisition caches it from the owner and organization GetChatWorkerAcquisitionCandidates now returns. Update callbacks pass tx.Ctx() to the store and helpers so their calls see the cached object.

measurement main this PR percent change
Round trips under lock 180.9 117.9 -35%
Statements under lock 86.1 54.6 -37%
GetChatByID calls under lock 54.1 22.9 -58%
GetChatByID calls total 75.5 27.9 -63%
Statements 235.8 188.0 -20%

Generated by Coder Agents on behalf of @cstyan.

Chat-ID-scoped dbauthz methods read the chat through chats_expanded
only to authorize it, and many of them run under the chat row lock.

Following the workspace RBAC-in-context pattern, cache the chat's RBAC
object (ID, owner, org; never ACLs, which change at runtime) on the
context and authorize against it, falling back to the read on any
failure or a different chat ID. Every chat-ID-scoped method whose read
only served authorization uses it; UpdateChatACLByID keeps its read
because it rejects sub-chats.

ChatMachine.Update caches the object from the lock's own row, the chat
HTTP middleware and the worker runner cache it up front, chat creation
caches it from the inserted row, and acquisition caches it from the
owner and organization GetChatWorkerAcquisitionCandidates now returns.
Update callbacks pass tx.Ctx() to the store and helpers so their calls
see the cached object.

Generated by Coder Agents on behalf of @cstyan.

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.

1 participant