From d25258943b66ae68c9d3fc05d5f26093046f0e6a Mon Sep 17 00:00:00 2001 From: k32 <10274441+k32@users.noreply.github.com> Date: Wed, 12 Jan 2022 16:19:46 +0100 Subject: [PATCH] feat(bpapi): Verify emqx cluster RPC --- apps/emqx/src/bpapi/emqx_bpapi_static_checks.erl | 4 +++- apps/emqx/src/bpapi/emqx_bpapi_trans.erl | 5 +++++ apps/emqx_conf/src/emqx_cluster_rpc.erl | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/emqx/src/bpapi/emqx_bpapi_static_checks.erl b/apps/emqx/src/bpapi/emqx_bpapi_static_checks.erl index b24b6747f..4d742c600 100644 --- a/apps/emqx/src/bpapi/emqx_bpapi_static_checks.erl +++ b/apps/emqx/src/bpapi/emqx_bpapi_static_checks.erl @@ -48,6 +48,8 @@ -define(IGNORED_MODULES, "emqx_rpc"). %% List of known RPC backend modules: -define(RPC_MODULES, "gen_rpc, erpc, rpc, emqx_rpc"). +%% List of known functions also known to do RPC: +-define(RPC_FUNCTIONS, "emqx_cluster_rpc:multicall/3, emqx_cluster_rpc:multicall/5"). %% List of functions in the RPC backend modules that we can ignore: -define(IGNORED_RPC_CALLS, "gen_rpc:nodes/0"). @@ -206,7 +208,7 @@ prepare(#{reldir := RelDir, plt := PLT}) -> find_remote_calls(_Opts) -> Query = "XC | (A - [" ?IGNORED_APPS "]:App - [" ?IGNORED_MODULES "] : Mod) - || ([" ?RPC_MODULES "] : Mod - " ?IGNORED_RPC_CALLS ")", + || (([" ?RPC_MODULES "] : Mod + [" ?RPC_FUNCTIONS "]) - " ?IGNORED_RPC_CALLS ")", {ok, Calls} = xref:q(?XREF, Query), ?INFO("Calls to RPC modules ~p", [Calls]), {Callers, _Callees} = lists:unzip(Calls), diff --git a/apps/emqx/src/bpapi/emqx_bpapi_trans.erl b/apps/emqx/src/bpapi/emqx_bpapi_trans.erl index eedaacd69..aec4aa320 100644 --- a/apps/emqx/src/bpapi/emqx_bpapi_trans.erl +++ b/apps/emqx/src/bpapi/emqx_bpapi_trans.erl @@ -158,6 +158,11 @@ extract_mfa(?BACKEND(RPC, CallOrCast), [_Node, M, F, A]) when ?IS_RPC(RPC) -> {call_or_cast(CallOrCast), M, F, A}; extract_mfa(?BACKEND(RPC, CallOrCast), [_Node, M, F, A, _Timeout]) when ?IS_RPC(RPC) -> {call_or_cast(CallOrCast), M, F, A}; +%% emqx_cluster_rpc: +extract_mfa(?BACKEND(emqx_cluster_rpc, multicall), [M, F, A]) -> + {call, M, F, A}; +extract_mfa(?BACKEND(emqx_cluster_rpc, multicall), [M, F, A, _RequiredNum, _Timeout]) -> + {call, M, F, A}; extract_mfa(_, _) -> error("unrecognized RPC call"). diff --git a/apps/emqx_conf/src/emqx_cluster_rpc.erl b/apps/emqx_conf/src/emqx_cluster_rpc.erl index 87758680f..58042e34e 100644 --- a/apps/emqx_conf/src/emqx_cluster_rpc.erl +++ b/apps/emqx_conf/src/emqx_cluster_rpc.erl @@ -18,6 +18,10 @@ %% API -export([start_link/0, mnesia/1]). + +%% Note: multicall functions are statically checked by +%% `emqx_bapi_trans' and `emqx_bpapi_static_checks' modules. Don't +%% forget to update it when adding or removing them here: -export([multicall/3, multicall/5, query/1, reset/0, status/0, skip_failed_commit/1, fast_forward_to_commit/2]). -export([get_node_tnx_id/1, latest_tnx_id/0]).