Skip to content

Commit 0ca22a0

Browse files
authored
Fail fast strategy should properly mark ppl as failed when one of the jobs fail (#507)
1 parent 1290b44 commit 0ca22a0

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

zebra/lib/zebra/workers/task_finisher.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ defmodule Zebra.Workers.TaskFinisher do
6161
log(task.id, "Processing task, results #{inspect(results)}, states #{inspect(states)}")
6262

6363
if Enum.all?(states, fn s -> s == Job.state_finished() end) do
64-
case calculate_task_result(results) do
64+
case calculate_task_result(results, task) do
6565
{:ok, result} ->
6666
finish(task, jobs, result)
6767
publish(task)
@@ -92,8 +92,13 @@ defmodule Zebra.Workers.TaskFinisher do
9292
log(task.id, "marked as finished")
9393
end
9494

95-
def calculate_task_result(job_results) do
95+
def calculate_task_result(job_results, task) do
9696
cond do
97+
# If fail_fast:stop is active and there's a failure, show as failed
98+
task.fail_fast_strategy == "stop" &&
99+
Enum.any?(job_results, fn r -> r == Job.result_failed() end) ->
100+
{:ok, "failed"}
101+
97102
Enum.any?(job_results, fn r -> r == Job.result_stopped() end) ->
98103
{:ok, "stopped"}
99104

zebra/test/zebra/workers/task_finisher_test.exs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,45 @@ defmodule Zebra.Workers.TaskFinisherTest do
6060
describe ".calculate_task_result" do
6161
test "when any of the jobs are stopped => result is stopped" do
6262
results = ["passed", "failed", "stopped"]
63+
{:ok, task} = Support.Factories.Task.create()
6364

64-
assert {:ok, "stopped"} = W.calculate_task_result(results)
65+
assert {:ok, "stopped"} = W.calculate_task_result(results, task)
6566
end
6667

6768
test "when any of the jobs are failed => result is failed" do
6869
results = ["passed", "failed", "passed"]
70+
{:ok, task} = Support.Factories.Task.create()
6971

70-
assert {:ok, "failed"} = W.calculate_task_result(results)
72+
assert {:ok, "failed"} = W.calculate_task_result(results, task)
7173
end
7274

7375
test "when all of the jobs are passed => result is passed" do
74-
results = ["passed", "failed", "passed"]
76+
results = ["passed", "passed", "passed"]
77+
{:ok, task} = Support.Factories.Task.create()
78+
79+
assert {:ok, "passed"} = W.calculate_task_result(results, task)
80+
end
81+
82+
test "when fail_fast:stop is active and jobs are stopped due to failure => result is failed" do
83+
results = ["passed", "failed", "stopped", "stopped"]
84+
{:ok, task} = Support.Factories.Task.create(%{fail_fast_strategy: "stop"})
85+
86+
assert {:ok, "failed"} = W.calculate_task_result(results, task)
87+
end
88+
89+
test "when fail_fast:stop is active but no jobs failed => result is stopped" do
90+
results = ["passed", "stopped", "stopped"]
91+
{:ok, task} = Support.Factories.Task.create(%{fail_fast_strategy: "stop"})
92+
93+
assert {:ok, "stopped"} = W.calculate_task_result(results, task)
94+
end
95+
96+
test "when fail_fast:cancel is active and jobs are stopped due to failure => result is stopped" do
97+
results = ["passed", "failed", "stopped"]
98+
{:ok, task} = Support.Factories.Task.create(%{fail_fast_strategy: "cancel"})
7599

76-
assert {:ok, "failed"} = W.calculate_task_result(results)
100+
# With cancel strategy, we don't override the normal logic
101+
assert {:ok, "stopped"} = W.calculate_task_result(results, task)
77102
end
78103
end
79104

0 commit comments

Comments
 (0)