pooler_pool_sup.erl 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. -module(pooler_pool_sup).
  2. -behaviour(supervisor).
  3. -export([
  4. start_link/1,
  5. init/1,
  6. pool_sup_name/1,
  7. member_sup_name/1,
  8. build_member_sup_name/1
  9. ]).
  10. -spec start_link(pooler:pool_config()) -> {ok, pid()}.
  11. start_link(PoolConf) ->
  12. SupName = pool_sup_name(PoolConf),
  13. supervisor:start_link({local, SupName}, ?MODULE, PoolConf).
  14. init(PoolConf) when is_map(PoolConf) ->
  15. PoolerSpec = #{
  16. id => pooler,
  17. start => {pooler, start_link, [PoolConf]},
  18. restart => transient,
  19. shutdown => 5000,
  20. type => worker,
  21. modules => [pooler]
  22. },
  23. MemberSupName = member_sup_name(PoolConf),
  24. MemberSupSpec =
  25. #{
  26. id => MemberSupName,
  27. start => {pooler_pooled_worker_sup, start_link, [PoolConf]},
  28. restart => transient,
  29. shutdown => 5000,
  30. type => supervisor,
  31. modules => [pooler_pooled_worker_sup]
  32. },
  33. %% five restarts in 60 seconds, then shutdown
  34. Restart = #{strategy => one_for_all, intensity => 5, period => 60},
  35. {ok, {Restart, [MemberSupSpec, PoolerSpec]}};
  36. init(PoolRecord) when is_tuple(PoolRecord), element(1, PoolRecord) =:= pool ->
  37. %% This clause is for the hot code upgrade from pre-1.6.0;
  38. %% can be removed when "upgrade-from-version" below 1.6.0 are removed from `pooler.appup.src'
  39. {ok, PoolRecord1} = pooler:code_change(0, PoolRecord, []),
  40. AsMap = pooler:to_map(PoolRecord1),
  41. init(
  42. maps:with(
  43. [
  44. name,
  45. init_count,
  46. max_count,
  47. start_mfa,
  48. group,
  49. cull_interval,
  50. max_age,
  51. member_start_timeout,
  52. queue_max,
  53. metrics_api,
  54. metrics_mod,
  55. stop_mfa,
  56. auto_grow_threshold,
  57. add_member_retry,
  58. metrics_mod,
  59. metrics_api
  60. ],
  61. AsMap
  62. )
  63. ).
  64. -spec member_sup_name(pooler:pool_config()) -> atom().
  65. member_sup_name(#{name := Name}) ->
  66. build_member_sup_name(Name).
  67. -spec build_member_sup_name(pooler:pool_name()) -> atom().
  68. build_member_sup_name(PoolName) ->
  69. list_to_atom("pooler_" ++ atom_to_list(PoolName) ++ "_member_sup").
  70. pool_sup_name(#{name := Name}) ->
  71. list_to_atom("pooler_" ++ atom_to_list(Name) ++ "_pool_sup").