diff options
author | Ben Hood <0x6e6562@gmail.com> | 2008-10-08 14:07:36 +0100 |
---|---|---|
committer | Ben Hood <0x6e6562@gmail.com> | 2008-10-08 14:07:36 +0100 |
commit | 9f4987da7816cad46476109d4ccc92a5cfe18a80 (patch) | |
tree | cfcd40f4394a7f5301f49ef9dcbc20ed8067b80f | |
parent | f53a02b832ad72f767f72a6b6422cafbcc3d0362 (diff) | |
download | rabbitmq-server-9f4987da7816cad46476109d4ccc92a5cfe18a80.tar.gz |
Simplified has_bindings because it only needs to do simple select and count
-rw-r--r-- | src/rabbit_exchange.erl | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index 39505c5a..169edcc4 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -226,22 +226,21 @@ lookup_qpids(Queues) -> delete_bindings(Binding = #binding{exchange_name = X, queue_name = QueueName}) when QueueName /= '_' andalso X == '_' -> + Exchanges = exchanges_for_queue(QueueName), + indexed_delete(reverse_route(#route{binding = Binding}), + fun mnesia:delete_object/1, fun delete_forward_routes/1), lists:foreach( fun(ExchangeName) -> call_with_exchange(ExchangeName, fun(Exchange) -> if Exchange#exchange.auto_delete -> - case has_bindings(ExchangeName, QueueName) of + case has_bindings(ExchangeName) of true -> ok; - false -> - unchecked_internal_delete(ExchangeName) + false -> unchecked_internal_delete(ExchangeName) end; - true -> ok - end - end) - end, exchanges_for_queue(QueueName)), - indexed_delete(reverse_route(#route{binding = Binding}), - fun mnesia:delete_object/1, fun delete_forward_routes/1); + true -> ok + end + end) end, Exchanges); %% This uses the forward routes as the primary index. delete_bindings(Binding = #binding{exchange_name = ExchangeName, @@ -276,17 +275,12 @@ exchanges_for_queue(QueueName) -> mnesia:select(reverse_route, [{MatchHead, [], ['$1']}]))). has_bindings(ExchangeName) -> - has_bindings_helper(ExchangeName, []). - -has_bindings(ExchangeName, QueueName) -> - has_bindings_helper(ExchangeName, [{'=/=', '$1', {QueueName}}]). - -has_bindings_helper(ExchangeName, Condition) -> MatchHead = #route{binding = #binding{exchange_name = ExchangeName, queue_name = '$1', key = '_'}}, - case mnesia:select(route, [{MatchHead, Condition, ['$1']}], 1, read) of + case mnesia:select(route, [{MatchHead, [], ['$1']}], 2, read) of '$end_of_table' -> false; + {[], _} -> false; _ -> true end. |