xds_end2end_test: avoid flakes from lingering shutdown from previous test (#25561)

pull/25558/head^2
Mark D. Roth 4 years ago committed by GitHub
parent 4a90992d03
commit d482f1268a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      test/cpp/end2end/BUILD
  2. 122
      test/cpp/end2end/xds_end2end_test.cc

@ -516,7 +516,7 @@ grpc_cc_test(
"gtest",
],
flaky = True, # TODO(b/144705388)
shard_count = 10,
shard_count = 20,
tags = [
"no_test_ios",
"no_windows",

@ -260,25 +260,6 @@ void WriteBootstrapFiles() {
g_bootstrap_file_v2 = bootstrap_file;
}
// Helper class to minimize the number of unique ports we use for this test.
class PortSaver {
public:
int GetPort() {
if (idx_ >= ports_.size()) {
ports_.push_back(grpc_pick_unused_port_or_die());
}
return ports_[idx_++];
}
void Reset() { idx_ = 0; }
private:
std::vector<int> ports_;
size_t idx_ = 0;
};
PortSaver* g_port_saver = nullptr;
template <typename ServiceType>
class CountedService : public ServiceType {
public:
@ -1540,6 +1521,15 @@ const grpc_arg_pointer_vtable
class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
protected:
// TODO(roth): We currently set the number of backends and number of
// balancers on a per-test-suite basis, not a per-test-case basis.
// However, not every individual test case in a given test suite uses
// the same number of backends or balancers, so we wind up having to
// set the numbers for the test suite to the max number needed by any
// one test case in that test suite. This results in starting more
// servers (and using more ports) than we actually need. When we have
// time, change each test to directly start the number of backends and
// balancers that it needs, so that we aren't wasting resources.
XdsEnd2endTest(size_t num_backends, size_t num_balancers,
int client_load_reporting_interval_seconds = 100,
bool use_xds_enabled_server = false,
@ -1560,39 +1550,11 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
? g_bootstrap_file_v2
: g_bootstrap_file_v3);
}
g_port_saver->Reset();
bool localhost_resolves_to_ipv4 = false;
bool localhost_resolves_to_ipv6 = false;
grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4,
&localhost_resolves_to_ipv6);
ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6;
response_generator_ =
grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
// Inject xDS channel response generator.
lb_channel_response_generator_ =
grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
xds_channel_args_to_add_.emplace_back(
grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
lb_channel_response_generator_.get()));
// Inject xDS logical cluster resolver response generator.
logical_dns_cluster_resolver_response_generator_ =
grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
if (xds_resource_does_not_exist_timeout_ms_ > 0) {
xds_channel_args_to_add_.emplace_back(grpc_channel_arg_integer_create(
const_cast<char*>(GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS),
xds_resource_does_not_exist_timeout_ms_));
}
xds_channel_args_.num_args = xds_channel_args_to_add_.size();
xds_channel_args_.args = xds_channel_args_to_add_.data();
grpc_core::internal::SetXdsChannelArgsForTest(&xds_channel_args_);
// Make sure each test creates a new XdsClient instance rather than
// reusing the one from the previous test. This avoids spurious failures
// caused when a load reporting test runs after a non-load reporting test
// and the XdsClient is still talking to the old LRS server, which fails
// because it's not expecting the client to connect. It also
// ensures that each test can independently set the global channel
// args for the xDS channel.
grpc_core::internal::UnsetGlobalXdsClientForTest();
// Initialize default xDS resources.
// Construct LDS resource.
default_listener_.set_name(kServerName);
@ -1613,11 +1575,6 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
if (GetParam().enable_load_reporting()) {
default_cluster_.mutable_lrs_server()->mutable_self();
}
// Start the backends.
for (size_t i = 0; i < num_backends_; ++i) {
backends_.emplace_back(new BackendServerThread(use_xds_enabled_server_));
backends_.back()->Start();
}
// Start the load balancers.
for (size_t i = 0; i < num_balancers_; ++i) {
balancers_.emplace_back(
@ -1630,6 +1587,40 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
default_route_config_);
balancers_.back()->ads_service()->SetCdsResource(default_cluster_);
}
// Initialize XdsClient state.
response_generator_ =
grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
// Inject xDS channel response generator.
lb_channel_response_generator_ =
grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
xds_channel_args_to_add_.emplace_back(
grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
lb_channel_response_generator_.get()));
// Inject xDS logical cluster resolver response generator.
logical_dns_cluster_resolver_response_generator_ =
grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
if (xds_resource_does_not_exist_timeout_ms_ > 0) {
xds_channel_args_to_add_.emplace_back(grpc_channel_arg_integer_create(
const_cast<char*>(GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS),
xds_resource_does_not_exist_timeout_ms_));
}
xds_channel_args_.num_args = xds_channel_args_to_add_.size();
xds_channel_args_.args = xds_channel_args_to_add_.data();
grpc_core::internal::SetXdsChannelArgsForTest(&xds_channel_args_);
// Make sure each test creates a new XdsClient instance rather than
// reusing the one from the previous test. This avoids spurious failures
// caused when a load reporting test runs after a non-load reporting test
// and the XdsClient is still talking to the old LRS server, which fails
// because it's not expecting the client to connect. It also
// ensures that each test can independently set the global channel
// args for the xDS channel.
grpc_core::internal::UnsetGlobalXdsClientForTest();
// Start the backends.
for (size_t i = 0; i < num_backends_; ++i) {
backends_.emplace_back(new BackendServerThread(use_xds_enabled_server_));
backends_.back()->Start();
}
// Create channel and stub.
ResetStub();
}
@ -2100,7 +2091,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
class ServerThread {
public:
explicit ServerThread(bool use_xds_enabled_server = false)
: port_(g_port_saver->GetPort()),
: port_(grpc_pick_unused_port_or_die()),
use_xds_enabled_server_(use_xds_enabled_server) {}
virtual ~ServerThread(){};
@ -2458,7 +2449,7 @@ TEST_P(BasicTest, AllServersUnreachableFailFast) {
const size_t kNumUnreachableServers = 5;
std::vector<int> ports;
for (size_t i = 0; i < kNumUnreachableServers; ++i) {
ports.push_back(g_port_saver->GetPort());
ports.push_back(grpc_pick_unused_port_or_die());
}
AdsServiceImpl::EdsResourceArgs args({
{"locality0", ports},
@ -4614,16 +4605,16 @@ TEST_P(LdsRdsTest, XdsRoutingApplyXdsTimeout) {
SetNextResolutionForLbChannelAllBalancers();
// Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
AdsServiceImpl::EdsResourceArgs args1({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
AdsServiceImpl::EdsResourceArgs args2({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
AdsServiceImpl::EdsResourceArgs args3({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
balancers_[0]->ads_service()->SetEdsResource(
@ -4746,7 +4737,7 @@ TEST_P(LdsRdsTest, XdsRoutingXdsTimeoutDisabled) {
SetNextResolutionForLbChannelAllBalancers();
// Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
RouteConfiguration new_route_config = default_route_config_;
@ -4784,7 +4775,7 @@ TEST_P(LdsRdsTest, XdsRoutingHttpTimeoutDisabled) {
SetNextResolutionForLbChannelAllBalancers();
// Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
// Construct listener.
auto listener = default_listener_;
@ -4827,13 +4818,13 @@ TEST_P(LdsRdsTest, XdsRoutingApplyApplicationTimeoutWhenXdsTimeoutExplicit0) {
SetNextResolutionForLbChannelAllBalancers();
// Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
AdsServiceImpl::EdsResourceArgs args1({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
AdsServiceImpl::EdsResourceArgs args2({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
balancers_[0]->ads_service()->SetEdsResource(
@ -4924,7 +4915,7 @@ TEST_P(LdsRdsTest, XdsRoutingApplyApplicationTimeoutWhenHttpTimeoutExplicit0) {
SetNextResolutionForLbChannelAllBalancers();
// Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
HttpConnectionManager http_connection_manager;
@ -4963,7 +4954,7 @@ TEST_P(LdsRdsTest, XdsRoutingWithOnlyApplicationTimeout) {
SetNextResolutionForLbChannelAllBalancers();
// Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args({
{"locality0", {g_port_saver->GetPort()}},
{"locality0", {grpc_pick_unused_port_or_die()}},
});
balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
auto t0 = system_clock::now();
@ -8365,7 +8356,6 @@ int main(int argc, char** argv) {
grpc::testing::TestEnvironment env(argc, argv);
::testing::InitGoogleTest(&argc, argv);
grpc::testing::WriteBootstrapFiles();
grpc::testing::g_port_saver = new grpc::testing::PortSaver();
// Make the backup poller poll very frequently in order to pick up
// updates from all the subchannels's FDs.
GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1);

Loading…
Cancel
Save