Hi @gavid ,
It took me a minute to figure out what was going on here. The short story is, you should use the name
of your Horde.DynamicSupervisor, not its pid
. The pid you get back is only suitable for use in the supervision tree, and it is not meant to be used in any of the other functions in Horde.DynamicSupervisor.
See below the modified version of your test script:
init_arg = fn name ->
[
name: name,
strategy: :one_for_one,
distribution_strategy: Horde.UniformDistribution,
max_restarts: 100_000,
max_seconds: 1,
members: :auto
]
end
{:ok, _root_supervisor} = Horde.DynamicSupervisor.start_link(init_arg.(:root_supervisor))
root_supervisor = :root_supervisor
for num <- 1..10 do
child_supervisor = :"child_supervisor#{num}"
{:ok, _child_supervisor_pid} =
Horde.DynamicSupervisor.start_child(root_supervisor, %{
id: child_supervisor,
start: {Horde.DynamicSupervisor, :start_link, [init_arg.(child_supervisor)]}
})
end
IO.puts("After creation...")
IO.inspect(Horde.DynamicSupervisor.which_children(root_supervisor), pretty: true)
IO.puts("-----------")
for {id, pid, :worker, _startup_module} <-
Horde.DynamicSupervisor.which_children(root_supervisor),
String.starts_with?(Atom.to_string(id), "child_supervisor") do
IO.puts("Trying to terminate worker with id: #{id} and process id: #{inspect(pid)}")
:ok = Horde.DynamicSupervisor.terminate_child(root_supervisor, pid)
end
IO.puts("After termination...")
IO.inspect(Horde.DynamicSupervisor.which_children(root_supervisor), pretty: true)
IO.puts("-----------")
:done