summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniil Fedotov <hairyhum@gmail.com>2018-03-15 17:16:07 +0000
committerMichael Klishin <michael@clojurewerkz.org>2018-03-16 17:14:11 +0300
commit1aa737b714595f219baf86bd2ddfe9bbf6730134 (patch)
treec58c994abe31ae0db42393fb922f889802f515dd /src
parentfbddd66e964eaca136b8e3f147df7b9f3790fdce (diff)
downloadrabbitmq-server-git-1aa737b714595f219baf86bd2ddfe9bbf6730134.tar.gz
Do not try to start a vhost supervisors on not fully booted nodes.
Sometimes when several nodes are started at the same time, add_vhost can try to start a remote vhost supervisor on a node, which does not have a rabbit_vhost_sup_sup process yet, resulting in `{error,rabbit_vhost_sup_sup_not_running}` error. Filter only fully booted nodes to start remote vhost supervisors. (cherry picked from commit 52d0c1aed0d5b532765d6efd0ed92b393d821322)
Diffstat (limited to 'src')
-rw-r--r--src/rabbit.erl25
-rw-r--r--src/rabbit_vhost_sup_sup.erl4
2 files changed, 24 insertions, 5 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index 37b33bd8a4..a91f2f32b5 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -27,6 +27,7 @@
-export([start/2, stop/1, prep_stop/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
+-export([is_booted/0, is_booted/1, is_booting/0]).
-ifdef(TEST).
@@ -652,10 +653,16 @@ await_startup(Node) ->
end.
is_booting(Node) ->
- case rpc:call(Node, erlang, whereis, [rabbit_boot]) of
- {badrpc, _} = Err -> Err;
- undefined -> false;
- P when is_pid(P) -> true
+ case rpc:call(Node, rabbit, is_booting, []) of
+ true -> true;
+ false -> false;
+ {badrpc, _} = Err -> Err
+ end.
+
+is_booting() ->
+ case erlang:whereis(rabbit_boot) of
+ undefined -> false;
+ P when is_pid(P) -> true
end.
wait_for_boot_to_start(Node) ->
@@ -745,6 +752,16 @@ is_running() -> is_running(node()).
is_running(Node) -> rabbit_nodes:is_process_running(Node, rabbit).
+is_booted(Node) ->
+ case rpc:call(Node, rabbit, is_booted, []) of
+ true -> true;
+ false -> false;
+ {badrpc, _} -> false
+ end.
+
+is_booted() ->
+ is_running() andalso not is_booting().
+
environment() ->
%% The timeout value is twice that of gen_server:call/2.
[{A, environment(A)} ||
diff --git a/src/rabbit_vhost_sup_sup.erl b/src/rabbit_vhost_sup_sup.erl
index 558648400a..993f1d8430 100644
--- a/src/rabbit_vhost_sup_sup.erl
+++ b/src/rabbit_vhost_sup_sup.erl
@@ -61,7 +61,9 @@ init([]) ->
start_on_all_nodes(VHost) ->
NodesStart = [ {Node, start_vhost(VHost, Node)}
- || Node <- rabbit_nodes:all_running() ],
+ || Node <- rabbit_nodes:all_running(),
+ %% Do not try to start a vhost on booting nodes.
+ rabbit:is_booted(Node) ],
Failures = lists:filter(fun
({_, {ok, _}}) -> false;
({_, {error, {already_started, _}}}) -> false;