From cdf421e80f6a8cca276a015e8cb8cb12660b8ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Fri, 25 Apr 2025 10:24:01 +0200 Subject: [PATCH] fix(core): Fix task runner's task timeout and heartbeat interval (#14889) --- docker/images/n8n/n8n-task-runners.json | 1 + .../__tests__/task-runner-process.test.ts | 30 +++++++++++++++++++ .../src/task-runners/task-runner-process.ts | 3 ++ 3 files changed, 34 insertions(+) diff --git a/docker/images/n8n/n8n-task-runners.json b/docker/images/n8n/n8n-task-runners.json index e88d2f1184..b30baed892 100644 --- a/docker/images/n8n/n8n-task-runners.json +++ b/docker/images/n8n/n8n-task-runners.json @@ -17,6 +17,7 @@ "N8N_RUNNERS_MAX_PAYLOAD", "N8N_RUNNERS_MAX_CONCURRENCY", "N8N_RUNNERS_TASK_TIMEOUT", + "N8N_RUNNERS_HEARTBEAT_INTERVAL", "N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED", "N8N_RUNNERS_HEALTH_CHECK_SERVER_HOST", "N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT", diff --git a/packages/cli/src/task-runners/__tests__/task-runner-process.test.ts b/packages/cli/src/task-runners/__tests__/task-runner-process.test.ts index b774315c1d..de0e63d143 100644 --- a/packages/cli/src/task-runners/__tests__/task-runner-process.test.ts +++ b/packages/cli/src/task-runners/__tests__/task-runner-process.test.ts @@ -120,6 +120,36 @@ describe('TaskRunnerProcess', () => { expect(options.env).not.toHaveProperty('NODE_OPTIONS'); }); + it('should pass N8N_RUNNERS_TASK_TIMEOUT if set', async () => { + jest.spyOn(authService, 'createGrantToken').mockResolvedValue('grantToken'); + runnerConfig.taskTimeout = 123; + + await taskRunnerProcess.start(); + + // @ts-expect-error The type is not correct + const options = spawnMock.mock.calls[0][2] as SpawnOptions; + expect(options.env).toEqual( + expect.objectContaining({ + N8N_RUNNERS_TASK_TIMEOUT: '123', + }), + ); + }); + + it('should pass N8N_RUNNERS_HEARTBEAT_INTERVAL if set', async () => { + jest.spyOn(authService, 'createGrantToken').mockResolvedValue('grantToken'); + runnerConfig.heartbeatInterval = 456; + + await taskRunnerProcess.start(); + + // @ts-expect-error The type is not correct + const options = spawnMock.mock.calls[0][2] as SpawnOptions; + expect(options.env).toEqual( + expect.objectContaining({ + N8N_RUNNERS_HEARTBEAT_INTERVAL: '456', + }), + ); + }); + it('should use --disallow-code-generation-from-strings and --disable-proto=delete flags', async () => { jest.spyOn(authService, 'createGrantToken').mockResolvedValue('grantToken'); diff --git a/packages/cli/src/task-runners/task-runner-process.ts b/packages/cli/src/task-runners/task-runner-process.ts index b51fbdf1e2..63506bafb0 100644 --- a/packages/cli/src/task-runners/task-runner-process.ts +++ b/packages/cli/src/task-runners/task-runner-process.ts @@ -51,6 +51,7 @@ export class TaskRunnerProcess extends TypedEmitter { private logger: Logger; + /** Environment variables inherited by the child process from the current environment. */ private readonly passthroughEnvVars = [ 'PATH', 'HOME', // So home directory can be resolved correctly @@ -171,6 +172,8 @@ export class TaskRunnerProcess extends TypedEmitter { N8N_RUNNERS_TASK_BROKER_URI: taskBrokerUri, N8N_RUNNERS_MAX_PAYLOAD: this.runnerConfig.maxPayload.toString(), N8N_RUNNERS_MAX_CONCURRENCY: this.runnerConfig.maxConcurrency.toString(), + N8N_RUNNERS_TASK_TIMEOUT: this.runnerConfig.taskTimeout.toString(), + N8N_RUNNERS_HEARTBEAT_INTERVAL: this.runnerConfig.heartbeatInterval.toString(), ...this.getPassthroughEnvVars(), };