summaryrefslogtreecommitdiff
path: root/src/rabbit_exchange.erl
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2010-10-08 18:56:36 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2010-10-08 18:56:36 +0100
commit17e1c2b4e8966eefb9dc6195dfa64d97f495a36c (patch)
tree2592d906d067bf82fd543bcfada7755f6d0606eb /src/rabbit_exchange.erl
parent325f0c2291e25bfdda468954ac9f77894a851788 (diff)
downloadrabbitmq-server-17e1c2b4e8966eefb9dc6195dfa64d97f495a36c.tar.gz
Minimised the number of calls to the XTs on deletion
Diffstat (limited to 'src/rabbit_exchange.erl')
-rw-r--r--src/rabbit_exchange.erl15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 9581c229..50f49d0c 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -84,7 +84,7 @@
rabbit_types:error('in_use')).
-spec(maybe_auto_delete/1::
(rabbit_types:exchange())
- -> 'not_deleted' | {'auto_deleted', fun (() -> any())}).
+ -> 'not_deleted' | {'auto_deleted', dict:dictionary()}).
-endif.
@@ -278,10 +278,11 @@ delete(XName, IfUnused) ->
false -> fun unconditional_delete/1
end,
case call_with_exchange(XName, Fun) of
- {deleted, X = #exchange{type = Type}, Bs, Fun1} ->
- (type_to_module(Type)):delete(X, Bs),
- Fun1(),
- ok;
+ {deleted, X, Bs, Grouped} ->
+ Grouped1 = dict:update(XName, fun ({_X, _MaybeDeleted, Bs1}) ->
+ {X, deleted, [Bs | Bs1]}
+ end, {X, deleted, Bs}, Grouped),
+ ok = (rabbit_binding:post_binding_removal_fun(Grouped1))();
Error = {error, _InUseOrNotFound} ->
Error
end.
@@ -291,7 +292,7 @@ maybe_auto_delete(#exchange{auto_delete = false}) ->
maybe_auto_delete(#exchange{auto_delete = true} = X) ->
case conditional_delete(X) of
{error, in_use} -> not_deleted;
- {deleted, X, [], Fun} -> {auto_deleted, Fun}
+ {deleted, X, [], Res} -> {auto_deleted, Res}
end.
conditional_delete(X = #exchange{name = XName}) ->
@@ -305,4 +306,4 @@ unconditional_delete(X = #exchange{name = XName}) ->
ok = mnesia:delete({rabbit_durable_exchange, XName}),
ok = mnesia:delete({rabbit_exchange, XName}),
rabbit_event:notify(exchange_deleted, [{name, XName}]),
- {deleted, X, Bindings, rabbit_binding:remove_for_destination(XName)}.
+ {deleted, X, Bindings, rabbit_binding:remove_for_destination_inner(XName)}.