grpc 1.82.0 → 1.83.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8 -5
  3. data/etc/roots.pem +10400 -3855
  4. data/include/grpc/grpc_audit_logging.h +2 -2
  5. data/include/grpc/grpc_security_constants.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +23 -0
  7. data/src/core/call/call_filters.h +19 -3
  8. data/src/core/call/call_spine.h +4 -4
  9. data/src/core/call/client_call.cc +1 -1
  10. data/src/core/call/metadata.cc +7 -2
  11. data/src/core/call/server_call.cc +13 -3
  12. data/src/core/call/server_call.h +5 -3
  13. data/src/core/client_channel/backup_poller.cc +2 -17
  14. data/src/core/client_channel/client_channel.cc +17 -14
  15. data/src/core/client_channel/client_channel.h +3 -1
  16. data/src/core/client_channel/client_channel_filter.cc +11 -13
  17. data/src/core/client_channel/client_channel_service_config.cc +5 -13
  18. data/src/core/client_channel/direct_channel.cc +5 -1
  19. data/src/core/client_channel/direct_channel.h +3 -1
  20. data/src/core/config/experiment_env_var.cc +30 -0
  21. data/src/core/config/experiment_env_var.h +26 -0
  22. data/src/core/credentials/call/regional_access_boundary_fetcher.cc +6 -6
  23. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +14 -2
  24. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.cc +172 -0
  25. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +103 -0
  26. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +3 -2
  27. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +10 -3
  28. data/src/core/credentials/transport/tls/tls_security_connector.cc +14 -2
  29. data/src/core/credentials/transport/xds/xds_credentials.cc +4 -12
  30. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -1
  31. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -13
  32. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +11 -9
  33. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  34. data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -2
  35. data/src/core/ext/transport/chttp2/transport/frame.cc +58 -1
  36. data/src/core/ext/transport/chttp2/transport/frame.h +13 -1
  37. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -4
  38. data/src/core/ext/transport/chttp2/transport/frame_security.cc +10 -1
  39. data/src/core/ext/transport/chttp2/transport/frame_security.h +2 -1
  40. data/src/core/ext/transport/chttp2/transport/goaway.cc +11 -1
  41. data/src/core/ext/transport/chttp2/transport/goaway.h +17 -1
  42. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +9 -0
  43. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +117 -276
  44. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +44 -17
  45. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +382 -496
  46. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +75 -77
  47. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  48. data/src/core/ext/transport/chttp2/transport/http2_settings.h +30 -11
  49. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +24 -9
  50. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +26 -0
  51. data/src/core/ext/transport/chttp2/transport/http2_transport.h +2 -0
  52. data/src/core/ext/transport/chttp2/transport/internal.h +4 -0
  53. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
  54. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +1 -1
  55. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +4 -10
  56. data/src/core/ext/transport/chttp2/transport/read_context.h +62 -20
  57. data/src/core/ext/transport/chttp2/transport/security_frame.h +1 -0
  58. data/src/core/ext/transport/chttp2/transport/stream.h +271 -120
  59. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +77 -61
  60. data/src/core/handshaker/security/secure_endpoint.cc +0 -13
  61. data/src/core/lib/channel/promise_based_filter.cc +77 -3
  62. data/src/core/lib/channel/promise_based_filter.h +238 -184
  63. data/src/core/lib/event_engine/extensions/receive_coalescing_extension.h +0 -4
  64. data/src/core/lib/event_engine/extensions/tcp_trace.h +1 -1
  65. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -12
  66. data/src/core/lib/event_engine/shim.cc +2 -16
  67. data/src/core/lib/event_engine/shim.h +0 -4
  68. data/src/core/lib/experiments/experiments.cc +51 -102
  69. data/src/core/lib/experiments/experiments.h +37 -59
  70. data/src/core/lib/iomgr/error.cc +3 -73
  71. data/src/core/lib/iomgr/error.h +8 -6
  72. data/src/core/lib/iomgr/error_cfstream.cc +1 -2
  73. data/src/core/lib/iomgr/ev_epoll1_linux.cc +2 -6
  74. data/src/core/lib/iomgr/ev_poll_posix.cc +2 -6
  75. data/src/core/lib/iomgr/tcp_posix.cc +2 -6
  76. data/src/core/lib/security/authorization/audit_logging.cc +2 -2
  77. data/src/core/lib/security/authorization/audit_logging.h +3 -3
  78. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +11 -13
  79. data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
  80. data/src/core/lib/security/authorization/matchers.cc +20 -20
  81. data/src/core/lib/security/authorization/matchers.h +15 -16
  82. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  83. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  84. data/src/core/lib/security/authorization/stdout_logger.h +6 -5
  85. data/src/core/lib/surface/call.cc +0 -8
  86. data/src/core/lib/surface/call.h +2 -0
  87. data/src/core/lib/surface/channel.cc +21 -2
  88. data/src/core/lib/surface/channel.h +14 -6
  89. data/src/core/lib/surface/filter_stack_call.cc +10 -29
  90. data/src/core/lib/surface/legacy_channel.cc +7 -7
  91. data/src/core/lib/surface/legacy_channel.h +3 -1
  92. data/src/core/lib/surface/version.cc +2 -2
  93. data/src/core/lib/transport/bdp_estimator.cc +13 -13
  94. data/src/core/lib/transport/bdp_estimator.h +9 -5
  95. data/src/core/lib/transport/error_utils.cc +26 -138
  96. data/src/core/lib/transport/promise_endpoint.h +2 -4
  97. data/src/core/load_balancing/grpclb/grpclb.cc +2 -1
  98. data/src/core/load_balancing/pick_first/pick_first.cc +33 -2
  99. data/src/core/load_balancing/pick_first/pick_first.h +6 -0
  100. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -10
  101. data/src/core/load_balancing/rls/rls.cc +2 -1
  102. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +2 -7
  103. data/src/core/load_balancing/xds/cds.cc +80 -56
  104. data/src/core/load_balancing/xds/cds.h +21 -0
  105. data/src/core/mitigation_engine/mitigation.h +53 -0
  106. data/src/core/mitigation_engine/mitigation_provider.h +62 -0
  107. data/src/core/resolver/dns/dns_resolver_plugin.cc +1 -6
  108. data/src/core/resolver/xds/xds_resolver.cc +14 -11
  109. data/src/core/server/server.h +1 -4
  110. data/src/core/server/server_config_selector.h +5 -4
  111. data/src/core/server/server_config_selector_filter.cc +67 -80
  112. data/src/core/server/xds_server_config_fetcher.cc +681 -692
  113. data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -12
  114. data/src/core/telemetry/call_tracer.cc +49 -2
  115. data/src/core/telemetry/call_tracer.h +1 -0
  116. data/src/core/telemetry/tcp_tracer.h +38 -0
  117. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  118. data/src/core/tsi/ssl_telemetry_utils.cc +343 -0
  119. data/src/core/tsi/ssl_telemetry_utils.h +74 -0
  120. data/src/core/tsi/ssl_transport_security.cc +577 -301
  121. data/src/core/tsi/ssl_transport_security.h +22 -6
  122. data/src/core/tsi/ssl_transport_security_utils.cc +2 -0
  123. data/src/core/tsi/transport_security.h +7 -0
  124. data/src/core/util/http_client/httpcli.cc +1 -4
  125. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  126. data/src/core/util/status_helper.cc +71 -192
  127. data/src/core/util/status_helper.h +16 -21
  128. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +2 -11
  129. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -7
  130. data/src/core/xds/grpc/xds_cluster_parser.cc +5 -16
  131. data/src/core/xds/grpc/xds_common_types.cc +94 -38
  132. data/src/core/xds/grpc/xds_common_types.h +33 -18
  133. data/src/core/xds/grpc/xds_common_types_parser.cc +168 -100
  134. data/src/core/xds/grpc/xds_common_types_parser.h +18 -1
  135. data/src/core/xds/grpc/xds_endpoint_parser.cc +6 -17
  136. data/src/core/xds/grpc/xds_http_filter_registry.cc +2 -10
  137. data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -12
  138. data/src/core/xds/grpc/xds_metadata_parser.cc +0 -2
  139. data/src/core/xds/grpc/xds_route_config_parser.cc +7 -11
  140. data/src/core/xds/grpc/xds_routing.cc +113 -82
  141. data/src/core/xds/grpc/xds_routing.h +70 -20
  142. data/src/core/xds/grpc/xds_server_grpc.cc +22 -13
  143. data/src/core/xds/grpc/xds_server_grpc.h +16 -2
  144. data/src/core/xds/grpc/xds_server_grpc_interface.h +10 -0
  145. data/src/core/xds/grpc/xds_transport_grpc.cc +123 -18
  146. data/src/core/xds/grpc/xds_transport_grpc.h +28 -4
  147. data/src/core/xds/xds_client/lrs_client.cc +3 -7
  148. data/src/core/xds/xds_client/xds_bootstrap.cc +4 -16
  149. data/src/core/xds/xds_client/xds_client.cc +2 -15
  150. data/src/core/xds/xds_client/xds_transport.h +3 -0
  151. data/src/ruby/lib/grpc/version.rb +1 -1
  152. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -1
  153. metadata +9 -1
