From 4cd056cab54d61b328bb1ce2fb0a947ea1ae7a8d Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Mon, 17 May 2021 17:59:01 +0800 Subject: [PATCH] fix(rule_engine): update status to false when refresh resource failed (#4821) * fix(rule_engine): update status to false when refresh resource failed * fix(dialyzer): ignore import_modules/1 created fun has no local return * fix(appup): update appup for rule engine --- .../src/emqx_mgmt_data_backup.erl | 1 + .../src/emqx_rule_engine.app.src | 2 +- .../src/emqx_rule_engine.appup.src | 14 +++++-- .../emqx_rule_engine/src/emqx_rule_engine.erl | 37 +++++++++---------- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt_data_backup.erl b/apps/emqx_management/src/emqx_mgmt_data_backup.erl index 1eb6f8245..71a92686e 100644 --- a/apps/emqx_management/src/emqx_mgmt_data_backup.erl +++ b/apps/emqx_management/src/emqx_mgmt_data_backup.erl @@ -503,6 +503,7 @@ do_import_acl_mnesia(Acls) -> end. -ifdef(EMQX_ENTERPRISE). +-dialyzer({nowarn_function, [import_modules/1]}). import_modules(Modules) -> case ets:info(emqx_modules) of undefined -> diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.app.src b/apps/emqx_rule_engine/src/emqx_rule_engine.app.src index 86846ccde..83b2d7632 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.app.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.app.src @@ -1,6 +1,6 @@ {application, emqx_rule_engine, [{description, "EMQ X Rule Engine"}, - {vsn, "4.3.1"}, % strict semver, bump manually! + {vsn, "4.3.2"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_rule_engine_sup, emqx_rule_registry]}, {applications, [kernel,stdlib,rulesql,getopt]}, diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src index 17cecac68..446e082b7 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src @@ -1,13 +1,21 @@ %% -*-: erlang -*- -{"4.3.1", +{"4.3.2", [ {"4.3.0", - [ {load_module, emqx_rule_funcs, brutal_purge, soft_purge, []} + [ {load_module, emqx_rule_funcs, brutal_purge, soft_purge, []}, + {load_module, emqx_rule_engine, brutal_purge, soft_purge, []} + ]}, + {"4.3.1", + [ {load_module, emqx_rule_engine, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} ], [ {"4.3.0", - [ {load_module, emqx_rule_funcs, brutal_purge, soft_purge, []} + [ {load_module, emqx_rule_funcs, brutal_purge, soft_purge, []}, + {load_module, emqx_rule_engine, brutal_purge, soft_purge, []} + ]}, + {"4.3.1", + [ {load_module, emqx_rule_engine, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} ] diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index 07827ed1f..c2ccf2c29 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -408,7 +408,7 @@ refresh_resource_status() -> fun(#resource{id = ResId, type = ResType}) -> case emqx_rule_registry:find_resource_type(ResType) of {ok, #resource_type{on_status = {Mod, OnStatus}}} -> - fetch_resource_status(Mod, OnStatus, ResId); + _ = fetch_resource_status(Mod, OnStatus, ResId); _ -> ok end end, emqx_rule_registry:get_resources()). @@ -588,27 +588,26 @@ clear_action(Module, Destroy, ActionInstId) -> fetch_resource_status(Module, OnStatus, ResId) -> case emqx_rule_registry:find_resource_params(ResId) of {ok, ResParams = #resource_params{params = Params, status = #{is_alive := LastIsAlive}}} -> - try - NewStatus = - case Module:OnStatus(ResId, Params) of - #{is_alive := LastIsAlive} = Status -> Status; - #{is_alive := true} = Status -> - {ok, Type} = find_type(ResId), - Name = alarm_name_of_resource_down(Type, ResId), - emqx_alarm:deactivate(Name), - Status; - #{is_alive := false} = Status -> - {ok, Type} = find_type(ResId), - Name = alarm_name_of_resource_down(Type, ResId), - emqx_alarm:activate(Name, #{id => ResId, type => Type}), - Status - end, - emqx_rule_registry:add_resource_params(ResParams#resource_params{status = NewStatus}), - NewStatus + NewStatus = try + case Module:OnStatus(ResId, Params) of + #{is_alive := LastIsAlive} = Status -> Status; + #{is_alive := true} = Status -> + {ok, Type} = find_type(ResId), + Name = alarm_name_of_resource_down(Type, ResId), + emqx_alarm:deactivate(Name), + Status; + #{is_alive := false} = Status -> + {ok, Type} = find_type(ResId), + Name = alarm_name_of_resource_down(Type, ResId), + emqx_alarm:activate(Name, #{id => ResId, type => Type}), + Status + end catch _Error:Reason:STrace -> ?LOG(error, "get resource status for ~p failed: ~0p", [ResId, {Reason, STrace}]), #{is_alive => false} - end; + end, + emqx_rule_registry:add_resource_params(ResParams#resource_params{status = NewStatus}), + NewStatus; not_found -> #{is_alive => false} end.