mirror of
https://github.com/coder/coder.git
synced 2026-10-31 02:43:21 +08:00
The usage generator writes `hb_agent_runtime_v1` rows with `created_at` at the UTC hourly bucket start and exactly one row per bucket, but nothing in the schema enforced either invariant. A duplicate bucket row under a different id would be double-counted by any consumer summing `runtime_ms`, and a misaligned `created_at` would skew which usage period a bucket is attributed to. This replaces the non-unique partial index `idx_usage_events_agent_runtime` (from migration 000561) with a unique index of the same shape and adds an hour-alignment `CHECK` constraint. Both statements validate existing rows: every supported writer has always produced conforming data, so a pre-existing violator is anomalous and failing the migration loudly beats silently rewriting usage rows. `generateBucket` treats a unique violation on the bucket index as another replica having won the race, mirroring the existing `ON CONFLICT (id)` no-op for committed rows. The `coderd/notifications` sync commit and its revert cancel out (the drift they addressed was fixed on main by #27979); the PR's net diff is only the usage-event changes. Part 1 of a 3-PR stack splitting up #27796 (see there for review history). Stack: this PR → #27984 → #27985.
10 lines
406 B
SQL
10 lines
406 B
SQL
-- IF EXISTS tolerates the index already being gone (e.g. rolling back out
|
|
-- of order during an incident) instead of failing.
|
|
DROP INDEX IF EXISTS idx_usage_events_agent_runtime;
|
|
CREATE INDEX idx_usage_events_agent_runtime
|
|
ON usage_events (event_type, created_at)
|
|
WHERE event_type = 'hb_agent_runtime_v1';
|
|
|
|
ALTER TABLE usage_events
|
|
DROP CONSTRAINT IF EXISTS usage_events_agent_runtime_hour_aligned;
|