diff options
Diffstat (limited to 'src')
| -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 9d3d6d5f2f..2c5ea99c90 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), |
