Fix build and test failures

Including the following
All all needed BUILD changes to include new xdsRouting
Fixed TSAN errors
AllServerUnavailableFailFast may return UNKNOWN as oppose UNAVAILABLE
ChooseLastRoute modified into 2 tests
reviewable/pr22280/r8
Donna Dionne 5 years ago
parent 8e188e6540
commit c0c7f1dae3
  1. 1
      BUILD
  2. 1
      BUILD.gn
  3. 2
      CMakeLists.txt
  4. 2
      Makefile
  5. 2
      build_autogenerated.yaml
  6. 1
      config.m4
  7. 1
      config.w32
  8. 1
      gRPC-Core.podspec
  9. 1
      grpc.gemspec
  10. 2
      grpc.gyp
  11. 1
      package.xml
  12. 11
      src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc
  13. 1
      src/python/grpcio/grpc_core_dependencies.py
  14. 218
      test/cpp/end2end/xds_end2end_test.cc
  15. 1
      tools/doxygen/Doxyfile.c++.internal
  16. 1
      tools/doxygen/Doxyfile.core.internal

@ -321,6 +321,7 @@ grpc_cc_library(
"grpc_lb_policy_cds", "grpc_lb_policy_cds",
"grpc_lb_policy_grpclb", "grpc_lb_policy_grpclb",
"grpc_lb_policy_xds", "grpc_lb_policy_xds",
"grpc_lb_policy_xds_routing",
"grpc_resolver_xds", "grpc_resolver_xds",
], ],
) )

@ -243,6 +243,7 @@ config("grpc_config") {
"src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc",
"src/core/ext/filters/client_channel/lb_policy/xds/xds.cc", "src/core/ext/filters/client_channel/lb_policy/xds/xds.cc",
"src/core/ext/filters/client_channel/lb_policy/xds/xds.h", "src/core/ext/filters/client_channel/lb_policy/xds/xds.h",
"src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc",
"src/core/ext/filters/client_channel/lb_policy_factory.h", "src/core/ext/filters/client_channel/lb_policy_factory.h",
"src/core/ext/filters/client_channel/lb_policy_registry.cc", "src/core/ext/filters/client_channel/lb_policy_registry.cc",
"src/core/ext/filters/client_channel/lb_policy_registry.h", "src/core/ext/filters/client_channel/lb_policy_registry.h",

@ -1327,6 +1327,7 @@ add_library(grpc
src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
src/core/ext/filters/client_channel/lb_policy/xds/xds.cc src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc
src/core/ext/filters/client_channel/lb_policy_registry.cc src/core/ext/filters/client_channel/lb_policy_registry.cc
src/core/ext/filters/client_channel/local_subchannel_pool.cc src/core/ext/filters/client_channel/local_subchannel_pool.cc
src/core/ext/filters/client_channel/parse_address.cc src/core/ext/filters/client_channel/parse_address.cc
@ -1981,6 +1982,7 @@ add_library(grpc_unsecure
src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
src/core/ext/filters/client_channel/lb_policy/xds/xds.cc src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc
src/core/ext/filters/client_channel/lb_policy_registry.cc src/core/ext/filters/client_channel/lb_policy_registry.cc
src/core/ext/filters/client_channel/local_subchannel_pool.cc src/core/ext/filters/client_channel/local_subchannel_pool.cc
src/core/ext/filters/client_channel/parse_address.cc src/core/ext/filters/client_channel/parse_address.cc

@ -3657,6 +3657,7 @@ LIBGRPC_SRC = \
src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \
src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \
src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \
src/core/ext/filters/client_channel/parse_address.cc \ src/core/ext/filters/client_channel/parse_address.cc \
@ -4286,6 +4287,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \
src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \
src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \
src/core/ext/filters/client_channel/parse_address.cc \ src/core/ext/filters/client_channel/parse_address.cc \

@ -751,6 +751,7 @@ libs:
- src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
- src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
- src/core/ext/filters/client_channel/lb_policy/xds/xds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
- src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc
- src/core/ext/filters/client_channel/lb_policy_registry.cc - src/core/ext/filters/client_channel/lb_policy_registry.cc
- src/core/ext/filters/client_channel/local_subchannel_pool.cc - src/core/ext/filters/client_channel/local_subchannel_pool.cc
- src/core/ext/filters/client_channel/parse_address.cc - src/core/ext/filters/client_channel/parse_address.cc
@ -1582,6 +1583,7 @@ libs:
- src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
- src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
- src/core/ext/filters/client_channel/lb_policy/xds/xds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc
- src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc
- src/core/ext/filters/client_channel/lb_policy_registry.cc - src/core/ext/filters/client_channel/lb_policy_registry.cc
- src/core/ext/filters/client_channel/local_subchannel_pool.cc - src/core/ext/filters/client_channel/local_subchannel_pool.cc
- src/core/ext/filters/client_channel/parse_address.cc - src/core/ext/filters/client_channel/parse_address.cc

@ -61,6 +61,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \
src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \
src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \
src/core/ext/filters/client_channel/parse_address.cc \ src/core/ext/filters/client_channel/parse_address.cc \

@ -30,6 +30,7 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " +
"src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " +
"src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds.cc " +
"src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds_routing.cc " +
"src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " +
"src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " + "src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " +
"src\\core\\ext\\filters\\client_channel\\parse_address.cc " + "src\\core\\ext\\filters\\client_channel\\parse_address.cc " +

@ -226,6 +226,7 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds.h', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.h',
'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc',
'src/core/ext/filters/client_channel/lb_policy_factory.h', 'src/core/ext/filters/client_channel/lb_policy_factory.h',
'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc',
'src/core/ext/filters/client_channel/lb_policy_registry.h', 'src/core/ext/filters/client_channel/lb_policy_registry.h',

@ -148,6 +148,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc )
s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.cc )
s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h )
s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc )
s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h )
s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc )
s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.h )

