Thereās something really strange going on here, and Iām sure someone will be able to point out a silly mistake somewhere in the code.
Iām using GenStageās ConsumerSupervisor
to subscribe to a Producer
:
defmodule UserConsumerSupervisor do
use ConsumerSupervisor
@opts [
strategy: :one_for_one,
max_restarts: 2,
subscribe_to: [{Producer, max_demand: 3}]
]
def start_link(_) do
ConsumerSupervisor.start_link(__MODULE__, :ok)
end
def init(:ok) do
children = [
%{
id: UserConsumer,
start: {UserConsumer, :start_link, []},
restart: :transient
}
]
ConsumerSupervisor.init(children, @opts)
end
end
As specified in the @opts
, Iād like the supervisor to restart a consumer only twice, if the consumer fails for whatever reason. The consumer itself is quite simple:
defmodule UserConsumer do
def start_link(user) do
Task.start_link(fn ->
:timer.sleep(3000)
if user == 3, do: raise "Ooops, error!"
end)
end
end
Despite the max_restarts
option, when the consumer errors, the consumer process keeps getting restarted foreverā¦
How is this possible? Am I misreading the configurations somehow
Link to docs: https://hexdocs.pm/gen_stage/ConsumerSupervisor.html#c:init/1