n8n-io/n8n · warning · ExecutionAlreadyResumingError

Execution is already being resumed by another process

Error message

Execution is already being resumed by another process

What it means

In a multi-main (queue mode) deployment, resuming a waiting execution uses an optimistic-concurrency claim: updateExistingExecution only succeeds if the execution is still in the expected status. If the update reports failure, another main process already claimed and started resuming this execution, so the current attempt throws ExecutionAlreadyResumingError to avoid duplicate concurrent resumes. The capacity reservation is released before re-throwing.

Source

Thrown at packages/cli/src/active-executions.ts:138

				}

				const execution: Pick<IExecutionDb, 'id' | 'data' | 'waitTill' | 'status'> = {
					id: executionId,
					data: executionData.executionData!,
					waitTill: null,
					status: executionStatus,
				};

				const updateSucceeded = await this.executionPersistence.updateExistingExecution(
					executionId,
					execution,
					// Only claim the execution if it is still in the status the caller expected
					{ requireStatus: existingExecution.expectedStatus },
				);

				if (!updateSucceeded) {
					// Another process is already resuming this execution
					throw new ExecutionAlreadyResumingError(executionId);
				}

				if (existingExecution.expectedStatus === 'new') {
					await this.executionRepository.setRunning(executionId);
				}
			}
		} catch (error) {
			capacityReservation.release();
			throw error;
		}

		const resumingExecution = this.activeExecutions[executionId];
		const postExecutePromise = createDeferredPromise<IRun | undefined>();

		const execution: IExecutingWorkflowData = {
			executionData,
			startedAt: resumingExecution?.startedAt ?? new Date(),
			postExecutePromise,

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Treat ExecutionAlreadyResumingError as benign: log it at info/debug and return success to the caller, since the execution is being handled by another main.
  2. Ensure your resume trigger (webhook endpoint, timer worker) is idempotent and does not retry on this specific error.
  3. Verify only one main is processing a given execution (check the active-executions ownership and queue topology).

Example fix

// before
await activeExecutions.resume(executionId, data);

// after
try {
  await activeExecutions.resume(executionId, data);
} catch (e) {
  if (e instanceof ExecutionAlreadyResumingError) {
    logger.info('Execution already being resumed elsewhere', { executionId });
    return;
  }
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Before resuming, check the execution is still in a resumable status
const status = await executionRepository.findStatusForExecution(executionId);
if (status !== 'waiting' && status !== 'new') {
  // already being resumed or finished; skip
  return;
}

Type guard

import { ExecutionAlreadyResumingError } from 'n8n-workflow';
function isAlreadyResuming(e: unknown): e is ExecutionAlreadyResumingError {
  return e instanceof ExecutionAlreadyResumingError;
}

Try / catch

try {
  await activeExecutions.resume(executionId, data);
} catch (e) {
  if (e instanceof ExecutionAlreadyResumingError) {
    logger.info('Execution already resuming elsewhere', { executionId });
    return; // benign in multi-main
  }
  throw e;
}

Prevention

When it happens

Trigger: Two main processes receive a resume signal (webhook, wait-timer expiry, manual resume) for the same executionId near-simultaneously; the first wins the optimistic update, the second gets updateSucceeded === false and throws. Also possible after a leader election flap where multiple mains briefly believe they own the execution.

Common situations: Multi-main / queue-mode (Redis-backed) n8n deployments; webhook-triggered resumes hitting a load-balanced multi-main cluster; retry logic that re-issues a resume before the first completes; race during rolling restarts.

Related errors


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/8e406b45ce18f796. Report an issue: GitHub.