Просмотр исходного кода

fix(rule_engine): refresh rules and then re-enable it

Shawn 4 лет назад
Родитель
Сommit
bea28d887c

+ 2 - 2
apps/emqx_rule_engine/src/emqx_rule_engine.erl

@@ -470,10 +470,10 @@ may_update_rule_params(Rule = #rule{enabled = OldEnb, actions = Actions, state =
     State = case {OldEnb, NewEnb} of
         {false, true} ->
             refresh_rule(Rule),
-            force_enabled;
+            force_changed;
         {true, false} ->
             clear_actions(Actions),
-            force_disabled;
+            force_changed;
         _NoChange -> OldState
     end,
     may_update_rule_params(Rule#rule{enabled = NewEnb, state = State}, maps:remove(enabled, Params));

+ 6 - 4
apps/emqx_rule_engine/src/emqx_rule_monitor.erl

@@ -105,7 +105,7 @@ retry_loop(resource, ResId, Interval) ->
                 {ok, #resource_type{on_create = {M, F}}} =
                     emqx_rule_registry:find_resource_type(Type),
                 ok = emqx_rule_engine:init_resource(M, F, ResId, Config),
-                enable_rules_of_resource(ResId)
+                refresh_and_enable_rules_of_resource(ResId)
             catch
                 Err:Reason:ST ->
                     ?LOG(warning, "init_resource failed: ~p, ~0p",
@@ -117,9 +117,11 @@ retry_loop(resource, ResId, Interval) ->
             ok
     end.
 
-enable_rules_of_resource(ResId) ->
+refresh_and_enable_rules_of_resource(ResId) ->
     lists:foreach(
-        fun (#rule{enabled = false, state = refresh_failed_at_bootup} = Rule) ->
-                emqx_rule_registry:add_rule(Rule#rule{enabled = true, state = normal});
+        fun (#rule{id = Id, enabled = false, state = refresh_failed_at_bootup} = Rule) ->
+                emqx_rule_engine:refresh_rule(Rule),
+                emqx_rule_registry:add_rule(Rule#rule{enabled = true, state = normal}),
+                ?LOG(info, "rule ~s is refreshed and re-enabled", [Id]);
             (_) -> ok
         end, emqx_rule_registry:find_rules_depends_on_resource(ResId)).