Skip to content

Commit 6568492

Browse files
committed
Implement PR feedback
* prevent the warning about deprecated features when they are not actually used * add a feature flag to prevent the use of queue-leader-locator until all nodes support it * don't use is_mixed_version in tests * keyfind -> keymember
1 parent f0537bb commit 6568492

File tree

5 files changed

+62
-48
lines changed

5 files changed

+62
-48
lines changed

deps/rabbit/src/rabbit_classic_queue.erl

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,21 @@
7878
{enables, recovery}]}).
7979

8080
validate_policy(Args) ->
81-
Strategy = proplists:get_value(<<"queue-master-locator">>, Args, unknown),
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", []}
81+
%% queue-master-locator was deprecated in 4.0
82+
Locator = proplists:get_value(<<"queue-master-locator">>, Args, unknown),
83+
case Locator of
84+
unknown ->
85+
ok;
86+
_ ->
87+
case rabbit_queue_location:master_locator_permitted() of
88+
true ->
89+
case lists:member(Locator, rabbit_queue_location:queue_leader_locators()) of
90+
true -> ok;
91+
false -> {error, "~tp is not a valid master locator", [Locator]}
92+
end;
93+
false ->
94+
{error, "use of deprecated queue-master-locator argument is not permitted", []}
95+
end
9096
end.
9197

9298
-spec is_enabled() -> boolean().
@@ -97,25 +103,24 @@ is_compatible(_, _, _) ->
97103
true.
98104

99105
validate_arguments(Args) ->
100-
case lists:keyfind(<<"x-queue-master-locator">>, 1, Args) of
106+
case lists:keymember(<<"x-queue-master-locator">>, 1, Args) of
101107
false ->
102108
ok;
103-
_ ->
109+
true ->
104110
case rabbit_queue_location:master_locator_permitted() of
105111
true ->
106112
ok;
107113
false ->
108-
error
114+
Warning = rabbit_deprecated_features:get_warning(
115+
queue_master_locator),
116+
{protocol_error, internal_error, "~ts", [Warning]}
109117
end
110118
end.
111119

112120
declare(Q, Node) when ?amqqueue_is_classic(Q) ->
113121
case validate_arguments(amqqueue:get_arguments(Q)) of
114122
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]}
123+
Error -> Error
119124
end.
120125

121126
do_declare(Q, Node) when ?amqqueue_is_classic(Q) ->
@@ -562,11 +567,11 @@ capabilities() ->
562567
<<"x-dead-letter-routing-key">>, <<"x-max-length">>,
563568
<<"x-max-length-bytes">>, <<"x-max-priority">>,
564569
<<"x-overflow">>, <<"x-queue-mode">>, <<"x-queue-version">>,
565-
<<"x-single-active-consumer">>, <<"x-queue-type">>,
566-
<<"x-queue-leader-locator">>] ++ case rabbit_queue_location:master_locator_permitted() of
567-
true -> [<<"x-queue-master-locator">>];
568-
false -> []
569-
end,
570+
<<"x-single-active-consumer">>, <<"x-queue-type">>, <<"x-queue-master-locator">>]
571+
++ case rabbit_feature_flags:is_enabled(classic_queue_leader_locator) of
572+
true -> [<<"x-queue-leader-locator">>];
573+
false -> []
574+
end,
570575
consumer_arguments => [<<"x-priority">>, <<"x-credit">>],
571576
server_named => true}.
572577

deps/rabbit/src/rabbit_core_ff.erl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,10 @@
185185
stability => stable,
186186
depends_on => [message_containers]
187187
}}).
188+
189+
-rabbit_feature_flag(
190+
{classic_queue_leader_locator,
191+
#{desc => "queue-leader-locator support in classic queues",
192+
doc_url => "https://www.rabbitmq.com/docs/clustering#replica-placement",
193+
stability => stable
194+
}}).

deps/rabbit/src/rabbit_queue_location.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
messages =>
2929
#{when_permitted =>
3030
"queue-master-locator is deprecated. "
31-
"queue-leader-locator should be used instead. Allowed values are 'client-local' and 'balanced'."}}
31+
"queue-leader-locator should be used instead (allowed values are 'client-local' and 'balanced')"}}
3232
}).
3333

3434
-define(QUEUE_LEADER_LOCATORS_DEPRECATED, [<<"random">>, <<"least-leaders">>, <<"min-masters">>]).

