diff --git a/services/chat/test/acceptance/js/helpers/MongoHelper.js b/services/chat/test/acceptance/js/helpers/MongoHelper.js index cf969c6210..12a39fc4ae 100644 --- a/services/chat/test/acceptance/js/helpers/MongoHelper.js +++ b/services/chat/test/acceptance/js/helpers/MongoHelper.js @@ -5,6 +5,6 @@ before('run migrations', async function () { this.timeout(60_000) await promisify(exec)( - `cd ../../tools/migrations && npm run migrations -- migrate -t server-ce` + `cd ../../tools/migrations && yarn run migrations migrate -t 'server-ce & !nonblocking'` ) }) diff --git a/services/docstore/test/acceptance/js/helpers/MongoHelper.js b/services/docstore/test/acceptance/js/helpers/MongoHelper.js index cf969c6210..12a39fc4ae 100644 --- a/services/docstore/test/acceptance/js/helpers/MongoHelper.js +++ b/services/docstore/test/acceptance/js/helpers/MongoHelper.js @@ -5,6 +5,6 @@ before('run migrations', async function () { this.timeout(60_000) await promisify(exec)( - `cd ../../tools/migrations && npm run migrations -- migrate -t server-ce` + `cd ../../tools/migrations && yarn run migrations migrate -t 'server-ce & !nonblocking'` ) }) diff --git a/services/document-updater/test/acceptance/js/helpers/MongoHelper.js b/services/document-updater/test/acceptance/js/helpers/MongoHelper.js index 2dc6bcaedc..18e2fb961f 100644 --- a/services/document-updater/test/acceptance/js/helpers/MongoHelper.js +++ b/services/document-updater/test/acceptance/js/helpers/MongoHelper.js @@ -5,6 +5,6 @@ before('run migrations', async function () { this.timeout(60_000) await promisify(exec)( - `cd ../../tools/migrations && npm run migrations -- migrate -t server-ce` + `cd ../../tools/migrations && yarn run migrations migrate -t 'server-ce & !nonblocking'` ) }) diff --git a/services/history-v1/test/setup.js b/services/history-v1/test/setup.js index 7f0e411cd1..2f6ebf6227 100644 --- a/services/history-v1/test/setup.js +++ b/services/history-v1/test/setup.js @@ -22,7 +22,7 @@ async function setupMongoDatabase() { this.timeout(60_000) await promisify(exec)( // Run saas migrations for backup indexes - `cd ../../tools/migrations && npm run migrations -- migrate -t saas` + `cd ../../tools/migrations && yarn run migrations migrate -t 'saas & !nonblocking'` ) } diff --git a/services/notifications/test/acceptance/js/MongoHelper.ts b/services/notifications/test/acceptance/js/MongoHelper.ts index f0ee6ce5c6..264cac1067 100644 --- a/services/notifications/test/acceptance/js/MongoHelper.ts +++ b/services/notifications/test/acceptance/js/MongoHelper.ts @@ -4,6 +4,6 @@ import { promisify } from 'node:util' beforeAll(async function () { await promisify(exec)( - `cd ../../tools/migrations && npm run migrations -- migrate -t server-ce` + `cd ../../tools/migrations && yarn run migrations migrate -t 'server-ce & !nonblocking'` ) }, 60_000) diff --git a/services/project-history/test/acceptance/js/helpers/MongoHelper.js b/services/project-history/test/acceptance/js/helpers/MongoHelper.js index cf969c6210..12a39fc4ae 100644 --- a/services/project-history/test/acceptance/js/helpers/MongoHelper.js +++ b/services/project-history/test/acceptance/js/helpers/MongoHelper.js @@ -5,6 +5,6 @@ before('run migrations', async function () { this.timeout(60_000) await promisify(exec)( - `cd ../../tools/migrations && npm run migrations -- migrate -t server-ce` + `cd ../../tools/migrations && yarn run migrations migrate -t 'server-ce & !nonblocking'` ) }) diff --git a/services/web/Makefile b/services/web/Makefile index b7705a39d2..fe18056ca0 100644 --- a/services/web/Makefile +++ b/services/web/Makefile @@ -175,7 +175,7 @@ test_unit_module: mongo_migrations_for_tests $(MAKE) modules/$(MODULE_NAME)/test_unit mongo_migrations_for_tests: - $(DOCKER_COMPOSE) run $(DC_RUN_FLAGS) --workdir /overleaf/tools/migrations test_unit yarn run migrations migrate -t saas + $(DOCKER_COMPOSE) run $(DC_RUN_FLAGS) --workdir /overleaf/tools/migrations test_unit yarn run migrations migrate -t 'saas & !nonblocking' # # Frontend tests diff --git a/services/web/test/acceptance/src/helpers/MongoHelper.mjs b/services/web/test/acceptance/src/helpers/MongoHelper.mjs index 35ce209ea1..f1b1b05a77 100644 --- a/services/web/test/acceptance/src/helpers/MongoHelper.mjs +++ b/services/web/test/acceptance/src/helpers/MongoHelper.mjs @@ -22,7 +22,7 @@ export default { this.timeout(60_000) await promisify(exec)( - `cd ../../tools/migrations && npm run migrations -- migrate -t ${Settings.env || DEFAULT_ENV}` + `cd ../../tools/migrations && yarn run migrations migrate -t '${Settings.env || DEFAULT_ENV} & !nonblocking'` ) }) diff --git a/tools/migrations/scripts/check_blocking.mjs b/tools/migrations/scripts/check_blocking.mjs index 97295b5316..ffabb89582 100644 --- a/tools/migrations/scripts/check_blocking.mjs +++ b/tools/migrations/scripts/check_blocking.mjs @@ -8,10 +8,7 @@ // 1 one or more blocking pending migrations - rollout must not proceed // 2 the check itself failed (e.g. Mongo unreachable) - fail closed // -// A migration is non-blocking when either: -// - it is tagged "nonblocking" (preferred; safe to set on an already-applied migration), or -// - its filename ends with "_nonBlocking" before the extension, -// e.g. 20260101000000_backfill_thing_nonBlocking.mjs. +// A migration is non-blocking when it is tagged "nonblocking". import path from 'node:path' import { fileURLToPath } from 'node:url' @@ -19,7 +16,6 @@ import east from 'east' const { MigrationManager } = east -const NON_BLOCKING_SUFFIX = '_nonBlocking' const NON_BLOCKING_TAG = 'nonblocking' const TAG = process.env.MIGRATION_TAG || 'saas' @@ -46,20 +42,14 @@ async function findBlockingMigrations() { try { const pending = await manager.getMigrationNames({ status: 'new' }) - const candidates = pending.filter( - name => !name.endsWith(NON_BLOCKING_SUFFIX) - ) - const nonBlocking = pending.filter(name => - name.endsWith(NON_BLOCKING_SUFFIX) - ) - const blocking = candidates.length + const blocking = pending.length ? await manager.getMigrationNames({ - migrations: candidates, + migrations: pending, tag: `${TAG} & !${NON_BLOCKING_TAG}`, }) : [] - return { pending, nonBlocking, blocking } + return { pending, blocking } } finally { await manager.disconnect() } @@ -74,14 +64,7 @@ async function main() { return 0 } - const { pending, nonBlocking, blocking } = await findBlockingMigrations() - - if (nonBlocking.length) { - console.log( - `Ignoring ${nonBlocking.length} non-blocking pending migration(s):\n` + - nonBlocking.map(name => ` - ${name}`).join('\n') - ) - } + const { pending, blocking } = await findBlockingMigrations() if (blocking.length === 0) { console.log( @@ -96,8 +79,7 @@ async function main() { `${blocking.length} blocking pending "${TAG}" migration(s) must be applied before deploying:\n` + blocking.map(name => ` - ${name}`).join('\n') + `\n\nApply them, then retry the rollout. To intentionally ship a non-blocking ` + - `migration, add the "${NON_BLOCKING_TAG}" tag (preferred — safe on already-applied ` + - `migrations) or rename the file with the "${NON_BLOCKING_SUFFIX}" suffix.` + `migration, add the "${NON_BLOCKING_TAG}" tag.` ) return 1 }