Skip to content

Commit c8aa544

Browse files
committed
Handle transient Prisma deploy connection failures
1 parent ff067f6 commit c8aa544

2 files changed

Lines changed: 13 additions & 4 deletions

File tree

prisma.config.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
import { config } from "dotenv";
33
import { defineConfig, env } from "prisma/config";
44

5-
config({ path: ".env.local" });
6-
config();
5+
if (!process.env.VERCEL) {
6+
config({ path: ".env.local" });
7+
config();
8+
}
79

810
const prismaCliDatabaseUrl = process.env.DIRECT_URL ?? process.env.DATABASE_URL;
911

scripts/prisma-deploy.mjs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ const RETRY_DELAY_MS = Number.parseInt(process.env.PRISMA_DEPLOY_RETRY_DELAY_MS
55

66
const advisoryLockTimeoutPattern =
77
/P1002|Timed out trying to acquire a postgres advisory lock/i;
8+
const transientConnectionPattern =
9+
/P1001|Can't reach database server|ECONNRESET|ECONNREFUSED|ETIMEDOUT|ENOTFOUND/i;
810

911
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
1012

@@ -28,15 +30,20 @@ for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt += 1) {
2830

2931
const combinedOutput = `${result.stdout ?? ""}\n${result.stderr ?? ""}`;
3032
const isAdvisoryLockTimeout = advisoryLockTimeoutPattern.test(combinedOutput);
31-
const shouldRetry = isAdvisoryLockTimeout && attempt < MAX_ATTEMPTS;
33+
const isTransientConnectionError = transientConnectionPattern.test(combinedOutput);
34+
const shouldRetry =
35+
(isAdvisoryLockTimeout || isTransientConnectionError) && attempt < MAX_ATTEMPTS;
3236

3337
if (!shouldRetry) {
3438
process.exit(result.status ?? 1);
3539
}
3640

3741
const waitSeconds = Math.ceil(RETRY_DELAY_MS / 1000);
42+
const reason = isAdvisoryLockTimeout
43+
? "advisory lock timeout"
44+
: "temporary database connectivity issue";
3845
console.warn(
39-
`[prisma:deploy] Advisory lock timeout detected (attempt ${attempt}/${MAX_ATTEMPTS}). Retrying in ${waitSeconds}s...`,
46+
`[prisma:deploy] ${reason} detected (attempt ${attempt}/${MAX_ATTEMPTS}). Retrying in ${waitSeconds}s...`,
4047
);
4148
await sleep(RETRY_DELAY_MS);
4249
}

0 commit comments

Comments
 (0)