diff options
author | Ben Hood <0x6e6562@gmail.com> | 2008-10-06 10:53:45 +0100 |
---|---|---|
committer | Ben Hood <0x6e6562@gmail.com> | 2008-10-06 10:53:45 +0100 |
commit | ff26177ec09b2220183d410c61f258880c130a77 (patch) | |
tree | a3f1c8fb90a43fe81bb50dbda213301564809b12 | |
parent | 675a5b81fb78d7277ba1c2fed784705eb8295f09 (diff) | |
download | rabbitmq-server-ff26177ec09b2220183d410c61f258880c130a77.tar.gz |
Fixed full table scan when deleting forwards routes
-rw-r--r-- | src/rabbit_exchange.erl | 23 |
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}) |