summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2017-10-19 20:06:12 +0300
committerMichael Klishin <michael@clojurewerkz.org>2017-10-19 20:06:12 +0300
commit1409ce20c40bfeeb3d82065119a2caf5f9b7e54e (patch)
treebb2ddc043bfea9756ea847ef88efe896ecd1d990
parentbe796e0c6fe9237ab5e9b1bae86b0de2f7b0a19a (diff)
parent51aca8851eba66445ad5b164fc92b2ffa0692fc2 (diff)
downloadrabbitmq-server-git-1409ce20c40bfeeb3d82065119a2caf5f9b7e54e.tar.gz
Merge branch 'rabbitmqctl-shutdown-custom-exit-code-to-indicate-server-reported-failure' into stable
-rw-r--r--include/rabbit_cli.hrl5
-rw-r--r--src/rabbit.erl2
-rw-r--r--src/rabbit_cli.erl4
-rw-r--r--src/rabbit_control_main.erl11
4 files changed, 17 insertions, 5 deletions
diff --git a/include/rabbit_cli.hrl b/include/rabbit_cli.hrl
index 12fa5b4dd8..0908f82775 100644
--- a/include/rabbit_cli.hrl
+++ b/include/rabbit_cli.hrl
@@ -72,3 +72,8 @@
-define(EX_SOFTWARE , 70). % Failed to execute command.
-define(EX_TEMPFAIL , 75). % Temporary error (e.g. something has timed out).
-define(EX_CONFIG , 78). % Misconfiguration detected
+
+% Non-standard code that indicates that node shutdown failed with an error
+% other than an unsuccessfull RPC call or a timeout. See rabbitmq/rabbitmq-server#1396
+% for context.
+-define(EX_SHUTDOWN_ERROR, 79).
diff --git a/src/rabbit.erl b/src/rabbit.erl
index 033379bad1..4a9ae6ba76 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -453,7 +453,7 @@ stop_and_halt() ->
stop()
catch Type:Reason ->
rabbit_log:error("Error trying to stop RabbitMQ: ~p:~p", [Type, Reason]),
- error({Type, Reason})
+ erlang:error({Type, Reason})
after
%% Enclose all the logging in the try block.
%% init:stop() will be called regardless of any errors.
diff --git a/src/rabbit_cli.erl b/src/rabbit_cli.erl
index da29136853..c4c7b8eaeb 100644
--- a/src/rabbit_cli.erl
+++ b/src/rabbit_cli.erl
@@ -93,6 +93,10 @@ main(ParseFun, DoFun, UsageMod) ->
{'EXIT', {function_clause, [{?MODULE, action, _, _} | _]}} -> %% >= R15
PrintInvalidCommandError(),
usage(UsageMod);
+ {error, {error_during_shutdown, Err}} ->
+ print_error("Node ~w failed to shut down: ~p.",
+ [Node, Err]),
+ rabbit_misc:quit(?EX_SHUTDOWN_ERROR);
{error, {missing_dependencies, Missing, Blame}} ->
print_error("dependent plugins ~p not found; used by ~p.",
[Missing, Blame]),
diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl
index 50cf832e5d..d220ab3802 100644
--- a/src/rabbit_control_main.erl
+++ b/src/rabbit_control_main.erl
@@ -283,10 +283,13 @@ shutdown_node_and_wait_pid_to_stop(Node, Pid, Inform) ->
wait_for_process_death(Pid),
Inform(
"RabbitMQ node ~p running at PID ~s successfully shut down",
- [Node, Pid]);
- _ -> ok
- end,
- Res.
+ [Node, Pid]),
+ Res;
+ {error, Err} ->
+ {error, {error_during_shutdown, Err}};
+ _ ->
+ Res
+ end.
action(shutdown, Node, [], _Opts, Inform) ->
case rpc:call(Node, os, getpid, []) of