From 178af6f5d42519a6b8da99fafa22820b3752aebb Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Mon, 22 Sep 2014 16:51:46 +0100 Subject: Move actual supervisor definitions out to avoid conflicting behaviours in a module. --- src/mirrored_supervisor.erl | 25 ++++------------------- src/mirrored_supervisor_sups.erl | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 src/mirrored_supervisor_sups.erl diff --git a/src/mirrored_supervisor.erl b/src/mirrored_supervisor.erl index 1ed6d710..289b9cc4 100644 --- a/src/mirrored_supervisor.erl +++ b/src/mirrored_supervisor.erl @@ -119,6 +119,7 @@ -define(SUPERVISOR, supervisor2). -define(GEN_SERVER, gen_server2). -define(PG2, pg2_fixed). +-define(SUP_MODULE, mirrored_supervisor_sups). -define(TABLE, mirrored_sup_childspec). -define(TABLE_DEF, @@ -134,7 +135,6 @@ which_children/1, count_children/1, check_childspecs/1]). -behaviour(?GEN_SERVER). --behaviour(?SUPERVISOR). -export([init/1, handle_call/3, handle_info/2, terminate/2, code_change/3, handle_cast/2]). @@ -221,7 +221,7 @@ start_link({global, _SupName}, _Group, _TxFun, _Mod, _Args) -> start_link0(Prefix, Group, TxFun, Init) -> case apply(?SUPERVISOR, start_link, - Prefix ++ [?MODULE, {overall, Group, TxFun, Init}]) of + Prefix ++ [?SUP_MODULE, {overall, Group, TxFun, Init}]) of {ok, Pid} -> case catch call(Pid, {init, Pid}) of ok -> {ok, Pid}; E -> E @@ -280,29 +280,12 @@ mirroring(Sup) -> child(Sup, mirroring). %%---------------------------------------------------------------------------- start_internal(Group, TxFun, ChildSpecs) -> - ?GEN_SERVER:start_link(?MODULE, {mirroring, Group, TxFun, ChildSpecs}, + ?GEN_SERVER:start_link(?MODULE, {Group, TxFun, ChildSpecs}, [{timeout, infinity}]). %%---------------------------------------------------------------------------- -init({overall, _Group, _TxFun, ignore}) -> ignore; -init({overall, Group, TxFun, {ok, {Restart, ChildSpecs}}}) -> - %% Important: Delegate MUST start before Mirroring so that when we - %% shut down from above it shuts down last, so Mirroring does not - %% see it die. - %% - %% See comment in handle_info('DOWN', ...) below - {ok, {{one_for_all, 0, 1}, - [{delegate, {?SUPERVISOR, start_link, [?MODULE, {delegate, Restart}]}, - temporary, 16#ffffffff, supervisor, [?SUPERVISOR]}, - {mirroring, {?MODULE, start_internal, [Group, TxFun, ChildSpecs]}, - permanent, 16#ffffffff, worker, [?MODULE]}]}}; - - -init({delegate, Restart}) -> - {ok, {Restart, []}}; - -init({mirroring, Group, TxFun, ChildSpecs}) -> +init({Group, TxFun, ChildSpecs}) -> {ok, #state{group = Group, tx_fun = TxFun, initial_childspecs = ChildSpecs}}. diff --git a/src/mirrored_supervisor_sups.erl b/src/mirrored_supervisor_sups.erl new file mode 100644 index 00000000..6ec08435 --- /dev/null +++ b/src/mirrored_supervisor_sups.erl @@ -0,0 +1,43 @@ +%% 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) 2011-2014 GoPivotal, Inc. All rights reserved. +%% + +-module(mirrored_supervisor_sups). + +-define(SUPERVISOR, supervisor2). +-define(GS_MODULE, mirrored_supervisor). + +-behaviour(?SUPERVISOR). + +-export([init/1]). + +%%---------------------------------------------------------------------------- + +init({overall, _Group, _TxFun, ignore}) -> ignore; +init({overall, Group, TxFun, {ok, {Restart, ChildSpecs}}}) -> + %% Important: Delegate MUST start before Mirroring so that when we + %% shut down from above it shuts down last, so Mirroring does not + %% see it die. + %% + %% See comment in handle_info('DOWN', ...) in mirrored_supervisor + {ok, {{one_for_all, 0, 1}, + [{delegate, {?SUPERVISOR, start_link, [?MODULE, {delegate, Restart}]}, + temporary, 16#ffffffff, supervisor, [?SUPERVISOR]}, + {mirroring, {?GS_MODULE, start_internal, [Group, TxFun, ChildSpecs]}, + permanent, 16#ffffffff, worker, [?MODULE]}]}}; + + +init({delegate, Restart}) -> + {ok, {Restart, []}}. -- cgit v1.2.1