Skip to content

Commit

Permalink
Handle all kinds of errors in the workflow (#10)
Browse files Browse the repository at this point in the history
* Handle all kinds of errors in the workflow

Handles all kinds of errors in the workflow, including "stop loop" (throw, exit)
errors from Erlang that could be sent from Finch lower in the stack.

Co-authored-by: Eric Iacutone <iacutone@protonmail.com>

* Addd tests to ensure we catch all kinds of errors

---------

Co-authored-by: Eric Iacutone <iacutone@protonmail.com>
  • Loading branch information
codeadict and iacutone authored Nov 10, 2023
1 parent d78926a commit 97b8fba
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 10 deletions.
10 changes: 5 additions & 5 deletions lib/workflow.ex
Original file line number Diff line number Diff line change
Expand Up @@ -1018,8 +1018,8 @@ defmodule Pacer.Workflow do
:telemetry.span([:pacer, :execute_vertex], metadata, fn ->
{Map.put(workflow, field, resolver.(workflow)), metadata}
end)
rescue
_error ->
catch
_kind, _error ->
workflow
end

Expand All @@ -1040,7 +1040,7 @@ defmodule Pacer.Workflow do
|> Enum.map(fn {field, resolver} ->
dependencies = module.__graph__(:batched_field_dependencies, field)
# We want to also pass the current value (which is the default) of the field itself,
# so that we can use it in the rescue/fallback clause
# so that we can use it in the fallback clause
partial_workflow = Map.take(workflow, [field | dependencies])
{field, partial_workflow, resolver}
end)
Expand All @@ -1063,8 +1063,8 @@ defmodule Pacer.Workflow do
Map.merge(%{parent_pid: parent_pid}, user_provided_metadata)}
end
)
rescue
_error ->
catch
_kind, _error ->
{field, Map.get(partial_workflow, field)}
end
end,
Expand Down
61 changes: 56 additions & 5 deletions test/workflow_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,39 @@ defmodule Pacer.WorkflowTest do
dependencies: [:custom_field, :field_a],
default: "this is a default value for request2"
)

field(:elixir_raise,
resolver: &__MODULE__.elixir_raise/1,
dependencies: [:custom_field],
default: :elixir_raise
)

field(:erlang_throw,
resolver: &__MODULE__.erlang_throw/1,
dependencies: [:custom_field],
default: :erlang_throw
)

field(:erlang_exit,
resolver: &__MODULE__.erlang_exit/1,
dependencies: [:custom_field],
default: :erlang_exit
)

field(:erlang_error,
resolver: &__MODULE__.erlang_error/1,
dependencies: [:custom_field],
default: :erlang_error
)
end
end

def do_work(_), do: :ok

def elixir_raise(_), do: raise("boom baby!")
def erlang_throw(_), do: :erlang.throw(:oops)
def erlang_exit(_), do: :erlang.exit(:no_reason)
def erlang_error(_), do: :erlang.error(:boom)
end

defmodule Resolvers do
Expand Down Expand Up @@ -160,7 +189,11 @@ defmodule Pacer.WorkflowTest do
:field_a,
:field_with_default,
:request_1,
:request_2
:request_2,
:elixir_raise,
:erlang_throw,
:erlang_exit,
:erlang_error
]
end

Expand All @@ -183,7 +216,14 @@ defmodule Pacer.WorkflowTest do
end

test "batch metadata" do
assert TestGraph.__graph__(:batch_fields, :http_requests) == [:request_1, :request_2]
assert TestGraph.__graph__(:batch_fields, :http_requests) == [
:request_1,
:request_2,
:elixir_raise,
:erlang_throw,
:erlang_exit,
:erlang_error
]

assert TestGraph.__graph__(:http_requests, :options) == [
on_timeout: :kill_task,
Expand Down Expand Up @@ -220,11 +260,22 @@ defmodule Pacer.WorkflowTest do

{:batch, batch_resolvers} = TestGraph.__graph__(:resolver, :http_requests)

assert Enum.count(batch_resolvers) == 2,
"Expected http_requests batch node to have 2 resolvers. Got #{inspect(batch_resolvers)}"
num_resolvers = Enum.count(batch_resolvers)

assert num_resolvers == 6,
"Expected http_requests batch node to have 3 resolvers. Got #{num_resolvers}:\n
#{inspect(batch_resolvers)}"

Enum.each(batch_resolvers, fn {field_name, resolver} ->
assert field_name in [:request_1, :request_2]
assert field_name in [
:request_1,
:request_2,
:elixir_raise,
:erlang_throw,
:erlang_exit,
:erlang_error
]

assert is_function(resolver, 1)
end)
end
Expand Down

0 comments on commit 97b8fba

Please sign in to comment.