From e8e956b074745c094c5d203d33382186e41a80da Mon Sep 17 00:00:00 2001 From: k32 <10274441+k32@users.noreply.github.com> Date: Mon, 28 Jun 2021 21:02:26 +0200 Subject: [PATCH 1/2] chore(mod_delayed): Add RLOG shard --- apps/emqx/include/emqx.hrl | 1 + apps/emqx/src/emqx_app.erl | 1 + apps/emqx_modules/src/emqx_mod_delayed.erl | 7 ++++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/emqx/include/emqx.hrl b/apps/emqx/include/emqx.hrl index 67744306e..d148e01a3 100644 --- a/apps/emqx/include/emqx.hrl +++ b/apps/emqx/include/emqx.hrl @@ -25,6 +25,7 @@ -define(COMMON_SHARD, emqx_common_shard). -define(SHARED_SUB_SHARD, emqx_shared_sub_shard). +-define(MOD_DELAYED_SHARD, emqx_delayed_shard). %%-------------------------------------------------------------------- %% Banner diff --git a/apps/emqx/src/emqx_app.erl b/apps/emqx/src/emqx_app.erl index 06bebe465..60f0fc40d 100644 --- a/apps/emqx/src/emqx_app.erl +++ b/apps/emqx/src/emqx_app.erl @@ -32,6 +32,7 @@ , ?COMMON_SHARD , ?SHARED_SUB_SHARD , ?RULE_ENGINE_SHARD + , ?MOD_DELAYED_SHARD ]). -include("emqx_release.hrl"). diff --git a/apps/emqx_modules/src/emqx_mod_delayed.erl b/apps/emqx_modules/src/emqx_mod_delayed.erl index ac5be58b2..925952078 100644 --- a/apps/emqx_modules/src/emqx_mod_delayed.erl +++ b/apps/emqx_modules/src/emqx_mod_delayed.erl @@ -58,6 +58,8 @@ -define(SERVER, ?MODULE). -define(MAX_INTERVAL, 4294967). +-rlog_shard({?MOD_DELAYED_SHARD, ?TAB}). + %%-------------------------------------------------------------------- %% Mnesia bootstrap %%-------------------------------------------------------------------- @@ -137,7 +139,7 @@ init([]) -> ensure_publish_timer(#{timer => undefined, publish_at => 0}))}. handle_call({store, DelayedMsg = #delayed_message{key = Key}}, _From, State) -> - ok = mnesia:dirty_write(?TAB, DelayedMsg), + ok = ekka_mnesia:dirty_write(?TAB, DelayedMsg), emqx_metrics:inc('messages.delayed'), {reply, ok, ensure_publish_timer(Key, State)}; @@ -152,7 +154,7 @@ handle_cast(Msg, State) -> %% Do Publish... handle_info({timeout, TRef, do_publish}, State = #{timer := TRef}) -> DeletedKeys = do_publish(mnesia:dirty_first(?TAB), os:system_time(seconds)), - lists:foreach(fun(Key) -> mnesia:dirty_delete(?TAB, Key) end, DeletedKeys), + lists:foreach(fun(Key) -> ekka_mnesia:dirty_delete(?TAB, Key) end, DeletedKeys), {noreply, ensure_publish_timer(State#{timer := undefined, publish_at := 0})}; handle_info(stats, State = #{stats_fun := StatsFun}) -> @@ -222,4 +224,3 @@ do_publish(Key = {Ts, _Id}, Now, Acc) when Ts =< Now -> -spec(delayed_count() -> non_neg_integer()). delayed_count() -> mnesia:table_info(?TAB, size). - From cc5bc4f7ca3e831210d37dde3b3befd2ae013f24 Mon Sep 17 00:00:00 2001 From: k32 <10274441+k32@users.noreply.github.com> Date: Tue, 29 Jun 2021 00:27:53 +0200 Subject: [PATCH 2/2] build(rlog): Add xref check for forbidden mnesia APIs --- rebar.config | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rebar.config b/rebar.config index 205d892aa..e5f46125a 100644 --- a/rebar.config +++ b/rebar.config @@ -15,6 +15,15 @@ {xref_checks,[undefined_function_calls,undefined_functions,locals_not_used, deprecated_function_calls,warnings_as_errors,deprecated_functions]}. +%% Check for the mnesia calls forbidden by Ekka: +{xref_queries, + [ {"E || \"mnesia\":\"dirty_write\"/\".*\" : Fun", []} + , {"E || \"mnesia\":\"dirty_delete.*\"/\".*\" : Fun", []} + , {"E || \"mnesia\":\"transaction\"/\".*\" : Fun", []} + , {"E || \"mnesia\":\"async_dirty\"/\".*\" : Fun", []} + , {"E || \"mnesia\":\"clear_table\"/\".*\" : Fun", []} + ]}. + {dialyzer, [ {warnings, [unmatched_returns, error_handling, race_conditions]}, {plt_location, "."},