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 | 72cf467993ffa1960a2a46cc532d79821436c89e (patch) | |
| tree | 56b4c677c2fa3834eb7677bca453e63caac59423 | |
| parent | 03f7405e12b2a1d286114055a23fd6fc6ddb8dd6 (diff) | |
| download | rabbitmq-server-git-72cf467993ffa1960a2a46cc532d79821436c89e.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 4e71cc43db..f7fd042526 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 }) -> |
