summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2013-06-13 15:42:46 +0100
committerSimon MacMullen <simon@rabbitmq.com>2013-06-13 15:42:46 +0100
commit7f8ff8a3308d5f545a464b3a5f4e163cd9636330 (patch)
treee2a4c23d20e7a3a0dc350c9a2998815a064d1168
parent60775e2dc2eb6df4e686fdb167b91e50b71f3ca0 (diff)
parent7429e0b61e735c1e5498b18a97c33dd474607c5c (diff)
downloadrabbitmq-server-7f8ff8a3308d5f545a464b3a5f4e163cd9636330.tar.gz
Merge bug25599
-rw-r--r--src/rabbit_amqqueue.erl21
-rw-r--r--src/rabbit_amqqueue_process.erl39
2 files changed, 37 insertions, 23 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 8c00c85c..e0fbaf77 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -592,15 +592,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 8441bd3c..c790a12d 100644
--- a/src/rabbit_amqqueue_process.erl
+++ b/src/rabbit_amqqueue_process.erl
@@ -153,19 +153,27 @@ init_state(Q) ->
terminate(shutdown = R, State = #q{backing_queue = BQ}) ->
terminate_shutdown(fun (BQS) -> BQ:terminate(R, BQS) end, State);
+terminate({shutdown, missing_owner} = Reason, State) ->
+ %% if the owner was missing then there will be no queue, so don't emit stats
+ terminate_shutdown(terminate_delete(false, Reason, State), State);
terminate({shutdown, _} = R, State = #q{backing_queue = BQ}) ->
terminate_shutdown(fun (BQS) -> BQ:terminate(R, BQS) end, State);
-terminate(Reason, State = #q{q = #amqqueue{name = QName},
- backing_queue = BQ}) ->
- terminate_shutdown(
- fun (BQS) ->
- BQS1 = BQ:delete_and_terminate(Reason, BQS),
- %% don't care if the internal delete doesn't return 'ok'.
- rabbit_event:if_enabled(State, #q.stats_timer,
- fun() -> emit_stats(State) end),
- rabbit_amqqueue:internal_delete(QName),
- BQS1
- end, State).
+terminate(Reason, State) ->
+ terminate_shutdown(terminate_delete(true, Reason, State), State).
+
+terminate_delete(EmitStats, Reason,
+ State = #q{q = #amqqueue{name = QName},
+ backing_queue = BQ}) ->
+ fun (BQS) ->
+ BQS1 = BQ:delete_and_terminate(Reason, BQS),
+ if EmitStats -> rabbit_event:if_enabled(State, #q.stats_timer,
+ fun() -> emit_stats(State) end);
+ true -> ok
+ end,
+ %% don't care if the internal delete doesn't return 'ok'.
+ rabbit_amqqueue:internal_delete(QName),
+ BQS1
+ end.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
@@ -1060,8 +1068,9 @@ 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(
@@ -1069,9 +1078,11 @@ handle_call({init, Recover}, From,
[rabbit_misc:rs(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, {shutdown, missing_owner},
+ State#q{backing_queue = BQ, backing_queue_state = BQS}}
end;
handle_call(info, _From, State) ->