Skip to content

Commit

Permalink
fix(core): Filter out workflows that failed to activate on startup (#…
Browse files Browse the repository at this point in the history
…6676)

* fix(core): Deactivate on init workflow that should not be retried

* fix(core): Filter out workflows with activation errors
  • Loading branch information
ivov authored and netroy committed Jul 18, 2023
1 parent 36d549f commit fcd1bdc
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 8 deletions.
1 change: 1 addition & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"name": "Launch n8n with debug",
"program": "${workspaceFolder}/packages/cli/bin/n8n",
"cwd": "${workspaceFolder}/packages/cli/bin",
// "args": ["start", "--tunnel"],
"request": "launch",
"skipFiles": ["<node_internals>/**"],
"type": "node",
Expand Down
16 changes: 11 additions & 5 deletions packages/cli/src/ActiveWorkflowRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ export class ActiveWorkflowRunner {
} catch (error) {
ErrorReporter.error(error);
Logger.info(
' => ERROR: Workflow could not be activated on first try, keep on trying',
' => ERROR: Workflow could not be activated on first try, keep on trying if not an auth issue',
);
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
Logger.info(` ${error.message}`);
Expand All @@ -148,8 +148,10 @@ export class ActiveWorkflowRunner {
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
this.executeErrorWorkflow(error, workflowData, 'internal');

// Keep on trying to activate the workflow
this.addQueuedWorkflowActivation('init', workflowData);
if (!error.message.includes('Authorization')) {
// Keep on trying to activate the workflow if not an auth issue
this.addQueuedWorkflowActivation('init', workflowData);
}
}
}
Logger.verbose('Finished initializing active workflows (startup)');
Expand Down Expand Up @@ -350,7 +352,9 @@ export class ActiveWorkflowRunner {
select: ['id'],
where: { active: true },
});
return activeWorkflows.map((workflow) => workflow.id.toString());
return activeWorkflows
.map((workflow) => workflow.id)
.filter((workflowId) => !this.activationErrors[workflowId]);
} else {
const active = await Db.collections.Workflow.find({
select: ['id'],
Expand All @@ -366,7 +370,9 @@ export class ActiveWorkflowRunner {
select: ['workflowId'],
where,
});
return shared.map((id) => id.workflowId.toString());
return shared
.map((id) => id.workflowId)
.filter((workflowId) => !this.activationErrors[workflowId]);
}
}

Expand Down
37 changes: 34 additions & 3 deletions packages/cli/test/unit/ActiveWorkflowRunner.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { v4 as uuid } from 'uuid';
import { mocked } from 'jest-mock';

import type { ICredentialTypes, INodesAndCredentials } from 'n8n-workflow';
import { LoggerProxy, NodeOperationError, Workflow } from 'n8n-workflow';
import type { ICredentialTypes, INode, INodesAndCredentials } from 'n8n-workflow';
import { LoggerProxy, NodeApiError, NodeOperationError, Workflow } from 'n8n-workflow';

import { ActiveWorkflowRunner } from '@/ActiveWorkflowRunner';
import * as Db from '@/Db';
Expand Down Expand Up @@ -51,7 +51,7 @@ const generateWorkflows = (count: number): WorkflowEntity[] => {
for (let i = 0; i < count; i++) {
const workflow = new WorkflowEntity();
Object.assign(workflow, {
id: i + 1,
id: (i + 1).toString(),
name: randomName(),
active: true,
createdAt: new Date(),
Expand Down Expand Up @@ -260,4 +260,35 @@ describe('ActiveWorkflowRunner', () => {
activeWorkflowRunner.executeErrorWorkflow(error, workflowData, 'trigger');
expect(workflowExecuteAdditionalDataExecuteErrorWorkflowSpy).toHaveBeenCalledTimes(1);
});

describe('init()', () => {
it('should execute error workflow on failure to activate due to 401', async () => {
databaseActiveWorkflowsCount = 1;

jest.spyOn(ActiveWorkflowRunner.prototype, 'add').mockImplementation(() => {
throw new NodeApiError(
{
id: 'a75dcd1b-9fed-4643-90bd-75933d67936c',
name: 'Github Trigger',
type: 'n8n-nodes-base.githubTrigger',
typeVersion: 1,
position: [0, 0],
} as INode,
{
httpCode: '401',
message: 'Authorization failed - please check your credentials',
},
);
});

const executeSpy = jest.spyOn(ActiveWorkflowRunner.prototype, 'executeErrorWorkflow');

await activeWorkflowRunner.init();

const [error, workflow] = executeSpy.mock.calls[0];

expect(error.message).toContain('Authorization');
expect(workflow.id).toBe('1');
});
});
});

0 comments on commit fcd1bdc

Please sign in to comment.