From 9657d7e6280ca4eaf06f3f18b67d6ef9e2c04d98 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Fri, 8 Oct 2021 11:11:05 +0800 Subject: [PATCH] refactor(mgmt_api): Use Continuation with ets selecting. --- apps/emqx_management/src/emqx_mgmt_api.erl | 46 +++++++++++++--------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt_api.erl b/apps/emqx_management/src/emqx_mgmt_api.erl index e13f52691..f7c92aee8 100644 --- a/apps/emqx_management/src/emqx_mgmt_api.erl +++ b/apps/emqx_management/src/emqx_mgmt_api.erl @@ -23,8 +23,7 @@ ]). %% first_next query APIs --export([ params2qs/2 - , node_query/5 +-export([ node_query/5 , cluster_query/4 , traverse_table/5 , select_table/5 @@ -130,20 +129,6 @@ node_query(Node, Params, Tab, QsSchema, QueryFun) -> end, #{meta => NMeta, data => lists:sublist(Rows, Limit)}. -%% @private -do_query(Node, Tab, Qs, {M,F}, Start, Limit) when Node =:= node() -> - M:F(Tab, Qs, Start, Limit); -do_query(Node, Tab, Qs, QueryFun, Start, Limit) -> - rpc_call(Node, ?MODULE, do_query, - [Node, Tab, Qs, QueryFun, Start, Limit], 50000). - -%% @private -rpc_call(Node, M, F, A, T) -> - case rpc:call(Node, M, F, A, T) of - {badrpc, _} = R -> {error, R}; - Res -> Res - end. - %%-------------------------------------------------------------------- %% Cluster Query %%-------------------------------------------------------------------- @@ -176,6 +161,28 @@ do_cluster_query([Node|Nodes], Tab, Qs, QueryFun, Start, Limit, Acc) -> lists:append(lists:reverse([Rows|Acc])) end. +%%-------------------------------------------------------------------- +%% Do Query (or rpc query) +%%-------------------------------------------------------------------- + +%% @private +do_query(Node, Tab, Qs, {M,F}, Continuation, Limit) when Node =:= node() -> + M:F(Tab, Qs, Continuation, Limit); +do_query(Node, Tab, Qs, QueryFun, Continuation, Limit) -> + rpc_call(Node, ?MODULE, do_query, + [Node, Tab, Qs, QueryFun, Continuation, Limit], 50000). + +%% @private +rpc_call(Node, M, F, A, T) -> + case rpc:call(Node, M, F, A, T) of + {badrpc, _} = R -> {error, R}; + Res -> Res + end. + +%%-------------------------------------------------------------------- +%% Table Select +%%-------------------------------------------------------------------- + traverse_table(Tab, MatchFun, Start, Limit, FmtFun) -> ets:safe_fixtable(Tab, true), {NStart, Rows} = traverse_n_by_one(Tab, ets:first(Tab), MatchFun, Start, Limit, []), @@ -238,15 +245,16 @@ select_n_by_one({Rows0, Cons}, Start, Limit, Acc) -> select_n_by_one(ets:select(Cons), 0, NLimit, [Got|Acc]) end. +%%-------------------------------------------------------------------- +%% Internal funcs +%%-------------------------------------------------------------------- + params2qs(Params, QsSchema) when is_map(Params) -> params2qs(maps:to_list(Params), QsSchema); params2qs(Params, QsSchema) -> {Qs, Fuzzy} = pick_params_to_qs(Params, QsSchema, [], []), {length(Qs) + length(Fuzzy), {Qs, Fuzzy}}. -%%-------------------------------------------------------------------- -%% Internal funcs - pick_params_to_qs([], _, Acc1, Acc2) -> NAcc2 = [E || E <- Acc2, not lists:keymember(element(1, E), 1, Acc1)], {lists:reverse(Acc1), lists:reverse(NAcc2)};