Skip to content

Commit f0537bb

Browse files
committed
Add deprecation flag for master-locator
1 parent 4c0df42 commit f0537bb

File tree

3 files changed

+124
-7
lines changed

3 files changed

+124
-7
lines changed

deps/rabbit/src/rabbit_classic_queue.erl

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,14 @@
7979

8080
validate_policy(Args) ->
8181
Strategy = proplists:get_value(<<"queue-master-locator">>, Args, unknown),
82-
case lists:member(Strategy, rabbit_queue_location:queue_leader_locators()) of
83-
true -> ok;
84-
false -> {error, "~tp is not a valid master locator", [Strategy]}
82+
case rabbit_queue_location:master_locator_permitted() of
83+
true ->
84+
case lists:member(Strategy, rabbit_queue_location:queue_leader_locators()) of
85+
true -> ok;
86+
false -> {error, "~tp is not a valid master locator", [Strategy]}
87+
end;
88+
false ->
89+
{error, "use of deprecated queue-master-locator argument is not permitted", []}
8590
end.
8691

8792
-spec is_enabled() -> boolean().
@@ -91,7 +96,29 @@ is_enabled() -> true.
9196
is_compatible(_, _, _) ->
9297
true.
9398

99+
validate_arguments(Args) ->
100+
case lists:keyfind(<<"x-queue-master-locator">>, 1, Args) of
101+
false ->
102+
ok;
103+
_ ->
104+
case rabbit_queue_location:master_locator_permitted() of
105+
true ->
106+
ok;
107+
false ->
108+
error
109+
end
110+
end.
111+
94112
declare(Q, Node) when ?amqqueue_is_classic(Q) ->
113+
case validate_arguments(amqqueue:get_arguments(Q)) of
114+
ok -> do_declare(Q, Node);
115+
error ->
116+
Warning = rabbit_deprecated_features:get_warning(
117+
queue_master_locator),
118+
{protocol_error, internal_error, "~ts", [Warning]}
119+
end.
120+
121+
do_declare(Q, Node) when ?amqqueue_is_classic(Q) ->
95122
QName = amqqueue:get_name(Q),
96123
VHost = amqqueue:get_vhost(Q),
97124
Node1 = case {Node, rabbit_amqqueue:is_exclusive(Q)} of
@@ -536,7 +563,10 @@ capabilities() ->
536563
<<"x-max-length-bytes">>, <<"x-max-priority">>,
537564
<<"x-overflow">>, <<"x-queue-mode">>, <<"x-queue-version">>,
538565
<<"x-single-active-consumer">>, <<"x-queue-type">>,
539-
<<"x-queue-master-locator">>, <<"x-queue-leader-locator">>],
566+
<<"x-queue-leader-locator">>] ++ case rabbit_queue_location:master_locator_permitted() of
567+
true -> [<<"x-queue-master-locator">>];
568+
false -> []
569+
end,
540570
consumer_arguments => [<<"x-priority">>, <<"x-credit">>],
541571
server_named => true}.
542572

deps/rabbit/src/rabbit_queue_location.erl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
-include("amqqueue.hrl").
1111

1212
-export([queue_leader_locators/0,
13-
select_leader_and_followers/2]).
13+
select_leader_and_followers/2,
14+
master_locator_permitted/0]).
1415

1516
%% these are needed because of they are called with ?MODULE:
1617
%% to allow mecking them in tests
@@ -21,6 +22,15 @@
2122
-export([select_members/7, leader_node/6, leader_locator/1]).
2223
-endif.
2324

25+
-rabbit_deprecated_feature(
26+
{queue_master_locator,
27+
#{deprecation_phase => permitted_by_default,
28+
messages =>
29+
#{when_permitted =>
30+
"queue-master-locator is deprecated. "
31+
"queue-leader-locator should be used instead. Allowed values are 'client-local' and 'balanced'."}}
32+
}).
33+
2434
-define(QUEUE_LEADER_LOCATORS_DEPRECATED, [<<"random">>, <<"least-leaders">>, <<"min-masters">>]).
2535
-define(QUEUE_LEADER_LOCATORS, [<<"client-local">>, <<"balanced">>] ++ ?QUEUE_LEADER_LOCATORS_DEPRECATED).
2636
-define(QUEUE_COUNT_START_RANDOM_SELECTION, 1_000).
@@ -215,3 +225,6 @@ queues_per_node(Nodes, GetQueues) ->
215225
%% for unit testing
216226
-spec node() -> node().
217227
node() -> erlang:node().
228+
229+
master_locator_permitted() ->
230+
rabbit_deprecated_features:is_permitted(queue_master_locator).

deps/rabbit/test/rabbitmq_4_0_deprecations_SUITE.erl

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@
3232
set_policy_when_cmq_is_not_permitted_from_conf/1,
3333

3434
when_transient_nonexcl_is_permitted_by_default/1,
35-
when_transient_nonexcl_is_not_permitted_from_conf/1
35+
when_transient_nonexcl_is_not_permitted_from_conf/1,
36+
37+
when_queue_master_locator_is_permitted_by_default/1,
38+
when_queue_master_locator_is_not_permitted_from_conf/1
3639
]).
3740

