diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2014-04-14 15:29:18 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2014-04-14 15:29:18 +0100 |
commit | 940d220bfa4b4c473acaf44e9216510544a72dea (patch) | |
tree | 83d27ab2d0fd9595ae24cd204c8e1157faf36901 | |
parent | a662edd75f44a847e256196bba9e36ed727c1630 (diff) | |
parent | 5784cd7ed58251decaa003a9fb0540adc23b749d (diff) | |
download | rabbitmq-server-940d220bfa4b4c473acaf44e9216510544a72dea.tar.gz |
Merge bug26084
-rw-r--r-- | src/gm.erl | 46 | ||||
-rw-r--r-- | src/rabbit_mirror_queue_slave.erl | 21 |
2 files changed, 26 insertions, 41 deletions
@@ -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. |