Files
wehub-resource-sync b3a7f98e5a
CI / E2E Cloudflare (4/8) (push) Failing after 0s
CI / E2E Cloudflare (8/8) (push) Failing after 1s
CI / Lint (push) Failing after 1s
Auto Extract / Extract (push) Failing after 4s
CI / Version Check (push) Failing after 9s
CI / Integration Tests (push) Failing after 1s
CI / E2E tests (1/8) (push) Failing after 1s
CI / E2E tests (2/8) (push) Failing after 2s
CI / E2E tests (3/8) (push) Failing after 2s
CI / Browser Tests (push) Failing after 1s
CI / E2E tests (5/8) (push) Failing after 1s
CI / E2E Cloudflare (2/8) (push) Failing after 2s
CI / Typecheck (push) Failing after 1s
CI / Changeset Validation (push) Failing after 2s
CI / E2E Cloudflare (5/8) (push) Failing after 1s
CI / E2E Cloudflare (6/8) (push) Failing after 1s
CI / E2E Cloudflare (7/8) (push) Failing after 1s
CodeQL / Analyze (javascript-typescript) (push) Failing after 1s
Format / Format (push) Failing after 0s
CodeQL / Analyze (actions) (push) Failing after 4s
CI / E2E tests (4/8) (push) Failing after 1s
CI / E2E tests (6/8) (push) Failing after 1s
CI / E2E tests (7/8) (push) Failing after 2s
CI / E2E tests (8/8) (push) Failing after 1s
CI / E2E Cloudflare (1/8) (push) Failing after 1s
CI / E2E Cloudflare (3/8) (push) Failing after 2s
Preview Releases / Publish Preview (push) Failing after 0s
zizmor / Run zizmor (push) Failing after 1s
Release / Release (push) Failing after 2s
CI / Smoke Tests (push) Failing after 5m36s
CI / Tests (push) Failing after 6m36s
Release / Sync Templates (push) Has been skipped
CI / E2E Tests (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:23:53 +08:00

56 lines
1.6 KiB
JavaScript

#!/usr/bin/env node
/**
* Identify queries that fire on cold but not warm in the d1 target —
* the cold-isolate startup tax.
*/
import { readFileSync, readdirSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const dir = resolve(__dirname, "d1");
function normalize(sql) {
return sql.replace(/\s+/g, " ").trim();
}
const routeOrder = [
"root",
"posts",
"posts_building_for_the_long_term",
"pages_about",
"category_development",
"tag_webdev",
"rss_xml",
"search",
];
const coldOnlyAcc = new Map(); // sql -> count
for (const r of routeOrder) {
const coldFile = resolve(dir, `${r}.cold.json`);
const warmFile = resolve(dir, `${r}.warm.json`);
const cold = JSON.parse(readFileSync(coldFile, "utf8"));
const warm = JSON.parse(readFileSync(warmFile, "utf8"));
const warmSet = new Map();
for (const e of warm) warmSet.set(normalize(e.sql), (warmSet.get(normalize(e.sql)) || 0) + 1);
for (const e of cold) {
const n = normalize(e.sql);
const wcount = warmSet.get(n) || 0;
if (wcount > 0) {
warmSet.set(n, wcount - 1);
} else {
coldOnlyAcc.set(n, (coldOnlyAcc.get(n) || 0) + 1);
}
}
}
const sorted = [...coldOnlyAcc.entries()].sort((a, b) => b[1] - a[1]);
process.stdout.write(
`# Cold-only queries (d1)\n\nQueries that appear in cold-phase dumps but not in matching warm-phase dumps. Aggregated across all routes.\n\n`,
);
process.stdout.write(`| count | sql |\n|---:|---|\n`);
for (const [sql, count] of sorted) {
process.stdout.write(`| ${count} | ${sql.slice(0, 200)} |\n`);
}