diff options
| author | Tim Watson <tim@rabbitmq.com> | 2012-05-04 11:18:53 +0100 |
|---|---|---|
| committer | Tim Watson <tim@rabbitmq.com> | 2012-05-04 11:18:53 +0100 |
| commit | a59ac79a6f0393cbe59c5afb51cb5be703485a61 (patch) | |
| tree | 49a8556e3913459b5a55e1be96c9b72f3cb981dd | |
| parent | 9d138b35a0a38144f0f475a6cbf7d31af9de2b93 (diff) | |
| download | rabbitmq-server-git-a59ac79a6f0393cbe59c5afb51cb5be703485a61.tar.gz | |
start and start_cold both defer to rabbit_misc to calculate application load order
| -rw-r--r-- | src/rabbit.erl | 33 | ||||
| -rw-r--r-- | src/rabbit_misc.erl | 24 | ||||
| -rw-r--r-- | src/rabbit_plugins.erl | 8 |
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 " |
