summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/rabbitmqctl.1.xml22
-rw-r--r--packaging/common/rabbitmq-server.init15
-rw-r--r--src/rabbit_control.erl26
3 files changed, 48 insertions, 15 deletions
diff --git a/docs/rabbitmqctl.1.xml b/docs/rabbitmqctl.1.xml
index bd9fee7d4b..5c090e5a2b 100644
--- a/docs/rabbitmqctl.1.xml
+++ b/docs/rabbitmqctl.1.xml
@@ -158,6 +158,28 @@
</varlistentry>
<varlistentry>
+ <term><cmdsynopsis><command>wait</command></cmdsynopsis></term>
+ <listitem>
+ <para>
+ Wait for the RabbitMQ application to start.
+ </para>
+ <para>
+ This command will wait for the RabbitMQ application to
+ start at the node. As long as the Erlang node is up but
+ the RabbitMQ application is down it will wait
+ indefinitely. If the node itself goes down, or takes too
+ long to come up, it will fail.
+ </para>
+ <para role="example-prefix">For example:</para>
+ <screen role="example">rabbitmqctl wait</screen>
+ <para role="example">
+ This command will return when the RabbitMQ node has
+ started up.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><cmdsynopsis><command>status</command></cmdsynopsis></term>
<listitem>
<para>
diff --git a/packaging/common/rabbitmq-server.init b/packaging/common/rabbitmq-server.init
index 54fd39b790..8ef1000bdb 100644
--- a/packaging/common/rabbitmq-server.init
+++ b/packaging/common/rabbitmq-server.init
@@ -22,7 +22,6 @@ DAEMON=/usr/sbin/${NAME}
CONTROL=/usr/sbin/rabbitmqctl
DESC=rabbitmq-server
USER=rabbitmq
-TIMEOUT=10
ROTATE_SUFFIX=
INIT_LOG_DIR=/var/log/rabbitmq
@@ -40,7 +39,7 @@ start_rabbitmq () {
set +e
nohup $DAEMON > ${INIT_LOG_DIR}/startup_log \
2> ${INIT_LOG_DIR}/startup_err &
- wait_for_rabbitmq
+ $CONTROL wait >/dev/null 2>&1
case "$?" in
0)
echo SUCCESS
@@ -59,18 +58,6 @@ start_rabbitmq () {
fi
}
-wait_for_rabbitmq() {
- WAITED=0
- while [ $WAITED != $TIMEOUT ]; do
- if status_rabbitmq quiet ; then
- return 0
- fi
- sleep 1
- WAITED=`expr $WAITED + 1`
- done
- return 1
-}
-
stop_rabbitmq () {
set +e
status_rabbitmq quiet
diff --git a/src/rabbit_control.erl b/src/rabbit_control.erl
index 8048309714..a7d07b0f38 100644
--- a/src/rabbit_control.erl
+++ b/src/rabbit_control.erl
@@ -20,6 +20,7 @@
-export([start/0, stop/0, action/5, diagnostics/1]).
-define(RPC_TIMEOUT, infinity).
+-define(WAIT_FOR_VM_TIMEOUT, 5000).
-define(QUIET_OPT, "-q").
-define(NODE_OPT, "-n").
@@ -297,7 +298,30 @@ action(list_permissions, Node, [], Opts, Inform) ->
VHost = proplists:get_value(?VHOST_OPT, Opts),
Inform("Listing permissions in vhost ~p", [VHost]),
display_list(call(Node, {rabbit_auth_backend_internal,
- list_vhost_permissions, [VHost]})).
+ list_vhost_permissions, [VHost]}));
+
+action(wait, Node, [], _Opts, Inform) ->
+ Inform("Waiting for ~p", [Node]),
+ wait_for_application(Node, ?WAIT_FOR_VM_TIMEOUT).
+
+wait_for_application(_Node, NodeTimeout) when NodeTimeout =< 0 ->
+ {badrpc, nodedown};
+
+wait_for_application(Node, NodeTimeout) ->
+ case call(Node, {application, which_applications, []}) of
+ {badrpc, nodedown} -> wait_for_application0(Node, NodeTimeout - 1000);
+ {badrpc, _} = E -> E;
+ Apps -> case proplists:is_defined(rabbit, Apps) of
+ %% We've seen the node up; if it goes down
+ %% die immediately.
+ false -> wait_for_application0(Node, 0);
+ true -> ok
+ end
+ end.
+
+wait_for_application0(Node, NodeTimeout) ->
+ timer:sleep(1000),
+ wait_for_application(Node, NodeTimeout).
default_if_empty(List, Default) when is_list(List) ->
if List == [] ->