summaryrefslogtreecommitdiff
path: root/src/rabbit.erl
diff options
context:
space:
mode:
authorDaniil Fedotov <dfedotov@pivotal.io>2017-06-08 18:13:15 +0100
committerDaniil Fedotov <dfedotov@pivotal.io>2017-06-08 18:13:15 +0100
commit04cadbc100a1634a65235dc4c7dbaecb0c8244d5 (patch)
treeabe7392764651bacd2a74f16f486ff26c4e361ff /src/rabbit.erl
parentfb82e4bca6aa4423cb068f5f5c5f41fdad6d2ab6 (diff)
downloadrabbitmq-server-git-04cadbc100a1634a65235dc4c7dbaecb0c8244d5.tar.gz
Add an API to await for node startup from a remote node.
rabbitmqctl wait will have more flexibility if the rabbitmqctl node will do the waiting. For example when net_ticktime is lower than startup time wait would not fail.
Diffstat (limited to 'src/rabbit.erl')
-rw-r--r--src/rabbit.erl61
1 files changed, 41 insertions, 20 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index dee8ff3571..f219e7784f 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -19,7 +19,8 @@
-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]).
@@ -473,7 +474,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(),
@@ -647,32 +648,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() ->