Ethan
15f2fa55c6
perf(coderd/x/chatd): add process-wide config cache for hot DB queries ( #23272 )
...
## Summary
Adds a process-wide cache for three hot database queries in `chatd` that
were hitting Postgres on **every chat turn** despite returning
rarely-changing configuration data:
| Query | Before (50k turns) | After | Reduction |
|---|---|---|---|
| `GetEnabledChatProviders` | ~98.6k calls | ~500-1000 | ~99% |
| `GetChatModelConfigByID` | ~49.2k calls | ~500-1000 | ~98% |
| `GetUserChatCustomPrompt` | ~46.7k calls | ~1000-2000 | ~97% |
These were identified via `coder exp scaletest chat` (5000 concurrent
chats × 10 turns) as the dominant source of Postgres load during chat
processing.
## Design
Follows the established **webpush subscription cache pattern**
(`coderd/webpush/webpush.go`):
- `sync.RWMutex` + `tailscale.com/util/singleflight` (generic) +
generation-based stale prevention + TTL
- 10s TTL for provider/model config, 5s TTL for user prompts
- Negative caching for `sql.ErrNoRows` on user prompts (the common case
— most users don't set custom prompts)
- Deep-clones `ChatModelConfig.Options` (`json.RawMessage` = `[]byte`)
on both store and read paths
### Invalidation
Single pubsub channel (`chat:config_change`) with kind discriminator for
cross-replica cache invalidation. Seven publish points in
`coderd/chats.go` cover all admin mutation endpoints
(create/update/delete for providers and model configs, put for user
prompts).
_This PR was generated with mux and was reviewed by a human_
2026-03-26 18:04:53 +11:00
..
2026-03-20 15:42:05 -05:00
2025-06-20 13:16:55 -06:00
2026-03-25 14:17:56 -04:00
2026-03-16 12:36:26 -05:00
2026-03-24 10:13:25 -08:00
2026-03-02 16:02:01 +01:00
2024-09-18 21:47:53 +10:00
2026-03-16 15:30:25 -05:00
2026-02-24 16:45:56 +00:00
2023-10-30 19:44:29 +00:00
2025-12-15 13:44:44 -09:00
2026-02-06 09:52:17 -07:00
2026-03-13 00:22:55 +11:00
2026-03-24 10:13:25 -08:00
2025-10-16 01:56:43 +11:00
2026-01-08 15:24:11 +04:00
2026-03-26 17:22:38 +11:00
2026-02-19 09:02:19 +00:00
2026-03-23 23:19:23 +02:00
2026-01-29 13:50:15 +01:00
2026-03-14 17:24:19 +00:00
2026-01-08 15:24:11 +04:00
2026-01-08 15:24:11 +04:00
2026-03-13 10:40:57 +00:00
2026-03-25 17:26:26 +00:00
2026-03-24 12:37:17 +11:00
2026-03-05 20:29:49 +00:00
2026-03-19 21:51:26 +00:00
2025-06-20 13:16:55 -06:00
2026-03-18 10:21:45 +00:00
2026-01-08 15:24:11 +04:00
2026-03-23 23:19:23 +02:00
2026-03-23 21:03:34 +00:00
2025-10-15 17:37:37 +00:00
2024-05-13 14:37:51 -04:00
2026-03-18 09:30:22 -05:00
2026-02-19 09:02:19 +00:00
2026-03-23 23:19:23 +02:00
2026-01-30 13:30:06 +01:00
2026-03-18 15:43:28 +01:00
2025-10-23 15:38:49 -05:00
2025-06-17 09:00:32 -08:00
2026-03-26 18:04:53 +11:00
2026-03-25 13:46:58 -05:00
2025-06-20 13:16:55 -06:00
2025-07-08 14:31:05 +00:00
2026-02-19 09:02:19 +00:00
2026-03-24 10:13:25 -08:00
2026-03-13 17:35:26 +00:00
2026-02-24 17:04:42 +00:00
2025-12-14 03:00:03 +00:00
2026-03-20 20:00:55 +00:00
2026-01-08 15:24:11 +04:00
2026-03-18 09:30:22 -05:00
2025-06-20 13:16:55 -06:00
2026-03-25 22:15:27 +00:00
2026-03-17 13:50:47 +11:00
2026-03-25 09:57:28 -04:00
2026-03-20 15:42:05 -05:00
2026-02-27 14:26:48 +00:00
2026-03-13 20:37:41 -07:00
2026-03-26 18:04:53 +11:00
2026-03-12 18:07:52 +02:00
2025-11-17 13:24:12 +00:00
2026-03-23 09:52:34 +00:00
2026-03-23 09:52:34 +00:00
2025-09-26 11:56:34 +02:00
2026-03-06 09:14:11 +00:00
2026-02-24 15:27:03 +00:00
2024-08-01 12:07:19 -05:00
2026-01-08 15:24:11 +04:00
2026-01-08 15:24:11 +04:00
2025-10-27 17:14:16 -06:00
2026-02-27 16:50:56 +00:00
2025-06-20 13:16:55 -06:00
2026-03-25 09:57:28 -04:00
2026-03-25 15:19:17 +00:00
2026-01-08 15:24:11 +04:00
2026-03-13 14:09:39 +00:00
2026-03-13 14:09:39 +00:00
2024-02-27 16:33:32 +00:00
2025-06-25 13:03:32 +00:00
2024-06-11 12:22:59 +10:00
2026-03-25 15:19:17 +00:00
2026-03-26 18:04:53 +11:00
2025-04-22 16:21:15 +00:00
2025-06-24 09:14:41 +01:00
2026-01-12 18:19:19 -08:00
2025-12-15 17:41:47 +00:00
2026-03-23 19:54:43 +00:00
2026-01-08 15:24:11 +04:00
2025-12-15 11:26:41 -06:00
2025-05-15 15:32:52 +01:00
2025-06-20 13:16:55 -06:00
2025-06-20 13:16:55 -06:00
2026-01-26 09:24:45 +00:00
2026-03-23 19:54:43 +00:00
2025-08-19 10:41:33 +02:00
2025-06-20 13:16:55 -06:00
2026-03-04 18:01:56 -08:00
2026-03-04 12:54:39 +02:00
2026-01-08 15:24:11 +04:00
2026-03-25 14:35:55 -04:00
2026-03-25 14:35:55 -04:00
2026-03-24 10:13:25 -08:00
2026-03-24 10:13:25 -08:00
2026-02-13 08:19:07 -06:00
2026-01-08 15:24:11 +04:00
2026-03-25 09:53:06 +00:00
2026-01-15 12:41:28 +03:00
2026-03-23 21:03:34 +00:00
2026-03-25 09:53:06 +00:00
2026-03-06 09:14:11 +00:00
2025-10-22 15:18:42 -05:00
2024-07-25 16:07:53 -05:00
2026-02-03 17:52:07 +00:00
2025-07-15 14:55:34 +10:00
2025-07-15 14:55:34 +10:00
2026-02-02 09:03:18 -06:00
2026-02-03 17:52:07 +00:00
2026-02-19 09:02:19 +00:00
2025-07-28 15:02:26 +01:00
2025-08-21 16:03:34 -04:00
2026-02-03 17:52:07 +00:00
2025-06-20 13:16:55 -06:00
2026-03-03 10:19:00 -05:00
2026-03-20 02:59:50 +00:00
2024-07-25 16:07:53 -05:00
2026-01-12 18:19:19 -08:00
2025-09-26 11:43:32 +02:00
2025-09-26 11:43:32 +02:00
2025-06-20 13:16:55 -06:00
2026-01-08 15:24:11 +04:00
2026-03-25 09:43:06 +02:00
2026-03-25 09:43:06 +02:00
2026-03-23 19:54:43 +00:00
2026-03-03 16:50:18 +00:00
2025-06-20 13:16:55 -06:00
2026-03-25 09:53:06 +00:00
2026-03-23 23:19:23 +02:00
2026-03-25 19:09:25 +00:00
2026-03-24 10:13:25 -08:00
2026-03-17 13:50:47 +11:00
2026-03-17 13:50:47 +11:00
2026-01-12 18:19:19 -08:00
2025-06-18 14:07:53 +00:00
2026-03-18 18:04:42 +00:00
2026-03-09 20:37:05 +00:00
2026-03-20 15:42:05 -05:00
2025-12-22 10:21:39 +04:00
2026-03-12 18:07:52 +02:00
2026-03-20 15:42:05 -05:00
2025-06-20 13:16:55 -06:00
2025-09-26 11:56:34 +02:00
2026-02-03 09:45:23 +00:00
2026-03-13 20:37:41 -07:00
2024-01-18 09:44:05 -06:00
2026-03-19 14:07:36 +00:00
2025-12-15 11:26:41 -06:00
2026-01-08 15:24:11 +04:00
2026-03-25 13:46:58 -05:00
2026-03-19 11:32:36 -05:00
2026-03-20 15:42:05 -05:00
2025-04-16 10:37:09 -06:00
2026-01-08 15:24:11 +04:00