Skip to content

Commit

Permalink
fix(core): Handle empty executions table in pruning in migrations (#8121
Browse files Browse the repository at this point in the history
)

In case someone manually prunes their executions table before upgrading
to 1.x, `MigrateIntegerKeysToString` should gracefully handle that,
instead of crashing the application.

## Review / Merge checklist
- [x] PR title and summary are descriptive
  • Loading branch information
netroy authored and ivov committed Dec 21, 2023
1 parent b67b5ae commit 6cbeb5d
Showing 1 changed file with 18 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -208,20 +208,24 @@ const pruneExecutionsData = async ({ queryRunner, tablePrefix, logger }: Migrati
}

console.time('pruningData');
const counting = (await queryRunner.query(
`select count(id) as rows from "${tablePrefix}execution_entity";`,
)) as Array<{ rows: number }>;

const averageExecutionSize = dbFileSize / counting[0].rows;
const numberOfExecutionsToKeep = Math.floor(DESIRED_DATABASE_FILE_SIZE / averageExecutionSize);

const query = `SELECT id FROM "${tablePrefix}execution_entity" ORDER BY id DESC limit ${numberOfExecutionsToKeep}, 1`;
const idToKeep = await queryRunner
.query(query)
.then((rows: Array<{ id: number }>) => rows[0].id);

const removalQuery = `DELETE FROM "${tablePrefix}execution_entity" WHERE id < ${idToKeep} and status IN ('success')`;
await queryRunner.query(removalQuery);
const [{ rowCount }] = (await queryRunner.query(
`select count(id) as rowCount from "${tablePrefix}execution_entity";`,
)) as Array<{ rowCount: number }>;

if (rowCount > 0) {
const averageExecutionSize = dbFileSize / rowCount;
const numberOfExecutionsToKeep = Math.floor(
DESIRED_DATABASE_FILE_SIZE / averageExecutionSize,
);

const query = `SELECT id FROM "${tablePrefix}execution_entity" ORDER BY id DESC limit ${numberOfExecutionsToKeep}, 1`;
const idToKeep = await queryRunner
.query(query)
.then((rows: Array<{ id: number }>) => rows[0].id);

const removalQuery = `DELETE FROM "${tablePrefix}execution_entity" WHERE id < ${idToKeep} and status IN ('success')`;
await queryRunner.query(removalQuery);
}
console.timeEnd('pruningData');
} else {
logger.debug('Pruning was requested, but was not enabled');
Expand Down

0 comments on commit 6cbeb5d

Please sign in to comment.