From 6980e40e511ad6feb4cc304e96345aedd7999ac3 Mon Sep 17 00:00:00 2001 From: "jason.woltje" Date: Wed, 24 Jun 2026 05:04:28 +0000 Subject: [PATCH] fix(db): stop pglite migration tests flaking CI (timeout + WASM OOM) (#647) --- .gitignore | 7 +++++++ eslint.config.mjs | 1 + packages/db/vitest.config.ts | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/.gitignore b/.gitignore index 27556b3..dd50108 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,10 @@ infra/step-ca/dev-password # Scratch dirs created by the framework git-wrapper shell test harnesses .mosaic-test-work/ + +# Transient config files vite/vitest/esbuild write next to a *.config.ts while +# loading it, then unlink. They are untracked but were not ignored, so turbo's +# package traversal hashed them and intermittently failed CI with "Package +# traversal error: ... .timestamp-*.mjs: No such file or directory" when the +# file vanished mid-scan. Ignoring them removes the race. +*.timestamp-*.mjs diff --git a/eslint.config.mjs b/eslint.config.mjs index eb57f77..ac2be1a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -28,6 +28,7 @@ export default tseslint.config( 'apps/web/e2e/helpers/*.ts', 'apps/web/playwright.config.ts', 'apps/gateway/vitest.config.ts', + 'packages/db/vitest.config.ts', 'packages/storage/vitest.config.ts', 'packages/mosaic/__tests__/*.ts', 'tools/federation-harness/*.ts', diff --git a/packages/db/vitest.config.ts b/packages/db/vitest.config.ts index 8e730d5..7cdd921 100644 --- a/packages/db/vitest.config.ts +++ b/packages/db/vitest.config.ts @@ -4,5 +4,22 @@ export default defineConfig({ test: { globals: true, environment: 'node', + // The migration suite spins up a real PGlite (WASM Postgres) instance per + // test and applies the full drizzle migration set. Each case legitimately + // takes ~5s locally and considerably longer on CI, where turbo runs many + // packages' test suites concurrently. The 5s vitest default then expires + // mid-migration and the run fails as a phantom "Test timed out in 5000ms" + // (often surfacing the underlying WASM `memory access out of bounds` when + // the heap is starved). Give migrations real headroom. + testTimeout: 120_000, + hookTimeout: 120_000, + // Each PGlite instance carries a multi-hundred-MB WASM heap. Running test + // files in parallel forks multiplies that peak and is what tips the CI + // runner into the WASM OOM. A single fork keeps only one instance resident + // at a time — slightly slower, but deterministic. + pool: 'forks', + poolOptions: { + forks: { singleFork: true }, + }, }, });