summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Hood <0x6e6562@gmail.com>2008-10-06 10:53:45 +0100
committerBen Hood <0x6e6562@gmail.com>2008-10-06 10:53:45 +0100
commitff26177ec09b2220183d410c61f258880c130a77 (patch)
treea3f1c8fb90a43fe81bb50dbda213301564809b12
parent675a5b81fb78d7277ba1c2fed784705eb8295f09 (diff)
downloadrabbitmq-server-ff26177ec09b2220183d410c61f258880c130a77.tar.gz
Fixed full table scan when deleting forwards routes
-rw-r--r--src/rabbit_exchange.erl23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 871ccf4b..5e4702f9 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -218,13 +218,6 @@ lookup_qpids(Queues) ->
[QPid | Acc]
end, [], sets:from_list(Queues)).
-delete_forward_routes(ExchangeName, QueueName) ->
- Route = #route{binding = #binding{exchange_name = ExchangeName,
- queue_name = QueueName,
- key = '_'}},
- ok = mnesia:delete_object(Route),
- ok = mnesia:delete_object(durable_routes, Route, write).
-
%% TODO: Should all of the route and binding management not be
%% refactored to its own module, especially seeing as unbind will have
%% to be implemented for 0.91 ?
@@ -246,12 +239,20 @@ delete_bindings(Binding = #binding{exchange_name = X,
do_internal_delete(ExchangeName)
end;
true -> ok
- end,
- delete_forward_routes(ExchangeName, QueueName)
+ end
end)
end, exchanges_for_queue(QueueName)),
- ok = mnesia:delete_object(reverse_route(#route{binding = Binding}));
-
+ %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);
delete_bindings(Binding = #binding{exchange_name = ExchangeName,
queue_name = QueueName})