diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2014-05-09 14:56:26 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2014-05-09 14:56:26 +0100 |
commit | 16056f2702cc1d4a251148e4bfaf2f154c13e07b (patch) | |
tree | 712634b949d39c7aa27d959b79cc701c53993dae | |
parent | c242e129e53f9964628915b713caee9fbf73ff2a (diff) | |
download | rabbitmq-server-16056f2702cc1d4a251148e4bfaf2f154c13e07b.tar.gz |
Actually, slaves should always delete_and_terminate; when shutting them donw in this case we still don't trust their contents.
-rw-r--r-- | src/rabbit_mirror_queue_coordinator.erl | 4 | ||||
-rw-r--r-- | src/rabbit_mirror_queue_master.erl | 9 | ||||
-rw-r--r-- | src/rabbit_mirror_queue_slave.erl | 9 |
3 files changed, 9 insertions, 13 deletions
diff --git a/src/rabbit_mirror_queue_coordinator.erl b/src/rabbit_mirror_queue_coordinator.erl index 6a67a759..74c03e64 100644 --- a/src/rabbit_mirror_queue_coordinator.erl +++ b/src/rabbit_mirror_queue_coordinator.erl @@ -368,7 +368,7 @@ handle_cast(request_depth, State = #state { depth_fun = DepthFun }) -> handle_cast({ensure_monitoring, Pids}, State = #state { monitors = Mons }) -> noreply(State #state { monitors = pmon:monitor_all(Pids, Mons) }); -handle_cast({terminate, _Delete, Reason}, State) -> +handle_cast({delete_and_terminate, Reason}, State) -> {stop, Reason, State}. handle_info({'DOWN', _MonitorRef, process, Pid, _Reason}, @@ -410,7 +410,7 @@ handle_msg([CPid], _From, request_depth = Msg) -> ok = gen_server2:cast(CPid, Msg); handle_msg([CPid], _From, {ensure_monitoring, _Pids} = Msg) -> ok = gen_server2:cast(CPid, Msg); -handle_msg([CPid], _From, {terminate, _Delete, _Reason} = Msg) -> +handle_msg([CPid], _From, {delete_and_terminate, _Reason} = Msg) -> ok = gen_server2:cast(CPid, Msg), {stop, {shutdown, ring_shutdown}}; handle_msg([_CPid], _From, _Msg) -> diff --git a/src/rabbit_mirror_queue_master.erl b/src/rabbit_mirror_queue_master.erl index c6e5a7d8..e8819bfa 100644 --- a/src/rabbit_mirror_queue_master.erl +++ b/src/rabbit_mirror_queue_master.erl @@ -130,8 +130,7 @@ stop_mirroring(State = #state { coordinator = CPid, backing_queue = BQ, backing_queue_state = BQS }) -> unlink(CPid), - %% delete = *slaves* should delete - stop_all_slaves(shutdown, delete, State), + stop_all_slaves(shutdown, State), {BQ, BQS}. sync_mirrors(HandleInfo, EmitStats, @@ -189,13 +188,13 @@ terminate(Reason, delete_and_terminate(Reason, State = #state { backing_queue = BQ, backing_queue_state = BQS }) -> - stop_all_slaves(Reason, delete, State), + stop_all_slaves(Reason, State), State#state{backing_queue_state = BQ:delete_and_terminate(Reason, BQS)}. -stop_all_slaves(Reason, Delete, #state{name = QName, gm = GM}) -> +stop_all_slaves(Reason, #state{name = QName, gm = GM}) -> {ok, #amqqueue{slave_pids = SPids}} = rabbit_amqqueue:lookup(QName), MRefs = [erlang:monitor(process, Pid) || Pid <- [GM | SPids]], - ok = gm:broadcast(GM, {terminate, Delete, Reason}), + ok = gm:broadcast(GM, {delete_and_terminate, Reason}), [receive {'DOWN', MRef, process, _Pid, _Info} -> ok end || MRef <- MRefs], %% Normally when we remove a slave another slave or master will %% notice and update Mnesia. But we just removed them all, and diff --git a/src/rabbit_mirror_queue_slave.erl b/src/rabbit_mirror_queue_slave.erl index e30b941d..ee889f84 100644 --- a/src/rabbit_mirror_queue_slave.erl +++ b/src/rabbit_mirror_queue_slave.erl @@ -420,7 +420,7 @@ handle_msg([_SPid], _From, process_death) -> %% messages from the master we have yet to receive. When we get %% members_changed, then there will be no more messages. ok; -handle_msg([CPid], _From, {terminate, _Delete, _Reason} = Msg) -> +handle_msg([CPid], _From, {delete_and_terminate, _Reason} = Msg) -> ok = gen_server2:cast(CPid, {gm, Msg}), {stop, {shutdown, ring_shutdown}}; handle_msg([SPid], _From, {sync_start, Ref, Syncer, SPids}) -> @@ -876,13 +876,10 @@ process_instruction({depth, Depth}, backing_queue_state = BQS }) -> {ok, set_delta(Depth - BQ:depth(BQS), State)}; -process_instruction({terminate, Delete, Reason}, +process_instruction({delete_and_terminate, Reason}, State = #state { backing_queue = BQ, backing_queue_state = BQS }) -> - case Delete of - delete -> BQ:delete_and_terminate(Reason, BQS); - nodelete -> BQ:terminate(Reason, BQS) - end, + BQ:delete_and_terminate(Reason, BQS), {stop, State #state { backing_queue_state = undefined }}. msg_ids_to_acktags(MsgIds, MA) -> |