From 53ef1664cb03a2b6e37a659eccc6c0126838725f Mon Sep 17 00:00:00 2001 From: Jasper Van Date: Mon, 20 Jul 2026 10:58:17 -0400 Subject: [PATCH] fix(stats): validate snapshot rollup markers by scope (#511) --- scripts/backfill-admin-stats.ts | 21 ++++++++++++++---- server/scripts/backfill-admin-stats.test.ts | 24 +++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/scripts/backfill-admin-stats.ts b/scripts/backfill-admin-stats.ts index f12d8ed8..27264095 100644 --- a/scripts/backfill-admin-stats.ts +++ b/scripts/backfill-admin-stats.ts @@ -866,11 +866,15 @@ export function buildValidationSql(now = new Date()): string { AND json_extract(metadata, '$.quality') IN ('exact', 'lower_bound') ELSE 0 END = 1 ), -counter_markers AS MATERIALIZED ( - SELECT bucket_start +completion_markers AS MATERIALIZED ( + SELECT bucket_start, json_extract(metadata, '$.scope') AS scope FROM valid_rollups WHERE metric_key = 'stats.rollup_run' AND org_id = '' AND dimension_key = '' AND dimension_value = '' - AND json_extract(metadata, '$.scope') IN ('counters', 'full') +), +counter_markers AS MATERIALIZED ( + SELECT bucket_start + FROM completion_markers + WHERE scope IN ('counters', 'full') ), counter_rows AS MATERIALIZED ( SELECT result.* @@ -903,7 +907,16 @@ SELECT json_object( SELECT COUNT(DISTINCT r.bucket_start) FROM valid_rollups r WHERE r.metric_key <> 'stats.rollup_run' - AND NOT EXISTS (SELECT 1 FROM counter_markers marker WHERE marker.bucket_start = r.bucket_start) + AND NOT EXISTS ( + SELECT 1 + FROM completion_markers marker + WHERE marker.bucket_start = r.bucket_start + AND ( + (json_extract(r.metadata, '$.scope') = 'counters' AND marker.scope IN ('counters', 'full')) + OR (json_extract(r.metadata, '$.scope') = 'snapshots' AND marker.scope IN ('snapshots', 'full')) + OR (json_extract(r.metadata, '$.scope') = 'full' AND marker.scope = 'full') + ) + ) ), 'lowerBoundRollups', ( SELECT COUNT(*) FROM valid_rollups WHERE json_extract(metadata, '$.quality') = 'lower_bound' diff --git a/server/scripts/backfill-admin-stats.test.ts b/server/scripts/backfill-admin-stats.test.ts index a8c2490d..9583881a 100644 --- a/server/scripts/backfill-admin-stats.test.ts +++ b/server/scripts/backfill-admin-stats.test.ts @@ -225,6 +225,30 @@ describe('admin stats backfill', () => { { outcome: 'completed', bytes: 512, value: 1 }, { outcome: 'failed', bytes: 0, value: 1 }, ]) + + db.exec(` + INSERT INTO stats_rollups_hourly VALUES + ('current-snapshot-marker', ${currentHourMs}, '', 'stats.rollup_run', '', '', 1, 0, 0, + '{"version":3,"scope":"snapshots","quality":"exact"}', ${currentHourMs}), + ('current-snapshot-gauge', ${currentHourMs}, '', 'storage.used', '', '', 0, 1024, 0, + '{"version":3,"scope":"snapshots","quality":"exact"}', ${currentHourMs}); + `) + const snapshotSummary = Object.assign( + {}, + ...splitSqlStatements(validationSql).map((statement) => + JSON.parse((db.prepare(statement).get() as { summary: string }).summary), + ), + ) as Record + expect(snapshotSummary.orphanRollupBuckets).toBe(0) + + db.prepare("DELETE FROM stats_rollups_hourly WHERE id = 'current-snapshot-marker'").run() + const missingMarkerSummary = Object.assign( + {}, + ...splitSqlStatements(validationSql).map((statement) => + JSON.parse((db.prepare(statement).get() as { summary: string }).summary), + ), + ) as Record + expect(missingMarkerSummary.orphanRollupBuckets).toBe(1) db.close() }) })