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:
committed by
GitHub
parent
44d1d18689
commit
cbf3644eb7
@@ -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,
|
||||
},
|
||||
})
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user