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

Merge pull request #12764 from zhongwencool/fix-bpapi-undef

fix: bpapi undef on old node
zhongwencool 1 год назад
Родитель
Сommit
2926518b3d
1 измененных файлов с 30 добавлено и 2 удалено
  1. 30 2
      apps/emqx/src/bpapi/emqx_bpapi.erl

+ 30 - 2
apps/emqx/src/bpapi/emqx_bpapi.erl

@@ -86,8 +86,36 @@ supported_version(API) ->
 -spec announce(node(), atom()) -> ok.
 announce(Node, App) ->
     {ok, Data} = file:consult(?MODULE:versions_file(App)),
-    {atomic, ok} = mria:transaction(?COMMON_SHARD, fun ?MODULE:announce_fun/2, [Node, Data]),
-    ok.
+    %% replicant(5.6.0) will call old core(<5.6.0) announce_fun/2 is undef on old core
+    %% so we just use anonymous function to update.
+    try
+        {atomic, ok} = mria:transaction(?COMMON_SHARD, fun ?MODULE:announce_fun/2, [Node, Data]),
+        ok
+    catch
+        error:undef ->
+            {atomic, ok} = mria:transaction(
+                ?COMMON_SHARD,
+                fun() ->
+                    MS = ets:fun2ms(fun(#?TAB{key = {N, API}}) when N =:= Node ->
+                        {N, API}
+                    end),
+                    OldKeys = mnesia:select(?TAB, MS, write),
+                    _ = [
+                        mnesia:delete({?TAB, Key})
+                     || Key <- OldKeys
+                    ],
+                    %% Insert new records:
+                    _ = [
+                        mnesia:write(#?TAB{key = {Node, API}, version = Version})
+                     || {API, Version} <- Data
+                    ],
+                    %% Update maximum supported version:
+                    _ = [update_minimum(API) || {API, _} <- Data],
+                    ok
+                end
+            ),
+            ok
+    end.
 
 -spec versions_file(atom()) -> file:filename_all().
 versions_file(App) ->