Packages
ex_esdb
0.8.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14-alpha
0.0.13-alpha
0.0.12-alpha
0.0.11-alpha
0.0.10-alpha
0.0.9-alpha
0.0.8-alpha
0.0.6-alpha
0.0.5-alpha
0.0.4-alpha
0.0.3-alpha
0.0.2-alfa
0.0.1-alfa
ExESDB is a reincarnation of rabbitmq/khepri, specialized for use as a BEAM-native event store.
Current section
Files
Jump to
Current section
Files
lib/ex_esdb/leader_system.ex
defmodule ExESDB.LeaderSystem do
@moduledoc """
This module supervises the Leader Subsystem.
"""
use Supervisor
require Logger
alias ExESDB.Themes, as: Themes
alias ExESDB.StoreNaming
############### PlUMBIng ############
#
def start_link(opts) do
store_id = StoreNaming.extract_store_id(opts)
name = StoreNaming.genserver_name(__MODULE__, store_id)
Supervisor.start_link(
__MODULE__,
opts,
name: name
)
end
@impl true
def init(config) do
store_id = StoreNaming.extract_store_id(config)
Process.flag(:trap_exit, true)
children = [
# LeaderTracker must start first to establish subscription tracking infrastructure
{ExESDB.LeaderTracker, config},
# LeaderWorker depends on the tracking infrastructure being ready
{ExESDB.LeaderWorker, config}
]
# Use :rest_for_one because LeaderWorker depends on LeaderTracker
result = Supervisor.init(children, strategy: :rest_for_one)
IO.puts(Themes.leader_system(self(), "[#{store_id}] is UP!"))
result
end
def child_spec(opts) do
store_id = StoreNaming.extract_store_id(opts)
%{
id: StoreNaming.child_spec_id(__MODULE__, store_id),
start: {__MODULE__, :start_link, [opts]},
restart: :permanent,
shutdown: :infinity,
type: :supervisor
}
end
end