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

refactor: avoid looking up cache for existence checks

zmstone 1 год назад
Родитель
Сommit
e2a139eb95

+ 4 - 0
apps/emqx_bridge/src/emqx_bridge.erl

@@ -40,6 +40,7 @@
     unload/0,
     lookup/1,
     lookup/2,
+    is_exist_v1/2,
     get_metrics/2,
     create/3,
     disable_enable/3,
@@ -327,6 +328,9 @@ lookup(Id) ->
     {Type, Name} = emqx_bridge_resource:parse_bridge_id(Id),
     lookup(Type, Name).
 
+is_exist_v1(Type, Name) ->
+    emqx_resource:is_exist(emqx_bridge_resource:resource_id(Type, Name)).
+
 lookup(Type, Name) ->
     case emqx_bridge_v2:is_bridge_v2_type(Type) of
         true ->

+ 5 - 5
apps/emqx_bridge/src/emqx_bridge_v2.erl

@@ -58,7 +58,7 @@
     check_deps_and_remove/3,
     check_deps_and_remove/4
 ]).
--export([lookup_action/2, lookup_source/2]).
+-export([is_action_exist/2, is_source_exist/2]).
 
 %% Operations
 
@@ -236,11 +236,11 @@ unload_bridges(ConfRooKey) ->
 lookup(Type, Name) ->
     lookup(?ROOT_KEY_ACTIONS, Type, Name).
 
-lookup_action(Type, Name) ->
-    lookup(?ROOT_KEY_ACTIONS, Type, Name).
+is_action_exist(Type, Name) ->
+    is_exist(?ROOT_KEY_ACTIONS, Type, Name).
 
-lookup_source(Type, Name) ->
-    lookup(?ROOT_KEY_SOURCES, Type, Name).
+is_source_exist(Type, Name) ->
+    is_exist(?ROOT_KEY_SOURCES, Type, Name).
 
 is_exist(ConfRootName, Type, Name) ->
     {error, not_found} =/= lookup_raw_conf(ConfRootName, Type, Name).

+ 7 - 5
apps/emqx_bridge/src/emqx_bridge_v2_api.erl

@@ -808,7 +808,7 @@ handle_update(ConfRootKey, Id, Conf0) ->
     Conf1 = filter_out_request_body(Conf0),
     ?TRY_PARSE_ID(
         Id,
-        case emqx_bridge_v2:is_exists(ConfRootKey, BridgeType, BridgeName) of
+        case emqx_bridge_v2:is_exist(ConfRootKey, BridgeType, BridgeName) of
             true ->
                 RawConf = emqx:get_raw_config([ConfRootKey, BridgeType, BridgeName], #{}),
                 Conf = emqx_utils:deobfuscate(Conf1, RawConf),
@@ -920,7 +920,7 @@ handle_probe(ConfRootKey, Request) ->
     RequestMeta = #{module => ?MODULE, method => post, path => Path},
     case emqx_dashboard_swagger:filter_check_request_and_translate_body(Request, RequestMeta) of
         {ok, #{body := #{<<"type">> := Type} = Params}} ->
-            Params1 = maybe_deobfuscate_bridge_probe(Params),
+            Params1 = maybe_deobfuscate_bridge_probe(ConfRootKey, Params),
             Params2 = maps:remove(<<"type">>, Params1),
             case emqx_bridge_v2:create_dry_run(ConfRootKey, Type, Params2) of
                 ok ->
@@ -942,8 +942,10 @@ handle_probe(ConfRootKey, Request) ->
     end.
 
 %%% API helpers
-maybe_deobfuscate_bridge_probe(#{<<"type">> := ActionType, <<"name">> := BridgeName} = Params) ->
-    case emqx_bridge_v2:lookup_raw_conf(ActionType, BridgeName) of
+maybe_deobfuscate_bridge_probe(
+    ConfRootKey, #{<<"type">> := ActionType, <<"name">> := BridgeName} = Params
+) ->
+    case emqx_bridge_v2:lookup_raw_conf(ConfRootKey, ActionType, BridgeName) of
         {ok, RawConf} ->
             %% TODO check if RawConf obtained above is compatible with the commented out code below
             %% RawConf = emqx:get_raw_config([bridges, BridgeType, BridgeName], #{}),
@@ -952,7 +954,7 @@ maybe_deobfuscate_bridge_probe(#{<<"type">> := ActionType, <<"name">> := BridgeN
             %% A bridge may be probed before it's created, so not finding it here is fine
             Params
     end;
-maybe_deobfuscate_bridge_probe(Params) ->
+maybe_deobfuscate_bridge_probe(_ConfRootKey, Params) ->
     Params.
 
 is_ok(ok) ->

+ 5 - 8
apps/emqx_rule_engine/src/emqx_rule_engine.erl

@@ -667,17 +667,14 @@ validate_bridge_existence_in_actions(#{actions := Actions, from := Froms} = _Rul
     NonExistentBridgeIDs =
         lists:filter(
             fun({Kind, Type, Name}) ->
-                LookupFn =
+                IsExist =
                     case Kind of
-                        action -> fun emqx_bridge_v2:lookup_action/2;
-                        source -> fun emqx_bridge_v2:lookup_source/2;
-                        bridge_v1 -> fun emqx_bridge:lookup/2
+                        action -> fun emqx_bridge_v2:is_action_exist/2;
+                        source -> fun emqx_bridge_v2:is_source_exist/2;
+                        bridge_v1 -> fun emqx_bridge:is_exist_v1/2
                     end,
                 try
-                    case LookupFn(Type, Name) of
-                        {ok, _} -> false;
-                        {error, _} -> true
-                    end
+                    not IsExist(Type, Name)
                 catch
                     _:_ -> true
                 end