From 742c8a8534098522fe103fad09fa95f70c460b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 25 Oct 2023 19:13:06 +0200 Subject: [PATCH] fix(core): Ensure execution deletion in worker lifecycle hook (#7481) Reported by customer [here](https://n8nio.slack.com/archives/C05PUALKZHD/p1697446945481249?thread_ts=1697196557.638169&cid=C05PUALKZHD), apparently a very old long-standing bug for queue mode. Please review closely as I am not familiar with queue mode. --- .../cli/src/WorkflowExecuteAdditionalData.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/cli/src/WorkflowExecuteAdditionalData.ts b/packages/cli/src/WorkflowExecuteAdditionalData.ts index 717f8bd67e..f4f10472a2 100644 --- a/packages/cli/src/WorkflowExecuteAdditionalData.ts +++ b/packages/cli/src/WorkflowExecuteAdditionalData.ts @@ -1129,6 +1129,36 @@ export function getWorkflowHooksWorkerMain( // So to avoid confusion, we are removing other hooks. hookFunctions.nodeExecuteBefore = []; hookFunctions.nodeExecuteAfter = []; + hookFunctions.workflowExecuteAfter = [ + async function ( + this: WorkflowHooks, + fullRunData: IRun, + newStaticData: IDataObject, + ): Promise { + // Check config to know if execution should be saved or not + let saveDataErrorExecution = config.getEnv('executions.saveDataOnError') as string; + let saveDataSuccessExecution = config.getEnv('executions.saveDataOnSuccess') as string; + if (this.workflowData.settings !== undefined) { + saveDataErrorExecution = + (this.workflowData.settings.saveDataErrorExecution as string) || saveDataErrorExecution; + saveDataSuccessExecution = + (this.workflowData.settings.saveDataSuccessExecution as string) || + saveDataSuccessExecution; + } + + const workflowStatusFinal = determineFinalExecutionStatus(fullRunData); + + if ( + (workflowStatusFinal === 'success' && saveDataSuccessExecution === 'none') || + (workflowStatusFinal !== 'success' && saveDataErrorExecution === 'none') + ) { + await Container.get(ExecutionRepository).hardDelete({ + workflowId: this.workflowData.id as string, + executionId: this.executionId, + }); + } + }, + ]; return new WorkflowHooks(hookFunctions, mode, executionId, workflowData, optionalParameters); }