diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2012-06-25 15:52:47 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2012-06-25 15:52:47 +0100 |
commit | 9ce01fded365bc954d0dec9c67c2149d1df8ae53 (patch) | |
tree | 56b4c677c2fa3834eb7677bca453e63caac59423 | |
parent | c20b3baa4bf74815b767406add4fb61e813f103d (diff) | |
download | rabbitmq-server-9ce01fded365bc954d0dec9c67c2149d1df8ae53.tar.gz |
And finally, have the master wait for all the slaves on deletion.
-rw-r--r-- | src/rabbit_mirror_queue_master.erl | 11 |
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 }) -> |