diff --git a/apps/hub/src/migrate.ts b/apps/hub/src/migrate.ts index 05348d539..37e8e29cb 100644 --- a/apps/hub/src/migrate.ts +++ b/apps/hub/src/migrate.ts @@ -51,6 +51,21 @@ function databaseUrlFrom(config: HubMigrateConfig): string { export async function migrateHub( config: HubMigrateConfig, db: Parameters[0], +): Promise { + // Concurrent boots against one database (parallel e2e suites, rolling + // deploys) would race on the one-shot platform SQL's CREATE TYPE. The + // transaction-scoped advisory lock serializes whole migrations. + await db.transaction(async (tx) => { + await tx.execute(sql`select pg_advisory_xact_lock(${MIGRATE_LOCK_KEY})`); + await applyMigrations(config, db); + }); +} + +const MIGRATE_LOCK_KEY = 7_460_391_205; + +async function applyMigrations( + config: HubMigrateConfig, + db: Parameters[0], ): Promise { const databaseUrl = databaseUrlFrom(config); const schema = config.schema ?? "public";