feat: added timeout function to migration

This commit is contained in:
=
2025-07-23 14:31:54 +05:30
parent 53bec6bc3e
commit dfecaae560
@@ -269,51 +269,61 @@ const kickOutSshProject = async (knex: Knex, oldProjectId: string) => {
}; };
const BATCH_SIZE = 1000; const BATCH_SIZE = 1000;
const MIGRATION_TIMEOUT = 30 * 60 * 1000; // 30 minutes
export async function up(knex: Knex): Promise<void> { export async function up(knex: Knex): Promise<void> {
const hasTemplateTypeColumn = await knex.schema.hasColumn(TableName.ProjectTemplates, "type"); const result = await knex.raw("SHOW statement_timeout");
if (hasTemplateTypeColumn) { const originalTimeout = result.rows[0].statement_timeout;
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 hasTypeColumn = await knex.schema.hasColumn(TableName.Project, "type"); try {
const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultProduct"); await knex.raw(`SET statement_timeout = ${MIGRATION_TIMEOUT}`);
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) => { const hasTemplateTypeColumn = await knex.schema.hasColumn(TableName.ProjectTemplates, "type");
t.string("type").notNullable().alter(); if (hasTemplateTypeColumn) {
t.string("defaultProduct").nullable().alter(); 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; const hasTypeColumn = await knex.schema.hasColumn(TableName.Project, "type");
do { const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultProduct");
// eslint-disable-next-line no-await-in-loop if (hasTypeColumn && hasDefaultTypeColumn) {
projectsToBeSplit = await knex(TableName.Project) await knex(TableName.Project).update({
.whereNotNull("defaultProduct") // eslint-disable-next-line
.limit(BATCH_SIZE) // @ts-ignore this is because this field is created later
.select("id", "defaultProduct"); type: knex.raw(`"defaultProduct"`)
if (projectsToBeSplit.length) { });
const ids: string[] = [];
for (const { id, defaultProduct } of projectsToBeSplit) { await knex.schema.alterTable(TableName.Project, (t) => {
if (defaultProduct !== ProjectType.SecretManager) await kickOutSecretManagerProject(knex, id); t.string("type").notNullable().alter();
if (defaultProduct !== ProjectType.CertificateManager) await kickOutCertManagerProject(knex, id); t.string("defaultProduct").nullable().alter();
if (defaultProduct !== ProjectType.KMS) await kickOutKmsProject(knex, id); });
if (defaultProduct !== ProjectType.SSH) await kickOutSshProject(knex, id);
if (defaultProduct !== ProjectType.SecretScanning) await kickOutSecretScanningProject(knex, id); let projectsToBeSplit;
ids.push(id); 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}'`);
} }
} }