Current section
Files
Jump to
Current section
Files
src/eredis_cluster_pools_sup.erl
-module(eredis_cluster_pools_sup).
-behaviour(supervisor).
-define(MAX_RETRY,20).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start_link/0]).
-export([create_eredis_pool/2]).
-export([stop_eredis_pool/1]).
-export([register_worker_connection/1]).
-export([init/1]).
%% ====================================================================
%% Internal functions
%% ====================================================================
start_link() ->
ets:new(?MODULE,[set,named_table,public]),
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
create_eredis_pool(Host,Port) ->
PoolName = list_to_atom(Host ++ "#" ++ integer_to_list(Port)),
case whereis(PoolName) of
undefined ->
ets:insert(?MODULE,{PoolName,0}),
WorkerArgs = [{host, Host},{port, Port},{pool_name,PoolName}],
Size = application:get_env(eredis_cluster, pool_size, 10),
MaxOverflow = application:get_env(eredis_cluster, pool_max_overflow, 0),
PoolArgs = [{name, {local, PoolName}},
{worker_module, eredis_cluster_worker},
{size, Size},
{max_overflow, MaxOverflow}],
ChildSpec = poolboy:child_spec(PoolName, PoolArgs, WorkerArgs),
{Result,_} = supervisor:start_child(?MODULE,ChildSpec),
{Result,PoolName};
_ ->
{ok,PoolName}
end.
register_worker_connection(PoolName) ->
RestartCounter = ets:update_counter(?MODULE,PoolName,1),
if
RestartCounter =:= ?MAX_RETRY ->
stop_eredis_pool(PoolName);
true ->
ok
end.
stop_eredis_pool(PoolName) ->
supervisor:terminate_child(?MODULE,PoolName),
supervisor:delete_child(?MODULE,PoolName),
ok.
init([]) ->
{ok, {{one_for_one, 1, 5}, []}}.