summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_binding.erl16
-rw-r--r--src/rabbit_exchange.erl12
2 files changed, 17 insertions, 11 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl
index e108640710..e96dfd7673 100644
--- a/src/rabbit_binding.erl
+++ b/src/rabbit_binding.erl
@@ -319,8 +319,8 @@ remove_for_source(SrcName) ->
Match = #route{binding = #binding{source = SrcName, _ = '_'}},
remove_routes(
lists:usort(
- mnesia:match_object(rabbit_route, Match, read) ++
- mnesia:match_object(rabbit_semi_durable_route, Match, read))).
+ mnesia:dirty_match_object(rabbit_route, Match) ++
+ mnesia:dirty_match_object(rabbit_semi_durable_route, Match))).
remove_for_destination(DstName, OnlyDurable) ->
remove_for_destination(DstName, OnlyDurable, fun remove_routes/1).
@@ -443,13 +443,13 @@ remove_for_destination(DstName, OnlyDurable, Fun) ->
Routes = case OnlyDurable of
false ->
[reverse_route(R) ||
- R <- mnesia:match_object(
- rabbit_reverse_route, MatchRev, read)];
+ R <- mnesia:dirty_match_object(
+ rabbit_reverse_route, MatchRev)];
true -> lists:usort(
- mnesia:match_object(
- rabbit_durable_route, MatchFwd, read) ++
- mnesia:match_object(
- rabbit_semi_durable_route, MatchFwd, read))
+ mnesia:dirty_match_object(
+ rabbit_durable_route, MatchFwd) ++
+ mnesia:dirty_match_object(
+ rabbit_semi_durable_route, MatchFwd))
end,
Bindings = Fun(Routes),
group_bindings_fold(fun maybe_auto_delete/4, new_deletions(),
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index c7a849ce2e..92e3f9acbd 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -492,15 +492,21 @@ maybe_auto_delete(#exchange{auto_delete = true} = X, OnlyDurable) ->
conditional_delete(X = #exchange{name = XName}, OnlyDurable) ->
case rabbit_binding:has_for_source(XName) of
- false -> unconditional_delete(X, OnlyDurable);
+ false -> internal_delete(X, OnlyDurable, false);
true -> {error, in_use}
end.
-unconditional_delete(X = #exchange{name = XName}, OnlyDurable) ->
+unconditional_delete(X, OnlyDurable) ->
+ internal_delete(X, OnlyDurable, true).
+
+internal_delete(X = #exchange{name = XName}, OnlyDurable, RemoveBindingsForSource) ->
ok = mnesia:delete({rabbit_exchange, XName}),
ok = mnesia:delete({rabbit_exchange_serial, XName}),
mnesia:delete({rabbit_durable_exchange, XName}),
- Bindings = rabbit_binding:remove_for_source(XName),
+ Bindings = case RemoveBindingsForSource of
+ true -> rabbit_binding:remove_for_source(XName);
+ false -> []
+ end,
{deleted, X, Bindings, rabbit_binding:remove_for_destination(
XName, OnlyDurable)}.