mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
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:
committed by
GitHub
parent
3a9c257f55
commit
d143f3f2ec
@@ -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');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user