diff options
| author | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2019-01-22 18:00:20 +0100 |
|---|---|---|
| committer | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2019-02-01 11:23:15 +0100 |
| commit | 166991462cb362ffb771dd731a13c8e7ad2e7be0 (patch) | |
| tree | bfdf14af80436fd7cd32c45a021092ca208bce73 | |
| parent | a87f5b19164946c594fc17f1d229aeb0c2335bbb (diff) | |
| download | rabbitmq-server-git-166991462cb362ffb771dd731a13c8e7ad2e7be0.tar.gz | |
Convert explicit default bindings removal to a feature flag
The feature flag is called `implicit_default_bindings`. It has the same
role as the previously existing upgrade function. The upgrade function
is removed in the process.
Compared to the upgrade function however, it does remove entries in the
`rabbit_route`, `rabbit_reverse_route` and `rabbit_semi_durable_route`
tables in addition to `rabbit_durable_route` table. Also, the list of
queues is taken from the `rabbit_queue` table instead of the
`rabbit_durable_queue` one.
[#163224049,#159298729]
| -rw-r--r-- | src/rabbit_binding.erl | 6 | ||||
| -rw-r--r-- | src/rabbit_core_ff.erl | 50 | ||||
| -rw-r--r-- | src/rabbit_upgrade_functions.erl | 21 |
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) -> |
