Skip to content

Commit f398892

Browse files
authored
Deprecate queue-master-locator (#11565)
* Deprecate queue-master-locator This should not be a breaking change - all validation should still pass * CQs can now use `queue-leader-locator` * `queue-leader-locator` takes precedence over `queue-master-locator` if both are used * regardless of which name is used, effectively there are only two values: `client-local` (default) or `balanced` * other values (`min-masters`, `random`, `least-leaders`) are mapped to `balanced` * Management UI no longer shows `master-locator` fields when declaring a queue/policy, but such arguments can still be used manually (unless not permitted) * exclusive queues are always declared locally, as before
1 parent 70eb413 commit f398892

22 files changed

+564
-815
lines changed

deps/rabbit/BUILD.bazel

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -645,12 +645,6 @@ rabbitmq_integration_suite(
645645
size = "medium",
646646
)
647647

648-
rabbitmq_integration_suite(
649-
name = "queue_master_location_SUITE",
650-
size = "large",
651-
shard_count = 2,
652-
)
653-
654648
rabbitmq_integration_suite(
655649
name = "queue_parallel_SUITE",
656650
size = "large",
@@ -678,6 +672,11 @@ rabbitmq_integration_suite(
678672
shard_count = 6,
679673
)
680674

675+
rabbitmq_integration_suite(
676+
name = "classic_queue_SUITE",
677+
size = "medium",
678+
)
679+
681680
rabbitmq_suite(
682681
name = "rabbit_confirms_SUITE",
683682
size = "small",
@@ -1020,6 +1019,14 @@ rabbitmq_suite(
10201019
size = "small",
10211020
)
10221021

1022+
rabbitmq_suite(
1023+
name = "unit_queue_location_SUITE",
1024+
size = "small",
1025+
deps = [
1026+
"@meck//:erlang_app",
1027+
]
1028+
)
1029+
10231030
rabbitmq_integration_suite(
10241031
name = "unit_stats_and_metrics_SUITE",
10251032
size = "medium",

deps/rabbit/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@ SLOW_CT_SUITES := backing_queue \
206206
priority_queue \
207207
priority_queue_recovery \
208208
publisher_confirms_parallel \
209-
queue_master_location \
210209
queue_parallel \
211210
quorum_queue \
212211
rabbit_core_metrics_gc \

deps/rabbit/app.bzl

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ def all_beam_files(name = "all_beam_files"):
1414
"src/rabbit_credential_validator.erl",
1515
"src/rabbit_exchange_type.erl",
1616
"src/rabbit_policy_merge_strategy.erl",
17-
"src/rabbit_queue_master_locator.erl",
1817
"src/rabbit_queue_type.erl",
1918
"src/rabbit_tracking.erl",
2019
],
@@ -194,11 +193,6 @@ def all_beam_files(name = "all_beam_files"):
194193
"src/rabbit_queue_decorator.erl",
195194
"src/rabbit_queue_index.erl",
196195
"src/rabbit_queue_location.erl",
197-
"src/rabbit_queue_location_client_local.erl",
198-
"src/rabbit_queue_location_min_masters.erl",
199-
"src/rabbit_queue_location_random.erl",
200-
"src/rabbit_queue_location_validator.erl",
201-
"src/rabbit_queue_master_location_misc.erl",
202196
"src/rabbit_queue_type_util.erl",
203197
"src/rabbit_quorum_memory_manager.erl",
204198
"src/rabbit_quorum_queue.erl",
@@ -272,7 +266,6 @@ def all_test_beam_files(name = "all_test_beam_files"):
272266
"src/rabbit_credential_validator.erl",
273267
"src/rabbit_exchange_type.erl",
274268
"src/rabbit_policy_merge_strategy.erl",
275-
"src/rabbit_queue_master_locator.erl",
276269
"src/rabbit_queue_type.erl",
277270
"src/rabbit_tracking.erl",
278271
],
@@ -453,11 +446,6 @@ def all_test_beam_files(name = "all_test_beam_files"):
453446
"src/rabbit_queue_decorator.erl",
454447
"src/rabbit_queue_index.erl",
455448
"src/rabbit_queue_location.erl",
456-
"src/rabbit_queue_location_client_local.erl",
457-
"src/rabbit_queue_location_min_masters.erl",
458-
"src/rabbit_queue_location_random.erl",
459-
"src/rabbit_queue_location_validator.erl",
460-
"src/rabbit_queue_master_location_misc.erl",
461449
"src/rabbit_queue_type_util.erl",
462450
"src/rabbit_quorum_memory_manager.erl",
463451
"src/rabbit_quorum_queue.erl",
@@ -732,12 +720,6 @@ def all_srcs(name = "all_srcs"):
732720
"src/rabbit_queue_decorator.erl",
733721
"src/rabbit_queue_index.erl",
734722
"src/rabbit_queue_location.erl",
735-
"src/rabbit_queue_location_client_local.erl",
736-
"src/rabbit_queue_location_min_masters.erl",
737-
"src/rabbit_queue_location_random.erl",
738-
"src/rabbit_queue_location_validator.erl",
739-
"src/rabbit_queue_master_location_misc.erl",
740-
"src/rabbit_queue_master_locator.erl",
741723
"src/rabbit_queue_type.erl",
742724
"src/rabbit_queue_type_util.erl",
743725
"src/rabbit_quorum_memory_manager.erl",
@@ -1239,15 +1221,6 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
12391221
erlc_opts = "//:test_erlc_opts",
12401222
deps = ["//deps/amqp_client:erlang_app"],
12411223
)
1242-
erlang_bytecode(
1243-
name = "queue_master_location_SUITE_beam_files",
1244-
testonly = True,
1245-
srcs = ["test/queue_master_location_SUITE.erl"],
1246-
outs = ["test/queue_master_location_SUITE.beam"],
1247-
app_name = "rabbit",
1248-
erlc_opts = "//:test_erlc_opts",
1249-
deps = ["//deps/amqp_client:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app"],
1250-
)
12511224
erlang_bytecode(
12521225
name = "queue_parallel_SUITE_beam_files",
12531226
testonly = True,
@@ -2143,3 +2116,20 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
21432116
erlc_opts = "//:test_erlc_opts",
21442117
deps = ["//deps/amqp_client:erlang_app"],
21452118
)
2119+
erlang_bytecode(
2120+
name = "unit_queue_location_SUITE_beam_files",
2121+
testonly = True,
2122+
srcs = ["test/unit_queue_location_SUITE.erl"],
2123+
outs = ["test/unit_queue_location_SUITE.beam"],
2124+
app_name = "rabbit",
2125+
erlc_opts = "//:test_erlc_opts",
2126+
)
2127+
erlang_bytecode(
2128+
name = "classic_queue_SUITE_beam_files",
2129+
testonly = True,
2130+
srcs = ["test/classic_queue_SUITE.erl"],
2131+
outs = ["test/classic_queue_SUITE.beam"],
2132+
app_name = "rabbit",
2133+
erlc_opts = "//:test_erlc_opts",
2134+
deps = ["//deps/amqp_client:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app"],
2135+
)

deps/rabbit/priv/schema/rabbit.schema

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,6 +1464,10 @@ end}.
14641464

