diff options
| -rw-r--r-- | src/rabbit_binding.erl | 16 | ||||
| -rw-r--r-- | src/rabbit_exchange.erl | 12 |
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)}. |
