123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- -module(pooler_sup).
- -behaviour(supervisor).
- -export([
- init/1,
- new_pool/1,
- rm_pool/1,
- pool_child_spec/1,
- start_link/0
- ]).
- start_link() ->
- supervisor:start_link({local, ?MODULE}, ?MODULE, []).
- init([]) ->
- %% a list of pool configs
- Config =
- case application:get_env(pooler, pools) of
- {ok, C} ->
- C;
- undefined ->
- []
- end,
- {MetricsApi, MetricsMod} = metrics_module(),
- MetricsConfig = [
- {metrics_mod, MetricsMod},
- {metrics_api, MetricsApi}
- ],
- Pools = [pooler_config:list_to_pool(MetricsConfig ++ L) || L <- Config],
- PoolSupSpecs = [pool_sup_spec(Pool) || Pool <- Pools],
- ets:new(pooler_config:group_table(), [set, public, named_table, {write_concurrency, true}]),
- {ok, {{one_for_one, 5, 60}, [starter_sup_spec() | PoolSupSpecs]}}.
- %% @doc Create a new pool from proplist pool config `PoolConfig'. The
- %% public API for this functionality is {@link pooler:new_pool/1}.
- new_pool(PoolConfig) ->
- Spec = pool_child_spec(PoolConfig),
- supervisor:start_child(?MODULE, Spec).
- %% @doc Create a child spec for new pool from proplist pool config `PoolConfig'. The
- %% public API for this functionality is {@link pooler:pool_child_spec/1}.
- pool_child_spec(PoolConfig) ->
- {MetricsApi, MetricsMod} = metrics_module(),
- NewPool = pooler_config:list_to_pool(
- [
- {metrics_mod, MetricsMod},
- {metrics_api, MetricsApi}
- ] ++ PoolConfig
- ),
- pool_sup_spec(NewPool).
- %% @doc Shutdown the named pool.
- rm_pool(Name) ->
- SupName = pool_sup_name(Name),
- case supervisor:terminate_child(?MODULE, SupName) of
- {error, not_found} ->
- ok;
- ok ->
- supervisor:delete_child(?MODULE, SupName);
- Error ->
- Error
- end.
- starter_sup_spec() ->
- {pooler_starter_sup, {pooler_starter_sup, start_link, []}, transient, 5000, supervisor, [pooler_starter_sup]}.
- pool_sup_spec(Pool) ->
- SupName = pool_sup_name(pooler_config:get_name(Pool)),
- {SupName, {pooler_pool_sup, start_link, [Pool]}, transient, 5000, supervisor, [pooler_pool_sup]}.
- pool_sup_name(Name) ->
- list_to_atom("pooler_" ++ atom_to_list(Name) ++ "_pool_sup").
- metrics_module() ->
- case application:get_env(pooler, metrics_module) of
- {ok, Mod} ->
- case application:get_env(pooler, metrics_api) of
- {ok, exometer} ->
- {exometer, Mod};
- % folsom is the default
- _V ->
- {folsom, Mod}
- end;
- undefined ->
- {folsom, pooler_no_metrics}
- end.
|