diff options
| author | Daniil Fedotov <hairyhum@gmail.com> | 2018-03-15 17:16:07 +0000 |
|---|---|---|
| committer | Daniil Fedotov <hairyhum@gmail.com> | 2018-03-15 17:16:07 +0000 |
| commit | 52d0c1aed0d5b532765d6efd0ed92b393d821322 (patch) | |
| tree | 90c041fbb69192a4038cb5ce3e3eaa0668ca31b7 /src | |
| parent | 6c03f0b2b206a7b8749470e7c1c430ae86a787dd (diff) | |
| download | rabbitmq-server-git-52d0c1aed0d5b532765d6efd0ed92b393d821322.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.
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; |
