summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2014-04-14 15:29:18 +0100
committerSimon MacMullen <simon@rabbitmq.com>2014-04-14 15:29:18 +0100
commit940d220bfa4b4c473acaf44e9216510544a72dea (patch)
tree83d27ab2d0fd9595ae24cd204c8e1157faf36901
parenta662edd75f44a847e256196bba9e36ed727c1630 (diff)
parent5784cd7ed58251decaa003a9fb0540adc23b749d (diff)
downloadrabbitmq-server-940d220bfa4b4c473acaf44e9216510544a72dea.tar.gz
Merge bug26084
-rw-r--r--src/gm.erl46
-rw-r--r--src/rabbit_mirror_queue_slave.erl21
2 files changed, 26 insertions, 41 deletions
diff --git a/src/gm.erl b/src/gm.erl
index 250a8de8..2ed2fcf1 100644
--- a/src/gm.erl
+++ b/src/gm.erl
@@ -706,9 +706,6 @@ handle_info({'DOWN', MRef, process, _Pid, Reason},
left = Left,
right = Right,
group_name = GroupName,
- view = View,
- module = Module,
- callback_args = Args,
confirms = Confirms,
txn_executor = TxnFun }) ->
Member = case {Left, Right} of
@@ -722,24 +719,15 @@ handle_info({'DOWN', MRef, process, _Pid, Reason},
{_, {shutdown, ring_shutdown}} ->
noreply(State);
_ ->
- View1 =
- group_to_view(record_dead_member_in_group(Member,
- GroupName, TxnFun)),
- {Result, State2} =
- case alive_view_members(View1) of
- [Self] ->
- {Result1, State1} = maybe_erase_aliases(State, View1),
- {Result1, State1 #state {
- members_state = blank_member_state(),
- confirms = purge_confirms(Confirms) }};
- _ ->
- %% here we won't be pointing out any deaths:
- %% the concern is that there maybe births
- %% which we'd otherwise miss.
- {callback_view_changed(Args, Module, View, View1),
- check_neighbours(State #state { view = View1 })}
- end,
- handle_callback_result({Result, State2})
+ View1 = group_to_view(record_dead_member_in_group(
+ Member, GroupName, TxnFun)),
+ State1 = case alive_view_members(View1) of
+ [Self] -> State #state {
+ members_state = blank_member_state(),
+ confirms = purge_confirms(Confirms) };
+ _ -> State
+ end,
+ handle_callback_result(maybe_erase_aliases(State1, View1))
end.
@@ -1198,14 +1186,14 @@ maybe_erase_aliases(State = #state { self = Self,
false -> Acc
end
end, {[], MembersState}, Aliases),
- State1 = State #state { members_state = MembersState1 },
- case Erasable of
- [] -> {ok, State1 #state { view = View }};
- _ -> View1 = group_to_view(
- erase_members_in_group(Erasable, GroupName, TxnFun)),
- {callback_view_changed(Args, Module, View0, View1),
- check_neighbours(State1 #state { view = View1 })}
- end.
+ View1 = case Erasable of
+ [] -> View;
+ _ -> group_to_view(
+ erase_members_in_group(Erasable, GroupName, TxnFun))
+ end,
+ State1 = State #state { members_state = MembersState1, view = View1 },
+ {callback_view_changed(Args, Module, View0, View1),
+ check_neighbours(State1)}.
can_erase_view_member(Self, Self, _LA, _LP) -> false;
can_erase_view_member(_Self, _Id, N, N) -> true;
diff --git a/src/rabbit_mirror_queue_slave.erl b/src/rabbit_mirror_queue_slave.erl
index 42680bfd..ee9f7701 100644
--- a/src/rabbit_mirror_queue_slave.erl
+++ b/src/rabbit_mirror_queue_slave.erl
@@ -108,7 +108,6 @@ handle_go(Q = #amqqueue{name = QName}) ->
case rabbit_misc:execute_mnesia_transaction(
fun() -> init_it(Self, GM, Node, QName) end) of
{new, QPid, GMPids} ->
- erlang:monitor(process, QPid),
ok = file_handle_cache:register_callback(
rabbit_amqqueue, set_maximum_since_use, [Self]),
ok = rabbit_memory_monitor:register(
@@ -193,7 +192,8 @@ handle_call(go, _From, {not_started, Q} = NotStarted) ->
end;
handle_call({gm_deaths, LiveGMPids}, From,
- State = #state { q = Q = #amqqueue { name = QName, pid = MPid }}) ->
+ State = #state { gm = GM, q = Q = #amqqueue {
+ name = QName, pid = MPid }}) ->
Self = self(),
case rabbit_mirror_queue_misc:remove_from_queue(QName, Self, LiveGMPids) of
{error, not_found} ->
@@ -214,7 +214,12 @@ handle_call({gm_deaths, LiveGMPids}, From,
_ ->
%% master has changed to not us
gen_server2:reply(From, ok),
- erlang:monitor(process, Pid),
+ %% Since GM is by nature lazy we need to make sure
+ %% there is some traffic when a master dies, to
+ %% make sure all slaves get informed of the
+ %% death. That is all process_death does, create
+ %% some traffic.
+ ok = gm:broadcast(GM, process_death),
noreply(State #state { q = Q #amqqueue { pid = Pid } })
end
end;
@@ -294,11 +299,6 @@ handle_info(sync_timeout, State) ->
handle_info(timeout, State) ->
noreply(backing_queue_timeout(State));
-handle_info({'DOWN', _MonitorRef, process, MPid, _Reason},
- State = #state { gm = GM, q = #amqqueue { pid = MPid } }) ->
- ok = gm:broadcast(GM, process_death),
- noreply(State);
-
handle_info({'DOWN', _MonitorRef, process, ChPid, _Reason}, State) ->
local_sender_death(ChPid, State),
noreply(maybe_forget_sender(ChPid, down_from_ch, State));
@@ -405,10 +405,7 @@ handle_msg([_SPid], _From, {ensure_monitoring, _Pid}) ->
%% This is only of value to the master
ok;
handle_msg([_SPid], _From, process_death) ->
- %% Since GM is by nature lazy we need to make sure there is some
- %% traffic when a master dies, to make sure we get informed of the
- %% death. That's all process_death does, create some traffic. We
- %% must not take any notice of the master death here since it
+ %% We must not take any notice of the master death here since it
%% comes without ordering guarantees - there could still be
%% messages from the master we have yet to receive. When we get
%% members_changed, then there will be no more messages.