diff options
author | Matthew Sackman <matthew@rabbitmq.com> | 2010-10-08 18:56:36 +0100 |
---|---|---|
committer | Matthew Sackman <matthew@rabbitmq.com> | 2010-10-08 18:56:36 +0100 |
commit | 17e1c2b4e8966eefb9dc6195dfa64d97f495a36c (patch) | |
tree | 2592d906d067bf82fd543bcfada7755f6d0606eb /src/rabbit_exchange.erl | |
parent | 325f0c2291e25bfdda468954ac9f77894a851788 (diff) | |
download | rabbitmq-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.erl | 15 |
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)}. |