diff options
| author | Michael Klishin <mklishin@pivotal.io> | 2017-06-12 19:26:13 +0300 |
|---|---|---|
| committer | Michael Klishin <mklishin@pivotal.io> | 2017-06-12 19:26:13 +0300 |
| commit | c8e3210bc5c9604a8759ab3ea28dc76d1a00d0c2 (patch) | |
| tree | df2d487e1982abd77749a4e3035eac34d9e63556 /src/rabbit.erl | |
| parent | b52796379ac465f35f5d92b901514b3cff3040c1 (diff) | |
| parent | 245e3c73031f2a7c27d32daa802dd03ec5b8aec2 (diff) | |
| download | rabbitmq-server-git-c8e3210bc5c9604a8759ab3ea28dc76d1a00d0c2.tar.gz | |
Merge branch 'master' into rabbitmq-server-1257
Diffstat (limited to 'src/rabbit.erl')
| -rw-r--r-- | src/rabbit.erl | 71 |
1 files changed, 49 insertions, 22 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl index 10bb23b22b..26a69ddeea 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -19,11 +19,12 @@ -behaviour(application). -export([start/0, boot/0, stop/0, - stop_and_halt/0, await_startup/0, status/0, is_running/0, alarms/0, + stop_and_halt/0, await_startup/0, await_startup/1, + status/0, is_running/0, alarms/0, is_running/1, environment/0, rotate_logs/0, force_event_refresh/1, start_fhc/0]). -export([start/2, stop/1, prep_stop/1]). --export([start_apps/1, stop_apps/1]). +-export([start_apps/1, start_apps/2, stop_apps/1]). -export([log_locations/0, config_files/0, decrypt_config/2]). %% for testing and mgmt-agent -ifdef(TEST). @@ -266,6 +267,8 @@ -spec boot_delegate() -> 'ok'. -spec recover() -> 'ok'. -spec start_apps([app_name()]) -> 'ok'. +-spec start_apps([app_name()], + #{app_name() => permanent|transient|temporary}) -> 'ok'. -spec stop_apps([app_name()]) -> 'ok'. %%---------------------------------------------------------------------------- @@ -467,7 +470,7 @@ stop() -> undefined -> ok; _ -> rabbit_log:info("RabbitMQ hasn't finished starting yet. Waiting for startup to finish before stopping..."), - wait_for_boot_to_finish() + ok = wait_for_boot_to_finish(node()) end, rabbit_log:info("RabbitMQ is asked to stop...~n", []), Apps = ?APPS ++ rabbit_plugins:active(), @@ -502,6 +505,9 @@ stop_and_halt() -> ok. start_apps(Apps) -> + start_apps(Apps, #{}). + +start_apps(Apps, AppModes) -> app_utils:load_applications(Apps), ConfigEntryDecoder = case application:get_env(rabbit, config_entry_decoder) of @@ -541,7 +547,8 @@ start_apps(Apps) -> true -> ok %% will run during start of rabbit app end, ok = app_utils:start_applications(OrderedApps, - handle_app_error(could_not_start)). + handle_app_error(could_not_start), + AppModes). %% This function retrieves the correct IoDevice for requesting %% input. The problem with using the default IoDevice is that @@ -637,32 +644,52 @@ handle_app_error(Term) -> end. await_startup() -> - case is_booting() of - true -> wait_for_boot_to_finish(); + await_startup(node()). + +await_startup(Node) -> + case is_booting(Node) of + true -> wait_for_boot_to_finish(Node); false -> - case is_running() of + case is_running(Node) of true -> ok; - false -> wait_for_boot_to_start(), - wait_for_boot_to_finish() + false -> wait_for_boot_to_start(Node), + wait_for_boot_to_finish(Node) end end. -is_booting() -> - whereis(rabbit_boot) /= undefined. +is_booting(Node) -> + case rpc:call(Node, erlang, whereis, [rabbit_boot]) of + {badrpc, _} = Err -> Err; + undefined -> false; + P when is_pid(P) -> true + end. -wait_for_boot_to_start() -> - case whereis(rabbit_boot) of - undefined -> timer:sleep(100), - wait_for_boot_to_start(); - _ -> ok +wait_for_boot_to_start(Node) -> + case is_booting(Node) of + false -> + timer:sleep(100), + wait_for_boot_to_start(Node); + {badrpc, _} = Err -> + Err; + true -> + ok end. -wait_for_boot_to_finish() -> - case whereis(rabbit_boot) of - undefined -> true = is_running(), - ok; - _ -> timer:sleep(100), - wait_for_boot_to_finish() +wait_for_boot_to_finish(Node) -> + case is_booting(Node) of + false -> + %% We don't want badrpc error to be interpreted as false, + %% so we don't call rabbit:is_running(Node) + case rpc:call(Node, rabbit, is_running, []) of + true -> ok; + false -> {error, rabbit_is_not_running}; + {badrpc, _} = Err -> Err + end; + {badrpc, _} = Err -> + Err; + true -> + timer:sleep(100), + wait_for_boot_to_finish(Node) end. status() -> |
