fix(machine): some apps not restarted after joining into the cluster
This commit is contained in:
parent
a42ab3d9da
commit
626a4c4713
|
@ -96,7 +96,6 @@ reboot_apps() ->
|
||||||
, emqx_resource
|
, emqx_resource
|
||||||
, emqx_rule_engine
|
, emqx_rule_engine
|
||||||
, emqx_bridge
|
, emqx_bridge
|
||||||
, emqx_bridge_mqtt
|
|
||||||
, emqx_plugin_libs
|
, emqx_plugin_libs
|
||||||
, emqx_management
|
, emqx_management
|
||||||
, emqx_retainer
|
, emqx_retainer
|
||||||
|
@ -112,17 +111,17 @@ sorted_reboot_apps() ->
|
||||||
|
|
||||||
app_deps(App) ->
|
app_deps(App) ->
|
||||||
case application:get_key(App, applications) of
|
case application:get_key(App, applications) of
|
||||||
undefined -> [];
|
undefined -> undefined;
|
||||||
{ok, List} -> lists:filter(fun(A) -> lists:member(A, reboot_apps()) end, List)
|
{ok, List} -> lists:filter(fun(A) -> lists:member(A, reboot_apps()) end, List)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
sorted_reboot_apps(Apps) ->
|
sorted_reboot_apps(Apps) ->
|
||||||
G = digraph:new(),
|
G = digraph:new(),
|
||||||
try
|
try
|
||||||
lists:foreach(fun({App, Deps}) -> add_app(G, App, Deps) end, Apps),
|
NoDepApps = add_apps_to_digraph(G, Apps),
|
||||||
case digraph_utils:topsort(G) of
|
case digraph_utils:topsort(G) of
|
||||||
Sorted when is_list(Sorted) ->
|
Sorted when is_list(Sorted) ->
|
||||||
Sorted;
|
Sorted ++ (NoDepApps -- Sorted);
|
||||||
false ->
|
false ->
|
||||||
Loops = find_loops(G),
|
Loops = find_loops(G),
|
||||||
error({circular_application_dependency, Loops})
|
error({circular_application_dependency, Loops})
|
||||||
|
@ -131,17 +130,29 @@ sorted_reboot_apps(Apps) ->
|
||||||
digraph:delete(G)
|
digraph:delete(G)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
add_app(G, App, undefined) ->
|
add_apps_to_digraph(G, Apps) ->
|
||||||
|
lists:foldl(fun
|
||||||
|
({App, undefined}, Acc) ->
|
||||||
|
?SLOG(debug, #{msg => "app_is_not_loaded", app => App}),
|
||||||
|
Acc;
|
||||||
|
({App, []}, Acc) ->
|
||||||
|
Acc ++ [App]; %% use '++' to keep the original order
|
||||||
|
({App, Deps}, Acc) ->
|
||||||
|
add_app_deps_to_digraph(G, App, Deps),
|
||||||
|
Acc
|
||||||
|
end, [], Apps).
|
||||||
|
|
||||||
|
add_app_deps_to_digraph(G, App, undefined) ->
|
||||||
?SLOG(debug, #{msg => "app_is_not_loaded", app => App}),
|
?SLOG(debug, #{msg => "app_is_not_loaded", app => App}),
|
||||||
%% not loaded
|
%% not loaded
|
||||||
add_app(G, App, []);
|
add_app_deps_to_digraph(G, App, []);
|
||||||
add_app(_G, _App, []) ->
|
add_app_deps_to_digraph(_G, _App, []) ->
|
||||||
ok;
|
ok;
|
||||||
add_app(G, App, [Dep | Deps]) ->
|
add_app_deps_to_digraph(G, App, [Dep | Deps]) ->
|
||||||
digraph:add_vertex(G, App),
|
digraph:add_vertex(G, App),
|
||||||
digraph:add_vertex(G, Dep),
|
digraph:add_vertex(G, Dep),
|
||||||
digraph:add_edge(G, Dep, App), %% dep -> app as dependency
|
digraph:add_edge(G, Dep, App), %% dep -> app as dependency
|
||||||
add_app(G, App, Deps).
|
add_app_deps_to_digraph(G, App, Deps).
|
||||||
|
|
||||||
find_loops(G) ->
|
find_loops(G) ->
|
||||||
lists:filtermap(
|
lists:filtermap(
|
||||||
|
|
Loading…
Reference in New Issue