From dfecaae560700150d345a7607c37f2eaa2097f24 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 22 Jul 2025 02:18:25 +0530 Subject: [PATCH] feat: added timeout function to migration --- .../20250718133527_project-unify-revert.ts | 90 ++++++++++--------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/backend/src/db/migrations/20250718133527_project-unify-revert.ts b/backend/src/db/migrations/20250718133527_project-unify-revert.ts index 365395d3b..d1bb48052 100644 --- a/backend/src/db/migrations/20250718133527_project-unify-revert.ts +++ b/backend/src/db/migrations/20250718133527_project-unify-revert.ts @@ -269,51 +269,61 @@ const kickOutSshProject = async (knex: Knex, oldProjectId: string) => { }; const BATCH_SIZE = 1000; +const MIGRATION_TIMEOUT = 30 * 60 * 1000; // 30 minutes export async function up(knex: Knex): Promise { - const hasTemplateTypeColumn = await knex.schema.hasColumn(TableName.ProjectTemplates, "type"); - if (hasTemplateTypeColumn) { - await knex(TableName.ProjectTemplates).whereNull("type").update({ - type: ProjectType.SecretManager - }); - await knex.schema.alterTable(TableName.ProjectTemplates, (t) => { - t.string("type").notNullable().defaultTo(ProjectType.SecretManager).alter(); - }); - } + const result = await knex.raw("SHOW statement_timeout"); + const originalTimeout = result.rows[0].statement_timeout; - const hasTypeColumn = await knex.schema.hasColumn(TableName.Project, "type"); - const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultProduct"); - if (hasTypeColumn && hasDefaultTypeColumn) { - await knex(TableName.Project).update({ - // eslint-disable-next-line - // @ts-ignore this is because this field is created later - type: knex.raw(`"defaultProduct"`) - }); + try { + await knex.raw(`SET statement_timeout = ${MIGRATION_TIMEOUT}`); - await knex.schema.alterTable(TableName.Project, (t) => { - t.string("type").notNullable().alter(); - t.string("defaultProduct").nullable().alter(); - }); + const hasTemplateTypeColumn = await knex.schema.hasColumn(TableName.ProjectTemplates, "type"); + if (hasTemplateTypeColumn) { + await knex(TableName.ProjectTemplates).whereNull("type").update({ + type: ProjectType.SecretManager + }); + await knex.schema.alterTable(TableName.ProjectTemplates, (t) => { + t.string("type").notNullable().defaultTo(ProjectType.SecretManager).alter(); + }); + } - let projectsToBeSplit; - do { - // eslint-disable-next-line no-await-in-loop - projectsToBeSplit = await knex(TableName.Project) - .whereNotNull("defaultProduct") - .limit(BATCH_SIZE) - .select("id", "defaultProduct"); - if (projectsToBeSplit.length) { - const ids: string[] = []; - for (const { id, defaultProduct } of projectsToBeSplit) { - if (defaultProduct !== ProjectType.SecretManager) await kickOutSecretManagerProject(knex, id); - if (defaultProduct !== ProjectType.CertificateManager) await kickOutCertManagerProject(knex, id); - if (defaultProduct !== ProjectType.KMS) await kickOutKmsProject(knex, id); - if (defaultProduct !== ProjectType.SSH) await kickOutSshProject(knex, id); - if (defaultProduct !== ProjectType.SecretScanning) await kickOutSecretScanningProject(knex, id); - ids.push(id); + const hasTypeColumn = await knex.schema.hasColumn(TableName.Project, "type"); + const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultProduct"); + if (hasTypeColumn && hasDefaultTypeColumn) { + await knex(TableName.Project).update({ + // eslint-disable-next-line + // @ts-ignore this is because this field is created later + type: knex.raw(`"defaultProduct"`) + }); + + await knex.schema.alterTable(TableName.Project, (t) => { + t.string("type").notNullable().alter(); + t.string("defaultProduct").nullable().alter(); + }); + + let projectsToBeSplit; + do { + // eslint-disable-next-line no-await-in-loop + projectsToBeSplit = await knex(TableName.Project) + .whereNotNull("defaultProduct") + .limit(BATCH_SIZE) + .select("id", "defaultProduct"); + if (projectsToBeSplit.length) { + const ids: string[] = []; + for (const { id, defaultProduct } of projectsToBeSplit) { + if (defaultProduct !== ProjectType.SecretManager) await kickOutSecretManagerProject(knex, id); + if (defaultProduct !== ProjectType.CertificateManager) await kickOutCertManagerProject(knex, id); + if (defaultProduct !== ProjectType.KMS) await kickOutKmsProject(knex, id); + if (defaultProduct !== ProjectType.SSH) await kickOutSshProject(knex, id); + if (defaultProduct !== ProjectType.SecretScanning) await kickOutSecretScanningProject(knex, id); + ids.push(id); + } + await knex(TableName.Project).whereIn("id", ids).update("defaultProduct", null); } - await knex(TableName.Project).whereIn("id", ids).update("defaultProduct", null); - } - } while (projectsToBeSplit.length > 0); + } while (projectsToBeSplit.length > 0); + } + } finally { + await knex.raw(`SET statement_timeout = '${originalTimeout}'`); } }