chore(cm): sync emqx_cm with ee

This commit is contained in:
Ilya Averyanov 2022-10-26 11:49:22 +03:00
parent ebd01da78b
commit cc468dca4e
1 changed files with 12 additions and 9 deletions

View File

@ -63,8 +63,8 @@
]). ]).
-export([all_channels/0, -export([all_channels/0,
channel_with_session_table/0, channel_with_session_table/1,
live_connection_table/0]). live_connection_table/1]).
%% gen_server callbacks %% gen_server callbacks
-export([ init/1 -export([ init/1
@ -433,7 +433,7 @@ all_channels() ->
ets:select(?CHAN_TAB, Pat). ets:select(?CHAN_TAB, Pat).
%% @doc Get clientinfo for all clients with sessions %% @doc Get clientinfo for all clients with sessions
channel_with_session_table() -> channel_with_session_table(ConnModules) ->
Ms = ets:fun2ms( Ms = ets:fun2ms(
fun({{ClientId, _ChanPid}, fun({{ClientId, _ChanPid},
Info, Info,
@ -441,22 +441,25 @@ channel_with_session_table() ->
{ClientId, Info} {ClientId, Info}
end), end),
Table = ets:table(?CHAN_INFO_TAB, [{traverse, {select, Ms}}]), Table = ets:table(?CHAN_INFO_TAB, [{traverse, {select, Ms}}]),
ConnModuleMap = maps:from_list([{Mod, true} || Mod <- ConnModules]),
qlc:q([ {ClientId, ConnState, ConnInfo, ClientInfo} qlc:q([ {ClientId, ConnState, ConnInfo, ClientInfo}
|| {ClientId, || {ClientId,
#{conn_state := ConnState, #{conn_state := ConnState,
clientinfo := ClientInfo, clientinfo := ClientInfo,
conninfo := #{clean_start := false} = ConnInfo}} <- Table conninfo := #{clean_start := false, conn_mod := ConnModule} = ConnInfo}}
<- Table,
maps:is_key(ConnModule, ConnModuleMap)
]). ]).
%% @doc Get all local connection query handle %% @doc Get all local connection query handle
live_connection_table() -> live_connection_table(ConnModules) ->
Ms = ets:fun2ms( Ms = lists:map(fun live_connection_ms/1, ConnModules),
fun({{ClientId, ChanPid}, _}) ->
{ClientId, ChanPid}
end),
Table = ets:table(?CHAN_CONN_TAB, [{traverse, {select, Ms}}]), Table = ets:table(?CHAN_CONN_TAB, [{traverse, {select, Ms}}]),
qlc:q([{ClientId, ChanPid} || {ClientId, ChanPid} <- Table, is_channel_connected(ClientId, ChanPid)]). qlc:q([{ClientId, ChanPid} || {ClientId, ChanPid} <- Table, is_channel_connected(ClientId, ChanPid)]).
live_connection_ms(ConnModule) ->
{{{'$1','$2'},ConnModule},[],[{{'$1','$2'}}]}.
is_channel_connected(ClientId, ChanPid) when node(ChanPid) =:= node() -> is_channel_connected(ClientId, ChanPid) when node(ChanPid) =:= node() ->
case get_chan_info(ClientId, ChanPid) of case get_chan_info(ClientId, ChanPid) of
#{conn_state := disconnected} -> false; #{conn_state := disconnected} -> false;