14651465
%% Queue master locator (classic queues)
14661466
%%
1467+
%% For backwards compatibility only as of 4.0.
1468+
%% We still allow values of min-masters, random and client-local
1469+
%% but the behaviour is only local or balanced.
1470+
%% Use queue_leader_locator instead.
14671471

14681472
{mapping, "queue_master_locator", "rabbit.queue_master_locator",
14691473
[{datatype, string}]}.

deps/rabbit/src/rabbit_classic_queue.erl

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
-module(rabbit_classic_queue).
22
-behaviour(rabbit_queue_type).
3+
-behaviour(rabbit_policy_validator).
34

45
-include("amqqueue.hrl").
56
-include_lib("rabbit_common/include/rabbit.hrl").
@@ -63,14 +64,66 @@
6364
send_drained_credit_api_v1/4,
6465
send_credit_reply/7]).
6566

67+
-export([validate_policy/1]).
68+
69+
-rabbit_boot_step(
70+
{?MODULE,
71+
[{description, "Deprecated queue-master-locator support."
72+
"Use queue-leader-locator instead."},
73+
{mfa, {rabbit_registry, register,
74+
[policy_validator, <<"queue-master-locator">>, ?MODULE]}},
75+
{mfa, {rabbit_registry, register,
76+
[operator_policy_validator, <<"queue-master-locator">>, ?MODULE]}},
77+
{requires, rabbit_registry},
78+
{enables, recovery}]}).
79+
80+
validate_policy(Args) ->
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
96+
end.
97+
6698
-spec is_enabled() -> boolean().
6799
is_enabled() -> true.
68100

