From d2d9130e324e93eed5b82dee95b9ce8657d21812 Mon Sep 17 00:00:00 2001 From: Andrey Starostin Date: Tue, 28 Nov 2023 14:33:58 +0100 Subject: [PATCH 1/2] fix(core): Fix hard deletes stopping if database query throws --- packages/cli/src/services/pruning.service.ts | 26 +++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/cli/src/services/pruning.service.ts b/packages/cli/src/services/pruning.service.ts index 706b7a2454f32..d3c4d997433d7 100644 --- a/packages/cli/src/services/pruning.service.ts +++ b/packages/cli/src/services/pruning.service.ts @@ -1,10 +1,10 @@ import { Service } from 'typedi'; import { BinaryDataService } from 'n8n-core'; -import { LessThanOrEqual, IsNull, Not, In, Brackets } from 'typeorm'; -import { DateUtils } from 'typeorm/util/DateUtils'; import type { FindOptionsWhere } from 'typeorm'; +import { Brackets, In, IsNull, LessThanOrEqual, Not } from 'typeorm'; +import { DateUtils } from 'typeorm/util/DateUtils'; -import { TIME, inTest } from '@/constants'; +import { inTest, TIME } from '@/constants'; import config from '@/config'; import { ExecutionRepository } from '@db/repositories/execution.repository'; import { Logger } from '@/Logger'; @@ -80,10 +80,15 @@ export class PruningService { private scheduleHardDeletion(rateMs = this.rates.hardDeletion) { const when = [rateMs / TIME.MINUTE, 'min'].join(' '); - this.hardDeletionTimeout = setTimeout( - async () => this.hardDeleteOnPruningCycle(), - this.rates.hardDeletion, - ); + this.hardDeletionTimeout = setTimeout(() => { + this.hardDeleteOnPruningCycle() + .then((rate) => this.scheduleHardDeletion(rate)) + .catch((error) => { + this.scheduleHardDeletion(1 * TIME.SECOND); + // Error will be handled by the global uncaught error handler + throw error; + }); + }, rateMs); this.logger.debug(`[Pruning] Hard-deletion scheduled for next ${when}`); } @@ -149,6 +154,7 @@ export class PruningService { /** * Permanently remove all soft-deleted executions and their binary data, in a pruning cycle. + * @return Delay in ms after which the next cycle should be started */ private async hardDeleteOnPruningCycle() { const date = new Date(); @@ -174,8 +180,7 @@ export class PruningService { if (executionIds.length === 0) { this.logger.debug('[Pruning] Found no executions to hard-delete'); - this.scheduleHardDeletion(); - return; + return undefined; } try { @@ -201,7 +206,6 @@ export class PruningService { */ const isHighVolume = executionIds.length >= this.hardDeletionBatchSize; const rate = isHighVolume ? 1 * TIME.SECOND : this.rates.hardDeletion; - - this.scheduleHardDeletion(rate); + return rate; } } From df4937add2dc3bef6b1ac62ba9889ddb97aef777 Mon Sep 17 00:00:00 2001 From: Andrey Starostin Date: Mon, 4 Dec 2023 11:32:04 +0100 Subject: [PATCH 2/2] refactor(core): make return type of hardDeleteOnPruningCycle consistent (no-changelog) --- packages/cli/src/services/pruning.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/services/pruning.service.ts b/packages/cli/src/services/pruning.service.ts index d3c4d997433d7..9320c3c34a4eb 100644 --- a/packages/cli/src/services/pruning.service.ts +++ b/packages/cli/src/services/pruning.service.ts @@ -180,7 +180,7 @@ export class PruningService { if (executionIds.length === 0) { this.logger.debug('[Pruning] Found no executions to hard-delete'); - return undefined; + return this.rates.hardDeletion; } try {