Skip to content

Commit 8d80817

Browse files
committed
Move test to its own suite
1 parent ba89c75 commit 8d80817

File tree

5 files changed

+219
-90
lines changed

5 files changed

+219
-90
lines changed

deps/rabbit/BUILD.bazel

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,14 @@ rabbitmq_integration_suite(
331331
size = "medium",
332332
)
333333

334+
rabbitmq_integration_suite(
335+
name = "member_evaluation_SUITE",
336+
size = "medium",
337+
additional_beam = [
338+
":test_quorum_queue_utils_beam",
339+
],
340+
)
341+
334342
rabbitmq_integration_suite(
335343
name = "clustering_management_SUITE",
336344
size = "large",
@@ -671,7 +679,7 @@ rabbitmq_integration_suite(
671679
":test_quorum_queue_utils_beam",
672680
],
673681
flaky = True,
674-
shard_count = 7,
682+
shard_count = 6,
675683
)
676684

677685
rabbitmq_suite(

deps/rabbit/app.bzl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,16 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
805805
erlc_opts = "//:test_erlc_opts",
806806
deps = ["//deps/amqp_client:erlang_app"],
807807
)
808+
erlang_bytecode(
809+
name = "member_evaluation_SUITE_beam_files",
810+
testonly = True,
811+
srcs = ["test/member_evaluation_SUITE.erl"],
812+
outs = ["test/member_evaluation_SUITE.beam"],
813+
hdrs = ["include/amqqueue.hrl", "include/amqqueue_v2.hrl"],
814+
app_name = "rabbit",
815+
erlc_opts = "//:test_erlc_opts",
816+
deps = ["//deps/amqp_client:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app"],
817+
)
808818
erlang_bytecode(
809819
name = "cluster_rename_SUITE_beam_files",
810820
testonly = True,

deps/rabbit/src/rabbit_queue_member_eval.erl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ handle_cast(_Msg, State) ->
7878
handle_info(?EVAL_MSG, #state{default_interval = DefaultInterval,
7979
short_interval = ShortInterval,
8080
target_group_size = TargetSize} = State) ->
81-
Res = eval_quroum_queue_membership(TargetSize),
81+
Res = eval_quorum_queue_membership(TargetSize),
8282
NewTimeout = case Res of
8383
noop ->
8484
DefaultInterval;
@@ -100,7 +100,7 @@ code_change(_OldVsn, State, _Extra) ->
100100
%% Internal functions
101101
%%----------------------------------------------------------------------------
102102

