diff options
author | Michael Bridgen <mikeb@lshift.net> | 2010-02-22 12:41:54 +0000 |
---|---|---|
committer | Michael Bridgen <mikeb@lshift.net> | 2010-02-22 12:41:54 +0000 |
commit | 8dd6e060058c530b97efc15e71b2d7d76d5fdfe8 (patch) | |
tree | ab0cb4ec66540d2d118ec21f1a96c08afecc42f5 | |
parent | f9d397dc015519b08854e2fe930f7f4a0f13c899 (diff) | |
download | rabbitmq-server-8dd6e060058c530b97efc15e71b2d7d76d5fdfe8.tar.gz |
Nicer formulation of cleanup_deleted_queue_bindings, thanks to
Matthew. This one has the same number of function heads, but is much
clearer. Also, correct the previous re-arrangement of the bit just
above that calls the hooks; it wasn't calling delete with the
bindings, but delete_binding followed by delete, in the case of an
auto-deleted exchange.
-rw-r--r-- | src/rabbit_exchange.erl | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index 9d3d6d5f..2c5ea99c 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -300,16 +300,14 @@ delete_queue_bindings(QueueName, FwdDeleteFun) -> _ = '_'}}), write)], Cleanup = cleanup_deleted_queue_bindings( - lists:keysort(#binding.exchange_name, DeletedBindings), - none, [], []), + lists:keysort(#binding.exchange_name, DeletedBindings), []), fun () -> lists:foreach( fun ({{IsDeleted, X = #exchange{ type = Type }}, Bs}) -> Module = type_to_module(Type), - [Module:delete_binding(X, B) || B <- Bs], case IsDeleted of - auto_deleted -> Module:delete(X, []); - no_delete -> ok + auto_deleted -> Module:delete(X, Bs); + no_delete -> [Module:delete_binding(X, B) || B <- Bs] end end, Cleanup) end. @@ -317,22 +315,25 @@ delete_queue_bindings(QueueName, FwdDeleteFun) -> %% Requires that its input binding list is sorted in exchange-name %% order, so that the grouping of bindings (for passing to %% cleanup_deleted_queue_bindings1) works properly. -cleanup_deleted_queue_bindings([], ExchangeName, Bindings, Acc) -> - cleanup_deleted_queue_bindings1(ExchangeName, Bindings, Acc); -cleanup_deleted_queue_bindings( - [B = #binding{exchange_name = ExchangeName} | Rest], - ExchangeName, Bindings, Acc) -> - cleanup_deleted_queue_bindings(Rest, ExchangeName, [B | Bindings], Acc); -cleanup_deleted_queue_bindings([B = #binding{exchange_name = N} | Rest], - ExchangeName, Bindings, Acc) -> - NewAcc = cleanup_deleted_queue_bindings1(ExchangeName, Bindings, Acc), - cleanup_deleted_queue_bindings(Rest, N, [B], NewAcc). - -cleanup_deleted_queue_bindings1(none, [], Acc) -> +cleanup_deleted_queue_bindings([], Acc) -> Acc; -cleanup_deleted_queue_bindings1(ExchangeName, Bindings, Acc) -> +cleanup_deleted_queue_bindings( + [B = #binding{exchange_name = ExchangeName} | Bs], Acc) -> + cleanup_deleted_queue_bindings(ExchangeName, Bs, [B], Acc). + +cleanup_deleted_queue_bindings( + ExchangeName, [B = #binding{exchange_name = ExchangeName} | Bs], + Bindings, Acc) -> + cleanup_deleted_queue_bindings(ExchangeName, Bs, [B | Bindings], Acc); +cleanup_deleted_queue_bindings(ExchangeName, Deleted, Bindings, Acc) -> + %% either Deleted is [], or its head has a non-matching ExchangeName + NewAcc = [cleanup_deleted_queue_bindings1(ExchangeName, Bindings) | Acc], + cleanup_deleted_queue_bindings(Deleted, NewAcc). + +cleanup_deleted_queue_bindings1(ExchangeName, Bindings) -> [X] = mnesia:read({rabbit_exchange, ExchangeName}), - [{maybe_auto_delete(X), Bindings} | Acc]. + {maybe_auto_delete(X), Bindings}. + delete_forward_routes(Route) -> ok = mnesia:delete_object(rabbit_route, Route, write), |