summaryrefslogtreecommitdiff
path: root/src/rabbit.erl
diff options
context:
space:
mode:
authorDaniil Fedotov <daniil@rabbitmq.com>2017-05-09 18:24:38 +0100
committerGerhard Lazu <gerhard@rabbitmq.com>2017-05-09 18:24:38 +0100
commit20a576bcc4eb436fd4fa8041f452ee8bafe8ca3b (patch)
tree4419096815329a60d58184fcf00021297105199e /src/rabbit.erl
parent9e1235c9ed1855d705150c7b38c62242282b6127 (diff)
downloadrabbitmq-server-git-20a576bcc4eb436fd4fa8041f452ee8bafe8ca3b.tar.gz
Ensure rabbit is running after the boot process finishes
Boot process can exit if boot fails. It can result in rabbit:await_startup/0 returning ok & rabbitmqctl wait exiting with exit status 0. WIP, still need to add some tests. Signed-off-by: Gerhard Lazu <gerhard@rabbitmq.com> re #1214 [#145043957]
Diffstat (limited to 'src/rabbit.erl')
-rw-r--r--src/rabbit.erl33
1 files changed, 31 insertions, 2 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index ba84f97610..b5d211e535 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -19,7 +19,7 @@
-behaviour(application).
-export([start/0, boot/0, stop/0,
- stop_and_halt/0, await_startup/0, status/0, is_running/0,
+ stop_and_halt/0, await_startup/0, await_startup2/0, status/0, is_running/0,
is_running/1, environment/0, rotate_logs/1, force_event_refresh/1,
start_fhc/0]).
-export([start/2, stop/1]).
@@ -436,7 +436,7 @@ stop() ->
undefined -> ok;
_ ->
rabbit_log:info("RabbitMQ hasn't finished starting yet. Waiting for startup to finish before stopping..."),
- await_startup(true)
+ wait_to_finish_booting()
end,
rabbit_log:info("RabbitMQ is asked to stop...~n", []),
Apps = ?APPS ++ rabbit_plugins:active(),
@@ -619,6 +619,35 @@ await_startup(HaveSeenRabbitBoot) ->
await_startup(true)
end.
+await_startup2() ->
+ case is_booting() of
+ true -> wait_to_finish_booting();
+ false ->
+ case is_running() of
+ true -> ok;
+ false -> wait_to_start_booting(),
+ wait_to_finish_booting()
+ end
+ end.
+
+is_booting() ->
+ whereis(rabbit_boot) /= undefined.
+
+wait_to_start_booting() ->
+ case whereis(rabbit_boot) of
+ undefined -> timer:sleep(100),
+ wait_to_start_booting();
+ _ -> ok
+ end.
+
+wait_to_finish_booting() ->
+ case whereis(rabbit_boot) of
+ undefined -> true = is_running(),
+ ok;
+ _ -> timer:sleep(100),
+ wait_to_finish_booting()
+ end.
+
status() ->
S1 = [{pid, list_to_integer(os:getpid())},
%% The timeout value used is twice that of gen_server:call/2.