chore(): Add retry strategy to database connection (#12713)

RESOLVES FRMW-2978

**What**
Add retry mechanism to database connection management to prevent failing when the server start faster than what makes the connection available
This commit is contained in:
Adrien de Peretti
2025-06-13 09:18:49 +02:00
committed by GitHub
parent 44d1d18689
commit cbf3644eb7
9 changed files with 333 additions and 45 deletions

View File

@@ -1,7 +1,7 @@
import { ModuleServiceInitializeOptions } from "@medusajs/types"
import { Filter as MikroORMFilter } from "@mikro-orm/core"
import { TSMigrationGenerator } from "@mikro-orm/migrations"
import { isString } from "../../common"
import { isString, retryExecution, stringifyCircular } from "../../common"
import { normalizeMigrationSQL } from "../utils"
type FilterDef = Parameters<typeof MikroORMFilter>[0]
@@ -83,38 +83,61 @@ export async function mikroOrmCreateConnection(
}
const { MikroORM, defineConfig } = await import("@mikro-orm/postgresql")
return await MikroORM.init(
defineConfig({
discovery: { disableDynamicFileAccess: true, warnWhenNoEntities: false },
entities,
debug: database.debug ?? process.env.NODE_ENV?.startsWith("dev") ?? false,
baseDir: process.cwd(),
clientUrl,
schema,
driverOptions,
tsNode: process.env.APP_ENV === "development",
filters: database.filters ?? {},
assign: {
convertCustomTypes: true,
const mikroOrmConfig = defineConfig({
discovery: { disableDynamicFileAccess: true, warnWhenNoEntities: false },
entities,
debug: database.debug ?? process.env.NODE_ENV?.startsWith("dev") ?? false,
baseDir: process.cwd(),
clientUrl,
schema,
driverOptions,
tsNode: process.env.APP_ENV === "development",
filters: database.filters ?? {},
assign: {
convertCustomTypes: true,
},
migrations: {
disableForeignKeys: false,
path: pathToMigrations,
snapshotName: database.snapshotName,
generator: CustomTsMigrationGenerator,
silent: !(
database.debug ??
process.env.NODE_ENV?.startsWith("dev") ??
false
),
},
schemaGenerator: {
disableForeignKeys: false,
},
pool: {
min: 2,
...database.pool,
},
})
const maxRetries = process.env.__MEDUSA_DB_CONNECTION_MAX_RETRIES
? parseInt(process.env.__MEDUSA_DB_CONNECTION_MAX_RETRIES)
: 5
const retryDelay = process.env.__MEDUSA_DB_CONNECTION_RETRY_DELAY
? parseInt(process.env.__MEDUSA_DB_CONNECTION_RETRY_DELAY)
: 1000
return await retryExecution(
async () => {
return await MikroORM.init(mikroOrmConfig)
},
{
maxRetries,
retryDelay,
onRetry: (error) => {
console.warn(
`MikroORM failed to connect to the database. Retrying...\n${stringifyCircular(
error
)}`
)
},
migrations: {
disableForeignKeys: false,
path: pathToMigrations,
snapshotName: database.snapshotName,
generator: CustomTsMigrationGenerator,
silent: !(
database.debug ??
process.env.NODE_ENV?.startsWith("dev") ??
false
),
},
schemaGenerator: {
disableForeignKeys: false,
},
pool: {
min: 2,
...database.pool,
},
})
}
)
}