summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2012-06-25 15:52:47 +0100
committerSimon MacMullen <simon@rabbitmq.com>2012-06-25 15:52:47 +0100
commit9ce01fded365bc954d0dec9c67c2149d1df8ae53 (patch)
tree56b4c677c2fa3834eb7677bca453e63caac59423
parentc20b3baa4bf74815b767406add4fb61e813f103d (diff)
downloadrabbitmq-server-9ce01fded365bc954d0dec9c67c2149d1df8ae53.tar.gz
And finally, have the master wait for all the slaves on deletion.
-rw-r--r--src/rabbit_mirror_queue_master.erl11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/rabbit_mirror_queue_master.erl b/src/rabbit_mirror_queue_master.erl
index 4e71cc43..f7fd0425 100644
--- a/src/rabbit_mirror_queue_master.erl
+++ b/src/rabbit_mirror_queue_master.erl
@@ -127,10 +127,21 @@ terminate(Reason,
delete_and_terminate(Reason, State = #state { gm = GM,
backing_queue = BQ,
backing_queue_state = BQS }) ->
+ Slaves = [Pid || Pid <- gm:group_members(GM), node(Pid) =/= node()],
ok = gm:broadcast(GM, {delete_and_terminate, Reason}),
+ MRefs = [erlang:monitor(process, S) || S <- Slaves],
+ monitor_wait(MRefs),
State #state { backing_queue_state = BQ:delete_and_terminate(Reason, BQS),
set_delivered = 0 }.
+monitor_wait([]) ->
+ ok;
+monitor_wait([MRef | MRefs]) ->
+ receive({'DOWN', MRef, process, _Pid, _Info}) ->
+ ok
+ end,
+ monitor_wait(MRefs).
+
purge(State = #state { gm = GM,
backing_queue = BQ,
backing_queue_state = BQS }) ->