@@ -34,6 +34,7 @@
34
34
  #include "envoy/config/endpoint/v3/endpoint_components.upb.h"
35
35
  #include "envoy/type/v3/percent.upb.h"
36
36
  #include "google/protobuf/wrappers.upb.h"
37
+ #include "src/core/config/experiment_env_var.h"
37
38
  #include "src/core/lib/address_utils/parse_address.h"
38
39
  #include "src/core/lib/address_utils/sockaddr_utils.h"
39
40
  #include "src/core/lib/channel/channel_args.h"
@@ -41,11 +42,9 @@
41
42
  #include "src/core/lib/iomgr/resolved_address.h"
42
43
  #include "src/core/load_balancing/ring_hash/ring_hash.h"
43
44
  #include "src/core/util/down_cast.h"
44
- #include "src/core/util/env.h"
45
45
  #include "src/core/util/grpc_check.h"
46
46
  #include "src/core/util/json/json_args.h"
47
47
  #include "src/core/util/json/json_object_loader.h"
48
- #include "src/core/util/string.h"
49
48
  #include "src/core/util/upb_utils.h"
50
49
  #include "src/core/util/validation_errors.h"
51
50
  #include "src/core/xds/grpc/xds_cluster_parser.h"
@@ -66,23 +65,11 @@ namespace grpc_core {
66
65
 
67
66
  namespace {
68
67
 
69
- // TODO(roth): Remove this after 1.67 is released.
70
- bool XdsDualstackEndpointsEnabled() {
71
- auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS");
72
- if (!value.has_value()) return true;
73
- bool parsed_value;
74
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
75
- return parse_succeeded && parsed_value;
76
- }
77
-
78
68
  // TODO(roth): Flip the default to false once this proves stable, then
79
69
  // remove it entirely at some point in the future.
80
70
  bool XdsEndpointHashKeyBackwardCompatEnabled() {
81
- auto value = GetEnv("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT");
82
- if (!value.has_value()) return true;
83
- bool parsed_value;
84
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
85
- return parse_succeeded && parsed_value;
71
+ return IsExperimentEnvVarEnabled("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT",
72
+ /*default_value=*/true);
86
73
  }
87
74
 
88
75
  void MaybeLogClusterLoadAssignment(
@@ -170,7 +157,9 @@ std::optional<EndpointAddresses> EndpointAddressesParse(
170
157
  envoy_config_endpoint_v3_Endpoint_address(endpoint), errors);
171
158
  if (address.has_value()) addresses.push_back(*address);
172
159
  }
173
- if (XdsDualstackEndpointsEnabled()) {
160
+ // TODO(roth): Remove this after 1.67 is released.
161
+ if (IsExperimentEnvVarEnabled("GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS",
162
+ /*default_value=*/true)) {
174
163
  size_t size;
175
164
  auto* additional_addresses =
176
165
  envoy_config_endpoint_v3_Endpoint_additional_addresses(endpoint,
@@ -23,7 +23,7 @@
23
23
 
24
24
  #include "envoy/extensions/filters/http/router/v3/router.upb.h"
25
25
  #include "envoy/extensions/filters/http/router/v3/router.upbdefs.h"
26
- #include "src/core/util/env.h"
26
+ #include "src/core/config/experiment_env_var.h"
27
27
  #include "src/core/util/grpc_check.h"
28
28
  #include "src/core/util/json/json.h"
29
29
  #include "src/core/util/sync.h"
@@ -112,14 +112,6 @@ RefCountedPtr<const FilterConfig> XdsHttpRouterFilter::ParseOverrideConfig(
112
112
 
113
113
  namespace {
114
114
 
115
- bool XdsCompositeFilterEnabled() {
116
- auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_COMPOSITE_FILTER");
117
- if (!value.has_value()) return false;
118
- bool parsed_value;
119
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
120
- return parse_succeeded && parsed_value;
121
- }
122
-
123
115
  Mutex* g_mu = new Mutex;
124
116
  NoDestruct<absl::AnyInvocable<std::unique_ptr<XdsHttpFilterImpl>()>>
125
117
  g_http_filter_factory_factory ABSL_GUARDED_BY(*g_mu);
@@ -139,7 +131,7 @@ XdsHttpFilterRegistry::XdsHttpFilterRegistry(bool register_builtins) {
139
131
  RegisterFilter(std::make_unique<XdsHttpRbacFilter>());
140
132
  RegisterFilter(std::make_unique<XdsHttpStatefulSessionFilter>());
141
133
  RegisterFilter(std::make_unique<XdsHttpGcpAuthnFilter>());
142
- if (XdsCompositeFilterEnabled()) {
134
+ if (IsExperimentEnvVarEnabled("GRPC_EXPERIMENTAL_XDS_COMPOSITE_FILTER")) {
143
135
  RegisterFilter(std::make_unique<XdsHttpCompositeFilter>());
144
136
  }
145
137
  MutexLock lock(g_mu);
@@ -36,14 +36,13 @@
36
36
  #include "envoy/type/matcher/v3/string.upb.h"
37
37
  #include "envoy/type/v3/range.upb.h"
38
38
  #include "google/protobuf/wrappers.upb.h"
39
+ #include "src/core/config/experiment_env_var.h"
39
40
  #include "src/core/ext/filters/rbac/rbac_filter.h"
40
41
  #include "src/core/ext/filters/rbac/rbac_service_config_parser.h"
41
42
  #include "src/core/lib/channel/channel_args.h"
42
43
  #include "src/core/util/down_cast.h"
43
- #include "src/core/util/env.h"
44
44
  #include "src/core/util/json/json.h"
45
45
  #include "src/core/util/json/json_writer.h"
46
- #include "src/core/util/string.h"
47
46
  #include "src/core/util/upb_utils.h"
48
47
  #include "src/core/xds/grpc/xds_audit_logger_registry.h"
49
48
  #include "src/core/xds/grpc/xds_bootstrap_grpc.h"
@@ -60,15 +59,6 @@ namespace grpc_core {
60
59
 
61
60
  namespace {
62
61
 
63
- // TODO(lwge): Remove once the feature is stable.
64
- bool XdsRbacAuditLoggingEnabled() {
65
- auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_RBAC_AUDIT_LOGGING");
66
- if (!value.has_value()) return false;
67
- bool parsed_value;
68
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
69
- return parse_succeeded && parsed_value;
70
- }
71
-
72
62
  Json ParseRegexMatcherToJson(
73
63
  const envoy_type_matcher_v3_RegexMatcher* regex_matcher) {
74
64
  return Json::FromObject(
@@ -479,7 +469,8 @@ Json ParseHttpRbacToJson(const XdsResourceType::DecodeContext& context,
479
469
  Json::FromObject(std::move(policies_object)));
480
470
  }
481
471
  // Flatten the nested messages defined in rbac.proto
482
- if (XdsRbacAuditLoggingEnabled() &&
472
+ // TODO(lwge): Remove env var guard once the feature is stable.
473
+ if (IsExperimentEnvVarEnabled("GRPC_EXPERIMENTAL_XDS_RBAC_AUDIT_LOGGING") &&
483
474
  envoy_config_rbac_v3_RBAC_has_audit_logging_options(rules)) {
484
475
  ValidationErrors::ScopedField field(errors, ".audit_logging_options");
485
476
  const auto* audit_logging_options =
@@ -24,8 +24,6 @@
24
24
  #include "envoy/extensions/filters/http/gcp_authn/v3/gcp_authn.upb.h"
25
25
  #include "envoy/extensions/filters/http/gcp_authn/v3/gcp_authn.upbdefs.h"
26
26
  #include "src/core/lib/address_utils/sockaddr_utils.h"
27
- #include "src/core/util/env.h"
28
- #include "src/core/util/string.h"
29
27
  #include "src/core/util/upb_utils.h"
30
28
  #include "src/core/util/validation_errors.h"
31
29
  #include "src/core/xds/grpc/xds_cluster_parser.h"
@@ -45,17 +45,16 @@
45
45
  #include "re2/re2.h"
46
46
  #include "src/core/call/status_util.h"
47
47
  #include "src/core/config/core_configuration.h"
48
+ #include "src/core/config/experiment_env_var.h"
48
49
  #include "src/core/lib/debug/trace.h"
49
50
  #include "src/core/load_balancing/lb_policy_registry.h"
50
51
  #include "src/core/util/down_cast.h"
51
- #include "src/core/util/env.h"
52
52
  #include "src/core/util/grpc_check.h"
53
53
  #include "src/core/util/json/json.h"
54
54
  #include "src/core/util/json/json_writer.h"
55
55
  #include "src/core/util/match.h"
56
56
  #include "src/core/util/matchers.h"
57
57
  #include "src/core/util/ref_counted_ptr.h"
58
- #include "src/core/util/string.h"
59
58
  #include "src/core/util/time.h"
60
59
  #include "src/core/util/upb_utils.h"
61
60
  #include "src/core/xds/grpc/xds_cluster_specifier_plugin.h"
@@ -79,21 +78,18 @@
79
78
 
80
79
  namespace grpc_core {
81
80
 
82
- // TODO(apolcyn): remove this flag by the 1.58 release
83
- bool XdsRlsEnabled() {
84
- auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_RLS_LB");
85
- if (!value.has_value()) return true;
86
- bool parsed_value;
87
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
88
- return parse_succeeded && parsed_value;
89
- }
90
-
91
81
  //
92
82
  // XdsRouteConfigResourceParse()
93
83
  //
94
84
 
95
85
  namespace {
96
86
 
87
+ // TODO(apolcyn): remove this flag by the 1.58 release
88
+ bool XdsRlsEnabled() {
89
+ return IsExperimentEnvVarEnabled("GRPC_EXPERIMENTAL_XDS_RLS_LB",
90
+ /*default_value=*/true);
91
+ }
92
+
97
93
  XdsRouteConfigResource::ClusterSpecifierPluginMap ClusterSpecifierPluginParse(
98
94
  const XdsResourceType::DecodeContext& context,
99
95
  const envoy_config_route_v3_RouteConfiguration* route_config,
@@ -190,16 +190,14 @@ std::optional<absl::string_view> XdsRouting::GetHeaderValue(
190
190
  return initial_metadata->GetStringValue(header_name, concatenated_value);
191
191
  }
192
192
 
193
- XdsRouting::PerRouteFilterChainBuilder::PerRouteFilterChainBuilder(
193
+ XdsRouting::RouteConfigFilterChainBuilder::RouteConfigFilterChainBuilder(
194
194
  const std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>&
195
195
  hcm_filter_configs,
196
196
  const XdsHttpFilterRegistry& http_filter_registry,
197
- const XdsRouteConfigResource::VirtualHost& vhost,
198
197
  FilterChainBuilder& builder,
199
198
  absl::AnyInvocable<void(FilterChainBuilder&)> add_last_filter,
200
199
  Blackboard& blackboard)
201
200
  : hcm_filter_configs_(hcm_filter_configs),
202
- vhost_(vhost),
203
201
  builder_(builder),
204
202
  add_last_filter_(std::move(add_last_filter)),
205
203
  blackboard_(blackboard) {
@@ -216,6 +214,31 @@ XdsRouting::PerRouteFilterChainBuilder::PerRouteFilterChainBuilder(
216
214
  }
217
215
  }
218
216
 
217
+ absl::StatusOr<RefCountedPtr<const FilterChain>>
218
+ XdsRouting::RouteConfigFilterChainBuilder::GetDefaultFilterChain() {
219
+ if (default_filter_chain_.ok() && *default_filter_chain_ == nullptr) {
220
+ GRPC_TRACE_LOG(xds_resolver, INFO) << "Building default filter chain:";
221
+ for (size_t i = 0; i < filter_impls_.size(); ++i) {
222
+ auto* filter_impl = filter_impls_[i];
223
+ const auto& filter_config = hcm_filter_configs_[i];
224
+ RefCountedPtr<const FilterConfig> config;
225
+ if (filter_config.filter_config != nullptr) {
226
+ config = filter_impl->MergeConfigs(filter_config.filter_config, nullptr,
227
+ nullptr, nullptr, blackboard_);
228
+ }
229
+ GRPC_TRACE_LOG(xds_resolver, INFO)
230
+ << " Adding filter=" << filter_config.name
231
+ << " config=" << (config == nullptr ? "<null>" : config->ToString());
232
+ filter_impl->AddFilter(builder_, std::move(config));
233
+ }
234
+ if (add_last_filter_ != nullptr) add_last_filter_(builder_);
235
+ default_filter_chain_ = builder_.Build();
236
+ GRPC_TRACE_LOG(xds_resolver, INFO)
237
+ << "Filter chain creation status: " << default_filter_chain_.status();
238
+ }
239
+ return default_filter_chain_;
240
+ }
241
+
219
242
  namespace {
220
243
 
221
244
  RefCountedPtr<const FilterConfig> GetOverrideConfig(
@@ -233,44 +256,51 @@ RefCountedPtr<const FilterConfig> GetOverrideConfig(
233
256
  } // namespace
234
257
 
235
258
  absl::StatusOr<RefCountedPtr<const FilterChain>>
236
- XdsRouting::PerRouteFilterChainBuilder::GetDefaultFilterChain() {
237
- if (default_filter_chain_.ok() && *default_filter_chain_ == nullptr) {
238
- GRPC_TRACE_LOG(xds_resolver, INFO) << "Building default filter chain:";
239
- for (size_t i = 0; i < filter_impls_.size(); ++i) {
240
- auto* filter_impl = filter_impls_[i];
241
- const auto& filter_config = hcm_filter_configs_[i];
259
+ XdsRouting::RouteConfigFilterChainBuilder::VirtualHostFilterChainBuilder::
260
+ GetVirtualHostFilterChain() {
261
+ if (vhost_filter_chain_.ok() && *vhost_filter_chain_ == nullptr) {
262
+ // If there are no per-vhost overrides, use the default filter chain.
263
+ if (vhost_.typed_per_filter_config.empty()) {
264
+ return route_config_builder_.GetDefaultFilterChain();
265
+ }
266
+ GRPC_TRACE_LOG(xds_resolver, INFO) << "Building virtual host filter chain:";
267
+ for (size_t i = 0; i < route_config_builder_.filter_impls_.size(); ++i) {
268
+ auto* filter_impl = route_config_builder_.filter_impls_[i];
269
+ const auto& filter_config = route_config_builder_.hcm_filter_configs_[i];
242
270
  RefCountedPtr<const FilterConfig> config;
243
271
  if (filter_config.filter_config != nullptr) {
244
272
  auto vhost_override_config = GetOverrideConfig(
245
273
  filter_impl, vhost_.typed_per_filter_config, filter_config.name);
246
- config = filter_impl->MergeConfigs(filter_config.filter_config,
247
- std::move(vhost_override_config),
248
- nullptr, nullptr, blackboard_);
274
+ config = filter_impl->MergeConfigs(
275
+ filter_config.filter_config, std::move(vhost_override_config),
276
+ nullptr, nullptr, route_config_builder_.blackboard_);
249
277
  }
250
278
  GRPC_TRACE_LOG(xds_resolver, INFO)
251
279
  << " Adding filter=" << filter_config.name
252
280
  << " config=" << (config == nullptr ? "<null>" : config->ToString());
253
- filter_impl->AddFilter(builder_, std::move(config));
281
+ filter_impl->AddFilter(route_config_builder_.builder_, std::move(config));
254
282
  }
255
- if (add_last_filter_ != nullptr) add_last_filter_(builder_);
256
- default_filter_chain_ = builder_.Build();
283
+ if (route_config_builder_.add_last_filter_ != nullptr) {
284
+ route_config_builder_.add_last_filter_(route_config_builder_.builder_);
285
+ }
286
+ vhost_filter_chain_ = route_config_builder_.builder_.Build();
257
287
  GRPC_TRACE_LOG(xds_resolver, INFO)
258
- << "Filter chain creation status: " << default_filter_chain_.status();
288
+ << "Filter chain creation status: " << vhost_filter_chain_.status();
259
289
  }
260
- return default_filter_chain_;
290
+ return vhost_filter_chain_;
261
291
  }
262
292
 
263
293
  absl::StatusOr<RefCountedPtr<const FilterChain>>
264
- XdsRouting::PerRouteFilterChainBuilder::BuildFilterChainForRoute(
265
- const XdsRouteConfigResource::Route& route) {
294
+ XdsRouting::RouteConfigFilterChainBuilder::VirtualHostFilterChainBuilder::
295
+ BuildFilterChainForRoute(const XdsRouteConfigResource::Route& route) {
266
296
  GRPC_TRACE_LOG(xds_resolver, INFO)
267
297
  << "Building filter chain for route:" << route.ToString();
268
- // If there are no per-route overrides, use the default filter chain.
269
- if (route.typed_per_filter_config.empty()) return GetDefaultFilterChain();
298
+ // If there are no per-route overrides, use the vhost filter chain.
299
+ if (route.typed_per_filter_config.empty()) return GetVirtualHostFilterChain();
270
300
  // Otherwise, build a new filter chain for the route.
271
- for (size_t i = 0; i < filter_impls_.size(); ++i) {
272
- auto* filter_impl = filter_impls_[i];
273
- const auto& filter_config = hcm_filter_configs_[i];
301
+ for (size_t i = 0; i < route_config_builder_.filter_impls_.size(); ++i) {
302
+ auto* filter_impl = route_config_builder_.filter_impls_[i];
303
+ const auto& filter_config = route_config_builder_.hcm_filter_configs_[i];
274
304
  RefCountedPtr<const FilterConfig> config;
275
305
  if (filter_config.filter_config != nullptr) {
276
306
  auto vhost_override_config = GetOverrideConfig(
@@ -279,77 +309,78 @@ XdsRouting::PerRouteFilterChainBuilder::BuildFilterChainForRoute(
279
309
  filter_impl, route.typed_per_filter_config, filter_config.name);
280
310
  config = filter_impl->MergeConfigs(
281
311
  filter_config.filter_config, std::move(vhost_override_config),
282
- std::move(route_override_config), nullptr, blackboard_);
312
+ std::move(route_override_config), nullptr,
313
+ route_config_builder_.blackboard_);
283
314
  }
284
315
  GRPC_TRACE_LOG(xds_resolver, INFO)
285
316
  << " Adding filter=" << filter_config.name
286
317
  << " config=" << (config == nullptr ? "<null>" : config->ToString());
287
- filter_impl->AddFilter(builder_, std::move(config));
318
+ filter_impl->AddFilter(route_config_builder_.builder_, std::move(config));
319
+ }
320
+ if (route_config_builder_.add_last_filter_ != nullptr) {
321
+ route_config_builder_.add_last_filter_(route_config_builder_.builder_);
288
322
  }
289
- if (add_last_filter_ != nullptr) add_last_filter_(builder_);
290
323
  absl::StatusOr<RefCountedPtr<const FilterChain>> route_filter_chain =
291
- builder_.Build();
324
+ route_config_builder_.builder_.Build();
292
325
  GRPC_TRACE_LOG(xds_resolver, INFO)
293
326
  << "Filter chain creation status: " << route_filter_chain.status();
294
327
  return route_filter_chain;
295
328
  }
296
329
 
297
- void XdsRouting::PerRouteFilterChainBuilder::
298
- BuildFilterChainForRouteWithWeightedClusters(
299
- const XdsRouteConfigResource::Route& route,
300
- absl::FunctionRef<
301
- void(size_t, absl::StatusOr<RefCountedPtr<const FilterChain>>)>
302
- set_filter_chain_for_cluster_weight) {
303
- // If any cluster weight does not have any filter config overrides,
304
- // we'll reuse the route-level filter chain. We construct it lazily
305
- // and cache it so that we never construct it more than we need to.
306
- absl::StatusOr<RefCountedPtr<const FilterChain>> route_filter_chain = nullptr;
307
- const auto& route_action =
308
- std::get<XdsRouteConfigResource::Route::RouteAction>(route.action);
309
- const auto& cluster_weights = std::get<
310
- std::vector<XdsRouteConfigResource::Route::RouteAction::ClusterWeight>>(
311
- route_action.action);
312
- for (size_t j = 0; j < cluster_weights.size(); ++j) {
313
- const auto& cluster_weight = cluster_weights[j];
314
- if (cluster_weight.typed_per_filter_config.empty()) {
315
- // No per-ClusterWeight overrides, so use the route-level filter chain.
316
- if (route_filter_chain.ok() && *route_filter_chain == nullptr) {
317
- route_filter_chain = BuildFilterChainForRoute(route);
318
- }
319
- set_filter_chain_for_cluster_weight(j, route_filter_chain);
320
- } else {
321
- GRPC_TRACE_LOG(xds_resolver, INFO)
322
- << "Building filter chain for route:" << route.ToString()
323
- << " ClusterWeight:" << cluster_weight.ToString();
324
- for (size_t i = 0; i < filter_impls_.size(); ++i) {
325
- auto* filter_impl = filter_impls_[i];
326
- const auto& filter_config = hcm_filter_configs_[i];
327
- RefCountedPtr<const FilterConfig> config;
328
- if (filter_config.filter_config != nullptr) {
329
- auto vhost_override_config = GetOverrideConfig(
330
- filter_impl, vhost_.typed_per_filter_config, filter_config.name);
331
- auto route_override_config = GetOverrideConfig(
332
- filter_impl, route.typed_per_filter_config, filter_config.name);
333
- auto cluster_weight_override_config = GetOverrideConfig(
334
- filter_impl, cluster_weight.typed_per_filter_config,
335
- filter_config.name);
336
- config = filter_impl->MergeConfigs(
337
- filter_config.filter_config, std::move(vhost_override_config),
338
- std::move(route_override_config),
339
- std::move(cluster_weight_override_config), blackboard_);
340
- }
341
- GRPC_TRACE_LOG(xds_resolver, INFO)
342
- << " Adding filter=" << filter_config.name << " config="
343
- << (config == nullptr ? "<null>" : config->ToString());
344
- filter_impl->AddFilter(builder_, std::move(config));
345
- }
346
- if (add_last_filter_ != nullptr) add_last_filter_(builder_);
347
- auto filter_chain = builder_.Build();
348
- GRPC_TRACE_LOG(xds_resolver, INFO)
349
- << "Filter chain creation status: " << filter_chain.status();
350
- set_filter_chain_for_cluster_weight(j, std::move(filter_chain));
330
+ absl::StatusOr<RefCountedPtr<const FilterChain>>
331
+ XdsRouting::RouteConfigFilterChainBuilder::VirtualHostFilterChainBuilder::
332
+ WeightedClusterRouteFilterChainBuilder::GetRouteFilterChain() {
333
+ if (route_filter_chain_.ok() && *route_filter_chain_ == nullptr) {
334
+ route_filter_chain_ = vhost_builder_.BuildFilterChainForRoute(route_);
335
+ }
336
+ return route_filter_chain_;
337
+ }
338
+
339
+ absl::StatusOr<RefCountedPtr<const FilterChain>>
340
+ XdsRouting::RouteConfigFilterChainBuilder::VirtualHostFilterChainBuilder::
341
+ WeightedClusterRouteFilterChainBuilder::BuildFilterChainForClusterWeight(
342
+ const XdsRouteConfigResource::Route::RouteAction::ClusterWeight&
343
+ cluster_weight) {
344
+ GRPC_TRACE_LOG(xds_resolver, INFO)
345
+ << "Building filter chain for route:" << route_.ToString()
346
+ << " ClusterWeight:" << cluster_weight.ToString();
347
+ // If there are no per-ClusterWeight overrides, use the route filter chain.
348
+ if (cluster_weight.typed_per_filter_config.empty()) {
349
+ return GetRouteFilterChain();
350
+ }
351
+ // Otherwise, build a new filter chain for the ClusterWeight.
352
+ auto& route_config_builder = vhost_builder_.route_config_builder_;
353
+ for (size_t i = 0; i < route_config_builder.filter_impls_.size(); ++i) {
354
+ auto* filter_impl = route_config_builder.filter_impls_[i];
355
+ const auto& filter_config = route_config_builder.hcm_filter_configs_[i];
356
+ RefCountedPtr<const FilterConfig> config;
357
+ if (filter_config.filter_config != nullptr) {
358
+ auto vhost_override_config = GetOverrideConfig(
359
+ filter_impl, vhost_builder_.vhost_.typed_per_filter_config,
360
+ filter_config.name);
361
+ auto route_override_config = GetOverrideConfig(
362
+ filter_impl, route_.typed_per_filter_config, filter_config.name);
363
+ auto cluster_weight_override_config =
364
+ GetOverrideConfig(filter_impl, cluster_weight.typed_per_filter_config,
365
+ filter_config.name);
366
+ config = filter_impl->MergeConfigs(
367
+ filter_config.filter_config, std::move(vhost_override_config),
368
+ std::move(route_override_config),
369
+ std::move(cluster_weight_override_config),
370
+ route_config_builder.blackboard_);
351
371
  }
372
+ GRPC_TRACE_LOG(xds_resolver, INFO)
373
+ << " Adding filter=" << filter_config.name
374
+ << " config=" << (config == nullptr ? "<null>" : config->ToString());
375
+ filter_impl->AddFilter(route_config_builder.builder_, std::move(config));
376
+ }
377
+ if (route_config_builder.add_last_filter_ != nullptr) {
378
+ route_config_builder.add_last_filter_(route_config_builder.builder_);
352
379
  }
380
+ auto filter_chain = route_config_builder.builder_.Build();
381
+ GRPC_TRACE_LOG(xds_resolver, INFO)
382
+ << "Filter chain creation status: " << filter_chain.status();
383
+ return filter_chain;
353
384
  }
354
385
 
355
386
  namespace {
@@ -80,49 +80,99 @@ class XdsRouting final {
80
80
  grpc_metadata_batch* initial_metadata, absl::string_view header_name,
81
81
  std::string* concatenated_value);
82
82
 
83
- // Logic for building a filter chain for a given route. Caching is
84
- // done to avoid unnecessary work while iterating over the list of
85
- // routes in a given VirtualHost.
83
+ // Logic for building filter chains for each route within a
84
+ // RouteConfiguration. Caching is done to avoid unnecessary work while
85
+ // iterating over the list of routes.
86
86
  //
87
87
  // TODO(roth): Currently, this class uses the xds_resolver tracer for
88
88
  // logging. When we change the server side to use the new filter
89
89
  // config structure, add a new tracer and use that instead, so that it
90
90
  // can be used on both the client and server side.
91
- class PerRouteFilterChainBuilder {
91
+ class RouteConfigFilterChainBuilder {
92
92
  public:
93
+ // Builds filter chains for each route within a VirtualHost.
94
+ class VirtualHostFilterChainBuilder {
95
+ public:
96
+ // Builds filter chains for each ClusterWeight within a route.
97
+ class WeightedClusterRouteFilterChainBuilder {
98
+ public:
99
+ WeightedClusterRouteFilterChainBuilder(
100
+ VirtualHostFilterChainBuilder& vhost_builder,
101
+ const XdsRouteConfigResource::Route& route)
102
+ : vhost_builder_(vhost_builder), route_(route) {}
103
+
104
+ // Builds a filter chain for a ClusterWeight.
105
+ absl::StatusOr<RefCountedPtr<const FilterChain>>
106
+ BuildFilterChainForClusterWeight(
107
+ const XdsRouteConfigResource::Route::RouteAction::ClusterWeight&
108
+ cluster_weight);
109
+
110
+ private:
111
+ absl::StatusOr<RefCountedPtr<const FilterChain>> GetRouteFilterChain();
112
+
113
+ VirtualHostFilterChainBuilder& vhost_builder_;
114
+ const XdsRouteConfigResource::Route& route_;
115
+
116
+ // Cached filter chain for the route, to be used for any ClusterWeight
117
+ // that does not have any filter config overrides.
118
+ absl::StatusOr<RefCountedPtr<const FilterChain>> route_filter_chain_ =
119
+ nullptr;
120
+ };
121
+
122
+ VirtualHostFilterChainBuilder(
123
+ RouteConfigFilterChainBuilder& route_config_builder,
124
+ const XdsRouteConfigResource::VirtualHost& vhost)
125
+ : route_config_builder_(route_config_builder), vhost_(vhost) {}
126
+
127
+ // Builds a filter chain for a route that has an individual cluster
128
+ // or a ClusterSpecifierPlugin.
129
+ absl::StatusOr<RefCountedPtr<const FilterChain>> BuildFilterChainForRoute(
130
+ const XdsRouteConfigResource::Route& route);
131
+
132
+ // Returns a filter chain builder for a given route that uses
133
+ // WeightedClusters.
134
+ WeightedClusterRouteFilterChainBuilder
135
+ MakeWeightedClusterRouteFilterChainBuilder(
136
+ const XdsRouteConfigResource::Route& route) {
137
+ return WeightedClusterRouteFilterChainBuilder(*this, route);
138
+ }
139
+
140
+ private:
141
+ absl::StatusOr<RefCountedPtr<const FilterChain>>
142
+ GetVirtualHostFilterChain();
143
+
144
+ RouteConfigFilterChainBuilder& route_config_builder_;
145
+ const XdsRouteConfigResource::VirtualHost& vhost_;
146
+
147
+ // Cached filter chain for the virtual host, to be used for any route
148
+ // that does not have any filter config overrides.
149
+ absl::StatusOr<RefCountedPtr<const FilterChain>> vhost_filter_chain_ =
150
+ nullptr;
151
+ };
152
+
93
153
  // The add_last_filter() callback is called on the builder after
94
154
  // adding all of the xDS HTTP filters and right before building the
95
155
  // filter chain. May be null if not needed.
96
- PerRouteFilterChainBuilder(
156
+ RouteConfigFilterChainBuilder(
97
157
  const std::vector<
98
158
  XdsListenerResource::HttpConnectionManager::HttpFilter>&
99
159
  hcm_filter_configs,
100
160
  const XdsHttpFilterRegistry& http_filter_registry,
101
- const XdsRouteConfigResource::VirtualHost& vhost,
102
161
  FilterChainBuilder& builder,
103
162
  absl::AnyInvocable<void(FilterChainBuilder&)> add_last_filter,
104
163
  Blackboard& blackboard);
105
164
 
106
- // Builds a filter chain for a route that has an individual cluster
107
- // or a ClusterSpecifierPlugin.
108
- absl::StatusOr<RefCountedPtr<const FilterChain>> BuildFilterChainForRoute(
109
- const XdsRouteConfigResource::Route& route);
110
-
111
- // Builds a filter chain for a route that uses WeightedClusters.
112
- // The set_filter_chain_for_cluster_weight() function will be called
113
- // once for each index in the WeightedClusters list.
114
- void BuildFilterChainForRouteWithWeightedClusters(
115
- const XdsRouteConfigResource::Route& route,
116
- absl::FunctionRef<
117
- void(size_t, absl::StatusOr<RefCountedPtr<const FilterChain>>)>
118
- set_filter_chain_for_cluster_weight);
165
+ // Returns a filter chain builder for a given virtual host.
166
+ VirtualHostFilterChainBuilder MakeVirtualHostFilterChainBuilder(
167
+ const XdsRouteConfigResource::VirtualHost& vhost) {
168
+ return VirtualHostFilterChainBuilder(*this, vhost);
169
+ }
119
170
 
120
171
  private:
121
172
  absl::StatusOr<RefCountedPtr<const FilterChain>> GetDefaultFilterChain();
122
173
 
123
174
  const std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>&
124
175
  hcm_filter_configs_;
125
- const XdsRouteConfigResource::VirtualHost& vhost_;
126
176
  FilterChainBuilder& builder_;
127
177
  absl::AnyInvocable<void(FilterChainBuilder&)> add_last_filter_;
128
178
  Blackboard& blackboard_;
@@ -24,11 +24,10 @@
24
24
  #include <vector>
25
25
 
26
26
  #include "src/core/config/core_configuration.h"
27
+ #include "src/core/config/experiment_env_var.h"
27
28
  #include "src/core/util/down_cast.h"
28
- #include "src/core/util/env.h"
29
29
  #include "src/core/util/json/json_reader.h"
30
30
  #include "src/core/util/json/json_writer.h"
31
- #include "src/core/util/string.h"
32
31
  #include "absl/strings/str_cat.h"
33
32
  #include "absl/strings/string_view.h"
34
33
 
@@ -98,16 +97,6 @@ struct ChannelOrCallCreds {
98
97
  }
99
98
  };
100
99
 
101
- // TODO(roth): Remove this guard once we have reports from OSS Istio
102
- // users that this works properly.
103
- bool XdsBootstrapCallCredsEnabled() {
104
- auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_BOOTSTRAP_CALL_CREDS");
105
- if (!value.has_value()) return false;
106
- bool parsed_value;
107
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
108
- return parse_succeeded && parsed_value;
109
- }
110
-
111
100
  } // namespace
112
101
 
113
102
  RefCountedPtr<const ChannelCredsConfig> ParseXdsBootstrapChannelCreds(
@@ -170,7 +159,9 @@ void GrpcXdsServer::JsonPostLoad(const Json& json, const JsonArgs& args,
170
159
  ParseXdsBootstrapChannelCreds(json, args, errors);
171
160
  // Parse "call_creds".
172
161
  std::vector<RefCountedPtr<const CallCredsConfig>> call_creds_configs;
173
- if (XdsBootstrapCallCredsEnabled()) {
162
+ // TODO(roth): Remove this guard once we have reports from OSS Istio
163
+ // users that this works properly.
164
+ if (IsExperimentEnvVarEnabled("GRPC_EXPERIMENTAL_XDS_BOOTSTRAP_CALL_CREDS")) {
174
165
  call_creds_configs = ParseXdsBootstrapCallCreds(json, args, errors);
175
166
  }
176
167
  // Parse "server_features".
@@ -238,6 +229,22 @@ std::string GrpcXdsServerTarget::Key() const {
238
229
  StrAppend(result, call_creds_config->ToString());
239
230
  StrAppend(result, "}");
240
231
  }
232
+ if (!initial_metadata_.empty()) {
233
+ StrAppend(result, ", initial_metadata=[");
234
+ bool is_first = true;
235
+ for (const auto& metadata : initial_metadata_) {
236
+ if (!is_first) StrAppend(result, ", ");
237
+ StrAppend(result, metadata.first);
238
+ StrAppend(result, "=");
239
+ StrAppend(result, metadata.second);
240
+ is_first = false;
241
+ }
242
+ StrAppend(result, "]");
243
+ }
244
+ if (timeout_ != Duration::Zero()) {
245
+ StrAppend(result, ", timeout=");
246
+ StrAppend(result, timeout_.ToString());
247
+ }
241
248
  StrAppend(result, "}");
242
249
  return result;
243
250
  }
@@ -258,6 +265,8 @@ bool GrpcXdsServerTarget::Equals(const XdsServerTarget& other) const {
258
265
  return false;
259
266
  }
260
267
  }
268
+ if (initial_metadata_ != o.initial_metadata_) return false;
269
+ if (timeout_ != o.timeout_) return false;
261
270
  return true;
262
271
  }
263
272