Current section

Files

Jump to
distributed_supervisor lib distributed_supervisor guard.ex
Raw

lib/distributed_supervisor/guard.ex

defmodule DistributedSupervisor.Guard do
@moduledoc false
use GenServer
require Logger
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, opts)
end
@impl GenServer
def init(opts), do: {:ok, Map.new(opts)}
@impl GenServer
def terminate(reason, %{distributed_supervisor_id: name}) do
Logger.debug(
"[🗒️] Distributed supervisor #{inspect(name)} at node #{inspect(node())} is terminating"
)
local_processes =
name
|> DistributedSupervisor.local_children()
|> Enum.map(&:sys.get_status/1)
self = node()
remote_nodes = DistributedSupervisor.nodes(name) -- [self]
Enum.each(remote_nodes, fn node ->
send(
{DistributedSupervisor.registry_name(name), node},
{:node_terminate, self, reason, local_processes}
)
end)
end
end