Skip to content

Commit 381df01

Browse files
committed
Move test to its own suite
1 parent 1c97113 commit 381df01

File tree

4 files changed

+210
-83
lines changed

4 files changed

+210
-83
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",
@@ -663,7 +671,7 @@ rabbitmq_integration_suite(
663671
":test_quorum_queue_utils_beam",
664672
],
665673
flaky = True,
666-
shard_count = 7,
674+
shard_count = 6,
667675
)
668676

669677
rabbitmq_suite(

deps/rabbit/app.bzl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,16 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
801801
erlc_opts = "//:test_erlc_opts",
802802
deps = ["//deps/amqp_client:erlang_app"],
803803
)
804+
erlang_bytecode(
805+
name = "member_evaluation_SUITE_beam_files",
806+
testonly = True,
807+
srcs = ["test/member_evaluation_SUITE.erl"],
808+
outs = ["test/member_evaluation_SUITE.beam"],
809+
hdrs = ["include/amqqueue.hrl", "include/amqqueue_v2.hrl"],
810+
app_name = "rabbit",
811+
erlc_opts = "//:test_erlc_opts",
812+
deps = ["//deps/amqp_client:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app"],
813+
)
804814
erlang_bytecode(
805815
name = "cluster_rename_SUITE_beam_files",
806816
testonly = True,
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
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+
{uncluster_size_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), Server0}),
146+
3 =:= length(M)
147+
end),
148+
ok = rabbit_control_helper:command(stop_app, Server2),
149+
ok = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_db_cluster, forget_member,
150+
[Server2, false]),
151+
%% with one node 'forgotten', eventually the membership will shrink to 2
152+
wait_until(fun() ->
153+
{ok, M, _} = ra:members({quorum_queue_utils:ra_name(QQ), Server0}),
154+
2 =:= length(M)
155+
end).
156+
157+
158+
159+
add_server_to_cluster(Server, Leader) ->
160+
ok = rabbit_control_helper:command(stop_app, Server),
161+
ok = rabbit_control_helper:command(join_cluster, Server, [atom_to_list(Leader)], []),
162+
rabbit_control_helper:command(start_app, Server).
163+
164+
declare(Ch, Q) ->
165+
declare(Ch, Q, []).
166+
167+
declare(Ch, Q, Args) ->
168+
amqp_channel:call(Ch, #'queue.declare'{queue = Q,
169+
durable = true,
170+
auto_delete = false,
171+
arguments = Args}).
172+
173+
wait_until(Condition) ->
174+
wait_until(Condition, 60).
175+
176+
wait_until(Condition, 0) ->
177+
?assertEqual(true, Condition());
178+
wait_until(Condition, N) ->
179+
case Condition() of
180+
true ->
181+
ok;
182+
_ ->
183+
timer:sleep(500),
184+
wait_until(Condition, N - 1)
185+
end.
186+
187+
188+
delete_queues() ->
189+
[rabbit_amqqueue:delete(Q, false, false, <<"dummy">>)
190+
|| 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)