@ -453,6 +453,7 @@
'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc',
'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc',
'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc',
'src/core/ext/filters/client_channel/parse_address.cc', 'src/core/ext/filters/client_channel/parse_address.cc',
@ -943,6 +944,7 @@
'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc',
'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc',
'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc',
'src/core/ext/filters/client_channel/parse_address.cc', 'src/core/ext/filters/client_channel/parse_address.cc',

@ -128,6 +128,7 @@
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/cds.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/cds.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_factory.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_factory.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_registry.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_registry.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_registry.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy_registry.h" role="src" />

@ -95,7 +95,7 @@ class XdsRoutingLb : public LoadBalancingPolicy {
ChildPickerWrapper(std::string name, ChildPickerWrapper(std::string name,
std::unique_ptr<SubchannelPicker> picker) std::unique_ptr<SubchannelPicker> picker)
: name_(std::move(name)), picker_(std::move(picker)) {} : name_(std::move(name)), picker_(std::move(picker)) {}
PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); } PickResult Pick(PickArgs args) { return picker_->Pick(args); }
const std::string& name() const { return name_; } const std::string& name() const { return name_; }
@ -239,7 +239,7 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) {
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"xds routing picker not given any picker; default " "xds routing picker not given any picker; default "
"route not configured"), "route not configured"),
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
return result; return result;
} }
@ -417,8 +417,8 @@ XdsRoutingLb::XdsRoutingChild::XdsRoutingChild(
XdsRoutingLb::XdsRoutingChild::~XdsRoutingChild() { XdsRoutingLb::XdsRoutingChild::~XdsRoutingChild() {
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
gpr_log(GPR_INFO, gpr_log(GPR_INFO,
"[xds_routing_lb %p] XdsRoutingChild %p %s: destroying child", "[xds_routing_lb %p] XdsRoutingChild %p: destroying child",
xds_routing_policy_.get(), this, name_.c_str()); xds_routing_policy_.get(), this);
} }
xds_routing_policy_.reset(DEBUG_LOCATION, "XdsRoutingChild"); xds_routing_policy_.reset(DEBUG_LOCATION, "XdsRoutingChild");
} }
@ -485,7 +485,7 @@ void XdsRoutingLb::XdsRoutingChild::UpdateLocked(
} }
// Construct update args. // Construct update args.
UpdateArgs update_args; UpdateArgs update_args;
update_args.config = config; update_args.config = std::move(config);
update_args.addresses = addresses; update_args.addresses = addresses;
update_args.args = grpc_channel_args_copy(args); update_args.args = grpc_channel_args_copy(args);
// Update the policy. // Update the policy.
@ -509,6 +509,7 @@ void XdsRoutingLb::XdsRoutingChild::ResetBackoffLocked() {
void XdsRoutingLb::XdsRoutingChild::DeactivateLocked() { void XdsRoutingLb::XdsRoutingChild::DeactivateLocked() {
// If already deactivated, don't do that again. // If already deactivated, don't do that again.
if (delayed_removal_timer_callback_pending_ == true) return;
// Set the child weight to 0 so that future picker won't contain this child. // Set the child weight to 0 so that future picker won't contain this child.
// Start a timer to delete the child. // Start a timer to delete the child.
Ref(DEBUG_LOCATION, "XdsRoutingChild+timer").release(); Ref(DEBUG_LOCATION, "XdsRoutingChild+timer").release();

@ -39,6 +39,7 @@ CORE_SOURCE_FILES = [
'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc',
'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc',
'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc',
'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc',
'src/core/ext/filters/client_channel/parse_address.cc', 'src/core/ext/filters/client_channel/parse_address.cc',

@ -1662,7 +1662,9 @@ TEST_P(BasicTest, AllServersUnreachableFailFast) {
AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName);
const Status status = SendRpc(); const Status status = SendRpc();
// The error shouldn't be DEADLINE_EXCEEDED. // The error shouldn't be DEADLINE_EXCEEDED.
EXPECT_EQ(StatusCode::UNAVAILABLE, status.error_code()); gpr_log(GPR_INFO, "error code %d message received %s", status.error_code(),
status.error_message().c_str());
EXPECT_NE(StatusCode::DEADLINE_EXCEEDED, status.error_code());
} }
// Tests that RPCs fail when the backends are down, and will succeed again after // Tests that RPCs fail when the backends are down, and will succeed again after
@ -2049,13 +2051,11 @@ TEST_P(LdsTest, ChooseMatchedDomain) {
AdsServiceImpl::ACKED); AdsServiceImpl::ACKED);
} }
// Tests that LDS client should choose the last route in the virtual host if // Tests that the LDS client should NACK when the last route is not a default
// multiple routes exist in the LDS response. // route.
TEST_P(LdsTest, ChooseLastRoute) { TEST_P(LdsTest, DefaultRouteInvalid) {
RouteConfiguration route_config = RouteConfiguration route_config =
balancers_[0]->ads_service()->default_route_config(); balancers_[0]->ads_service()->default_route_config();
*(route_config.mutable_virtual_hosts(0)->add_routes()) =
route_config.virtual_hosts(0).routes(0);
route_config.mutable_virtual_hosts(0) route_config.mutable_virtual_hosts(0)
->mutable_routes(0) ->mutable_routes(0)
->mutable_route() ->mutable_route()
@ -2066,10 +2066,10 @@ TEST_P(LdsTest, ChooseLastRoute) {
SetNextResolutionForLbChannelAllBalancers(); SetNextResolutionForLbChannelAllBalancers();
(void)SendRpc(); (void)SendRpc();
EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(),
AdsServiceImpl::ACKED); AdsServiceImpl::NACKED);
} }
// Tests that LDS client should send a NACK if route match has non-empty prefix // Tests that LDS client should send a ACK if route match has non-empty prefix
// in the LDS response. // in the LDS response.
TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) {
RouteConfiguration route_config = RouteConfiguration route_config =
@ -2084,7 +2084,7 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) {
SetNextResolutionForLbChannelAllBalancers(); SetNextResolutionForLbChannelAllBalancers();
CheckRpcSendFailure(); CheckRpcSendFailure();
EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(),
AdsServiceImpl::NACKED); AdsServiceImpl::ACKED);
} }
// Tests that LDS client should send a NACK if route has an action other than // Tests that LDS client should send a NACK if route has an action other than
@ -2130,7 +2130,9 @@ TEST_P(LdsTest, Timeout) {
} }
TEST_P(LdsTest, XdsRoutingPathMatching) { TEST_P(LdsTest, XdsRoutingPathMatching) {
const char* kNewClusterName = "new_cluster_name"; const char* kNewCluster1Name = "new_cluster_1";
const char* kNewCluster2Name = "new_cluster_2";
const size_t kNumRpcs = 10;
SetNextResolution({}); SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers(); SetNextResolutionForLbChannelAllBalancers();
AdsServiceImpl::EdsResourceArgs args({ AdsServiceImpl::EdsResourceArgs args({
@ -2140,34 +2142,59 @@ TEST_P(LdsTest, XdsRoutingPathMatching) {
AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName);
// We need to wait for all backends to come online. // We need to wait for all backends to come online.
WaitForAllBackends(0, 2); WaitForAllBackends(0, 2);
// Populate new EDS resource. // Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args1({
{"locality0", GetBackendPorts(2, 3)},
});
AdsServiceImpl::EdsResourceArgs args2({ AdsServiceImpl::EdsResourceArgs args2({
{"locality0", GetBackendPorts(2, 4)}, {"locality0", GetBackendPorts(3, 4)},
}); });
balancers_[0]->ads_service()->SetEdsResource( balancers_[0]->ads_service()->SetEdsResource(
AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name),
kNewClusterName); kNewCluster1Name);
// Populate new CDS resource. balancers_[0]->ads_service()->SetEdsResource(
Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name),
new_cluster.set_name(kNewClusterName); kNewCluster2Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); // Populate new CDS resources.
// Change RDS resource to point to new cluster. Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
new_cluster1.set_name(kNewCluster1Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name);
Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
new_cluster2.set_name(kNewCluster2Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name);
// Change RDS resource to set up prefix matching to direct traffic to the
// first new cluster.
RouteConfiguration new_route_config = RouteConfiguration new_route_config =
balancers_[0]->ads_service()->default_route_config(); balancers_[0]->ads_service()->default_route_config();
auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); auto* mismatched_route =
route->mutable_match()->set_path("/grpc.testing.EchoTestService/Echo"); new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
route->mutable_route()->set_cluster(kNewClusterName); mismatched_route->mutable_match()->set_path(
"/grpc.testing.EchoTestService/Echo");
mismatched_route->mutable_route()->set_cluster(kNewCluster1Name);
auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
matched_route->mutable_match()->set_path(
"/grpc.testing.EchoTestService/NewMethod");
matched_route->mutable_route()->set_cluster(kNewCluster2Name);
Listener listener = Listener listener =
balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->BuildListener(new_route_config);
balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName);
// Wait for all new backends to be used. // Wait for the new backend to come up.
std::tuple<int, int, int> counts = WaitForAllBackends(2, 4); WaitForAllBackends(2, 3);
// Make sure no RPCs failed in the transition. CheckRpcSendOk(kNumRpcs);
EXPECT_EQ(0, std::get<1>(counts)); // Make sure RPCs all go to the correct backend.
for (size_t i = 0; i < 4; ++i) {
if (i == 2) {
EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->request_count());
} else {
EXPECT_EQ(0, backends_[i]->backend_service()->request_count());
}
}
} }
TEST_P(LdsTest, XdsRoutingPrefixMatching) { TEST_P(LdsTest, XdsRoutingPrefixMatching) {
const char* kNewClusterName = "new_cluster_name"; const char* kNewCluster1Name = "new_cluster_1";
const char* kNewCluster2Name = "new_cluster_2";
const size_t kNumRpcs = 10;
SetNextResolution({}); SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers(); SetNextResolutionForLbChannelAllBalancers();
AdsServiceImpl::EdsResourceArgs args({ AdsServiceImpl::EdsResourceArgs args({
@ -2177,30 +2204,121 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) {
AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName);
// We need to wait for all backends to come online. // We need to wait for all backends to come online.
WaitForAllBackends(0, 2); WaitForAllBackends(0, 2);
// Populate new EDS resource. // Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args1({
{"locality0", GetBackendPorts(2, 3)},
});
AdsServiceImpl::EdsResourceArgs args2({ AdsServiceImpl::EdsResourceArgs args2({
{"locality0", GetBackendPorts(2, 4)}, {"locality0", GetBackendPorts(3, 4)},
}); });
balancers_[0]->ads_service()->SetEdsResource( balancers_[0]->ads_service()->SetEdsResource(
AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name),
kNewClusterName); kNewCluster1Name);
// Populate new CDS resource. balancers_[0]->ads_service()->SetEdsResource(
Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name),
new_cluster.set_name(kNewClusterName); kNewCluster2Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); // Populate new CDS resources.
// Change RDS resource to point to new cluster. Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
new_cluster1.set_name(kNewCluster1Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name);
Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
new_cluster2.set_name(kNewCluster2Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name);
// Change RDS resource to set up prefix matching to direct traffic to the
// second new cluster.
RouteConfiguration new_route_config = RouteConfiguration new_route_config =
balancers_[0]->ads_service()->default_route_config(); balancers_[0]->ads_service()->default_route_config();
auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); auto* mismatched_route =
route->mutable_match()->set_prefix("/grpc.testing.EchoTestService"); new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
route->mutable_route()->set_cluster(kNewClusterName); mismatched_route->mutable_match()->set_prefix(
"/grpc.testing.EchoTestService0");
mismatched_route->mutable_route()->set_cluster(kNewCluster1Name);
auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTestService");
matched_route->mutable_route()->set_cluster(kNewCluster2Name);
Listener listener = Listener listener =
balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->BuildListener(new_route_config);
balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName);
// Wait for all new backends to be used. // Wait for the new backend to come up.
std::tuple<int, int, int> counts = WaitForAllBackends(2, 4); WaitForAllBackends(3, 4);
// Make sure no RPCs failed in the transition. CheckRpcSendOk(kNumRpcs);
EXPECT_EQ(0, std::get<1>(counts)); // Make sure RPCs all go to the correct backend.
for (size_t i = 0; i < 4; ++i) {
if (i == 3) {
EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->request_count());
} else {
EXPECT_EQ(0, backends_[i]->backend_service()->request_count());
}
}
}
// Tests that LDS client should choose the default route (with no matching
// specified) after unable to find a match with previous routes.
TEST_P(LdsTest, XdsRoutingDefaultRoute) {
const char* kNewCluster1Name = "new_cluster_1";
const char* kNewCluster2Name = "new_cluster_2";
const size_t kNumRpcs = 10;
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
AdsServiceImpl::EdsResourceArgs args({
{"locality0", GetBackendPorts(0, 2)},
});
balancers_[0]->ads_service()->SetEdsResource(
AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName);
// We need to wait for all backends to come online.
WaitForAllBackends(0, 2);
// Populate new EDS resources.
AdsServiceImpl::EdsResourceArgs args1({
{"locality0", GetBackendPorts(2, 3)},
});
AdsServiceImpl::EdsResourceArgs args2({
{"locality0", GetBackendPorts(3, 4)},
});
balancers_[0]->ads_service()->SetEdsResource(
AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name),
kNewCluster1Name);
balancers_[0]->ads_service()->SetEdsResource(
AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name),
kNewCluster2Name);
// Populate new CDS resources.
Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster();
new_cluster1.set_name(kNewCluster1Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name);
Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster();
new_cluster2.set_name(kNewCluster2Name);
balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name);
// Change RDS resource to set up prefix matching to direct traffic to the
// second new cluster.
RouteConfiguration new_route_config =
balancers_[0]->ads_service()->default_route_config();
auto* mismatched_route1 =
new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
mismatched_route1->mutable_match()->set_prefix(
"/grpc.testing.EchoTestService0");
mismatched_route1->mutable_route()->set_cluster(kNewCluster1Name);
auto* mismatched_route2 =
new_route_config.mutable_virtual_hosts(0)->add_routes();
mismatched_route2->mutable_match()->set_path(
"/grpc.testing.EchoTestService/EchoMismatch");
mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name);
auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
default_route->mutable_match()->set_prefix("");
default_route->mutable_match()->set_path("");
default_route->mutable_route()->set_cluster(kDefaultResourceName);
Listener listener =
balancers_[0]->ads_service()->BuildListener(new_route_config);
balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName);
// Wait for the new backend to come up.
WaitForAllBackends(0, 2);
CheckRpcSendOk(kNumRpcs);
// Make sure RPCs all go to the correct backend.
for (size_t i = 0; i < 4; ++i) {
if (i < 2) {
EXPECT_EQ(kNumRpcs / 2, backends_[i]->backend_service()->request_count());
} else {
EXPECT_EQ(0, backends_[i]->backend_service()->request_count());
}
}
} }
using RdsTest = BasicTest; using RdsTest = BasicTest;
@ -2254,14 +2372,12 @@ TEST_P(RdsTest, ChooseMatchedDomain) {
AdsServiceImpl::ACKED); AdsServiceImpl::ACKED);
} }
// Tests that RDS client should choose the last route in the virtual host if // Tests that the RDS client should NACK when the last route is not a default
// multiple routes exist in the RDS response. // route.
TEST_P(RdsTest, ChooseLastRoute) { TEST_P(RdsTest, DefaultRouteInvalid) {
balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); balancers_[0]->ads_service()->SetLdsToUseDynamicRds();
RouteConfiguration route_config = RouteConfiguration route_config =
balancers_[0]->ads_service()->default_route_config(); balancers_[0]->ads_service()->default_route_config();
*(route_config.mutable_virtual_hosts(0)->add_routes()) =
route_config.virtual_hosts(0).routes(0);
route_config.mutable_virtual_hosts(0) route_config.mutable_virtual_hosts(0)
->mutable_routes(0) ->mutable_routes(0)
->mutable_route() ->mutable_route()
@ -2272,10 +2388,10 @@ TEST_P(RdsTest, ChooseLastRoute) {
SetNextResolutionForLbChannelAllBalancers(); SetNextResolutionForLbChannelAllBalancers();
(void)SendRpc(); (void)SendRpc();
EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(),
AdsServiceImpl::ACKED); AdsServiceImpl::NACKED);
} }
// Tests that RDS client should send a NACK if route match has non-empty prefix // Tests that RDS client should send a ACK if route match has non-empty prefix
// in the RDS response. // in the RDS response.
TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) { TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) {
balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); balancers_[0]->ads_service()->SetLdsToUseDynamicRds();
@ -2291,7 +2407,7 @@ TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) {
SetNextResolutionForLbChannelAllBalancers(); SetNextResolutionForLbChannelAllBalancers();
CheckRpcSendFailure(); CheckRpcSendFailure();
EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(),
AdsServiceImpl::NACKED); AdsServiceImpl::ACKED);
} }
// Tests that RDS client should send a NACK if route has an action other than // Tests that RDS client should send a NACK if route has an action other than

@ -1111,6 +1111,7 @@ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds.h \ src/core/ext/filters/client_channel/lb_policy/xds/xds.h \
src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \
src/core/ext/filters/client_channel/lb_policy_factory.h \ src/core/ext/filters/client_channel/lb_policy_factory.h \
src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \
src/core/ext/filters/client_channel/lb_policy_registry.h \ src/core/ext/filters/client_channel/lb_policy_registry.h \

@ -908,6 +908,7 @@ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \
src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \
src/core/ext/filters/client_channel/lb_policy/xds/xds.h \ src/core/ext/filters/client_channel/lb_policy/xds/xds.h \
src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \
src/core/ext/filters/client_channel/lb_policy_factory.h \ src/core/ext/filters/client_channel/lb_policy_factory.h \
src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \
src/core/ext/filters/client_channel/lb_policy_registry.h \ src/core/ext/filters/client_channel/lb_policy_registry.h \

Loading…
Cancel
Save