Missing processes when started with DynamicSupervisor

I am starting a few processes using:

DynamicSupervisor.start_child(Hangman.Supervisor, Hangman.Server)

If I execute count_children everything seems ok to me:

iex(8)> DynamicSupervisor.count_children(Hangman.Supervisor)
%{active: 2, specs: 2, supervisors: 0, workers: 2}

Firing up observer, I can view these children on the Processes list, but not on the Applications tree:

Not sure if this is what is expected, or if something is wrong.

Well they are not separate apps, so that’s quite logical.

I think you may have something wrong in your Child specification. From the start_child docs:

https://hexdocs.pm/elixir/DynamicSupervisor.html#start_child/2

child_spec should be a valid child specification as detailed in the “Child specification” section of the documentation for Supervisor. The child process will be started as defined in the child specification.

Can you show your Hangman.Server code? Also what is the return value of start_child?

1 Like

Sure @axelson , start_child returns a pid as expected and everything seems to be working fine, all the childs launched this way work without a problem. I just don’t see them on the observer application tree…

This is the Hangman.Server code:

defmodule Hangman.Server do
  alias Hangman.Game
  use GenServer

  def start_link(_) do
    GenServer.start(__MODULE__, nil)
  end

  def init(_) do
    {:ok, Game.new_game()}
  end

  def handle_call({:make_move, guess}, _from, game) do
    {game, tally} = Game.make_move(game, guess)
    {:reply, tally, game}
  end

  def handle_call({:tally}, _from, game) do
    {:reply, Game.tally(game), game}
  end
end

And this is my application entry point:

defmodule Hangman.Application do
  use Application

  def start(_type, _args) do
    options = [
      name: Hangman.Supervisor,
      strategy: :one_for_one
    ]

    DynamicSupervisor.start_link(options)
  end
end

Can you please elaborate on that? On the old code that I had, using Supervisor and :simple_one_for_one strategy they showed up on the tree, only after converting to DynamicSupervisor I do not found them on the tree anymore…

You need to change that line to GenServer.start_link(__MODULE__, nil) so that your process is linked to the supervisor.

The start_link/1 function must return {:ok, pid} where pid is the process identifier of a new process that is linked to the supervisor.

from: Supervisor — Elixir v1.16.0

3 Likes

That is exactly right, thank you so much @axelson !!!

One more step in my learning Elixir journey :wink:

1 Like