%%%-------------------------------------------------------------------
%%% @doc barrel_docdb top-level supervisor
%%%
%%% Supervises all barrel_docdb processes.
%%% @end
%%%-------------------------------------------------------------------
-module(barrel_docdb_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%====================================================================
%% API functions
%%====================================================================
%% @doc Start the barrel_docdb supervisor
-spec start_link() -> {ok, pid()} | {error, term()}.
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%%====================================================================
%% Supervisor callbacks
%%====================================================================
%% @doc Initialize the supervisor with child specs
-spec init([]) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}.
init([]) ->
SupFlags = #{
strategy => one_for_one,
intensity => 5,
period => 60
},
%% Prometheus metrics module
%% Must start first to set up metric declarations
Metrics = #{
id => barrel_metrics,
start => {barrel_metrics, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_metrics]
},
%% Shared RocksDB block cache for all databases
%% Must start before any database opens
Cache = #{
id => barrel_cache,
start => {barrel_cache, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_cache]
},
%% Global HLC clock for distributed time synchronization
%% Registered as 'barrel_hlc_clock' for node-wide access
HlcMaxOffset = application:get_env(barrel_docdb, hlc_max_offset, 0),
Hlc = #{
id => barrel_hlc_clock,
start => {hlc, start_link, [barrel_hlc_clock, fun hlc:physical_clock/0, HlcMaxOffset]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [hlc]
},
%% Subscription manager for path-based document subscriptions
Sub = #{
id => barrel_sub,
start => {barrel_sub, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_sub]
},
%% Query subscription manager for query-based document subscriptions
QuerySub = #{
id => barrel_query_sub,
start => {barrel_query_sub, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_query_sub]
},
%% Path dictionary for path ID interning (posting lists)
PathDict = #{
id => barrel_path_dict,
start => {barrel_path_dict, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_path_dict]
},
%% Query cursor manager for chunked query execution
QueryCursor = #{
id => barrel_query_cursor,
start => {barrel_query_cursor, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_query_cursor]
},
%% Parallel worker pool for query processing
Parallel = #{
id => barrel_parallel,
start => {barrel_parallel, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_parallel]
},
%% Database supervisor for managing individual database processes
%% Note: Each database starts its own compaction filter handler in barrel_db_server
DbSup = #{
id => barrel_db_sup,
start => {barrel_db_sup, start_link, []},
restart => permanent,
shutdown => infinity,
type => supervisor,
modules => [barrel_db_sup]
},
%% Replication task manager for persistent replication tasks
RepTasks = #{
id => barrel_rep_tasks,
start => {barrel_rep_tasks, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [barrel_rep_tasks]
},
%% Child specs (embedded-only; no HTTP server)
ChildSpecs = [Metrics, Cache, Hlc, Sub, QuerySub, PathDict, QueryCursor, Parallel, DbSup, RepTasks],
{ok, {SupFlags, ChildSpecs}}.