summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_binding.erl6
-rw-r--r--src/rabbit_core_ff.erl50
-rw-r--r--src/rabbit_upgrade_functions.erl21
3 files changed, 52 insertions, 25 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl
index 2b63b809b8..c4542abc61 100644
--- a/src/rabbit_binding.erl
+++ b/src/rabbit_binding.erl
@@ -257,7 +257,11 @@ remove(Src, Dst, B, ActingUser) ->
remove_default_exchange_binding_rows_of(Dst = #resource{}) ->
case rabbit_binding:implicit_for_destination(Dst) of
[Binding] ->
- mnesia:dirty_delete(rabbit_durable_route, Binding);
+ mnesia:dirty_delete(rabbit_durable_route, Binding),
+ mnesia:dirty_delete(rabbit_semi_durable_route, Binding),
+ mnesia:dirty_delete(rabbit_reverse_route,
+ reverse_binding(Binding)),
+ mnesia:dirty_delete(rabbit_route, Binding);
_ ->
%% no binding to remove or
%% a competing tx has beaten us to it?
diff --git a/src/rabbit_core_ff.erl b/src/rabbit_core_ff.erl
index 158eca4df8..a13099e304 100644
--- a/src/rabbit_core_ff.erl
+++ b/src/rabbit_core_ff.erl
@@ -16,7 +16,8 @@
-module(rabbit_core_ff).
--export([quorum_queue_migration/3]).
+-export([quorum_queue_migration/3,
+ implicit_default_bindings_migration/3]).
-rabbit_feature_flag(
{quorum_queue,
@@ -26,13 +27,29 @@
migration_fun => {?MODULE, quorum_queue_migration}
}}).
+-rabbit_feature_flag(
+ {implicit_default_bindings,
+ #{desc => "Default bindings are now implicit, instead of "
+ "being stored in the database",
+ stability => stable,
+ migration_fun => {?MODULE, implicit_default_bindings_migration}
+ }}).
+
+%% -------------------------------------------------------------------
+%% Quorum queues.
+%% -------------------------------------------------------------------
+
+-define(quorum_queue_tables, [rabbit_queue,
+ rabbit_durable_queue]).
+
quorum_queue_migration(FeatureName, _FeatureProps, enable) ->
- Tables = [rabbit_queue,
- rabbit_durable_queue],
+ Tables = ?quorum_queue_tables,
rabbit_table:wait(Tables),
Fields = amqqueue:fields(amqqueue_v2),
migrate_to_amqqueue_with_type(FeatureName, Tables, Fields);
quorum_queue_migration(_FeatureName, _FeatureProps, is_enabled) ->
+ Tables = ?quorum_queue_tables,
+ rabbit_table:wait(Tables),
Fields = amqqueue:fields(amqqueue_v2),
mnesia:table_info(rabbit_queue, attributes) =:= Fields andalso
mnesia:table_info(rabbit_durable_queue, attributes) =:= Fields.
@@ -51,3 +68,30 @@ migrate_to_amqqueue_with_type(FeatureName, [], _) ->
rabbit_log:info("Feature flag `~s`: Mnesia tables migration done",
[FeatureName]),
ok.
+
+%% -------------------------------------------------------------------
+%% Default bindings.
+%% -------------------------------------------------------------------
+
+implicit_default_bindings_migration(FeatureName, _FeatureProps,
+ enable) ->
+ %% Default exchange bindings are now implicit (not stored in the
+ %% route tables). It should be safe to remove them outside of a
+ %% transaction.
+ rabbit_table:wait([rabbit_queue]),
+ Queues = mnesia:dirty_all_keys(rabbit_queue),
+ remove_explicit_default_bindings(FeatureName, Queues);
+implicit_default_bindings_migration(_Feature_Name, _FeatureProps,
+ is_enabled) ->
+ undefined.
+
+remove_explicit_default_bindings(_FeatureName, []) ->
+ ok;
+remove_explicit_default_bindings(FeatureName, Queues) ->
+ rabbit_log:info("Feature flag `~s`: deleting explicit "
+ "default bindings for ~b queues "
+ "(it may take some time)...",
+ [FeatureName, length(Queues)]),
+ [rabbit_binding:remove_default_exchange_binding_rows_of(Q)
+ || Q <- Queues],
+ ok.
diff --git a/src/rabbit_upgrade_functions.erl b/src/rabbit_upgrade_functions.erl
index 76a8b59e31..3072728d69 100644
--- a/src/rabbit_upgrade_functions.erl
+++ b/src/rabbit_upgrade_functions.erl
@@ -62,9 +62,6 @@
-rabbit_upgrade({queue_options, mnesia, [queue_vhost_field]}).
-rabbit_upgrade({exchange_options, mnesia, [operator_policies]}).
-%% TODO: move that to feature flags
--rabbit_upgrade({remove_explicit_default_exchange_bindings, mnesia, [queue_state]}).
-
%% -------------------------------------------------------------------
-spec remove_user_scope() -> 'ok'.
@@ -613,24 +610,6 @@ exchange_options(Table) ->
[name, type, durable, auto_delete, internal, arguments, scratches, policy,
operator_policy, decorators, options]).
-remove_explicit_default_exchange_bindings() ->
- Tab = rabbit_durable_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(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.
-
%%--------------------------------------------------------------------
transform(TableName, Fun, FieldList) ->