Packages

Otplabs-lib provides Horde and Mnesia Supervisor, Horde Registry and NodeObserver that loads nodes dynamically when they start. Those recives notitication when a node up and down and update Horde and mnesia cluster.

Current section

Files

Jump to
otplabs lib horde node_observer.ex
Raw

lib/horde/node_observer.ex

defmodule OTPLabs.Horde.NodeObserver do
@moduledoc ~S"""
This module is used for notify dynamically Horde Registry and Supervisor when a new node up or down.
"""
use GenServer
require Logger
@doc false
def start_link(_) do
Logger.log(:info, "Starting #{__MODULE__}")
GenServer.start_link(__MODULE__, [])
end
@impl true
def init(_) do
Logger.log(:info, "init #{__MODULE__}")
:net_kernel.monitor_nodes(true, node_type: :visible)
{:ok, nil}
end
@impl true
def handle_info({:nodeup, node, _node_type}, state) do
Logger.log(:info, "[#{__MODULE__}].handle_info :nodeup - #{inspect(node)} ")
set_members(OTPLabs.Horde.Registry)
set_members(OTPLabs.Horde.Supervisor)
{:noreply, state}
end
@impl true
def handle_info({:nodedown, node, _node_type}, state) do
Logger.log(:info, "[#{__MODULE__}].handle_info :nodown - #{inspect(node)} ")
set_members(OTPLabs.Horde.Registry)
set_members(OTPLabs.Horde.Supervisor)
{:noreply, state}
end
defp set_members(name) do
members = Enum.map([Node.self() | Node.list()], &{name, &1})
:ok = Horde.Cluster.set_members(name, members)
end
end