From 87780c1c1b7ad26abb6b7678c87043ce57b1904b Mon Sep 17 00:00:00 2001 From: zhouzb Date: Tue, 11 Aug 2020 16:58:21 +0800 Subject: [PATCH] fix(static-cluster): fix the issue that static cluster failure caused by the wrong way of creating tables --- src/emqx_alarm.erl | 39 +++++++++++++++++++++++++++------------ src/emqx_mod_delayed.erl | 27 ++++++++++++++++++++------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/emqx_alarm.erl b/src/emqx_alarm.erl index 229b534b1..41553e79c 100644 --- a/src/emqx_alarm.erl +++ b/src/emqx_alarm.erl @@ -23,6 +23,12 @@ -logger_header("[Alarm Handler]"). +%% Mnesia bootstrap +-export([mnesia/1]). + +-boot_mnesia({mnesia, [boot]}). +-copy_mnesia({mnesia, [copy]}). + -export([ start_link/1 , stop/0 ]). @@ -88,6 +94,27 @@ -compile(nowarn_export_all). -endif. +%%-------------------------------------------------------------------- +%% Mnesia bootstrap +%%-------------------------------------------------------------------- + +mnesia(boot) -> + ok = ekka_mnesia:create_table(?ACTIVATED_ALARM, + [{type, set}, + {disc_copies, [node()]}, + {local_content, true}, + {record_name, activated_alarm}, + {attributes, record_info(fields, activated_alarm)}]), + ok = ekka_mnesia:create_table(?DEACTIVATED_ALARM, + [{type, ordered_set}, + {disc_copies, [node()]}, + {local_content, true}, + {record_name, deactivated_alarm}, + {attributes, record_info(fields, deactivated_alarm)}]); +mnesia(copy) -> + ok = ekka_mnesia:copy_table(?ACTIVATED_ALARM), + ok = ekka_mnesia:copy_table(?DEACTIVATED_ALARM). + %%-------------------------------------------------------------------- %% API %%-------------------------------------------------------------------- @@ -130,18 +157,6 @@ init([]) -> Opts = [{actions, [log, publish]}], init([Opts]); init([Opts]) -> - ok = ekka_mnesia:create_table(?ACTIVATED_ALARM, - [{type, set}, - {disc_copies, [node()]}, - {local_content, true}, - {record_name, activated_alarm}, - {attributes, record_info(fields, activated_alarm)}]), - ok = ekka_mnesia:create_table(?DEACTIVATED_ALARM, - [{type, ordered_set}, - {disc_copies, [node()]}, - {local_content, true}, - {record_name, deactivated_alarm}, - {attributes, record_info(fields, deactivated_alarm)}]), deactivate_all_alarms(), Actions = proplists:get_value(actions, Opts), SizeLimit = proplists:get_value(size_limit, Opts), diff --git a/src/emqx_mod_delayed.erl b/src/emqx_mod_delayed.erl index 096fecbb3..208da68ca 100644 --- a/src/emqx_mod_delayed.erl +++ b/src/emqx_mod_delayed.erl @@ -22,6 +22,12 @@ -include_lib("emqx/include/emqx.hrl"). -include_lib("emqx/include/logger.hrl"). +%% Mnesia bootstrap +-export([mnesia/1]). + +-boot_mnesia({mnesia, [boot]}). +-copy_mnesia({mnesia, [copy]}). + %% emqx_gen_mod callbacks -export([ load/1 , unload/1 @@ -50,6 +56,20 @@ -define(SERVER, ?MODULE). -define(MAX_INTERVAL, 4294967). +%%-------------------------------------------------------------------- +%% Mnesia bootstrap +%%-------------------------------------------------------------------- + +mnesia(boot) -> + ok = ekka_mnesia:create_table(?TAB, [ + {type, ordered_set}, + {disc_copies, [node()]}, + {local_content, true}, + {record_name, delayed_message}, + {attributes, record_info(fields, delayed_message)}]); +mnesia(copy) -> + ok = ekka_mnesia:copy_table(?TAB, disc_copies). + %%-------------------------------------------------------------------- %% Load/Unload %%-------------------------------------------------------------------- @@ -107,13 +127,6 @@ store(DelayedMsg) -> %%-------------------------------------------------------------------- init([]) -> - ok = ekka_mnesia:create_table(?TAB, [ - {type, ordered_set}, - {disc_copies, [node()]}, - {local_content, true}, - {record_name, delayed_message}, - {attributes, record_info(fields, delayed_message)}]), - ok = ekka_mnesia:copy_table(?TAB, disc_copies), {ok, ensure_publish_timer(#{timer => undefined, publish_at => 0})}. handle_call({store, DelayedMsg = #delayed_message{key = Key}}, _From, State) ->