summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2013-02-06 17:11:20 +0000
committerSimon MacMullen <simon@rabbitmq.com>2013-02-06 17:11:20 +0000
commit0962afad0d4490da6dda92d80151389e9c1bb4ed (patch)
treed9c4544047fc770d463d4bd92e06375549aa5608
parent9ed0c43dd88fb973d116dec993df3d848a22a8e4 (diff)
downloadrabbitmq-server-0962afad0d4490da6dda92d80151389e9c1bb4ed.tar.gz
Remove durable queues based on a node while forgetting that node.
-rw-r--r--src/rabbit_amqqueue.erl19
-rw-r--r--src/rabbit_mnesia.erl1
2 files changed, 19 insertions, 1 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 07895ae3..352dea07 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -17,7 +17,7 @@
-module(rabbit_amqqueue).
-export([recover/0, stop/0, start/1, declare/5,
- delete_immediately/1, delete/3, purge/1]).
+ delete_immediately/1, delete/3, purge/1, forget_all_durable/1]).
-export([pseudo_queue/2]).
-export([lookup/1, not_found_or_absent/1, with/2, with/3, with_or_die/2,
assert_equivalence/5,
@@ -134,6 +134,7 @@
rabbit_types:error('in_use') |
rabbit_types:error('not_empty')).
-spec(purge/1 :: (rabbit_types:amqqueue()) -> qlen()).
+-spec(forget_all_durable/1 :: (node()) -> 'ok').
-spec(deliver/2 :: ([rabbit_types:amqqueue()], rabbit_types:delivery()) ->
{routing_result(), qpids()}).
-spec(deliver_flow/2 :: ([rabbit_types:amqqueue()], rabbit_types:delivery()) ->
@@ -585,6 +586,22 @@ internal_delete(QueueName, QPid) ->
end
end).
+forget_all_durable(Node) ->
+ %% Note rabbit is not running so we avoid e.g. the worker pool. Also why
+ %% we don't invoke the return from rabbit_binding:process_deletions/1.
+ {atomic, ok} =
+ mnesia:sync_transaction(
+ fun () ->
+ Qs = mnesia:match_object(rabbit_durable_queue,
+ #amqqueue{_ = '_'}, write),
+ [rabbit_binding:process_deletions(
+ internal_delete1(Name)) ||
+ #amqqueue{name = Name, pid = Pid} <- Qs,
+ node(Pid) =:= Node],
+ ok
+ end),
+ ok.
+
run_backing_queue(QPid, Mod, Fun) ->
gen_server2:cast(QPid, {run_backing_queue, Mod, Fun}).
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index c7157753..039a8c60 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -679,6 +679,7 @@ remove_node_if_mnesia_running(Node) ->
%% change being propagated to all nodes
case mnesia:del_table_copy(schema, Node) of
{atomic, ok} ->
+ rabbit_amqqueue:forget_all_durable(Node),
rabbit_node_monitor:notify_left_cluster(Node),
ok;
{aborted, Reason} ->