diff --git a/src/emqx_alarm.erl b/src/emqx_alarm.erl index 37d6fe1e8..a0e230c46 100644 --- a/src/emqx_alarm.erl +++ b/src/emqx_alarm.erl @@ -165,6 +165,10 @@ init([Opts]) -> size_limit = SizeLimit, validity_period = ValidityPeriod})}. +%% suppress dialyzer warning due to dirty read/write race condition. +%% TODO: change from dirty_read/write to transactional. +%% TODO: handle mnesia write errors. +-dialyzer([{nowarn_function, [handle_call/3]}]). handle_call({activate_alarm, Name, Details}, _From, State = #state{actions = Actions}) -> case mnesia:dirty_read(?ACTIVATED_ALARM, Name) of [#activated_alarm{name = Name}] -> @@ -211,7 +215,7 @@ handle_call({deactivate_alarm, Name}, _From, State = #state{actions = Actions, end; handle_call(delete_all_deactivated_alarms, _From, State) -> - mnesia:clear_table(?DEACTIVATED_ALARM), + clear_table(?DEACTIVATED_ALARM), {reply, ok, State}; handle_call({get_alarms, all}, _From, State) -> @@ -266,7 +270,17 @@ deactivate_all_alarms() -> message = Message, deactivate_at = erlang:system_time(microsecond)}) end, ets:tab2list(?ACTIVATED_ALARM)), - mnesia:clear_table(?ACTIVATED_ALARM). + clear_table(?ACTIVATED_ALARM). + +%% Delete all records from the given table, ignore result. +clear_table(TableName) -> + case mnesia:clear_table(TableName) of + {aborted, Reason} -> + ?LOG(warning, "Faile to clear table ~p reason: ~p", + [TableName, Reason]); + {atomic, ok} -> + ok + end. ensure_delete_timer(State = #state{validity_period = ValidityPeriod}) -> State#state{timer = emqx_misc:start_timer(ValidityPeriod div 1, delete_expired_deactivated_alarm)}. @@ -299,7 +313,8 @@ do_actions(Operation, Alarm, [publish | More]) -> {ok, Payload} = encode_to_json(Alarm), Message = emqx_message:make(?MODULE, 0, Topic, Payload, #{sys => true}, #{properties => #{'Content-Type' => <<"application/json">>}}), - emqx_broker:safe_publish(Message), + %% TODO log failed publishes + _ = emqx_broker:safe_publish(Message), do_actions(Operation, Alarm, More). encode_to_json(Alarm) ->