diff options
| author | Daniil Fedotov <hairyhum@gmail.com> | 2018-03-15 17:16:07 +0000 |
|---|---|---|
| committer | Michael Klishin <michael@clojurewerkz.org> | 2018-03-16 17:14:11 +0300 |
| commit | 1aa737b714595f219baf86bd2ddfe9bbf6730134 (patch) | |
| tree | c58c994abe31ae0db42393fb922f889802f515dd /src | |
| parent | fbddd66e964eaca136b8e3f147df7b9f3790fdce (diff) | |
| download | rabbitmq-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.erl | 25 | ||||
| -rw-r--r-- | src/rabbit_vhost_sup_sup.erl | 4 |
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; |
