151 lines
5.4 KiB
Erlang
151 lines
5.4 KiB
Erlang
%% This Source Code Form is subject to the terms of the Mozilla Public
|
|
%% License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
%%
|
|
%% Copyright (c) 2007-2025 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
|
|
%%
|
|
|
|
-module(per_vhost_connection_limit_partitions_SUITE).
|
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
-include_lib("rabbitmq_ct_helpers/include/rabbit_assert.hrl").
|
|
|
|
-compile(nowarn_export_all).
|
|
-compile(export_all).
|
|
|
|
-import(rabbit_ct_client_helpers, [open_unmanaged_connection/2,
|
|
open_unmanaged_connection/3]).
|
|
|
|
|
|
all() ->
|
|
[
|
|
{group, net_ticktime_1}
|
|
].
|
|
|
|
groups() ->
|
|
[
|
|
{net_ticktime_1, [], [
|
|
cluster_full_partition_with_autoheal
|
|
]}
|
|
].
|
|
|
|
suite() ->
|
|
[
|
|
%% If a test hangs, no need to wait for 30 minutes.
|
|
{timetrap, {minutes, 8}}
|
|
].
|
|
|
|
%% see partitions_SUITE
|
|
-define(DELAY, 12000).
|
|
|
|
%% -------------------------------------------------------------------
|
|
%% Testsuite setup/teardown.
|
|
%% -------------------------------------------------------------------
|
|
|
|
init_per_suite(Config) ->
|
|
rabbit_ct_helpers:log_environment(),
|
|
rabbit_ct_helpers:run_setup_steps(Config, [
|
|
fun rabbit_ct_broker_helpers:configure_dist_proxy/1
|
|
]).
|
|
|
|
end_per_suite(Config) ->
|
|
rabbit_ct_helpers:run_teardown_steps(Config).
|
|
|
|
init_per_group(net_ticktime_1 = Group, Config) ->
|
|
Config1 = rabbit_ct_helpers:set_config(Config, [{net_ticktime, 1}]),
|
|
init_per_multinode_group(Group, Config1, 3).
|
|
|
|
init_per_multinode_group(_Group, Config, NodeCount) ->
|
|
Suffix = rabbit_ct_helpers:testcase_absname(Config, "", "-"),
|
|
Config1 = rabbit_ct_helpers:set_config(Config, [
|
|
{rmq_nodes_count, NodeCount},
|
|
{rmq_nodename_suffix, Suffix}
|
|
]),
|
|
rabbit_ct_helpers:run_steps(Config1,
|
|
rabbit_ct_broker_helpers:setup_steps() ++
|
|
rabbit_ct_client_helpers:setup_steps()).
|
|
|
|
end_per_group(_Group, Config) ->
|
|
rabbit_ct_helpers:run_steps(Config,
|
|
rabbit_ct_client_helpers:teardown_steps() ++
|
|
rabbit_ct_broker_helpers:teardown_steps()).
|
|
|
|
init_per_testcase(Testcase, Config) ->
|
|
rabbit_ct_helpers:testcase_started(Config, Testcase).
|
|
|
|
end_per_testcase(Testcase, Config) ->
|
|
rabbit_ct_helpers:testcase_finished(Config, Testcase).
|
|
|
|
%% -------------------------------------------------------------------
|
|
%% Test cases.
|
|
%% -------------------------------------------------------------------
|
|
|
|
cluster_full_partition_with_autoheal(Config) ->
|
|
VHost = <<"/">>,
|
|
rabbit_ct_broker_helpers:set_partition_handling_mode_globally(Config, autoheal),
|
|
|
|
?assertEqual(0, count_connections_in(Config, VHost)),
|
|
[A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
|
|
|
|
%% 6 connections, 2 per node
|
|
Conn1 = open_unmanaged_connection(Config, A),
|
|
Conn2 = open_unmanaged_connection(Config, A),
|
|
Conn3 = open_unmanaged_connection(Config, B),
|
|
Conn4 = open_unmanaged_connection(Config, B),
|
|
Conn5 = open_unmanaged_connection(Config, C),
|
|
Conn6 = open_unmanaged_connection(Config, C),
|
|
?awaitMatch(Connections when length(Connections) == 6,
|
|
connections_in(Config, VHost),
|
|
60000, 3000),
|
|
|
|
%% B drops off the network, non-reachable by either A or C
|
|
rabbit_ct_broker_helpers:block_traffic_between(A, B),
|
|
rabbit_ct_broker_helpers:block_traffic_between(B, C),
|
|
timer:sleep(?DELAY),
|
|
|
|
%% A and C are still connected, so 4 connections are tracked
|
|
?awaitMatch(Connections when length(Connections) == 4,
|
|
connections_in(Config, VHost),
|
|
60000, 3000),
|
|
|
|
rabbit_ct_broker_helpers:allow_traffic_between(A, B),
|
|
rabbit_ct_broker_helpers:allow_traffic_between(B, C),
|
|
timer:sleep(?DELAY),
|
|
|
|
%% During autoheal B's connections were dropped. Autoheal is not running
|
|
%% when Khepri is used.
|
|
KhepriEnabled = rabbit_ct_broker_helpers:is_feature_flag_enabled(
|
|
Config, khepri_db),
|
|
ExpectedCount = case KhepriEnabled of
|
|
true -> 6;
|
|
false -> 4
|
|
end,
|
|
?awaitMatch(Connections when length(Connections) == ExpectedCount,
|
|
connections_in(Config, VHost),
|
|
60000, 3000),
|
|
|
|
lists:foreach(fun (Conn) ->
|
|
(catch rabbit_ct_client_helpers:close_connection(Conn))
|
|
end, [Conn1, Conn2, Conn3, Conn4,
|
|
Conn5, Conn6]),
|
|
|
|
passed.
|
|
|
|
%% -------------------------------------------------------------------
|
|
%% Helpers
|
|
%% -------------------------------------------------------------------
|
|
|
|
count_connections_in(Config, VHost) ->
|
|
count_connections_in(Config, VHost, 0).
|
|
count_connections_in(Config, VHost, NodeIndex) ->
|
|
rabbit_ct_broker_helpers:rpc(Config, NodeIndex,
|
|
rabbit_connection_tracking,
|
|
count_tracked_items_in, [{vhost, VHost}]).
|
|
|
|
connections_in(Config, VHost) ->
|
|
connections_in(Config, 0, VHost).
|
|
connections_in(Config, NodeIndex, VHost) ->
|
|
rabbit_ct_broker_helpers:rpc(Config, NodeIndex,
|
|
rabbit_connection_tracking,
|
|
list, [VHost]).
|