pooler_sup.erl 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. -module(pooler_sup).
  2. -behaviour(supervisor).
  3. -export([
  4. init/1,
  5. new_pool/1,
  6. rm_pool/1,
  7. pool_child_spec/1,
  8. start_link/0
  9. ]).
  10. start_link() ->
  11. supervisor:start_link({local, ?MODULE}, ?MODULE, []).
  12. init([]) ->
  13. %% a list of pool configs
  14. Config =
  15. case application:get_env(pooler, pools) of
  16. {ok, C} ->
  17. C;
  18. undefined ->
  19. []
  20. end,
  21. {MetricsApi, MetricsMod} = metrics_module(),
  22. MetricsConfig = [
  23. {metrics_mod, MetricsMod},
  24. {metrics_api, MetricsApi}
  25. ],
  26. Pools = [pooler_config:list_to_pool(MetricsConfig ++ L) || L <- Config],
  27. PoolSupSpecs = [pool_sup_spec(Pool) || Pool <- Pools],
  28. ets:new(pooler_config:group_table(), [set, public, named_table, {write_concurrency, true}]),
  29. {ok, {{one_for_one, 5, 60}, [starter_sup_spec() | PoolSupSpecs]}}.
  30. %% @doc Create a new pool from proplist pool config `PoolConfig'. The
  31. %% public API for this functionality is {@link pooler:new_pool/1}.
  32. new_pool(PoolConfig) ->
  33. Spec = pool_child_spec(PoolConfig),
  34. supervisor:start_child(?MODULE, Spec).
  35. %% @doc Create a child spec for new pool from proplist pool config `PoolConfig'. The
  36. %% public API for this functionality is {@link pooler:pool_child_spec/1}.
  37. pool_child_spec(PoolConfig) ->
  38. {MetricsApi, MetricsMod} = metrics_module(),
  39. NewPool = pooler_config:list_to_pool(
  40. [
  41. {metrics_mod, MetricsMod},
  42. {metrics_api, MetricsApi}
  43. ] ++ PoolConfig
  44. ),
  45. pool_sup_spec(NewPool).
  46. %% @doc Shutdown the named pool.
  47. rm_pool(Name) ->
  48. SupName = pool_sup_name(Name),
  49. case supervisor:terminate_child(?MODULE, SupName) of
  50. {error, not_found} ->
  51. ok;
  52. ok ->
  53. supervisor:delete_child(?MODULE, SupName);
  54. Error ->
  55. Error
  56. end.
  57. starter_sup_spec() ->
  58. {pooler_starter_sup, {pooler_starter_sup, start_link, []}, transient, 5000, supervisor, [pooler_starter_sup]}.
  59. pool_sup_spec(Pool) ->
  60. SupName = pool_sup_name(pooler_config:get_name(Pool)),
  61. {SupName, {pooler_pool_sup, start_link, [Pool]}, transient, 5000, supervisor, [pooler_pool_sup]}.
  62. pool_sup_name(Name) ->
  63. list_to_atom("pooler_" ++ atom_to_list(Name) ++ "_pool_sup").
  64. metrics_module() ->
  65. case application:get_env(pooler, metrics_module) of
  66. {ok, Mod} ->
  67. case application:get_env(pooler, metrics_api) of
  68. {ok, exometer} ->
  69. {exometer, Mod};
  70. % folsom is the default
  71. _V ->
  72. {folsom, Mod}
  73. end;
  74. undefined ->
  75. {folsom, pooler_no_metrics}
  76. end.