Packages

Loner provides a simple method for creating a registered, supervised singleton process within a multi-node cluster with the help of Horde.

Current section

Files

Jump to
loner lib loner node_monitor.ex
Raw

lib/loner/node_monitor.ex

defmodule Loner.NodeMonitor do
@moduledoc """
GenServer responsible for monitoring node additions/deletions and triggering
updates to the Horde node list to ensure it stays current
"""
use GenServer
alias Horde.Cluster
def start_link(_) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init(_) do
:ok = :net_kernel.monitor_nodes(true)
update_nodes()
{:ok, nil}
end
def handle_info({:nodeup, _node}, s) do
update_nodes()
{:noreply, s}
end
def handle_info({:nodedown, _node}, s) do
update_nodes()
{:noreply, s}
end
def handle_info(_, s) do
{:noreply, s}
end
defp update_nodes do
nodes = Node.list([:visible, :this])
registries = for n <- nodes, do: {Loner.Registry, n}
:ok = Cluster.set_members(Loner.Registry, registries)
supervisors = for n <- nodes, do: {Loner.DynamicSupervisor, n}
:ok = Cluster.set_members(Loner.DynamicSupervisor, supervisors)
end
end