Przeglądaj źródła

fix(emqx_mgmt_data_backup): implement importer modules ordering

`emqx_bridge_v2` depends on `emqx_connector`, so connectors must be imported first.
Serge Tupchii 2 lat temu
rodzic
commit
0562585c8f
1 zmienionych plików z 24 dodań i 2 usunięć
  1. 24 2
      apps/emqx_management/src/emqx_mgmt_data_backup.erl

+ 24 - 2
apps/emqx_management/src/emqx_mgmt_data_backup.erl

@@ -61,6 +61,12 @@
     <<"slow_subs">>
 ]).
 
+%% emqx_bridge_v2 depends on emqx_connector, so connectors need to be imported first
+-define(IMPORT_ORDER, [
+    emqx_connector,
+    emqx_bridge_v2
+]).
+
 -define(DEFAULT_OPTS, #{}).
 -define(tar(_FileName_), _FileName_ ++ ?TAR_SUFFIX).
 -define(fmt_tar_err(_Expr_),
@@ -534,7 +540,7 @@ do_import_conf(RawConf, Opts) ->
     GenConfErrs = filter_errors(maps:from_list(import_generic_conf(RawConf))),
     maybe_print_errors(GenConfErrs, Opts),
     Errors =
-        lists:foldr(
+        lists:foldl(
             fun(Module, ErrorsAcc) ->
                 case Module:import_config(RawConf) of
                     {ok, #{changed := Changed}} ->
@@ -545,11 +551,27 @@ do_import_conf(RawConf, Opts) ->
                 end
             end,
             GenConfErrs,
-            find_behaviours(emqx_config_backup)
+            sort_importer_modules(find_behaviours(emqx_config_backup))
         ),
     maybe_print_errors(Errors, Opts),
     Errors.
 
+sort_importer_modules(Modules) ->
+    lists:sort(
+        fun(M1, M2) -> order(M1, ?IMPORT_ORDER) =< order(M2, ?IMPORT_ORDER) end,
+        Modules
+    ).
+
+order(Elem, List) ->
+    order(Elem, List, 0).
+
+order(_Elem, [], Order) ->
+    Order;
+order(Elem, [Elem | _], Order) ->
+    Order;
+order(Elem, [_ | T], Order) ->
+    order(Elem, T, Order + 1).
+
 import_generic_conf(Data) ->
     lists:map(
         fun(Key) ->