Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

173 рядки
5.2 KiB

5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
5 роки тому
  1. -module(agAgencyPoolMgrIns).
  2. -include("agHttpCli.hrl").
  3. -compile(inline).
  4. -compile({inline_size, 128}).
  5. -export([
  6. startPool/2
  7. , startPool/3
  8. , stopPool/1
  9. , getOneAgency/1
  10. %% genExm API
  11. , init/1
  12. , handleMsg/2
  13. , terminate/2
  14. ]).
  15. %% k-v缓存表
  16. -define(ETS_AG_Pool, ets_ag_Pool).
  17. -define(ETS_AG_Agency, ets_ag_Agency).
  18. -spec init(Args :: term()) -> ok.
  19. init(_Args) ->
  20. ets:new(?ETS_AG_Pool, [named_table, set, protected]),
  21. ets:new(?ETS_AG_Agency, [named_table, set, protected]),
  22. agKvsToBeam:load(?agBeamPool, []),
  23. agKvsToBeam:load(?agBeamAgency, []),
  24. {ok, undefined}.
  25. handleMsg({'$gen_call', From, {miStartPool, PoolName, DbCfgs, AgencyOpts}}, State) ->
  26. dealStart(PoolName, DbCfgs, AgencyOpts),
  27. gen_server:reply(From, ok),
  28. {ok, State};
  29. handleMsg({'$gen_call', From, {miStopPool, Name}}, State) ->
  30. delaStop(Name),
  31. gen_server:reply(From, ok),
  32. {ok, State};
  33. handleMsg(_Msg, State) ->
  34. ?WARN(?MODULE, "receive unexpected msg: ~p", [_Msg]),
  35. {ok, State}.
  36. terminate(_Reason, _State) ->
  37. ets:delete_all_objects(?ETS_AG_Pool),
  38. ets:delete_all_objects(?ETS_AG_Agency),
  39. agKvsToBeam:load(?agBeamPool, []),
  40. agKvsToBeam:load(?agBeamAgency, []),
  41. ok.
  42. -spec startPool(poolName(), dbCfgs()) -> ok | {error, pool_name_used}.
  43. startPool(PoolName, DbCfgs) ->
  44. startPool(PoolName, DbCfgs, []).
  45. -spec startPool(poolName(), dbCfgs(), agencyCfgs()) -> ok | {error, pool_name_used}.
  46. startPool(PoolName, DbCfgs, AgencyCfgs) ->
  47. case ?agBeamPool:get(PoolName) of
  48. undefined ->
  49. gen_server:call(?agAgencyPoolMgr, {miStartPool, PoolName, DbCfgs, AgencyCfgs});
  50. _ ->
  51. {error, pool_name_used}
  52. end.
  53. -spec stopPool(poolName()) -> ok | {error, pool_not_started}.
  54. stopPool(PoolName) ->
  55. case ?agBeamPool:get(PoolName) of
  56. undefined ->
  57. {error, pool_not_started};
  58. _ ->
  59. gen_server:call(?agAgencyPoolMgr, {miStopPool, PoolName})
  60. end.
  61. dealStart(PoolName, DbCfgs, AgencyCfgs) ->
  62. #dbOpts{poolSize = PoolSize, protocol = Protocol} = DbOpts = agMiscUtils:dbOpts(DbCfgs),
  63. AgencyOpts = agMiscUtils:agencyOpts(AgencyCfgs),
  64. cacheAddPool(PoolName, DbOpts),
  65. startChildren(PoolName, Protocol, PoolSize, AgencyOpts),
  66. cacheAddAgency(PoolName, PoolSize),
  67. case persistent_term:get(PoolName, undefined) of
  68. undefined ->
  69. IndexRef = atomics:new(1, [{signed, false}]),
  70. persistent_term:put(PoolName, IndexRef);
  71. _ ->
  72. ignore
  73. end,
  74. ok.
  75. delaStop(PoolName) ->
  76. case ?agBeamPool:get(PoolName) of
  77. undefined ->
  78. {error, pool_not_started};
  79. #dbOpts{poolSize = PoolSize} ->
  80. stopChildren(agencyNames(PoolName, PoolSize)),
  81. cacheDelPool(PoolName),
  82. cacheDelAgency(PoolName),
  83. ok
  84. end.
  85. agencyName(PoolName, Index) ->
  86. list_to_atom(atom_to_list(PoolName) ++ "_" ++ integer_to_list(Index)).
  87. agencyNames(PoolName, PoolSize) ->
  88. [agencyName(PoolName, N) || N <- lists:seq(1, PoolSize)].
  89. agencyMod(tcp) ->
  90. agTcpAgencyExm;
  91. agencyMod(ssl) ->
  92. agSslAgencyExm;
  93. agencyMod(_) ->
  94. agTcpAgencyExm.
  95. agencySpec(ServerMod, ServerName, Args) ->
  96. %% TODO 下面spawn_opt 参数需要调优
  97. StartFunc = {ServerMod, start_link, [ServerName, Args, [{min_heap_size, 5000}, {min_bin_vheap_size, 100000}, {fullsweep_after, 500}]]},
  98. {ServerName, StartFunc, transient, infinity, worker, [ServerMod]}.
  99. -spec startChildren(atom(), protocol(), poolSize(), agencyOpts()) -> ok.
  100. startChildren(PoolName, Protocol, PoolSize, AgencyOpts) ->
  101. AgencyMod = agencyMod(Protocol),
  102. AgencyNames = agencyNames(PoolName, PoolSize),
  103. AgencySpecs = [agencySpec(AgencyMod, AgencyName, {PoolName, AgencyName, AgencyOpts}) || AgencyName <- AgencyNames],
  104. [supervisor:start_child(agAgencyPool_sup, AgencySpec) || AgencySpec <- AgencySpecs],
  105. ok.
  106. stopChildren([AgencyName | T]) ->
  107. ok = supervisor:terminate_child(agAgencyPool_sup, AgencyName),
  108. ok = supervisor:delete_child(agAgencyPool_sup, AgencyName),
  109. stopChildren(T);
  110. stopChildren([]) ->
  111. ok.
  112. cacheAddPool(Key, Value) ->
  113. ets:insert(?ETS_AG_Pool, {Key, Value}),
  114. KVS = ets:tab2list(?ETS_AG_Pool),
  115. agKvsToBeam:load(?agBeamPool, KVS),
  116. ok.
  117. cacheDelPool(Key) ->
  118. ets:delete(?ETS_AG_Pool, Key),
  119. KVS = ets:tab2list(?ETS_AG_Pool),
  120. agKvsToBeam:load(?agBeamPool, KVS),
  121. ok.
  122. cacheAddAgency(PoolName, PoolSize) ->
  123. NameList = [{{PoolName, N}, agencyName(PoolName, N)} || N <- lists:seq(1, PoolSize)],
  124. ets:insert(?ETS_AG_Agency, NameList),
  125. KVS = ets:tab2list(?ETS_AG_Agency),
  126. agKvsToBeam:load(?agBeamAgency, KVS),
  127. ok.
  128. cacheDelAgency(PoolName) ->
  129. ets:match_delete(?ETS_AG_Agency, {{PoolName, '_'}, '_'}),
  130. KVS = ets:tab2list(?ETS_AG_Agency),
  131. agKvsToBeam:load(?agBeamAgency, KVS),
  132. ok.
  133. -spec getOneAgency(atom()) -> atom() | {error, term()}.
  134. getOneAgency(PoolName) ->
  135. case ?agBeamPool:get(PoolName) of
  136. undefined ->
  137. {error, pool_not_found};
  138. #dbOpts{poolSize = PoolSize} ->
  139. Ref = persistent_term:get(PoolName),
  140. AgencyIdx = atomics:add_get(Ref, 1, 1),
  141. case AgencyIdx >= PoolSize of
  142. true ->
  143. atomics:put(Ref, 1, 0),
  144. ?agBeamAgency:get({PoolName, PoolSize});
  145. _ ->
  146. ?agBeamAgency:get({PoolName, AgencyIdx})
  147. end
  148. end.