From b3e62bd8f8c16c57754fa91bfffcc52f4ed32783 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Fri, 13 Jan 2023 12:32:35 +0300 Subject: [PATCH 1/2] fix(paging): respect matchspec even if qs is empty when counting --- .../test/emqx_authz_api_mnesia_SUITE.erl | 27 +++++++++++++------ apps/emqx_management/src/emqx_mgmt_api.erl | 6 ++--- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/apps/emqx_authz/test/emqx_authz_api_mnesia_SUITE.erl b/apps/emqx_authz/test/emqx_authz_api_mnesia_SUITE.erl index 62bce770e..0d4d974f2 100644 --- a/apps/emqx_authz/test/emqx_authz_api_mnesia_SUITE.erl +++ b/apps/emqx_authz/test/emqx_authz_api_mnesia_SUITE.erl @@ -109,14 +109,17 @@ t_api(_) -> ]), [] ), - #{ - <<"data">> := [], - <<"meta">> := #{ - <<"limit">> := 20, - <<"page">> := 1, - <<"hasnext">> := false - } - } = jsx:decode(Request1_1), + ?assertEqual( + #{ + <<"data">> => [], + <<"meta">> => #{ + <<"limit">> => 20, + <<"page">> => 1, + <<"hasnext">> => false + } + }, + jsx:decode(Request1_1) + ), {ok, 200, Request2} = request( @@ -160,6 +163,14 @@ t_api(_) -> [] ), + % ensure that db contain a mix of records + {ok, 204, _} = + request( + post, + uri(["authorization", "sources", "built_in_database", "username"]), + [?USERNAME_RULES_EXAMPLE] + ), + {ok, 204, _} = request( post, diff --git a/apps/emqx_management/src/emqx_mgmt_api.erl b/apps/emqx_management/src/emqx_mgmt_api.erl index ba232daf3..e46047521 100644 --- a/apps/emqx_management/src/emqx_mgmt_api.erl +++ b/apps/emqx_management/src/emqx_mgmt_api.erl @@ -384,8 +384,6 @@ apply_total_query(QueryState = #{table := Tab}) -> Fun(Tab) end. -counting_total_fun(_QueryState = #{qs := {[], []}}) -> - fun(Tab) -> ets:info(Tab, size) end; counting_total_fun(_QueryState = #{match_spec := Ms, fuzzy_fun := undefined}) -> %% XXX: Calculating the total number of data that match a certain %% condition under a large table is very expensive because the @@ -400,7 +398,9 @@ counting_total_fun(_QueryState = #{match_spec := Ms, fuzzy_fun := undefined}) -> counting_total_fun(_QueryState = #{fuzzy_fun := FuzzyFun}) when FuzzyFun =/= undefined -> %% XXX: Calculating the total number for a fuzzy searching is very very expensive %% so it is not supported now - false. + false; +counting_total_fun(_QueryState = #{qs := {[], []}}) -> + fun(Tab) -> ets:info(Tab, size) end. %% ResultAcc :: #{count := integer(), %% cursor := integer(), From 8c68f8e50e8709bc5b07099d3b3229c37b3166e8 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Fri, 13 Jan 2023 13:55:24 +0300 Subject: [PATCH 2/2] chore: add a changelog entry --- changes/v5.0.15/fix-9749-en.md | 1 + changes/v5.0.15/fix-9749-zh.md | 1 + 2 files changed, 2 insertions(+) create mode 100644 changes/v5.0.15/fix-9749-en.md create mode 100644 changes/v5.0.15/fix-9749-zh.md diff --git a/changes/v5.0.15/fix-9749-en.md b/changes/v5.0.15/fix-9749-en.md new file mode 100644 index 000000000..f079385ce --- /dev/null +++ b/changes/v5.0.15/fix-9749-en.md @@ -0,0 +1 @@ +In some cases search APIs could respond with an incorrect `count` value in the metadata, that is usually much bigger than expected, this is now fixed. diff --git a/changes/v5.0.15/fix-9749-zh.md b/changes/v5.0.15/fix-9749-zh.md new file mode 100644 index 000000000..356cf9475 --- /dev/null +++ b/changes/v5.0.15/fix-9749-zh.md @@ -0,0 +1 @@ +在某些情况下,搜索 API 可能会在元数据中响应不正确的 `count` 值,这通常比预期的要大得多,现在已经修复了。