diff options
| -rw-r--r-- | src/rabbit_binding.erl | 20 | ||||
| -rw-r--r-- | src/rabbit_upgrade_functions.erl | 26 |
2 files changed, 33 insertions, 13 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl index d8312daede..14398bd4c9 100644 --- a/src/rabbit_binding.erl +++ b/src/rabbit_binding.erl @@ -25,7 +25,8 @@ -export([info_keys/0, info/1, info/2, info_all/1, info_all/2, info_all/4]). %% these must all be run inside a mnesia tx -export([has_for_source/1, remove_for_source/1, - remove_for_destination/2, remove_transient_for_destination/1]). + remove_for_destination/2, remove_transient_for_destination/1, + remove_default_exchange_binding_rows_of/1]). -export([implicit_for_destination/1, reverse_binding/1]). @@ -251,6 +252,23 @@ remove(Src, Dst, B, ActingUser) -> B#binding.source, [B], new_deletions(), false), process_deletions(Deletions, ActingUser). +%% Implicit bindings are implicit as of rabbitmq/rabbitmq-server#1721. +remove_default_exchange_binding_rows_of(Dst = #resource{}) -> + case rabbit_binding:implicit_for_destination(Dst) of + [Binding] -> + mnesia:dirty_delete(rabbit_route, Binding), + mnesia:dirty_delete(rabbit_durable_route, Binding), + mnesia:dirty_delete(rabbit_semi_durable_route, Binding), + + RevBinding = rabbit_binding:reverse_binding(Binding), + mnesia:dirty_delete(rabbit_reverse_route, RevBinding); + _ -> + %% no binding to remove or + %% a competing tx has beaten us to it? + ok + end, + ok. + list(VHostPath) -> VHostResource = rabbit_misc:r(VHostPath, '_'), Route = #route{binding = #binding{source = VHostResource, diff --git a/src/rabbit_upgrade_functions.erl b/src/rabbit_upgrade_functions.erl index 46519d6099..a4c1f06de7 100644 --- a/src/rabbit_upgrade_functions.erl +++ b/src/rabbit_upgrade_functions.erl @@ -65,7 +65,7 @@ -rabbit_upgrade({exchange_options, mnesia, [operator_policies]}). %% TODO: move that to feature flags --rabbit_upgrade({default_bindings, mnesia, [semi_durable_route]}). +-rabbit_upgrade({remove_explicit_default_exchange_bindings, mnesia, [queue_state]}). %% ------------------------------------------------------------------- @@ -107,6 +107,7 @@ -spec queue_quorum_nodes() -> 'ok'. -spec exchange_options() -> 'ok'. +-spec remove_explicit_default_exchange_bindings() -> 'ok'. %%-------------------------------------------------------------------- @@ -657,21 +658,22 @@ exchange_options(Table) -> [name, type, durable, auto_delete, internal, arguments, scratches, policy, operator_policy, decorators, options]). -default_bindings() -> +remove_explicit_default_exchange_bindings() -> + Tab = rabbit_queue, + rabbit_table:wait([Tab]), %% Default exchange bindings are now implicit %% (not stored in the route tables). %% It should be safe to remove them outside of a %% transaction. - Queues = mnesia:dirty_all_keys(rabbit_queue), - [begin - Binding = rabbit_binding:implicit_for_destination(Q), - mnesia:dirty_delete(rabbit_route, Binding), - mnesia:dirty_delete(rabbit_durable_route, Binding), - mnesia:dirty_delete(rabbit_semi_durable_route, Binding), - mnesia:dirty_delete(rabbit_reverse_route, - rabbit_binding:reverse_binding(Binding)) - end - || Q <- Queues], + Queues = mnesia:dirty_all_keys(Tab), + N = length(Queues), + case N of + 0 -> ok; + _ -> + error_logger:info_msg("Will delete explicit default exchange bindings for ~p queues. " + "This can take some time...", [N]), + [rabbit_binding:remove_default_exchange_binding_rows_of(Q) || Q <- Queues] + end, ok. %%-------------------------------------------------------------------- |
