summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_binding.erl20
-rw-r--r--src/rabbit_upgrade_functions.erl26
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.
%%--------------------------------------------------------------------