Compare commits

...

2 commits

Author SHA1 Message Date
Danny Martini e9fd2be0b3
Revert "report ExecutionNotFoundError only to sentry and the logs, not to the user"
This reverts commit 9b0b0fbf57.
2024-09-19 17:36:25 +02:00
Danny Martini f19fcb2c0b
Revert "getExecution can now return undefined if there is no active execution for that id"
This reverts commit 047b1d13c0.
2024-09-19 17:36:25 +02:00
2 changed files with 15 additions and 40 deletions

View file

@ -5,12 +5,7 @@ import type {
ExecutionStatus, ExecutionStatus,
IWorkflowExecutionDataProcess, IWorkflowExecutionDataProcess,
} from 'n8n-workflow'; } from 'n8n-workflow';
import { import { createDeferredPromise, ExecutionCancelledError, sleep } from 'n8n-workflow';
createDeferredPromise,
ErrorReporterProxy,
ExecutionCancelledError,
sleep,
} from 'n8n-workflow';
import { strict as assert } from 'node:assert'; import { strict as assert } from 'node:assert';
import type PCancelable from 'p-cancelable'; import type PCancelable from 'p-cancelable';
import { Service } from 'typedi'; import { Service } from 'typedi';
@ -127,20 +122,14 @@ export class ActiveExecutions {
*/ */
attachWorkflowExecution(executionId: string, workflowExecution: PCancelable<IRun>) { attachWorkflowExecution(executionId: string, workflowExecution: PCancelable<IRun>) {
const execution = this.getExecution(executionId); this.getExecution(executionId).workflowExecution = workflowExecution;
if (execution) {
execution.workflowExecution = workflowExecution;
}
} }
attachResponsePromise( attachResponsePromise(
executionId: string, executionId: string,
responsePromise: IDeferredPromise<IExecuteResponsePromiseData>, responsePromise: IDeferredPromise<IExecuteResponsePromiseData>,
): void { ): void {
const execution = this.getExecution(executionId); this.getExecution(executionId).responsePromise = responsePromise;
if (execution) {
execution.responsePromise = responsePromise;
}
} }
resolveResponsePromise(executionId: string, response: IExecuteResponsePromiseData): void { resolveResponsePromise(executionId: string, response: IExecuteResponsePromiseData): void {
@ -151,31 +140,23 @@ export class ActiveExecutions {
/** Cancel the execution promise and reject its post-execution promise. */ /** Cancel the execution promise and reject its post-execution promise. */
stopExecution(executionId: string): void { stopExecution(executionId: string): void {
const execution = this.getExecution(executionId); const execution = this.getExecution(executionId);
if (execution) { execution.workflowExecution?.cancel();
execution.workflowExecution?.cancel(); execution.postExecutePromise.reject(new ExecutionCancelledError(executionId));
execution.postExecutePromise.reject(new ExecutionCancelledError(executionId)); this.logger.debug('Execution cancelled', { executionId });
this.logger.debug('Execution cancelled', { executionId });
}
} }
/** Resolve the post-execution promise in an execution. */ /** Resolve the post-execution promise in an execution. */
finalizeExecution(executionId: string, fullRunData?: IRun) { finalizeExecution(executionId: string, fullRunData?: IRun) {
const execution = this.getExecution(executionId); const execution = this.getExecution(executionId);
if (execution) { execution.postExecutePromise.resolve(fullRunData);
execution.postExecutePromise.resolve(fullRunData); this.logger.debug('Execution finalized', { executionId });
this.logger.debug('Execution finalized', { executionId });
}
} }
/** /**
* Returns a promise which will resolve with the data of the execution with the given id * Returns a promise which will resolve with the data of the execution with the given id
*/ */
async getPostExecutePromise(executionId: string): Promise<IRun | undefined> { async getPostExecutePromise(executionId: string): Promise<IRun | undefined> {
const execution = this.getExecution(executionId); return await this.getExecution(executionId).postExecutePromise.promise;
if (execution) {
return await execution.postExecutePromise.promise;
}
return undefined;
} }
/** /**
@ -202,14 +183,11 @@ export class ActiveExecutions {
} }
setStatus(executionId: string, status: ExecutionStatus) { setStatus(executionId: string, status: ExecutionStatus) {
const execution = this.getExecution(executionId); this.getExecution(executionId).status = status;
if (execution) {
execution.status = status;
}
} }
getStatus(executionId: string): ExecutionStatus | undefined { getStatus(executionId: string): ExecutionStatus {
return this.getExecution(executionId)?.status; return this.getExecution(executionId).status;
} }
/** Wait for all active executions to finish */ /** Wait for all active executions to finish */
@ -241,10 +219,10 @@ export class ActiveExecutions {
} }
} }
private getExecution(executionId: string): IExecutingWorkflowData | undefined { private getExecution(executionId: string): IExecutingWorkflowData {
const execution = this.activeExecutions[executionId]; const execution = this.activeExecutions[executionId];
if (!execution) { if (!execution) {
ErrorReporterProxy.error(new ExecutionNotFoundError(executionId)); throw new ExecutionNotFoundError(executionId);
} }
return execution; return execution;
} }

View file

@ -334,10 +334,7 @@ export class WorkflowRunner {
if (workflowExecution.isCanceled) { if (workflowExecution.isCanceled) {
fullRunData.finished = false; fullRunData.finished = false;
} }
const status = this.activeExecutions.getStatus(executionId); fullRunData.status = this.activeExecutions.getStatus(executionId);
if (status) {
fullRunData.status = status;
}
this.activeExecutions.finalizeExecution(executionId, fullRunData); this.activeExecutions.finalizeExecution(executionId, fullRunData);
}) })
.catch( .catch(