summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2013-02-08 11:15:09 +0000
committerEmile Joubert <emile@rabbitmq.com>2013-02-08 11:15:09 +0000
commit7fda39b54ccb1bfbf1082d633b10eae4bf2bd954 (patch)
tree0b6262b97b180409e61feebe15a970a0accabcb5
parent0dd6aa85db597cd239a261a7f2bc45860f5f810a (diff)
parent77ca2f1fa64f59f4e5c7bc67b214d2ca35cc2498 (diff)
downloadrabbitmq-server-7fda39b54ccb1bfbf1082d633b10eae4bf2bd954.tar.gz
Merge stable into default
-rw-r--r--ebin/rabbit_app.in2
-rw-r--r--src/rabbit_amqqueue.erl21
-rw-r--r--src/rabbit_mnesia.erl1
3 files changed, 22 insertions, 2 deletions
diff --git a/ebin/rabbit_app.in b/ebin/rabbit_app.in
index f4d4ec3d..ad961a44 100644
--- a/ebin/rabbit_app.in
+++ b/ebin/rabbit_app.in
@@ -10,7 +10,7 @@
rabbit_sup,
rabbit_tcp_client_sup,
rabbit_direct_client_sup]},
- {applications, [kernel, stdlib, sasl, mnesia, os_mon]},
+ {applications, [kernel, stdlib, sasl, mnesia, os_mon, xmerl]},
%% we also depend on crypto, public_key and ssl but they shouldn't be
%% in here as we don't actually want to start it
{mod, {rabbit, []}},
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 9228755e..ae7fe5c5 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,
@@ -135,6 +135,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()) ->
@@ -591,6 +592,24 @@ internal_delete(QueueName) ->
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} = Q <- Qs,
+ node(Pid) =:= Node,
+ rabbit_policy:get(<<"ha-mode">>, Q)
+ =:= {error, not_found}],
+ 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 010fd9ac..c39e898c 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -677,6 +677,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} ->