summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-09-02 14:10:41 +0100
committerMatthew Sackman <matthew@lshift.net>2009-09-02 14:10:41 +0100
commitc3aa97272cd0667c378559cab177ed873799a746 (patch)
tree4b37d2946cc49cc2c8727c60e8e113af7b68ab07
parent0c7017a36e2ee6d522b88a8b6a9777f2ca44173e (diff)
downloadrabbitmq-server-git-c3aa97272cd0667c378559cab177ed873799a746.tar.gz
made dq:delete_queue a call, not a cast. This eliminates a race condition between queues being deleted and new queues with the same name being created and published to
-rw-r--r--src/rabbit_disk_queue.erl9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/rabbit_disk_queue.erl b/src/rabbit_disk_queue.erl
index 6701bc6bec..9282eeb141 100644
--- a/src/rabbit_disk_queue.erl
+++ b/src/rabbit_disk_queue.erl
@@ -334,7 +334,7 @@ purge(Q) ->
gen_server2:call(?SERVER, {purge, Q}, infinity).
delete_queue(Q) ->
- gen_server2:cast(?SERVER, {delete_queue, Q}).
+ gen_server2:call(?SERVER, {delete_queue, Q}, infinity).
delete_non_durable_queues(DurableQueues) ->
gen_server2:call(?SERVER, {delete_non_durable_queues, DurableQueues},
@@ -467,6 +467,10 @@ handle_call({purge, Q}, _From, State) ->
reply(Count, State1);
handle_call(filesync, _From, State) ->
reply(ok, sync_current_file_handle(State));
+handle_call({delete_queue, Q}, From, State) ->
+ gen_server2:reply(From, ok),
+ {ok, State1} = internal_delete_queue(Q, State),
+ noreply(State1);
handle_call({len, Q}, _From, State = #dqstate { sequences = Sequences }) ->
{ReadSeqId, WriteSeqId} = sequence_lookup(Sequences, Q),
reply(WriteSeqId - ReadSeqId, State);
@@ -514,9 +518,6 @@ handle_cast({requeue, Q, MsgSeqIds}, State) ->
handle_cast({requeue_next_n, Q, N}, State) ->
{ok, State1} = internal_requeue_next_n(Q, N, State),
noreply(State1);
-handle_cast({delete_queue, Q}, State) ->
- {ok, State1} = internal_delete_queue(Q, State),
- noreply(State1);
handle_cast({set_mode, Mode}, State) ->
noreply((case Mode of
oppressed -> fun to_disk_only_mode/1;