|
@@ -292,6 +292,18 @@ nlohmann::json ExecutionResult::toJson() const {
|
|
|
nr["retryCount"] = result.retry_count;
|
|
nr["retryCount"] = result.retry_count;
|
|
|
if (result.status == NodeStatus::Completed && !result.error.empty()) {
|
|
if (result.status == NodeStatus::Completed && !result.error.empty()) {
|
|
|
++tolerated_error_count;
|
|
++tolerated_error_count;
|
|
|
|
|
+ } else if (result.status == NodeStatus::Failed && status == ExecutionStatus::Completed) {
|
|
|
|
|
+ // A node that failed outright while the run still finished. Something
|
|
|
|
|
+ // swallowed it - a loop's Continue On Error, or the workflow-level
|
|
|
|
|
+ // setting - which is what "tolerated" means, so it belongs in this
|
|
|
|
|
+ // count as much as a node that swallowed its own failure does.
|
|
|
|
|
+ //
|
|
|
|
|
+ // It was not counted, and that left the worst case invisible: a
|
|
|
|
|
+ // stop-and-error inside a loop body fails, the loop tolerates it by
|
|
|
|
|
+ // default, and the run was reported as completed with no error and a
|
|
|
|
|
+ // tolerated count of zero. Nothing in the listing said a node whose
|
|
|
|
|
+ // entire purpose is to end the run had fired and been ignored.
|
|
|
|
|
+ ++tolerated_error_count;
|
|
|
}
|
|
}
|
|
|
// Absent for a node that did not run inside a loop. Present for one
|
|
// Absent for a node that did not run inside a loop. Present for one
|
|
|
// that did - even a disabled one, recorded once for the whole loop
|
|
// that did - even a disabled one, recorded once for the whole loop
|