summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2013-06-10 13:27:39 +0100
committerEmile Joubert <emile@rabbitmq.com>2013-06-10 13:27:39 +0100
commiteea4bbf3276853d524a1a93e32b4fb90a45067a8 (patch)
tree1bf8c27c8ebbbe42dab7f373139d3cbe822cedcd
parent202a36f38bf480d4833f4f9847d03006c8d00952 (diff)
downloadrabbitmq-server-eea4bbf3276853d524a1a93e32b4fb90a45067a8.tar.gz
Clear exclusive durable queues on boot
-rw-r--r--src/rabbit_amqqueue.erl37
-rw-r--r--src/rabbit_amqqueue_process.erl9
2 files changed, 27 insertions, 19 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 8c00c85c..b94f08f6 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -577,14 +577,16 @@ resume(QPid, ChPid) -> delegate:cast(QPid, {resume, ChPid}).
flush_all(QPids, ChPid) -> delegate:cast(QPids, {flush, ChPid}).
-internal_delete1(QueueName) ->
- ok = mnesia:delete({rabbit_queue, QueueName}),
- %% this 'guarded' delete prevents unnecessary writes to the mnesia
- %% disk log
- case mnesia:wread({rabbit_durable_queue, QueueName}) of
+%% 'guarded' delete prevents unnecessary writes to the mnesia disk log
+guarded_delete(Table, QueueName) ->
+ case mnesia:wread({Table, QueueName}) of
[] -> ok;
- [_] -> ok = mnesia:delete({rabbit_durable_queue, QueueName})
- end,
+ [_] -> ok = mnesia:delete({Table, QueueName})
+ end.
+
+internal_delete1(QueueName) ->
+ guarded_delete(rabbit_durable_queue, QueueName),
+ guarded_delete(rabbit_queue, QueueName),
%% we want to execute some things, as decided by rabbit_exchange,
%% after the transaction.
rabbit_binding:remove_for_destination(QueueName).
@@ -592,15 +594,18 @@ internal_delete1(QueueName) ->
internal_delete(QueueName) ->
rabbit_misc:execute_mnesia_tx_with_tail(
fun () ->
- case mnesia:wread({rabbit_queue, QueueName}) of
- [] -> rabbit_misc:const({error, not_found});
- [_] -> Deletions = internal_delete1(QueueName),
- T = rabbit_binding:process_deletions(Deletions),
- fun() ->
- ok = T(),
- ok = rabbit_event:notify(queue_deleted,
- [{name, QueueName}])
- end
+ case {mnesia:wread({rabbit_queue, QueueName}),
+ mnesia:wread({rabbit_durable_queue, QueueName})} of
+ {[], []} ->
+ rabbit_misc:const({error, not_found});
+ _ ->
+ Deletions = internal_delete1(QueueName),
+ T = rabbit_binding:process_deletions(Deletions),
+ fun() ->
+ ok = T(),
+ ok = rabbit_event:notify(queue_deleted,
+ [{name, QueueName}])
+ end
end
end).
diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl
index d2f4a178..a7a227e1 100644
--- a/src/rabbit_amqqueue_process.erl
+++ b/src/rabbit_amqqueue_process.erl
@@ -1047,17 +1047,20 @@ handle_call({init, Recover}, From,
case rabbit_misc:is_process_alive(Owner) of
true -> erlang:monitor(process, Owner),
declare(Recover, From, State);
- false -> #q{backing_queue = BQ, backing_queue_state = undefined,
- q = #amqqueue{name = QName} = Q} = State,
+ false -> #q{backing_queue = undefined,
+ backing_queue_state = undefined,
+ q = #amqqueue{name = QName} = Q} = State,
gen_server2:reply(From, not_found),
case Recover of
new -> rabbit_log:warning(
"Queue ~p exclusive owner went away~n", [QName]);
_ -> ok
end,
+ BQ = backing_queue_module(Q),
BQS = bq_init(BQ, Q, Recover),
%% Rely on terminate to delete the queue.
- {stop, normal, State#q{backing_queue_state = BQS}}
+ {stop, normal, State#q{backing_queue = BQ,
+ backing_queue_state = BQS}}
end;
handle_call(info, _From, State) ->