Ethan
535c775f2a
fix(coderd): serialize chat model config default election with advisory lock ( #27114 )
...
Closes CODAGT-736
Concurrent chat model config writes on a deployment with no default all
elect themselves default: at READ COMMITTED neither transaction sees the
other's uncommitted default, so both self-promote and
`idx_chat_model_configs_single_default` rejects the loser as a spurious
409. The coderd Terraform provider hits this routinely, since a single
`terraform apply` creates or deletes many configs in parallel by design.
The fix serializes the election with a transaction-scoped advisory lock:
the create, update, and delete handlers run their default election
inside a transaction that first takes `pg_advisory_xact_lock` on a
dedicated `LockIDChatModelConfigDefault`, so elections run one at a time
and the index is never contended. The partial unique index stays in
place as the schema-level invariant, and the existing 409 mapping
remains as a backstop for any writer that bypasses the lock.
We considered a singleton pointer table (one row holding a
`model_config_id` FK, making a second default unrepresentable), which
would remove the race outright, but it needs a migration, new queries,
dbauthz rules, and handler/read-path rework. Not proportionate for an
experimental endpoint.
2026-07-14 13:51:47 +10:00
..
2026-07-07 10:42:01 +00:00
2026-07-08 12:46:47 +01:00
2026-07-13 19:44:36 -04:00
2026-07-13 19:44:36 -04:00
2026-07-08 15:32:17 +02:00
2026-06-16 09:01:43 +00:00
2026-07-13 20:28:28 +02:00
2026-03-02 16:02:01 +01:00
2026-06-16 09:01:43 +00:00
2026-06-23 11:37:33 -05:00
2026-07-01 21:24:42 -05:00
2026-06-26 07:24:21 -04:00
2026-06-25 15:41:09 -06:00
2026-03-13 00:22:55 +11:00
2026-07-13 20:28:28 +02:00
2026-04-03 15:47:26 -05:00
2026-07-13 11:00:02 -07:00
2026-07-14 13:51:47 +10:00
2026-02-19 09:02:19 +00:00
2026-05-21 09:19:29 -06:00
2026-07-09 11:49:19 -08:00
2026-04-28 13:06:45 -07:00
2026-06-18 10:08:29 +01:00
2026-07-05 06:36:33 +02:00
2026-06-24 14:27:23 -05:00
2026-03-19 21:51:26 +00:00
2026-06-01 16:17:29 +03:00
2026-07-06 13:15:58 +01:00
2026-05-22 20:24:38 +10:00
2026-07-07 09:18:30 -07:00
2026-04-02 23:51:02 +02:00
2026-06-17 13:10:53 +02:00
2026-07-07 09:18:30 -07:00
2026-07-07 00:20:54 +10:00
2026-07-07 09:18:30 -07:00
2026-06-24 12:32:46 +01:00
2026-06-23 17:32:47 -05:00
2026-06-17 13:35:53 -08:00
2026-05-07 17:10:50 +01:00
2026-07-13 20:28:28 +02:00
2026-07-06 16:48:00 -04:00
2026-05-21 09:19:29 -06:00
2026-07-09 14:02:18 +00:00
2026-03-18 09:30:22 -05:00
2026-06-10 02:18:44 -05:00
2026-05-22 13:36:53 +03:00
2026-06-17 00:22:41 +10:00
2026-06-25 11:17:23 -05:00
2026-06-05 15:01:45 -05:00
2026-06-25 15:41:09 -06:00
2026-05-21 09:19:29 -06:00
2026-07-07 09:18:30 -07:00
2026-07-07 09:18:30 -07:00
2026-07-13 20:28:28 +02:00
2026-03-12 18:07:52 +02:00
2026-07-01 15:59:55 +03:00
2026-07-06 23:00:09 +01:00
2026-07-01 20:44:15 +00:00
2026-07-06 23:00:09 +01:00
2026-07-06 23:00:09 +01:00
2026-05-27 11:58:43 +02:00
2026-07-06 23:00:09 +01:00
2026-07-06 23:00:09 +01:00
2026-05-25 18:04:12 +02:00
2026-07-13 17:52:45 +01:00
2026-07-09 13:59:49 -07:00
2026-07-09 13:59:49 -07:00
2026-04-01 09:54:59 -04:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-05-28 18:37:57 +01:00
2026-06-16 09:01:43 +00:00
2026-05-05 02:54:03 +05:00
2026-07-07 10:42:01 +00:00
2026-05-12 22:13:55 +10:00
2026-07-01 20:15:03 +01:00
2026-07-01 20:15:03 +01:00
2026-07-13 11:00:02 -07:00
2026-05-05 02:54:03 +05:00
2026-03-13 14:09:39 +00:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-07-06 13:15:58 +01:00
2026-07-06 13:15:58 +01:00
2026-06-12 13:03:45 +00:00
2026-06-16 09:01:43 +00:00
2026-07-14 13:51:47 +10:00
2026-07-14 13:51:47 +10:00
2026-05-05 02:54:03 +05:00
2026-06-22 19:26:34 -06:00
2026-05-05 02:54:03 +05:00
2026-06-02 10:11:49 -07:00
2026-06-02 10:11:49 -07:00
2026-06-02 08:36:01 -06:00
2026-07-06 13:15:58 +01:00
2026-07-06 13:15:58 +01:00
2026-03-23 19:54:43 +00:00
2026-05-05 02:54:03 +05:00
2026-03-04 18:01:56 -08:00
2026-05-05 02:54:03 +05:00
2026-04-22 12:34:17 +02:00
2026-05-03 11:31:48 -04:00
2026-05-29 16:49:25 +10:00
2026-05-12 08:54:53 -04:00
2026-04-07 12:25:32 -06:00
2026-05-05 02:54:03 +05:00
2026-02-13 08:19:07 -06:00
2026-05-05 02:54:03 +05:00
2026-03-25 09:53:06 +00:00
2026-03-23 21:03:34 +00:00
2026-06-25 15:41:09 -06:00
2026-03-06 09:14:11 +00:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-05-21 09:19:29 -06:00
2026-06-03 10:46:07 +01:00
2026-02-19 09:02:19 +00:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-06-03 10:46:07 +01:00
2026-04-10 09:50:11 -05:00
2026-06-03 10:46:07 +01:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-05-11 08:41:17 -06:00
2026-06-23 23:06:44 +10:00
2026-06-15 11:07:16 -04:00
2026-07-06 16:48:00 -04:00
2026-06-23 11:36:07 -04:00
2026-06-23 17:32:47 -05:00
2026-06-23 17:32:47 -05:00
2026-06-23 17:32:47 -05:00
2026-06-23 17:32:47 -05:00
2026-04-23 06:20:35 +10:00
2026-06-25 15:47:35 -07:00
2026-05-05 02:54:03 +05:00
2026-06-04 14:37:19 -04:00
2026-07-07 09:05:14 -07:00
2026-07-07 09:05:14 -07:00
2026-07-07 09:05:14 -07:00
2026-07-07 09:05:14 -07:00
2026-04-29 12:57:47 -06:00
2026-05-26 14:42:31 -06:00
2026-05-26 14:42:31 -06:00
2026-05-20 19:50:50 +02:00
2026-05-20 00:09:09 +02:00
2026-04-15 11:31:43 +02:00
2026-04-26 14:49:10 -07:00
2026-05-05 02:54:03 +05:00
2026-05-05 02:54:03 +05:00
2026-07-01 15:59:55 +03:00
2026-07-07 12:38:37 -07:00
2026-07-07 12:38:37 -07:00
2026-07-07 12:38:37 -07:00
2026-05-11 14:27:40 -05:00
2026-03-12 18:07:52 +02:00
2026-07-01 20:15:03 +01:00
2026-05-05 02:54:03 +05:00
2026-07-07 09:18:30 -07:00
2026-06-25 15:47:35 -07:00
2026-07-07 09:18:30 -07:00
2026-05-05 02:54:03 +05:00
2026-05-18 08:33:29 -04:00
2026-05-13 14:14:07 +00:00
2026-05-11 11:03:38 +02:00
2026-07-06 13:04:48 -07:00
2026-07-09 13:59:49 -07:00