Skip to content

Commit

Permalink
fix(editor): Rerun failed nodes in manual executions (#9050)
Browse files Browse the repository at this point in the history
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
  • Loading branch information
2 people authored and despairblue committed Apr 4, 2024
1 parent cb2e460 commit a30e02d
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 3 deletions.
31 changes: 30 additions & 1 deletion packages/editor-ui/src/composables/useRunWorkflow.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { useToast } from '@/composables/useToast';
import { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';
import { useNodeHelpers } from '@/composables/useNodeHelpers';
import { useRouter } from 'vue-router';
import type { IPinData, IRunData, Workflow } from 'n8n-workflow';
import { ExpressionError, type IPinData, type IRunData, type Workflow } from 'n8n-workflow';

vi.mock('@/stores/n8nRoot.store', () => ({
useRootStore: vi.fn().mockReturnValue({ pushConnectionActive: true }),
Expand Down Expand Up @@ -285,5 +285,34 @@ describe('useRunWorkflow({ router })', () => {
expect(result.startNodeNames).toContain('node1');
expect(result.runData).toBeUndefined();
});

it('should rerun failed parent nodes, adding them to the returned list of start nodes and not adding their result to runData', () => {
const { consolidateRunDataAndStartNodes } = useRunWorkflow({ router });
const directParentNodes = ['node1'];
const runData = {
node1: [
{
error: new ExpressionError('error'),
},
],
} as unknown as IRunData;
const workflowMock = {
getParentNodes: vi.fn().mockReturnValue([]),
nodes: {
node1: { disabled: false },
node2: { disabled: false },
},
} as unknown as Workflow;

const result = consolidateRunDataAndStartNodes(
directParentNodes,
runData,
undefined,
workflowMock,
);

expect(result.startNodeNames).toContain('node1');
expect(result.runData).toEqual(undefined);
});
});
});
9 changes: 7 additions & 2 deletions packages/editor-ui/src/composables/useRunWorkflow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -428,14 +428,19 @@ export function useRunWorkflow(options: { router: ReturnType<typeof useRouter> }
parentNodes.push(directParentNode);

for (const parentNode of parentNodes) {
if (!runData[parentNode]?.length && !pinData?.[parentNode]?.length) {
// We want to execute nodes that don't have run data neither pin data
// in addition, if a node failed we want to execute it again
if (
(!runData[parentNode]?.length && !pinData?.[parentNode]?.length) ||
runData[parentNode]?.[0]?.error !== undefined
) {
// When we hit a node which has no data we stop and set it
// as a start node the execution from and then go on with other
// direct input nodes
startNodeNames.push(parentNode);
break;
}
if (runData[parentNode]) {
if (runData[parentNode] && !runData[parentNode]?.[0]?.error) {
newRunData[parentNode] = runData[parentNode]?.slice(0, 1);
}
}
Expand Down

0 comments on commit a30e02d

Please sign in to comment.