103-
eval_quroum_queue_membership(TargetSize) ->
103+
eval_quorum_queue_membership(TargetSize) ->
104104
LocalLeaders = rabbit_amqqueue:list_local_leaders(),
105105
ExpectedNodes = rabbit_nodes:list_members(),
106106
Running = rabbit_nodes:list_running(),
@@ -118,7 +118,7 @@ eval_quorum_members(ExpectedNodes, Running, [Q | LocalLeaders], TargetSize, OldR
118118
Remove = MemberNodes -- ExpectedNodes,
119119
case Remove of
120120
[] ->
121-
add_member(Q, Running, MemberNodes, TargetSize);
121+
add_member(Q, Running, MemberNodes, get_target_size(Q, TargetSize));
122122
_ ->
123123
remove_members(Q, Remove)
124124
end;
@@ -139,9 +139,10 @@ add_member(Q, Running, MemberNodes, TargetSize) ->
139139
case rabbit_quorum_queue:add_member(Q, Node) of
140140
ok ->
141141
rabbit_log:debug(
142-
"Added node ~ts as a member to queue ~ts as "
143-
"the queues target group size is not met and "
144-
"there are enough nodes in the cluster", [Node, QName]);
142+
"Added node ~ts as a member to ~ts as "
143+
"the queues target group size(#~w) is not met and "
144+
"there are enough new nodes(#~w) in the cluster",
145+
[Node, rabbit_misc:rs(QName), TargetSize, length(New)]);
145146
{error, Err} ->
146147
rabbit_log:warning(
147148
"~ts: failed to add member (replica) on node ~w, error: ~w",
@@ -154,7 +155,6 @@ add_member(Q, Running, MemberNodes, TargetSize) ->
154155

155156
should_add_node(MemberNodes, New, Q, TargetSize) ->
156157
CurrentSize = length(MemberNodes),
157-
TargetSize = get_target_size(Q, TargetSize),
158158
maybe
159159
true ?= CurrentSize < TargetSize, %% Target size not reached
160160
true ?= (TargetSize - CurrentSize) =< length(New), %% Enough nodes,
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
%% This Source Code Form is subject to the terms of the Mozilla Public
2+
%% License, v. 2.0. If a copy of the MPL was not distributed with this
3+
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
4+
%%
5+
%% Copyright (c) 2018-2023 VMware, Inc. or its affiliates. All rights reserved.
6+
7+
-module(member_evaluation_SUITE).
8+
9+
-include_lib("common_test/include/ct.hrl").
10+
-include_lib("eunit/include/eunit.hrl").
11+
-include_lib("amqp_client/include/amqp_client.hrl").
12+
-include_lib("rabbitmq_ct_helpers/include/rabbit_assert.hrl").
13+
14+
-compile([nowarn_export_all, export_all]).
15+
16+
17+
all() ->
18+
[
19+
{group, unclustered}
20+
].
21+
22+
groups() ->
23+
[
24+
{unclustered, [],
25+
[
26+
{quorum_queue_3, [], [auto_grow, auto_shrink]}
27+
]}
28+
].
29+
30+
%% -------------------------------------------------------------------
31+
%% Testsuite setup/teardown.
32+
%% -------------------------------------------------------------------
33+
34+
init_per_suite(Config0) ->
35+
rabbit_ct_helpers:log_environment(),
36+
Config1 = rabbit_ct_helpers:merge_app_env(
37+
Config0, {rabbit, [{quorum_tick_interval, 1000},
38+
{member_eval_default_timeout, 5000},
39+
{member_eval_short_timeout, 2000},
40+
{member_eval_target_group_size, 3}]}),
41+
rabbit_ct_helpers:run_setup_steps(Config1, []).
42+
43+
end_per_suite(Config) ->
44+
rabbit_ct_helpers:run_teardown_steps(Config).
45+
init_per_group(unclustered, Config) ->
46+
rabbit_ct_helpers:set_config(Config, [{rmq_nodes_clustered, false}]);
47+
init_per_group(Group, Config) ->
48+
ClusterSize = 3,
49+
Config1 = rabbit_ct_helpers:set_config(Config,
50+
[{rmq_nodes_count, ClusterSize},
51+
{rmq_nodename_suffix, Group},
52+
{tcp_ports_base}]),
53+
Config1b = rabbit_ct_helpers:set_config(Config1, [{net_ticktime, 10}]),
54+
rabbit_ct_helpers:run_steps(Config1b,
55+
[fun merge_app_env/1 ] ++
56+
rabbit_ct_broker_helpers:setup_steps()).
57+
58+
end_per_group(unclustered, Config) ->
59+
Config;
60+
end_per_group(_, Config) ->
61+
rabbit_ct_helpers:run_steps(Config,
62+
rabbit_ct_broker_helpers:teardown_steps()).
63+
64+
init_per_testcase(Testcase, Config) ->
65+
Config1 = rabbit_ct_helpers:testcase_started(Config, Testcase),
66+
rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE, delete_queues, []),
67+
Q = rabbit_data_coercion:to_binary(Testcase),
68+
Config2 = rabbit_ct_helpers:set_config(Config1,
69+
[{queue_name, Q},
70+
{alt_queue_name, <<Q/binary, "_alt">>},
71+
{alt_2_queue_name, <<Q/binary, "_alt_2">>}
72+
]),
73+
rabbit_ct_helpers:run_steps(Config2, rabbit_ct_client_helpers:setup_steps()).
74+
75+
merge_app_env(Config) ->
76+
rabbit_ct_helpers:merge_app_env(
77+
rabbit_ct_helpers:merge_app_env(Config,
78+
{rabbit, [{core_metrics_gc_interval, 100}]}),
79+
{ra, [{min_wal_roll_over_interval, 30000}]}).
80+
81+
end_per_testcase(Testcase, Config) ->
82+
[Server0, Server1, Server2] =
83+
rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
84+
reset_nodes([Server1, Server2], Server0),
85+
Config1 = rabbit_ct_helpers:run_steps(
86+
Config,
87+
rabbit_ct_client_helpers:teardown_steps()),
88+
rabbit_ct_helpers:testcase_finished(Config1, Testcase).
89+
90+
reset_nodes([], _Leader) ->
91+
ok;
92+
reset_nodes([Node| Nodes], Leader) ->
93+
ok = rabbit_control_helper:command(stop_app, Node),
94+
ok = rabbit_control_helper:command(forget_cluster_node, Leader, [atom_to_list(Node)]),
95+
ok = rabbit_control_helper:command(reset, Node),
96+
ok = rabbit_control_helper:command(start_app, Node),
97+
reset_nodes(Nodes, Leader).
98+
99+
100+
%% -------------------------------------------------------------------
101+
%% Testcases.
102+
%% -------------------------------------------------------------------
103+
104+
auto_grow(Config) ->
105+
[Server0, Server1, Server2] =
106+
rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
107+
Ch = rabbit_ct_client_helpers:open_channel(Config, Server0),
108+
109+
QQ = ?config(queue_name, Config),
110+
?assertEqual({'queue.declare_ok', QQ, 0, 0},
111+
declare(Ch, QQ, [{<<"x-queue-type">>, longstr, <<"quorum">>}])),
112+
113+
%% There is only one node in the cluster at the moment
114+
{ok, Members, _} = ra:members({quorum_queue_utils:ra_name(QQ), Server0}),
115+
?assertEqual(1, length(Members)),
116+
117+
add_server_to_cluster(Server1, Server0),
118+
%% With 2 nodes in the cluster, target group size is not reached, so no
119+
%% new members should be available. We sleep a while so the periodic check
120+
%% runs
121+
timer:sleep(4000),
122+
{ok, Members, _} = ra:members({quorum_queue_utils:ra_name(QQ), Server0}),
123+
?assertEqual(1, length(Members)),
124+
125+
add_server_to_cluster(Server2, Server0),
126+
%% With 3 nodes in the cluster, target size is met so eventually it should
127+
%% be 3 members
128+
wait_until(fun() ->
129+
{ok, M, _} = ra:members({quorum_queue_utils:ra_name(QQ), Server0}),
130+
3 =:= length(M)
131+
end).
132+
133+
auto_shrink(Config) ->
134+
[Server0, Server1, Server2] =
135+
rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
136+
Ch = rabbit_ct_client_helpers:open_channel(Config, Server0),
137+
add_server_to_cluster(Server1, Server0),
138+
add_server_to_cluster(Server2, Server0),
139+
140+
QQ = ?config(queue_name, Config),
141+
?assertEqual({'queue.declare_ok', QQ, 0, 0},
142+
declare(Ch, QQ, [{<<"x-queue-type">>, longstr, <<"quorum">>}])),
143+
144+
wait_until(fun() ->
145+
{ok, M, _} = ra:members({quorum_queue_utils:ra_name(QQ),
146+
Server0}),
147+
3 =:= length(M)
148+
end),
149+
ok = rabbit_control_helper:command(stop_app, Server2),
150+
ok = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_db_cluster, forget_member,
151+
[Server2, false]),
152+
%% with one node 'forgotten', eventually the membership will shrink to 2
153+
wait_until(fun() ->
154+
{ok, M, _} = ra:members({quorum_queue_utils:ra_name(QQ),
155+
Server0}),
156+
2 =:= length(M)
157+
end).
158+
159+
160+
161+
add_server_to_cluster(Server, Leader) ->
162+
ok = rabbit_control_helper:command(stop_app, Server),
163+
ok = rabbit_control_helper:command(join_cluster, Server, [atom_to_list(Leader)], []),
164+
rabbit_control_helper:command(start_app, Server).
165+
166+
declare(Ch, Q) ->
167+
declare(Ch, Q, []).
168+
169+
declare(Ch, Q, Args) ->
170+
amqp_channel:call(Ch, #'queue.declare'{queue = Q,
171+
durable = true,
172+
auto_delete = false,
173+
arguments = Args}).
174+
175+
wait_until(Condition) ->
176+
wait_until(Condition, 60).
177+
178+
wait_until(Condition, 0) ->
179+
?assertEqual(true, Condition());
180+
wait_until(Condition, N) ->
181+
case Condition() of
182+
true ->
183+
ok;
184+
_ ->
185+
timer:sleep(500),
186+
wait_until(Condition, N - 1)
187+
end.
188+
189+
190+
delete_queues() ->
191+
[rabbit_amqqueue:delete(Q, false, false, <<"dummy">>)
192+
|| Q <- rabbit_amqqueue:list()].

