Packages
ex_esdb
0.3.3
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/core_system.ex
defmodule ExESDB.CoreSystem do
@moduledoc """
Critical infrastructure supervisor that manages core ExESDB components.
This supervisor uses :one_for_all strategy because these components are
tightly coupled and must restart together to maintain consistency.
Startup order:
1. PersistenceSystem: Manages streams, snapshots, and subscriptions (foundation)
2. NotificationSystem: Manages leadership and event emission (depends on persistence)
3. StoreSystem: Manages store lifecycle and clustering (depends on persistence & notification)
The NotificationSystem includes:
- LeaderSystem: Leadership responsibilities and subscription management
- EmitterSystem: Event emission and distribution
This ensures that leadership and event distribution are core capabilities
available in both single-node and cluster modes.
"""
use Supervisor
require Logger
alias ExESDB.Themes, as: Themes
alias ExESDB.StoreNaming
@impl true
def init(opts) do
Logger.info("[CORE_SYSTEM] Initializing CoreSystem supervisor with opts: #{inspect(opts)}")
Logger.info("[CORE_SYSTEM] CoreSystem PID: #{inspect(self())}, Node: #{inspect(node())}")
# Extract store_id for logging
store_id = StoreNaming.extract_store_id(opts)
Logger.info("[CORE_SYSTEM] Store ID: #{inspect(store_id)}")
Logger.info("[CORE_SYSTEM] Starting core infrastructure components in order...")
children = [
{ExESDB.PersistenceSystem, opts},
{ExESDB.NotificationSystem, opts},
{ExESDB.StoreSystem, opts}
]
Logger.info("[CORE_SYSTEM] Configured #{length(children)} core subsystems:")
children |> Enum.with_index(1) |> Enum.each(fn {{module, _opts}, index} ->
Logger.info("[CORE_SYSTEM] #{index}. #{inspect(module)}")
end)
Logger.info("[CORE_SYSTEM] Using :one_for_all strategy - all components restart together for consistency")
Logger.info("[CORE_SYSTEM] Max restarts: 3, Max seconds: 60")
IO.puts(Themes.core_system(self(), "is UP"))
# Use :one_for_all because these components are interdependent
result = Supervisor.init(children,
strategy: :one_for_all,
max_restarts: 3,
max_seconds: 60
)
Logger.info("[CORE_SYSTEM] CoreSystem supervisor initialization complete")
result
end
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
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