69101
-spec is_compatible(boolean(), boolean(), boolean()) -> boolean().
70102
is_compatible(_, _, _) ->
71103
true.
72104

105+
validate_arguments(Args) ->
106+
case lists:keymember(<<"x-queue-master-locator">>, 1, Args) of
107+
false ->
108+
ok;
109+
true ->
110+
case rabbit_queue_location:master_locator_permitted() of
111+
true ->
112+
ok;
113+
false ->
114+
Warning = rabbit_deprecated_features:get_warning(
115+
queue_master_locator),
116+
{protocol_error, internal_error, "~ts", [Warning]}
117+
end
118+
end.
119+
73120
declare(Q, Node) when ?amqqueue_is_classic(Q) ->
121+
case validate_arguments(amqqueue:get_arguments(Q)) of
122+
ok -> do_declare(Q, Node);
123+
Error -> Error
124+
end.
125+
126+
do_declare(Q, Node) when ?amqqueue_is_classic(Q) ->
74127
QName = amqqueue:get_name(Q),
75128
VHost = amqqueue:get_vhost(Q),
76129
Node1 = case {Node, rabbit_amqqueue:is_exclusive(Q)} of
@@ -79,10 +132,8 @@ declare(Q, Node) when ?amqqueue_is_classic(Q) ->
79132
{_, true} ->
80133
Node;
81134
_ ->
82-
case rabbit_queue_master_location_misc:get_location(Q) of
83-
{ok, Node0} -> Node0;
84-
_ -> Node
85-
end
135+
{Node0, _} = rabbit_queue_location:select_leader_and_followers(Q, 1),
136+
Node0
86137
end,
87138
case rabbit_vhost_sup_sup:get_vhost_sup(VHost, Node1) of
88139
{ok, _} ->
@@ -509,15 +560,18 @@ recover_durable_queues(QueuesAndRecoveryTerms) ->
509560
capabilities() ->
510561
#{unsupported_policies => [%% Stream policies
511562
<<"max-age">>, <<"stream-max-segment-size-bytes">>,
512-
<<"queue-leader-locator">>, <<"initial-cluster-size">>,
563+
<<"initial-cluster-size">>,
513564
%% Quorum policies
514565
<<"delivery-limit">>, <<"dead-letter-strategy">>, <<"max-in-memory-length">>, <<"max-in-memory-bytes">>, <<"target-group-size">>],
515566
queue_arguments => [<<"x-expires">>, <<"x-message-ttl">>, <<"x-dead-letter-exchange">>,
516567
<<"x-dead-letter-routing-key">>, <<"x-max-length">>,
517568
<<"x-max-length-bytes">>, <<"x-max-priority">>,
518569
<<"x-overflow">>, <<"x-queue-mode">>, <<"x-queue-version">>,
519-
<<"x-single-active-consumer">>, <<"x-queue-type">>,
520-
<<"x-queue-master-locator">>],
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,
521575
consumer_arguments => [<<"x-priority">>, <<"x-credit">>],
522576
server_named => true}.
523577

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+
}}).

0 commit comments

Comments
 (0)