feat(core): Add execution runData recovery and status field (#5112)

* adds ExecutionEvents view modal to ExecutionList

* fix time rendering and remove wf column

* checks for unfinished executions and fails them

* prevent re-setting stoppedAt for execution

* some cleanup / manually create rundata after crash

* quicksave

* remove Threads lib, log worker rewrite

* cleanup comment

* fix sentry destination return value

* test for tests...

* run tests with single worker

* fix tests

* remove console log

* add endpoint for execution data recovery

* lint cleanup and some refactoring

* fix accidental recursion

* remove cyclic imports

* add rundata recovery to Workflowrunner

* remove comments

* cleanup and refactor

* adds a status field to executions

* setExecutionStatus on queued worker

* fix onWorkflowPostExecute

* set waiting from worker

* get crashed status into frontend

* remove comment

* merge fix

* cleanup

* catch empty rundata in recovery

* refactor IExecutionsSummary and inject nodeExecution Errors

* reduce default event log size to 10mb from 100mb

* add per node execution status

* lint fix

* merge and lint fix

* phrasing change

* improve preview rendering and messaging

* remove debug

* Improve partial rundata recovery

* fix labels

* fix line through

* send manual rundata to ui at crash

* some type and msg push fixes

* improve recovered item rendering in preview

* update workflowStatistics on recover

* merge fix

* review fixes

* merge fix

* notify eventbus when ui is back up

* add a small timeout to make sure the UI is back up

* increase reconnect timeout to 30s

* adjust recover timeout and ui connection lost msg

* do not stop execution in editor after x reconnects

* add executionRecovered push event

* fix recovered connection not green

* remove reconnect toast and  merge existing rundata

* merge editor and recovered data for own mode
This commit is contained in:
Michael Auerswald
2023-02-17 10:54:07 +01:00
committed by GitHub
parent 3a9c257f55
commit d143f3f2ec
71 changed files with 1245 additions and 307 deletions

View File

@@ -34,7 +34,7 @@
<font-awesome-icon icon="exclamation-triangle" />
</n8n-tooltip>
</div>
<div v-else-if="waiting" class="waiting">
<div v-else-if="waiting || nodeExecutionStatus === 'waiting'" class="waiting">
<n8n-tooltip placement="bottom">
<template #content>
<div v-text="waiting"></div>
@@ -46,6 +46,9 @@
<font-awesome-icon icon="thumbtack" />
<span v-if="workflowDataItems > 1" class="items-count"> {{ workflowDataItems }}</span>
</span>
<span v-else-if="nodeExecutionStatus === 'unknown'">
<!-- Do nothing, unknown means the node never executed -->
</span>
<span v-else-if="workflowDataItems" class="data-count">
<font-awesome-icon icon="check" />
<span v-if="workflowDataItems > 1" class="items-count"> {{ workflowDataItems }}</span>
@@ -136,7 +139,10 @@
</div>
</div>
<div
:class="{ 'disabled-linethrough': true, success: workflowDataItems > 0 }"
:class="{
'disabled-linethrough': true,
success: !['unknown'].includes(nodeExecutionStatus) && workflowDataItems > 0,
}"
v-if="showDisabledLinethrough"
></div>
</div>
@@ -228,8 +234,13 @@ export default mixins(
return this.workflowsStore.getWorkflowResultDataByNodeName(this.data?.name || '') || [];
},
hasIssues(): boolean {
if (
this.nodeExecutionStatus &&
['crashed', 'error', 'failed'].includes(this.nodeExecutionStatus)
)
return true;
if (this.hasPinData) return false;
if (this.data.issues !== undefined && Object.keys(this.data.issues).length) {
if (this.data?.issues !== undefined && Object.keys(this.data.issues).length) {
return true;
}
return false;
@@ -303,12 +314,31 @@ export default mixins(
executing: this.isExecuting,
};
},
nodeIssues(): string[] {
if (this.data.issues === undefined) {
return [];
nodeExecutionStatus(): string {
const nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];
if (nodeExecutionRunData) {
return nodeExecutionRunData[0].executionStatus ?? '';
}
return NodeHelpers.nodeIssuesToString(this.data.issues, this.data);
return '';
},
nodeIssues(): string[] {
const issues: string[] = [];
const nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];
if (nodeExecutionRunData) {
nodeExecutionRunData.forEach((executionRunData) => {
if (executionRunData.error) {
issues.push(
`${executionRunData.error.message}${
executionRunData.error.description ? ` (${executionRunData.error.description})` : ''
}`,
);
}
});
}
if (this.data?.issues !== undefined) {
issues.push(...NodeHelpers.nodeIssuesToString(this.data.issues, this.data));
}
return issues;
},
nodeDisabledIcon(): string {
if (this.data.disabled === false) {
@@ -387,6 +417,8 @@ export default mixins(
borderColor = getStyleTokenValue('--color-danger');
} else if (this.waiting || this.showPinnedDataInfo) {
borderColor = getStyleTokenValue('--color-secondary');
} else if (this.nodeExecutionStatus === 'unknown') {
borderColor = getStyleTokenValue('--color-foreground-xdark');
} else if (this.workflowDataItems) {
borderColor = getStyleTokenValue('--color-success');
}