rabbitmq-server/src/rabbit_vhost_sup_wrapper.erl

67 lines
2.3 KiB
Erlang

%% The contents of this file are subject to the Mozilla Public License
%% Version 1.1 (the "License"); you may not use this file except in
%% compliance with the License. You may obtain a copy of the License
%% at http://www.mozilla.org/MPL/
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and
%% limitations under the License.
%%
%% The Original Code is RabbitMQ.
%%
%% The Initial Developer of the Original Code is GoPivotal, Inc.
%% Copyright (c) 2017 Pivotal Software, Inc. All rights reserved.
%%
%% This module is a wrapper around vhost supervisor to
%% provide exactly once restart semantics.
-module(rabbit_vhost_sup_wrapper).
-include("rabbit.hrl").
-behaviour(supervisor2).
-export([init/1]).
-export([start_link/1]).
-export([start_vhost_sup/1]).
start_link(VHost) ->
%% Using supervisor, because supervisor2 does not stop a started child when
%% another one fails to start. Bug?
case rabbit_vhost_sup_sup:get_vhost_sup(VHost) of
{ok, Pid} ->
{error, {already_started, Pid}};
{error, _} ->
supervisor:start_link(?MODULE, [VHost])
end.
init([VHost]) ->
%% 2 restarts in 5 minutes. One per message store.
{ok, {{one_for_all, 2, 300},
[
%% rabbit_vhost_sup is an empty supervisor container for
%% all data processes.
{rabbit_vhost_sup,
{rabbit_vhost_sup_wrapper, start_vhost_sup, [VHost]},
permanent, infinity, supervisor,
[rabbit_vhost_sup]},
%% rabbit_vhost_process is a vhost identity process, which
%% is responsible for data recovery and vhost aliveness status.
%% See the module comments for more info.
{rabbit_vhost_process,
{rabbit_vhost_process, start_link, [VHost]},
permanent, ?WORKER_WAIT, worker,
[rabbit_vhost_process]}]}}.
start_vhost_sup(VHost) ->
case rabbit_vhost_sup:start_link(VHost) of
{ok, Pid} ->
%% Save vhost sup record with wrapper pid and vhost sup pid.
ok = rabbit_vhost_sup_sup:save_vhost_sup(VHost, self(), Pid),
{ok, Pid};
Other ->
Other
end.