3841
suite() ->
@@ -57,7 +60,10 @@ groups() ->
5760
set_policy_when_cmq_is_not_permitted_from_conf]},
5861
{transient_nonexcl_queues, [],
5962
[when_transient_nonexcl_is_permitted_by_default,
60-
when_transient_nonexcl_is_not_permitted_from_conf]}
63+
when_transient_nonexcl_is_not_permitted_from_conf]},
64+
{queue_master_locator, [],
65+
[when_queue_master_locator_is_permitted_by_default,
66+
when_queue_master_locator_is_not_permitted_from_conf]}
6167
],
6268
[{mnesia_store, [], Groups},
6369
{khepri_store, [], Groups}].
@@ -89,6 +95,8 @@ init_per_group(classic_queue_mirroring, Config) ->
8995
rabbit_ct_helpers:set_config(Config, {rmq_nodes_count, 1});
9096
init_per_group(transient_nonexcl_queues, Config) ->
9197
rabbit_ct_helpers:set_config(Config, {rmq_nodes_count, 1});
98+
init_per_group(queue_master_locator, Config) ->
99+
rabbit_ct_helpers:set_config(Config, {rmq_nodes_count, 1});
92100
init_per_group(_Group, Config) ->
93101
Config.
94102

@@ -125,6 +133,14 @@ init_per_testcase(
125133
[{permit_deprecated_features,
126134
#{transient_nonexcl_queues => false}}]}),
127135
init_per_testcase1(Testcase, Config1);
136+
init_per_testcase(
137+
when_queue_master_locator_is_not_permitted_from_conf = Testcase, Config) ->
138+
Config1 = rabbit_ct_helpers:merge_app_env(
139+
Config,
140+
{rabbit,
141+
[{permit_deprecated_features,
142+
#{queue_master_locator => false}}]}),
143+
init_per_testcase1(Testcase, Config1);
128144
init_per_testcase(Testcase, Config) ->
129145
init_per_testcase1(Testcase, Config).
130146

@@ -454,6 +470,64 @@ when_transient_nonexcl_is_not_permitted_from_conf(Config) ->
454470
["Deprecated features: `transient_nonexcl_queues`: Feature `transient_nonexcl_queues` is deprecated",
455471
"Its use is not permitted per the configuration"])).
456472

473+
%% -------------------------------------------------------------------
474+
%% (x-)queue-master-locator
475+
%% -------------------------------------------------------------------
476+
477+
when_queue_master_locator_is_permitted_by_default(Config) ->
478+
[NodeA] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
479+
480+
Ch = rabbit_ct_client_helpers:open_channel(Config, NodeA),
481+
482+
QName = list_to_binary(atom_to_list(?FUNCTION_NAME)),
483+
?assertEqual(
484+
{'queue.declare_ok', QName, 0, 0},
485+
amqp_channel:call(
486+
Ch,
487+
#'queue.declare'{queue = QName,
488+
arguments = [{<<"x-queue-master-locator">>, longstr, <<"client-local">>}]})),
489+
490+
?assertEqual(
491+
ok,
492+
rabbit_ct_broker_helpers:set_policy(
493+
Config, 0, <<"client-local">>, <<".*">>, <<"queues">>, [{<<"queue-master-locator">>, <<"client-local">>}])),
494+
495+
?assert(
496+
log_file_contains_message(
497+
Config, NodeA,
498+
["Deprecated features: `queue_master_locator`: queue-master-locator is deprecated. ",
499+
"queue-leader-locator should be used instead."])).
500+
501+
when_queue_master_locator_is_not_permitted_from_conf(Config) ->
502+
[NodeA] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
503+
504+
Ch = rabbit_ct_client_helpers:open_channel(Config, NodeA),
505+
506+
QName = list_to_binary(atom_to_list(?FUNCTION_NAME)),
507+
?assertExit(
508+
{{shutdown,
509+
{connection_closing,
510+
{server_initiated_close, 541,
511+
<<"INTERNAL_ERROR - Feature `queue_master_locator` is "
512+
"deprecated.", _/binary>>}}}, _},
513+
amqp_channel:call(
514+
Ch,
515+
#'queue.declare'{queue = QName,
516+
arguments = [{<<"x-queue-master-locator">>, longstr, <<"client-local">>}]})),
517+
518+
?assertError(
519+
{badmatch,
520+
{error_string,
521+
"Validation failed\n\nuse of deprecated queue-master-locator argument is not permitted\n"}},
522+
rabbit_ct_broker_helpers:set_policy(
523+
Config, 0, <<"client-local">>, <<".*">>, <<"queues">>, [{<<"queue-master-locator">>, <<"client-local">>}])),
524+
525+
?assert(
526+
log_file_contains_message(
527+
Config, NodeA,
528+
["Deprecated features: `queue_master_locator`: Feature `queue_master_locator` is deprecated",
529+
"Its use is not permitted per the configuration"])).
530+
457531
%% -------------------------------------------------------------------
458532
%% Helpers.
459533
%% -------------------------------------------------------------------

0 commit comments

Comments
 (0)