fix(ets_model): use only ChanPid as key to save memory

This commit is contained in:
Thales Macedo Garitezi 2021-11-08 12:15:04 -03:00
parent 0955122468
commit 6d37d2df68
No known key found for this signature in database
GPG Key ID: DD279F8152A9B6DD
3 changed files with 12 additions and 14 deletions

View File

@ -1536,9 +1536,8 @@ ensure_connected(Channel = #channel{conninfo = ConnInfo,
clientinfo = ClientInfo}) -> clientinfo = ClientInfo}) ->
NConnInfo = ConnInfo#{connected_at => erlang:system_time(millisecond)}, NConnInfo = ConnInfo#{connected_at => erlang:system_time(millisecond)},
ok = run_hooks('client.connected', [ClientInfo, NConnInfo]), ok = run_hooks('client.connected', [ClientInfo, NConnInfo]),
ClientID = info(clientid, Channel), ChanPid = self(),
Chan = {ClientID, self()}, emqx_cm:increment_connected_client_count(ChanPid),
emqx_cm:increment_connected_client_count(Chan),
Channel#channel{conninfo = NConnInfo, Channel#channel{conninfo = NConnInfo,
conn_state = connected conn_state = connected
}. }.
@ -1627,9 +1626,8 @@ ensure_disconnected(Reason, Channel = #channel{conninfo = ConnInfo,
clientinfo = ClientInfo}) -> clientinfo = ClientInfo}) ->
NConnInfo = ConnInfo#{disconnected_at => erlang:system_time(millisecond)}, NConnInfo = ConnInfo#{disconnected_at => erlang:system_time(millisecond)},
ok = run_hooks('client.disconnected', [ClientInfo, Reason, NConnInfo]), ok = run_hooks('client.disconnected', [ClientInfo, Reason, NConnInfo]),
ClientID = info(clientid, Channel), ChanPid = self(),
Chan = {ClientID, self()}, emqx_cm:decrement_connected_client_count(ChanPid),
emqx_cm:decrement_connected_client_count(Chan),
Channel#channel{conninfo = NConnInfo, conn_state = disconnected}. Channel#channel{conninfo = NConnInfo, conn_state = disconnected}.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------

View File

@ -470,7 +470,7 @@ handle_info({'DOWN', _MRef, process, Pid, _Reason}, State = #{chan_pmon := PMon}
Chan = {ClientID, ChanPid}, Chan = {ClientID, ChanPid},
case ets:lookup(?CHAN_INFO_TAB, Chan) of case ets:lookup(?CHAN_INFO_TAB, Chan) of
[{Chan, #{conn_state := connected}, _}] -> [{Chan, #{conn_state := connected}, _}] ->
decrement_connected_client_count(Chan); decrement_connected_client_count(ChanPid);
_ -> _ ->
ok ok
end end
@ -513,14 +513,14 @@ get_chann_conn_mod(ClientId, ChanPid) when node(ChanPid) == node() ->
get_chann_conn_mod(ClientId, ChanPid) -> get_chann_conn_mod(ClientId, ChanPid) ->
rpc_call(node(ChanPid), get_chann_conn_mod, [ClientId, ChanPid], ?T_GET_INFO). rpc_call(node(ChanPid), get_chann_conn_mod, [ClientId, ChanPid], ?T_GET_INFO).
increment_connected_client_count(Chan) -> increment_connected_client_count(ChanPid) ->
?tp(emqx_cm_connected_client_count_inc, #{}), ?tp(emqx_cm_connected_client_count_inc, #{}),
ets:insert_new(?CONN_CLIENT_TAB, {Chan, true}), ets:insert_new(?CONN_CLIENT_TAB, {ChanPid, true}),
ok. ok.
decrement_connected_client_count(Chan) -> decrement_connected_client_count(ChanPid) ->
?tp(emqx_cm_connected_client_count_dec, #{}), ?tp(emqx_cm_connected_client_count_dec, #{}),
ets:delete(?CONN_CLIENT_TAB, Chan), ets:delete(?CONN_CLIENT_TAB, ChanPid),
ok. ok.
get_connected_client_count() -> get_connected_client_count() ->

View File

@ -502,11 +502,11 @@ t_connect_client_never_negative({init, Config}) ->
t_connect_client_never_negative(Config) when is_list(Config) -> t_connect_client_never_negative(Config) when is_list(Config) ->
?assertEqual(0, emqx_cm:get_connected_client_count()), ?assertEqual(0, emqx_cm:get_connected_client_count()),
%% would go to -1 %% would go to -1
Chan = {<<"clientid">>, list_to_pid("<0.0.1>")}, ChanPid = list_to_pid("<0.0.1>"),
emqx_cm:decrement_connected_client_count(Chan), emqx_cm:decrement_connected_client_count(ChanPid),
?assertEqual(0, emqx_cm:get_connected_client_count()), ?assertEqual(0, emqx_cm:get_connected_client_count()),
%% would be 0, if really went to -1 %% would be 0, if really went to -1
emqx_cm:increment_connected_client_count(Chan), emqx_cm:increment_connected_client_count(ChanPid),
?assertEqual(1, emqx_cm:get_connected_client_count()), ?assertEqual(1, emqx_cm:get_connected_client_count()),
ok; ok;
t_connect_client_never_negative({'end', _Config}) -> t_connect_client_never_negative({'end', _Config}) ->