summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Hood <0x6e6562@gmail.com>2008-10-06 14:58:19 +0100
committerBen Hood <0x6e6562@gmail.com>2008-10-06 14:58:19 +0100
commit3f58cfa55e39f199af0fd2b12d543729751481ba (patch)
tree30ce92df25adfad386ab79e2b08225063d1e81af
parent694930845bab1654412e49cca14d7b94488b951d (diff)
downloadrabbitmq-server-3f58cfa55e39f199af0fd2b12d543729751481ba.tar.gz
Factored out route deletion with reverse lookup
-rw-r--r--src/rabbit_exchange.erl44
1 files changed, 25 insertions, 19 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 82534354..a9e27a70 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -240,30 +240,16 @@ delete_bindings(Binding = #binding{exchange_name = X,
end
end)
end, exchanges_for_queue(QueueName)),
- %TODO: Refactor this because it is the mirror image of the code below
- RouteMatch = reverse_route(#route{binding = Binding}),
- lists:foreach(fun(Route) ->
- B = Route#reverse_route.reverse_binding,
- R = #route{binding = #binding{exchange_name = B#reverse_binding.exchange_name,
- queue_name = B#reverse_binding.queue_name,
- key = B#reverse_binding.key}},
- ok = mnesia:delete_object(R),
- ok = mnesia:delete_object(durable_routes, R, write)
- end, mnesia:match_object(RouteMatch)),
- ok = mnesia:delete_object(RouteMatch);
+ indexed_delete(reverse_route(#route{binding = Binding}),
+ fun mnesia:delete_object/1, fun delete_forward_routes/1);
delete_bindings(Binding = #binding{exchange_name = ExchangeName,
queue_name = QueueName})
when QueueName == '_'
andalso ExchangeName /= '_' ->
% This uses the forward routes as the primary index
- RouteMatch = #route{binding = Binding},
- lists:foreach(fun(Route) ->
- ok = mnesia:delete_object(reverse_route(Route))
- end, mnesia:match_object(RouteMatch)),
- ok = mnesia:delete_object(RouteMatch),
- ok = mnesia:delete_object(durable_routes, RouteMatch, write);
-
+ indexed_delete(#route{binding = Binding},
+ fun delete_forward_routes/1, fun mnesia:delete_object/1);
% Must be called in a transaction
delete_bindings(QueueName) ->
@@ -271,6 +257,16 @@ delete_bindings(QueueName) ->
queue_name = QueueName,
key = '_'}).
+indexed_delete(Match, ForwardsDeleteFun, ReverseDeleteFun) ->
+ lists:foreach(fun(Route) ->
+ ok = ReverseDeleteFun(reverse_route(Route))
+ end, mnesia:match_object(Match)),
+ ForwardsDeleteFun(Match).
+
+delete_forward_routes(Match) ->
+ ok = mnesia:delete_object(Match),
+ ok = mnesia:delete_object(durable_routes, Match, write).
+
exchanges_for_queue(QueueName) ->
MatchHead = #reverse_route{reverse_binding =
#reverse_binding{exchange_name = '$1',
@@ -376,7 +372,17 @@ route_with_reverse(Binding = #binding{}) ->
{Route, reverse_route(Route)}.
reverse_route(#route{binding = Binding}) ->
- #reverse_route{reverse_binding = reverse_binding(Binding)}.
+ #reverse_route{reverse_binding = reverse_binding(Binding)};
+
+reverse_route(#reverse_route{reverse_binding = Binding}) ->
+ #route{binding = reverse_binding(Binding)}.
+
+reverse_binding(#reverse_binding{exchange_name = Exchange,
+ queue_name = Queue,
+ key = Key}) ->
+ #binding{exchange_name = Exchange,
+ queue_name = Queue,
+ key = Key};
reverse_binding(#binding{exchange_name = Exchange,
queue_name = Queue,