Packages
reckon_db
2.1.4
5.11.0
5.10.4
5.10.3
5.10.1
5.10.0
5.9.1
5.9.0
5.8.3
5.8.2
5.8.1
5.8.0
5.7.0
5.6.1
5.6.0
5.5.5
5.5.4
5.5.3
5.5.2
5.5.1
5.5.0
5.4.0
5.2.2
5.2.1
5.2.0
5.1.0
5.0.0
4.0.0
3.1.2
3.1.1
3.0.0
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.2
2.2.0
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.0
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.3
1.0.2
1.0.1
1.0.0
BEAM-native Event Store built on Khepri/Ra with Raft consensus. Event sourcing, persistent subscriptions, snapshots, and automatic cluster formation via UDP multicast discovery. Ships embedded Rust NIFs for 3-15x acceleration of crypto, hashing, compression, aggregation, filter matching, and grap...
Current section
Files
Jump to
Current section
Files
src/reckon_db_system_sup.erl
%% @doc Per-store system supervisor for reckon-db
%%
%% This supervisor manages all subsystems for a single store instance.
%% Uses rest_for_one strategy to ensure proper startup order:
%%
%% 1. CoreSystem (one_for_all) - persistence, notification, store management
%% 2. ClusterSystem (cluster mode only) - discovery, coordination, monitoring
%% 3. GatewaySystem - external interface workers
%%
%% @author rgfaber
-module(reckon_db_system_sup).
-behaviour(supervisor).
-include("reckon_db.hrl").
%% API
-export([start_link/1]).
%% Supervisor callbacks
-export([init/1]).
%%====================================================================
%% API
%%====================================================================
%% @doc Start the system supervisor for a store
-spec start_link(store_config()) -> {ok, pid()} | {error, term()}.
start_link(#store_config{store_id = StoreId} = Config) ->
Name = reckon_db_naming:system_sup_name(StoreId),
supervisor:start_link({local, Name}, ?MODULE, Config).
%%====================================================================
%% Supervisor callbacks
%%====================================================================
%% @private
-spec init(store_config()) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}.
init(#store_config{store_id = StoreId, mode = Mode} = Config) ->
SupFlags = #{
strategy => rest_for_one,
intensity => 5,
period => 30
},
%% Core children (always present)
CoreChildren = [
core_sup_spec(Config)
],
%% Cluster children (cluster mode only)
ClusterChildren = case Mode of
cluster ->
[cluster_sup_spec(Config)];
single ->
[]
end,
%% Node monitor (all modes) — detects Ra leader and activates
%% leader responsibilities. Must start after CoreSystem (store up)
%% and after ClusterSystem (coordinator available in cluster mode).
MonitorChildren = [
node_monitor_spec(Config)
],
%% Gateway children (always present, starts last)
GatewayChildren = [
gateway_sup_spec(Config)
],
Children = CoreChildren ++ ClusterChildren ++ MonitorChildren ++ GatewayChildren,
logger:info("Starting reckon-db system for store ~p in ~p mode", [StoreId, Mode]),
{ok, {SupFlags, Children}}.
%%====================================================================
%% Internal functions
%%====================================================================
%% @private
-spec core_sup_spec(store_config()) -> supervisor:child_spec().
core_sup_spec(#store_config{store_id = StoreId} = Config) ->
#{
id => reckon_db_naming:core_sup_name(StoreId),
start => {reckon_db_core_sup, start_link, [Config]},
restart => permanent,
shutdown => infinity,
type => supervisor,
modules => [reckon_db_core_sup]
}.
%% @private
-spec cluster_sup_spec(store_config()) -> supervisor:child_spec().
cluster_sup_spec(#store_config{store_id = StoreId} = Config) ->
#{
id => reckon_db_naming:cluster_sup_name(StoreId),
start => {reckon_db_cluster_sup, start_link, [Config]},
restart => permanent,
shutdown => infinity,
type => supervisor,
modules => [reckon_db_cluster_sup]
}.
%% @private Node monitor — runs in all modes for leader detection.
%% In single mode: detects Ra leader, activates LeaderWorker, stops polling.
%% In cluster mode: continuous leader/membership monitoring.
-spec node_monitor_spec(store_config()) -> supervisor:child_spec().
node_monitor_spec(#store_config{store_id = StoreId} = Config) ->
#{
id => reckon_db_naming:node_monitor_name(StoreId),
start => {reckon_db_node_monitor, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [reckon_db_node_monitor]
}.
%% @private
-spec gateway_sup_spec(store_config()) -> supervisor:child_spec().
gateway_sup_spec(#store_config{store_id = StoreId} = Config) ->
#{
id => reckon_db_naming:gateway_sup_name(StoreId),
start => {reckon_db_gateway_sup, start_link, [Config]},
restart => permanent,
shutdown => infinity,
type => supervisor,
modules => [reckon_db_gateway_sup]
}.