diff options
author | Emile Joubert <emile@rabbitmq.com> | 2013-06-10 13:27:39 +0100 |
---|---|---|
committer | Emile Joubert <emile@rabbitmq.com> | 2013-06-10 13:27:39 +0100 |
commit | eea4bbf3276853d524a1a93e32b4fb90a45067a8 (patch) | |
tree | 1bf8c27c8ebbbe42dab7f373139d3cbe822cedcd | |
parent | 202a36f38bf480d4833f4f9847d03006c8d00952 (diff) | |
download | rabbitmq-server-eea4bbf3276853d524a1a93e32b4fb90a45067a8.tar.gz |
Clear exclusive durable queues on boot
-rw-r--r-- | src/rabbit_amqqueue.erl | 37 | ||||
-rw-r--r-- | src/rabbit_amqqueue_process.erl | 9 |
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) -> |