summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Watson <tim@rabbitmq.com>2012-05-04 11:18:53 +0100
committerTim Watson <tim@rabbitmq.com>2012-05-04 11:18:53 +0100
commita59ac79a6f0393cbe59c5afb51cb5be703485a61 (patch)
tree49a8556e3913459b5a55e1be96c9b72f3cb981dd
parent9d138b35a0a38144f0f475a6cbf7d31af9de2b93 (diff)
downloadrabbitmq-server-git-a59ac79a6f0393cbe59c5afb51cb5be703485a61.tar.gz
start and start_cold both defer to rabbit_misc to calculate application load order
-rw-r--r--src/rabbit.erl33
-rw-r--r--src/rabbit_misc.erl24
-rw-r--r--src/rabbit_plugins.erl8
3 files changed, 43 insertions, 22 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index 7f2845b60f..13afdc682e 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -305,9 +305,21 @@ start_cold() ->
start_it(fun() ->
ok = prepare(),
Plugins = determine_required_plugins(),
- ToBeLoaded = ?APPS ++ Plugins,
- StartupApps = application_load_order(ToBeLoaded, ToBeLoaded),
- ok = rabbit_misc:start_applications(StartupApps)
+ ToBeLoaded = Plugins ++ ?APPS,
+
+ io:format("~n"
+ "Activating RabbitMQ plugins ...~n"),
+
+ load_applications(queue:from_list(ToBeLoaded), sets:new()),
+ StartupApps =
+ rabbit_misc:calculate_app_dependency_ordering(ToBeLoaded),
+ ok = rabbit_misc:start_applications(StartupApps),
+
+ io:format("~w plugins activated:~n", [length(Plugins)]),
+ [io:format("* ~s-~s~n", [AppName,
+ element(2, application:get_key(AppName, vsn))])
+ || AppName <- Plugins],
+ io:nl()
end).
start_it(StartFun) ->
@@ -408,20 +420,7 @@ stop(_State) ->
application_load_order() ->
ok = load_applications(),
- LoadedApps = application:loaded_applications(),
- application_load_order(LoadedApps, ?APPS).
-
-application_load_order(LoadedApps, RootApps) ->
- {ok, G} = rabbit_misc:build_acyclic_graph(
- fun (App, _Deps) -> [{App, App}] end,
- fun (App, Deps) -> [{Dep, App} || Dep <- Deps] end,
- [{App, app_dependencies(App)} || App <- LoadedApps]),
- true = digraph:del_vertices(
- G, digraph:vertices(G) --
- digraph_utils:reachable(RootApps, G)),
- Result = digraph_utils:topsort(G),
- true = digraph:delete(G),
- Result.
+ rabbit_misc:calculate_app_dependency_ordering(?APPS).
load_applications() ->
load_applications(queue:from_list(?APPS), sets:new()).
diff --git a/src/rabbit_misc.erl b/src/rabbit_misc.erl
index 28c61a2e50..2fffc2cdab 100644
--- a/src/rabbit_misc.erl
+++ b/src/rabbit_misc.erl
@@ -42,7 +42,8 @@
-export([dirty_read_all/1, dirty_foreach_key/2, dirty_dump_log/1]).
-export([format/2, format_many/1, format_stderr/2]).
-export([with_local_io/1, local_info_msg/2]).
--export([start_applications/1, stop_applications/1]).
+-export([calculate_app_dependency_ordering/1,
+ start_applications/1, stop_applications/1]).
-export([unfold/2, ceil/1, queue_fold/3]).
-export([sort_field_table/1]).
-export([pid_to_string/1, string_to_pid/1]).
@@ -169,6 +170,7 @@
-spec(with_local_io/1 :: (fun (() -> A)) -> A).
-spec(local_info_msg/2 :: (string(), [any()]) -> 'ok').
-spec(start_applications/1 :: ([atom()]) -> 'ok').
+-spec(calculate_app_dependency_ordering/1 :: ([atom()]) -> 'ok').
-spec(stop_applications/1 :: ([atom()]) -> 'ok').
-spec(unfold/2 :: (fun ((A) -> ({'true', B, A} | 'false')), A) -> {[B], A}).
-spec(ceil/1 :: (number()) -> integer()).
@@ -637,6 +639,26 @@ stop_applications(Apps) ->
cannot_stop_application,
Apps).
+calculate_app_dependency_ordering(RootApps) ->
+ {ok, G} = build_acyclic_graph(
+ fun (App, _Deps) -> [{App, App}] end,
+ fun (App, Deps) -> [{Dep, App} || Dep <- Deps] end,
+ [{App, app_dependencies(App)} ||
+ {App, _Desc, _Vsn} <- application:loaded_applications()]),
+ try
+ true = digraph:del_vertices(G, digraph:vertices(G) --
+ digraph_utils:reachable(RootApps, G)),
+ digraph_utils:topsort(G)
+ after
+ true = digraph:delete(G)
+ end.
+
+app_dependencies(App) ->
+ case application:get_key(App, applications) of
+ undefined -> [];
+ {ok, Lst} -> Lst
+ end.
+
unfold(Fun, Init) ->
unfold(Fun, [], Init).
diff --git a/src/rabbit_plugins.erl b/src/rabbit_plugins.erl
index 3ce0d3b173..0a5f8d5197 100644
--- a/src/rabbit_plugins.erl
+++ b/src/rabbit_plugins.erl
@@ -84,12 +84,12 @@ stop() ->
ok.
prepare_plugins(EnabledPluginsFile, PluginsDistDir, DestDir) ->
- AllPlugins = rabbit_plugins:find_plugins(PluginsDistDir),
- Enabled = rabbit_plugins:read_enabled_plugins(EnabledPluginsFile),
- ToUnpack = rabbit_plugins:calculate_required_plugins(Enabled, AllPlugins),
+ AllPlugins = find_plugins(PluginsDistDir),
+ Enabled = read_enabled_plugins(EnabledPluginsFile),
+ ToUnpack = calculate_required_plugins(Enabled, AllPlugins),
ToUnpackPlugins = lookup_plugins(ToUnpack, AllPlugins),
- Missing = Enabled -- rabbit_plugins:plugin_names(ToUnpackPlugins),
+ Missing = Enabled -- plugin_names(ToUnpackPlugins),
case Missing of
[] -> ok;
_ -> io:format("Warning: the following enabled plugins were "