deps/rabbit/test/quorum_queue_SUITE.erl

Lines changed: 1 addition & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ groups() ->
3838
++ memory_tests()
3939
++ [node_removal_is_quorum_critical]},
4040
{unclustered, [], [
41-
{uncluster_size_2, [], [add_member]},
42-
{uncluster_size_3, [], [auto_grow, auto_shrink]}
41+
{uncluster_size_2, [], [add_member]}
4342
]},
4443
{clustered, [], [
4544
{cluster_size_2, [], [add_member_not_running,
@@ -200,7 +199,6 @@ init_per_group(Group, Config) ->
200199
ClusterSize = case Group of
201200
single_node -> 1;
202201
uncluster_size_2 -> 2;
203-
uncluster_size_3 -> 3;
204202
cluster_size_2 -> 2;
205203
cluster_size_3 -> 3;
206204
cluster_size_5 -> 5
@@ -1804,85 +1802,6 @@ add_member(Config) ->
18041802
Servers = lists:sort(Servers0),
18051803
?assertEqual(Servers, lists:sort(proplists:get_value(online, Info, []))).
18061804

1807-
auto_grow(Config) ->
1808-
[Server0, Server1, Server2] =
1809-
rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
1810-
Ch = rabbit_ct_client_helpers:open_channel(Config, Server0),
1811-
1812-
ok = rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env,
1813-
[rabbit, member_eval_default_timeout, 5000]),
1814-
ok = rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env,
1815-
[rabbit, member_eval_short_timeout, 2000]),
1816-
ok = rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env,
1817-
[rabbit, member_eval_target_group_size, 3]),
1818-
1819-
QQ = ?config(queue_name, Config),
1820-
?assertEqual({'queue.declare_ok', QQ, 0, 0},
1821-
declare(Ch, QQ, [{<<"x-queue-type">>, longstr, <<"quorum">>}])),
1822-
1823-
%% There is only one node in the cluster at the moment
1824-
{ok, Members, _} = ra:members({ra_name(QQ), Server0}),
1825-
?assertEqual(1, length(Members)),
1826-
1827-
ok = rabbit_control_helper:command(stop_app, Server1),
1828-
ok = rabbit_control_helper:command(join_cluster, Server1, [atom_to_list(Server0)], []),
1829-
rabbit_control_helper:command(start_app, Server1),
1830-
1831-
%% With 2 nodes in the cluster, target group size is not reached, so no
1832-
%% new members should be available. We sleep a while so the periodic check
1833-
%% runs
1834-
timer:sleep(4000),
1835-
{ok, Members, _} = ra:members({ra_name(QQ), Server0}),
1836-
?assertEqual(1, length(Members)),
1837-
1838-
ok = rabbit_control_helper:command(stop_app, Server2),
1839-
ok = rabbit_control_helper:command(join_cluster, Server2, [atom_to_list(Server0)], []),
1840-
rabbit_control_helper:command(start_app, Server2),
1841-
1842-
%% With 3 nodes in the cluster, target size is met so eventually it should
1843-
%% be 3 members
1844-
wait_until(fun() ->
1845-
{ok, M, _} = ra:members({ra_name(QQ), Server0}),
1846-
3 =:= length(M)
1847-
end).
1848-
1849-
auto_shrink(Config) ->
1850-
[Server0, Server1, Server2] =
1851-
rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
1852-
Ch = rabbit_ct_client_helpers:open_channel(Config, Server0),
1853-
ok = rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env,
1854-
[rabbit, member_eval_default_timeout, 5000]),
1855-
ok = rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env,
1856-
[rabbit, member_eval_short_timeout, 2000]),
1857-
ok = rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env,
1858-
[rabbit, member_eval_target_group_size, 3]),
1859-
1860-
ok = rabbit_control_helper:command(stop_app, Server1),
1861-
ok = rabbit_control_helper:command(join_cluster, Server1, [atom_to_list(Server0)], []),
1862-
rabbit_control_helper:command(start_app, Server1),
1863-
ok = rabbit_control_helper:command(stop_app, Server2),
1864-
ok = rabbit_control_helper:command(join_cluster, Server2, [atom_to_list(Server0)], []),
1865-
rabbit_control_helper:command(start_app, Server2),
1866-
1867-
QQ = ?config(queue_name, Config),
1868-
?assertEqual({'queue.declare_ok', QQ, 0, 0},
1869-
declare(Ch, QQ, [{<<"x-queue-type">>, longstr, <<"quorum">>}])),
1870-
1871-
wait_until(fun() ->
1872-
{ok, M, _} = ra:members({ra_name(QQ), Server0}),
1873-
3 =:= length(M)
1874-
end),
1875-
ok = rabbit_control_helper:command(stop_app, Server2),
1876-
1877-
ok = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_db_cluster, forget_member,
1878-
[Server2, false]),
1879-
%% with one node 'forgotten', eventually the membership will shrink to 2
1880-
wait_until(fun() ->
1881-
{ok, M, _} = ra:members({ra_name(QQ), Server0}),
1882-
2 =:= length(M)
1883-
end).
1884-
1885-
18861805
delete_member_not_running(Config) ->
18871806
[Server | _] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
18881807

0 commit comments

Comments
 (0)