deps/rabbit/test/classic_queue_SUITE.erl

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111

1212
-compile([nowarn_export_all, export_all]).
1313

14+
-import(rabbit_ct_broker_helpers,
15+
[get_node_config/3,
16+
rpc/4,
17+
rpc/5]).
1418

1519
all() ->
1620
[
@@ -56,38 +60,37 @@ end_per_group(_, Config) ->
5660
rabbit_ct_client_helpers:teardown_steps() ++
5761
rabbit_ct_broker_helpers:teardown_steps()).
5862

63+
init_per_testcase(T, Config) ->
64+
case rpc(Config, rabbit_feature_flags, is_enabled, [classic_queue_leader_locator]) of
65+
true ->
66+
rabbit_ct_helpers:testcase_started(Config, T);
67+
false ->
68+
{skip, "queue-leader-locator support was added to classic queues in 4.0;"
69+
"previously only queue-master-locator was allowed"}
70+
end.
71+
5972
%% -------------------------------------------------------------------
6073
%% Testcases.
6174
%% -------------------------------------------------------------------
6275

6376
leader_locator_client_local(Config) ->
64-
case rabbit_ct_helpers:is_mixed_versions() of
65-
true ->
66-
{skip, "x-queue-leader-locator is only supported by CQs in 4.0+"};
67-
false ->
77+
Servers = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
78+
Q = <<"q1">>,
6879

69-
Servers = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
70-
Q = <<"q1">>,
71-
72-
[begin
73-
Ch = rabbit_ct_client_helpers:open_channel(Config, Server),
74-
?assertEqual({'queue.declare_ok', Q, 0, 0},
75-
declare(Ch, Q, [{<<"x-queue-type">>, longstr, <<"classic">>},
76-
{<<"x-queue-leader-locator">>, longstr, <<"client-local">>}])),
77-
{ok, Leader0} = rabbit_ct_broker_helpers:rpc(Config, Server, rabbit_amqqueue, lookup, [rabbit_misc:r(<<"/">>, queue, Q)]),
78-
Leader = amqqueue:qnode(Leader0),
79-
?assertEqual(Server, Leader),
80-
?assertMatch(#'queue.delete_ok'{},
81-
amqp_channel:call(Ch, #'queue.delete'{queue = Q}))
82-
end || Server <- Servers] end.
80+
[begin
81+
Ch = rabbit_ct_client_helpers:open_channel(Config, Server),
82+
?assertEqual({'queue.declare_ok', Q, 0, 0},
83+
declare(Ch, Q, [{<<"x-queue-type">>, longstr, <<"classic">>},
84+
{<<"x-queue-leader-locator">>, longstr, <<"client-local">>}])),
85+
{ok, Leader0} = rabbit_ct_broker_helpers:rpc(Config, Server, rabbit_amqqueue, lookup, [rabbit_misc:r(<<"/">>, queue, Q)]),
86+
Leader = amqqueue:qnode(Leader0),
87+
?assertEqual(Server, Leader),
88+
?assertMatch(#'queue.delete_ok'{},
89+
amqp_channel:call(Ch, #'queue.delete'{queue = Q}))
90+
end || Server <- Servers].
8391

8492
leader_locator_balanced(Config) ->
85-
case rabbit_ct_helpers:is_mixed_versions() of
86-
true ->
87-
{skip, "x-queue-leader-locator is only supported by CQs in 4.0+"};
88-
false ->
89-
test_leader_locator(Config, <<"x-queue-leader-locator">>, [<<"balanced">>])
90-
end.
93+
test_leader_locator(Config, <<"x-queue-leader-locator">>, [<<"balanced">>]).
9194

9295
%% This test can be delted once we remove x-queue-master-locator support
9396
locator_deprecated(Config) ->

deps/rabbit/test/rabbitmq_4_0_deprecations_SUITE.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,7 @@ when_queue_master_locator_is_permitted_by_default(Config) ->
495495
?assert(
496496
log_file_contains_message(
497497
Config, NodeA,
498-
["Deprecated features: `queue_master_locator`: queue-master-locator is deprecated. ",
499-
"queue-leader-locator should be used instead."])).
498+
["Deprecated features: `queue_master_locator`: queue-master-locator is deprecated"])).
500499

501500
when_queue_master_locator_is_not_permitted_from_conf(Config) ->
502501
[NodeA] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),

0 commit comments

Comments
 (0)