Current section

Files

Jump to
ex_esdb lib ex_esdb cluster_system.ex
Raw

lib/ex_esdb/cluster_system.ex

defmodule ExESDB.ClusterSystem do
@moduledoc """
Supervisor for cluster coordination components.
This supervisor manages cluster-specific coordination components:
- ClusterCoordinator: Handles coordination logic and split-brain prevention
- NodeMonitor: Monitors node health and handles failures
Note: KhepriCluster is managed at the System level since it's mode-aware.
"""
use Supervisor
alias ExESDB.Themes, as: Themes
@impl true
def init(opts) do
children = [
# ClusterCoordinator handles coordination logic and split-brain prevention
{ExESDB.ClusterCoordinator, opts},
# NodeMonitor provides fast failure detection
{ExESDB.NodeMonitor, node_monitor_config(opts)}
]
IO.puts("#{Themes.cluster_system(self())} is UP")
Supervisor.init(children, strategy: :one_for_one)
end
def start_link(opts) do
Supervisor.start_link(__MODULE__, opts, name: __MODULE__)
end
def child_spec(opts) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [opts]},
restart: :permanent,
shutdown: :infinity,
type: :supervisor
}
end
# Helper function to configure NodeMonitor options
defp node_monitor_config(opts) do
store_id = Keyword.get(opts, :store_id, :ex_esdb)
# More lenient configuration for node monitoring to prevent cascading failures
[
store_id: store_id,
# 5 seconds (less frequent probing)
probe_interval: 5_000,
# 6 consecutive failures (more tolerance)
failure_threshold: 6,
# 3 second timeout per probe (more time)
probe_timeout: 3_000
]
end
end