Packages
reckon_db
2.3.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_persistence_sup.erl
%% @doc Persistence supervisor for reckon-db
%%
%% Manages persistence-related components:
%% - Khepri store worker
%% - Streams supervisor (writers/readers)
%% - Persistence worker (batched flush, currently disabled)
%%
%% Note: Snapshots and Subscriptions stores are facade modules that
%% work directly with Khepri without needing gen_servers.
%%
%% @author rgfaber
-module(reckon_db_persistence_sup).
-behaviour(supervisor).
-include("reckon_db.hrl").
%% API
-export([start_link/1]).
%% Supervisor callbacks
-export([init/1]).
%%====================================================================
%% API
%%====================================================================
%% @doc Start the persistence supervisor
-spec start_link(store_config()) -> {ok, pid()} | {error, term()}.
start_link(#store_config{store_id = StoreId} = Config) ->
Name = reckon_db_naming:persistence_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} = Config) ->
SupFlags = #{
strategy => one_for_one,
intensity => 5,
period => 30
},
Children = [
%% Khepri store must start first
store_spec(Config),
%% Streams supervisor (writers/readers)
streams_sup_spec(Config),
%% Persistence worker (batched flush, disabled for now)
persistence_worker_spec(Config)
],
logger:debug("Starting persistence supervisor for store ~p", [StoreId]),
{ok, {SupFlags, Children}}.
%%====================================================================
%% Internal functions
%%====================================================================
%% @private
-spec store_spec(store_config()) -> supervisor:child_spec().
store_spec(Config) ->
#{
id => reckon_db_store,
start => {reckon_db_store, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [reckon_db_store]
}.
%% @private
-spec streams_sup_spec(store_config()) -> supervisor:child_spec().
streams_sup_spec(#store_config{store_id = StoreId} = Config) ->
#{
id => reckon_db_naming:streams_sup_name(StoreId),
start => {reckon_db_streams_sup, start_link, [Config]},
restart => permanent,
shutdown => infinity,
type => supervisor,
modules => [reckon_db_streams_sup]
}.
%% @private
-spec persistence_worker_spec(store_config()) -> supervisor:child_spec().
persistence_worker_spec(#store_config{store_id = StoreId} = Config) ->
#{
id => reckon_db_naming:persistence_worker_name(StoreId),
start => {reckon_db_persistence_worker, start_link, [Config]},
restart => permanent,
%% Allow time for final persistence on shutdown
shutdown => 10000,
type => worker,
modules => [reckon_db_persistence_worker]
}.