grpc 1.49.1 → 1.50.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (270) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +54 -153
  3. data/include/grpc/event_engine/endpoint_config.h +11 -5
  4. data/include/grpc/event_engine/event_engine.h +1 -1
  5. data/include/grpc/impl/codegen/atm_gcc_atomic.h +19 -28
  6. data/include/grpc/impl/codegen/atm_gcc_sync.h +0 -2
  7. data/include/grpc/impl/codegen/atm_windows.h +0 -2
  8. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +3 -3
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +4 -6
  11. data/src/core/ext/filters/client_channel/client_channel.cc +33 -22
  12. data/src/core/ext/filters/client_channel/client_channel.h +1 -1
  13. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +0 -16
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +12 -19
  15. data/src/core/ext/filters/client_channel/http_proxy.h +3 -2
  16. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
  17. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -4
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +0 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +112 -96
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +20 -11
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +106 -108
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +16 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +20 -13
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +165 -257
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +218 -231
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +10 -6
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +389 -444
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +16 -16
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +8 -13
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +84 -96
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +38 -37
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +106 -186
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +106 -93
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +170 -218
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +2 -2
  36. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
  37. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -15
  38. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +84 -37
  39. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +11 -0
  40. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  41. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +5 -3
  42. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -4
  43. data/src/core/ext/filters/client_channel/retry_filter.cc +25 -29
  44. data/src/core/ext/filters/client_channel/subchannel.cc +38 -33
  45. data/src/core/ext/filters/client_channel/subchannel.h +12 -3
  46. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +1 -2
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +23 -16
  48. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -0
  49. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -2
  50. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +2 -4
  51. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -2
  52. data/src/core/ext/filters/http/server/http_server_filter.cc +1 -2
  53. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +12 -8
  54. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +32 -26
  55. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -1
  56. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +25 -130
  57. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +287 -0
  58. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1018 -0
  59. data/src/core/ext/transport/chttp2/transport/flow_control.cc +83 -51
  60. data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -6
  61. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +1 -2
  62. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -20
  63. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +28 -28
  64. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +1 -10
  65. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +11 -6
  66. data/src/core/ext/transport/chttp2/transport/internal.h +2 -0
  67. data/src/core/ext/transport/chttp2/transport/parsing.cc +44 -0
  68. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -14
  69. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -3
  70. data/src/core/ext/xds/certificate_provider_store.cc +63 -3
  71. data/src/core/ext/xds/certificate_provider_store.h +9 -1
  72. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +5 -5
  73. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +1 -1
  74. data/src/core/ext/xds/xds_api.cc +21 -17
  75. data/src/core/ext/xds/xds_api.h +7 -0
  76. data/src/core/ext/xds/xds_bootstrap.cc +5 -537
  77. data/src/core/ext/xds/xds_bootstrap.h +39 -111
  78. data/src/core/ext/xds/xds_bootstrap_grpc.cc +370 -0
  79. data/src/core/ext/xds/xds_bootstrap_grpc.h +169 -0
  80. data/src/core/ext/xds/xds_client.cc +219 -145
  81. data/src/core/ext/xds/xds_client.h +19 -17
  82. data/src/core/ext/xds/xds_client_grpc.cc +18 -80
  83. data/src/core/ext/xds/xds_client_grpc.h +2 -25
  84. data/src/core/ext/xds/xds_client_stats.cc +4 -4
  85. data/src/core/ext/xds/xds_cluster.cc +87 -79
  86. data/src/core/ext/xds/xds_cluster.h +5 -5
  87. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +3 -1
  88. data/src/core/ext/xds/xds_common_types.cc +13 -5
  89. data/src/core/ext/xds/xds_endpoint.cc +8 -6
  90. data/src/core/ext/xds/xds_endpoint.h +3 -4
  91. data/src/core/ext/xds/xds_lb_policy_registry.cc +4 -2
  92. data/src/core/ext/xds/xds_listener.cc +25 -20
  93. data/src/core/ext/xds/xds_listener.h +3 -4
  94. data/src/core/ext/xds/xds_resource_type.h +11 -8
  95. data/src/core/ext/xds/xds_route_config.cc +15 -16
  96. data/src/core/ext/xds/xds_route_config.h +3 -3
  97. data/src/core/ext/xds/xds_server_config_fetcher.cc +7 -5
  98. data/src/core/ext/xds/xds_transport_grpc.cc +15 -7
  99. data/src/core/lib/backoff/backoff.cc +2 -4
  100. data/src/core/lib/channel/call_finalization.h +1 -3
  101. data/src/core/lib/channel/channel_args.h +114 -14
  102. data/src/core/lib/channel/channel_trace.cc +3 -4
  103. data/src/core/lib/channel/promise_based_filter.cc +18 -19
  104. data/src/core/lib/channel/status_util.cc +27 -0
  105. data/src/core/lib/channel/status_util.h +10 -0
  106. data/src/core/lib/config/core_configuration.cc +5 -1
  107. data/src/core/lib/config/core_configuration.h +33 -0
  108. data/src/core/lib/debug/stats.cc +26 -30
  109. data/src/core/lib/debug/stats.h +2 -12
  110. data/src/core/lib/debug/stats_data.cc +118 -614
  111. data/src/core/lib/debug/stats_data.h +67 -465
  112. data/src/core/lib/debug/trace.cc +0 -2
  113. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +12 -20
  114. data/src/core/lib/event_engine/channel_args_endpoint_config.h +13 -7
  115. data/src/core/lib/event_engine/forkable.cc +1 -1
  116. data/src/core/lib/event_engine/poller.h +14 -12
  117. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +53 -32
  118. data/src/core/lib/event_engine/posix_engine/timer_manager.h +23 -1
  119. data/src/core/lib/event_engine/thread_pool.cc +131 -94
  120. data/src/core/lib/event_engine/thread_pool.h +56 -23
  121. data/src/core/lib/event_engine/time_util.cc +30 -0
  122. data/src/core/lib/event_engine/time_util.h +32 -0
  123. data/src/core/lib/event_engine/utils.cc +0 -5
  124. data/src/core/lib/event_engine/utils.h +0 -4
  125. data/src/core/lib/event_engine/windows/iocp.cc +13 -7
  126. data/src/core/lib/event_engine/windows/iocp.h +2 -1
  127. data/src/core/lib/event_engine/windows/win_socket.cc +1 -1
  128. data/src/core/lib/experiments/config.cc +146 -0
  129. data/src/core/lib/experiments/config.h +43 -0
  130. data/src/core/lib/experiments/experiments.cc +75 -0
  131. data/src/core/lib/experiments/experiments.h +56 -0
  132. data/src/core/lib/gpr/alloc.cc +1 -9
  133. data/src/core/lib/gpr/log_windows.cc +0 -1
  134. data/src/core/lib/gpr/string_util_windows.cc +3 -30
  135. data/src/core/lib/gpr/sync_abseil.cc +0 -14
  136. data/src/core/lib/gpr/sync_posix.cc +0 -14
  137. data/src/core/lib/gpr/time_posix.cc +0 -6
  138. data/src/core/lib/gpr/time_precise.h +1 -1
  139. data/src/core/lib/gpr/tmpfile_windows.cc +5 -7
  140. data/src/core/lib/gpr/useful.h +11 -0
  141. data/src/core/lib/{gpr → gprpp}/env.h +25 -12
  142. data/src/core/lib/{gpr → gprpp}/env_linux.cc +20 -15
  143. data/src/core/lib/{gpr → gprpp}/env_posix.cc +11 -10
  144. data/src/core/lib/gprpp/env_windows.cc +56 -0
  145. data/src/core/lib/gprpp/fork.cc +14 -22
  146. data/src/core/lib/gprpp/fork.h +0 -8
  147. data/src/core/lib/gprpp/global_config_env.cc +7 -6
  148. data/src/core/lib/gprpp/notification.h +67 -0
  149. data/src/core/lib/gprpp/packed_table.h +40 -0
  150. data/src/core/lib/gprpp/ref_counted_ptr.h +20 -33
  151. data/src/core/lib/gprpp/sorted_pack.h +98 -0
  152. data/src/core/lib/gprpp/status_helper.h +6 -0
  153. data/src/core/lib/gprpp/table.h +9 -1
  154. data/src/core/lib/gprpp/tchar.cc +49 -0
  155. data/src/core/lib/gprpp/tchar.h +33 -0
  156. data/src/core/lib/gprpp/time.cc +21 -0
  157. data/src/core/lib/gprpp/time.h +55 -0
  158. data/src/core/lib/gprpp/validation_errors.cc +61 -0
  159. data/src/core/lib/gprpp/validation_errors.h +110 -0
  160. data/src/core/{ext/filters/client_channel → lib/handshaker}/proxy_mapper.h +3 -3
  161. data/src/core/{ext/filters/client_channel → lib/handshaker}/proxy_mapper_registry.cc +14 -36
  162. data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
  163. data/src/core/lib/iomgr/call_combiner.cc +0 -8
  164. data/src/core/lib/iomgr/closure.h +0 -1
  165. data/src/core/lib/iomgr/endpoint_pair_posix.cc +14 -10
  166. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  167. data/src/core/lib/iomgr/ev_epoll1_linux.cc +1 -38
  168. data/src/core/lib/iomgr/ev_poll_posix.cc +2 -17
  169. data/src/core/lib/iomgr/exec_ctx.cc +0 -10
  170. data/src/core/lib/iomgr/exec_ctx.h +7 -31
  171. data/src/core/lib/iomgr/iocp_windows.cc +1 -2
  172. data/src/core/lib/iomgr/iomgr.cc +6 -8
  173. data/src/core/lib/iomgr/iomgr_fwd.h +1 -0
  174. data/src/core/lib/iomgr/pollset.h +1 -1
  175. data/src/core/lib/iomgr/pollset_set.h +0 -1
  176. data/src/core/lib/iomgr/resolve_address.h +1 -0
  177. data/src/core/lib/iomgr/resolve_address_impl.h +1 -0
  178. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -0
  179. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -0
  180. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +2 -1
  181. data/src/core/lib/iomgr/socket_utils_common_posix.cc +12 -34
  182. data/src/core/lib/iomgr/socket_utils_posix.cc +83 -1
  183. data/src/core/lib/iomgr/socket_utils_posix.h +98 -6
  184. data/src/core/lib/iomgr/tcp_client.cc +6 -7
  185. data/src/core/lib/iomgr/tcp_client.h +11 -11
  186. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -6
  187. data/src/core/lib/iomgr/tcp_client_posix.cc +33 -29
  188. data/src/core/lib/iomgr/tcp_client_posix.h +12 -9
  189. data/src/core/lib/iomgr/tcp_client_windows.cc +6 -6
  190. data/src/core/lib/iomgr/tcp_posix.cc +131 -114
  191. data/src/core/lib/iomgr/tcp_posix.h +3 -1
  192. data/src/core/lib/iomgr/tcp_server.cc +5 -4
  193. data/src/core/lib/iomgr/tcp_server.h +9 -6
  194. data/src/core/lib/iomgr/tcp_server_posix.cc +17 -28
  195. data/src/core/lib/iomgr/tcp_server_utils_posix.h +2 -2
  196. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +3 -3
  197. data/src/core/lib/iomgr/tcp_server_windows.cc +6 -7
  198. data/src/core/lib/iomgr/tcp_windows.cc +0 -1
  199. data/src/core/lib/iomgr/tcp_windows.h +0 -1
  200. data/src/core/lib/iomgr/timer_generic.cc +4 -4
  201. data/src/core/lib/iomgr/timer_manager.cc +1 -2
  202. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +0 -2
  203. data/src/core/lib/json/json_object_loader.cc +21 -52
  204. data/src/core/lib/json/json_object_loader.h +56 -76
  205. data/src/core/lib/json/json_util.cc +2 -1
  206. data/src/core/lib/load_balancing/lb_policy.h +5 -5
  207. data/src/core/lib/load_balancing/lb_policy_registry.cc +29 -55
  208. data/src/core/lib/load_balancing/lb_policy_registry.h +23 -11
  209. data/src/core/lib/promise/activity.h +2 -3
  210. data/src/core/lib/promise/context.h +1 -1
  211. data/src/core/lib/promise/sleep.cc +16 -4
  212. data/src/core/lib/promise/sleep.h +8 -2
  213. data/src/core/lib/resolver/resolver.h +13 -3
  214. data/src/core/lib/resource_quota/api.cc +9 -0
  215. data/src/core/lib/resource_quota/api.h +6 -0
  216. data/src/core/lib/resource_quota/arena.cc +1 -3
  217. data/src/core/lib/resource_quota/memory_quota.cc +8 -24
  218. data/src/core/lib/resource_quota/memory_quota.h +6 -19
  219. data/src/core/lib/resource_quota/periodic_update.cc +2 -3
  220. data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +3 -3
  221. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
  222. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
  223. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +1 -0
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +15 -16
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -1
  226. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +5 -8
  227. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +6 -6
  228. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -2
  229. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  230. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -2
  231. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +4 -3
  232. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +4 -2
  233. data/src/core/lib/security/credentials/tls/tls_utils.cc +3 -1
  234. data/src/core/lib/security/transport/client_auth_filter.cc +12 -1
  235. data/src/core/lib/security/transport/secure_endpoint.cc +0 -4
  236. data/src/core/lib/surface/call.cc +1 -11
  237. data/src/core/lib/surface/channel.cc +3 -2
  238. data/src/core/lib/surface/completion_queue.cc +16 -28
  239. data/src/core/lib/surface/completion_queue.h +1 -1
  240. data/src/core/lib/surface/completion_queue_factory.cc +5 -0
  241. data/src/core/lib/surface/init.cc +16 -11
  242. data/src/core/lib/surface/init_internally.cc +24 -0
  243. data/src/core/lib/surface/init_internally.h +28 -0
  244. data/src/core/lib/surface/server.cc +1 -7
  245. data/src/core/lib/surface/server.h +4 -6
  246. data/src/core/lib/surface/version.cc +2 -2
  247. data/src/core/lib/transport/bdp_estimator.cc +1 -3
  248. data/src/core/lib/transport/metadata_batch.cc +2 -3
  249. data/src/core/lib/transport/metadata_batch.h +9 -7
  250. data/src/core/lib/transport/parsed_metadata.h +4 -2
  251. data/src/core/lib/transport/status_conversion.cc +1 -3
  252. data/src/core/lib/transport/tcp_connect_handshaker.cc +9 -5
  253. data/src/core/lib/transport/transport.h +0 -1
  254. data/src/core/lib/transport/transport_impl.h +0 -1
  255. data/src/core/plugin_registry/grpc_plugin_registry.cc +23 -46
  256. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +13 -25
  257. data/src/ruby/lib/grpc/version.rb +1 -1
  258. data/src/ruby/spec/channel_spec.rb +5 -0
  259. data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
  260. data/src/ruby/spec/user_agent_spec.rb +1 -1
  261. metadata +33 -19
  262. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -56
  263. data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
  264. data/src/core/ext/xds/certificate_provider_registry.h +0 -59
  265. data/src/core/lib/event_engine/promise.h +0 -78
  266. data/src/core/lib/gpr/env_windows.cc +0 -74
  267. data/src/core/lib/gpr/string_windows.h +0 -32
  268. data/src/core/lib/profiling/basic_timers.cc +0 -295
  269. data/src/core/lib/profiling/stap_timers.cc +0 -50
  270. data/src/core/lib/profiling/timers.h +0 -94
@@ -45,7 +45,6 @@
45
45
  #include "src/core/lib/gprpp/sync.h"
46
46
  #include "src/core/lib/gprpp/time.h"
47
47
  #include "src/core/lib/gprpp/work_serializer.h"
48
- #include "src/core/lib/iomgr/exec_ctx.h"
49
48
  #include "src/core/lib/uri/uri_parser.h"
50
49
 
51
50
  namespace grpc_core {
@@ -76,9 +75,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
76
75
  ~XdsClient() override;
77
76
 
78
77
  const XdsBootstrap& bootstrap() const {
79
- // bootstrap_ is guaranteed to be non-null since XdsClient::GetOrCreate()
80
- // would return a null object if bootstrap_ was null.
81
- return *bootstrap_;
78
+ return *bootstrap_; // ctor asserts that it is non-null
82
79
  }
83
80
 
84
81
  XdsTransportFactory* transport_factory() const {
@@ -188,8 +185,9 @@ class XdsClient : public DualRefCounted<XdsClient> {
188
185
  void MaybeStartLrsCall();
189
186
  void StopLrsCallLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
190
187
 
191
- bool HasAdsCall() const;
192
- bool HasActiveAdsCall() const;
188
+ // Returns non-OK if there has been an error since the last time the
189
+ // ADS stream saw a response.
190
+ const absl::Status& status() const { return status_; }
193
191
 
194
192
  void SubscribeLocked(const XdsResourceType* type,
195
193
  const XdsResourceName& name)
@@ -200,14 +198,17 @@ class XdsClient : public DualRefCounted<XdsClient> {
200
198
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
201
199
 
202
200
  private:
203
- void OnConnectivityStateChange(absl::Status status);
204
- void OnConnectivityStateChangeLocked(absl::Status status)
201
+ void OnConnectivityFailure(absl::Status status);
202
+
203
+ // Enqueues error notifications to watchers. Caller must drain
204
+ // XdsClient::work_serializer_ after releasing the lock.
205
+ void SetChannelStatusLocked(absl::Status status)
205
206
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
206
207
 
207
208
  // The owning xds client.
208
209
  WeakRefCountedPtr<XdsClient> xds_client_;
209
210
 
210
- const XdsBootstrap::XdsServer& server_;
211
+ const XdsBootstrap::XdsServer& server_; // Owned by bootstrap.
211
212
 
212
213
  OrphanablePtr<XdsTransportFactory::XdsTransport> transport_;
213
214
 
@@ -220,6 +221,8 @@ class XdsClient : public DualRefCounted<XdsClient> {
220
221
  // Stores the most recent accepted resource version for each resource type.
221
222
  std::map<const XdsResourceType*, std::string /*version*/>
222
223
  resource_type_version_map_;
224
+
225
+ absl::Status status_;
223
226
  };
224
227
 
225
228
  struct ResourceState {
@@ -248,7 +251,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
248
251
  std::map<RefCountedPtr<XdsLocalityName>, LocalityState,
249
252
  XdsLocalityName::Less>
250
253
  locality_stats;
251
- Timestamp last_report_time = ExecCtx::Get()->Now();
254
+ Timestamp last_report_time = Timestamp::Now();
252
255
  };
253
256
 
254
257
  // Load report data.
@@ -261,9 +264,6 @@ class XdsClient : public DualRefCounted<XdsClient> {
261
264
  LoadReportMap load_report_map;
262
265
  };
263
266
 
264
- // Sends an error notification to all watchers.
265
- void NotifyOnErrorLocked(absl::Status status)
266
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
267
267
  // Sends an error notification to a specific set of watchers.
268
268
  void NotifyWatchersOnErrorLocked(
269
269
  const std::map<ResourceWatcherInterface*,
@@ -311,14 +311,16 @@ class XdsClient : public DualRefCounted<XdsClient> {
311
311
  v2_resource_types_ ABSL_GUARDED_BY(mu_);
312
312
  upb::SymbolTable symtab_ ABSL_GUARDED_BY(mu_);
313
313
 
314
- // Map of existing xDS server channels.
315
- std::map<XdsBootstrap::XdsServer, ChannelState*> xds_server_channel_map_
316
- ABSL_GUARDED_BY(mu_);
314
+ // Map of existing xDS server channels.
315
+ // Key is owned by the bootstrap config.
316
+ std::map<const XdsBootstrap::XdsServer*, ChannelState*>
317
+ xds_server_channel_map_ ABSL_GUARDED_BY(mu_);
317
318
 
318
319
  std::map<std::string /*authority*/, AuthorityState> authority_state_map_
319
320
  ABSL_GUARDED_BY(mu_);
320
321
 
321
- std::map<XdsBootstrap::XdsServer, LoadReportServer>
322
+ // Key is owned by the bootstrap config.
323
+ std::map<const XdsBootstrap::XdsServer*, LoadReportServer>
322
324
  xds_load_report_server_map_ ABSL_GUARDED_BY(mu_);
323
325
 
324
326
  // Stores started watchers whose resource name was not parsed successfully,
@@ -19,18 +19,12 @@
19
19
  #include "src/core/ext/xds/xds_client_grpc.h"
20
20
 
21
21
  #include <algorithm>
22
- #include <map>
23
22
  #include <memory>
24
23
  #include <string>
25
24
  #include <utility>
26
- #include <vector>
27
25
 
28
26
  #include "absl/base/thread_annotations.h"
29
- #include "absl/memory/memory.h"
30
27
  #include "absl/status/status.h"
31
- #include "absl/strings/str_cat.h"
32
- #include "absl/strings/str_format.h"
33
- #include "absl/strings/str_join.h"
34
28
  #include "absl/strings/string_view.h"
35
29
  #include "absl/types/optional.h"
36
30
 
@@ -40,9 +34,8 @@
40
34
  #include <grpc/support/log.h>
41
35
  #include <grpc/support/string_util.h>
42
36
 
43
- #include "src/core/ext/xds/certificate_provider_factory.h"
44
- #include "src/core/ext/xds/certificate_provider_registry.h"
45
37
  #include "src/core/ext/xds/xds_bootstrap.h"
38
+ #include "src/core/ext/xds/xds_bootstrap_grpc.h"
46
39
  #include "src/core/ext/xds/xds_channel_args.h"
47
40
  #include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
48
41
  #include "src/core/ext/xds/xds_http_filters.h"
@@ -50,9 +43,8 @@
50
43
  #include "src/core/ext/xds/xds_transport_grpc.h"
51
44
  #include "src/core/lib/channel/channel_args.h"
52
45
  #include "src/core/lib/debug/trace.h"
53
- #include "src/core/lib/gpr/env.h"
54
46
  #include "src/core/lib/gprpp/debug_location.h"
55
- #include "src/core/lib/gprpp/memory.h"
47
+ #include "src/core/lib/gprpp/env.h"
56
48
  #include "src/core/lib/gprpp/orphanable.h"
57
49
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
58
50
  #include "src/core/lib/gprpp/sync.h"
@@ -60,7 +52,6 @@
60
52
  #include "src/core/lib/iomgr/error.h"
61
53
  #include "src/core/lib/iomgr/exec_ctx.h"
62
54
  #include "src/core/lib/iomgr/load_file.h"
63
- #include "src/core/lib/json/json.h"
64
55
  #include "src/core/lib/slice/slice_internal.h"
65
56
  #include "src/core/lib/slice/slice_refcount.h"
66
57
  #include "src/core/lib/transport/error_utils.h"
@@ -101,31 +92,31 @@ namespace {
101
92
 
102
93
  absl::StatusOr<std::string> GetBootstrapContents(const char* fallback_config) {
103
94
  // First, try GRPC_XDS_BOOTSTRAP env var.
104
- UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
105
- if (path != nullptr) {
95
+ auto path = GetEnv("GRPC_XDS_BOOTSTRAP");
96
+ if (path.has_value()) {
106
97
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
107
98
  gpr_log(GPR_INFO,
108
99
  "Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
109
100
  "environment variable: %s",
110
- path.get());
101
+ path->c_str());
111
102
  }
112
103
  grpc_slice contents;
113
104
  grpc_error_handle error =
114
- grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
105
+ grpc_load_file(path->c_str(), /*add_null_terminator=*/true, &contents);
115
106
  if (!GRPC_ERROR_IS_NONE(error)) return grpc_error_to_absl_status(error);
116
107
  std::string contents_str(StringViewFromSlice(contents));
117
108
  grpc_slice_unref_internal(contents);
118
109
  return contents_str;
119
110
  }
120
111
  // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
121
- UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
122
- if (env_config != nullptr) {
112
+ auto env_config = GetEnv("GRPC_XDS_BOOTSTRAP_CONFIG");
113
+ if (env_config.has_value()) {
123
114
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
124
115
  gpr_log(GPR_INFO,
125
116
  "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
126
117
  "environment variable");
127
118
  }
128
- return env_config.get();
119
+ return std::move(*env_config);
129
120
  }
130
121
  // Finally, try fallback config.
131
122
  if (fallback_config != nullptr) {
@@ -144,21 +135,16 @@ absl::StatusOr<std::string> GetBootstrapContents(const char* fallback_config) {
144
135
 
145
136
  absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
146
137
  const ChannelArgs& args, const char* reason) {
147
- // Construct certificate provider plugin map.
148
- auto certificate_provider_plugin_map =
149
- absl::make_unique<GrpcXdsCertificateProviderPluginMap>();
150
138
  // If getting bootstrap from channel args, create a local XdsClient
151
139
  // instance for the channel or server instead of using the global instance.
152
140
  absl::optional<absl::string_view> bootstrap_config = args.GetString(
153
141
  GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
154
142
  if (bootstrap_config.has_value()) {
155
- grpc_error_handle error = GRPC_ERROR_NONE;
156
- std::unique_ptr<XdsBootstrap> bootstrap = XdsBootstrap::Create(
157
- *bootstrap_config, std::move(certificate_provider_plugin_map), &error);
158
- if (!GRPC_ERROR_IS_NONE(error)) return grpc_error_to_absl_status(error);
143
+ auto bootstrap = GrpcXdsBootstrap::Create(*bootstrap_config);
144
+ if (!bootstrap.ok()) return bootstrap.status();
159
145
  grpc_channel_args* xds_channel_args = args.GetPointer<grpc_channel_args>(
160
146
  GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
161
- return MakeRefCounted<GrpcXdsClient>(std::move(bootstrap),
147
+ return MakeRefCounted<GrpcXdsClient>(std::move(*bootstrap),
162
148
  ChannelArgs::FromC(xds_channel_args));
163
149
  }
164
150
  // Otherwise, use the global instance.
@@ -175,18 +161,16 @@ absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
175
161
  bootstrap_contents->c_str());
176
162
  }
177
163
  // Parse bootstrap.
178
- grpc_error_handle error = GRPC_ERROR_NONE;
179
- std::unique_ptr<XdsBootstrap> bootstrap = XdsBootstrap::Create(
180
- *bootstrap_contents, std::move(certificate_provider_plugin_map), &error);
181
- if (!GRPC_ERROR_IS_NONE(error)) return grpc_error_to_absl_status(error);
164
+ auto bootstrap = GrpcXdsBootstrap::Create(*bootstrap_contents);
165
+ if (!bootstrap.ok()) return bootstrap.status();
182
166
  // Instantiate XdsClient.
183
167
  auto xds_client = MakeRefCounted<GrpcXdsClient>(
184
- std::move(bootstrap), ChannelArgs::FromC(g_channel_args));
168
+ std::move(*bootstrap), ChannelArgs::FromC(g_channel_args));
185
169
  g_xds_client = xds_client.get();
186
170
  return xds_client;
187
171
  }
188
172
 
189
- GrpcXdsClient::GrpcXdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
173
+ GrpcXdsClient::GrpcXdsClient(std::unique_ptr<GrpcXdsBootstrap> bootstrap,
190
174
  const ChannelArgs& args)
191
175
  : XdsClient(
192
176
  std::move(bootstrap), MakeOrphanable<GrpcXdsTransportFactory>(args),
@@ -195,9 +179,8 @@ GrpcXdsClient::GrpcXdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
195
179
  GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS)
196
180
  .value_or(Duration::Seconds(15)))),
197
181
  certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
198
- static_cast<const GrpcXdsCertificateProviderPluginMap*>(
199
- this->bootstrap().certificate_provider_plugin_map())
200
- ->plugin_map())) {}
182
+ static_cast<const GrpcXdsBootstrap&>(this->bootstrap())
183
+ .certificate_providers())) {}
201
184
 
202
185
  GrpcXdsClient::~GrpcXdsClient() {
203
186
  MutexLock lock(g_mu);
@@ -229,51 +212,6 @@ void SetXdsFallbackBootstrapConfig(const char* config) {
229
212
 
230
213
  } // namespace internal
231
214
 
232
- //
233
- // GrpcXdsCertificateProviderPluginMap
234
- //
235
-
236
- absl::Status GrpcXdsCertificateProviderPluginMap::AddPlugin(
237
- const std::string& instance_name, const std::string& plugin_name,
238
- const Json& config) {
239
- CertificateProviderFactory* factory =
240
- CertificateProviderRegistry::LookupCertificateProviderFactory(
241
- plugin_name);
242
- if (factory == nullptr) {
243
- return absl::InvalidArgumentError(
244
- absl::StrCat("Unrecognized plugin name: ", plugin_name));
245
- }
246
- grpc_error_handle error = GRPC_ERROR_NONE;
247
- auto parsed_config = factory->CreateCertificateProviderConfig(config, &error);
248
- if (!GRPC_ERROR_IS_NONE(error)) {
249
- absl::Status status = grpc_error_to_absl_status(error);
250
- GRPC_ERROR_UNREF(error);
251
- return status;
252
- }
253
- plugin_map_.insert({instance_name, {plugin_name, std::move(parsed_config)}});
254
- return absl::OkStatus();
255
- }
256
-
257
- bool GrpcXdsCertificateProviderPluginMap::HasPlugin(
258
- const std::string& instance_name) const {
259
- return plugin_map_.find(instance_name) != plugin_map_.end();
260
- }
261
-
262
- std::string GrpcXdsCertificateProviderPluginMap::ToString() const {
263
- std::vector<std::string> parts = {"{\n"};
264
- for (const auto& entry : plugin_map_) {
265
- parts.push_back(
266
- absl::StrFormat(" %s={\n"
267
- " plugin_name=%s\n"
268
- " config=%s\n"
269
- " },\n",
270
- entry.first, entry.second.plugin_name,
271
- entry.second.config->ToString()));
272
- }
273
- parts.push_back("}");
274
- return absl::StrJoin(parts, "");
275
- }
276
-
277
215
  } // namespace grpc_core
278
216
 
279
217
  // The returned bytes may contain NULL(0), so we can't use c-string.
@@ -20,23 +20,20 @@
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
22
  #include <memory>
23
- #include <string>
24
23
 
25
- #include "absl/status/status.h"
26
24
  #include "absl/status/statusor.h"
27
25
  #include "absl/strings/string_view.h"
28
26
 
29
27
  #include <grpc/impl/codegen/grpc_types.h>
30
28
 
31
29
  #include "src/core/ext/xds/certificate_provider_store.h"
32
- #include "src/core/ext/xds/xds_bootstrap.h"
30
+ #include "src/core/ext/xds/xds_bootstrap_grpc.h"
33
31
  #include "src/core/ext/xds/xds_client.h"
34
32
  #include "src/core/lib/channel/channel_args.h"
35
33
  #include "src/core/lib/gpr/useful.h"
36
34
  #include "src/core/lib/gprpp/orphanable.h"
37
35
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
38
36
  #include "src/core/lib/iomgr/iomgr_fwd.h"
39
- #include "src/core/lib/json/json.h"
40
37
 
41
38
  namespace grpc_core {
42
39
 
@@ -47,7 +44,7 @@ class GrpcXdsClient : public XdsClient {
47
44
  const ChannelArgs& args, const char* reason);
48
45
 
49
46
  // Do not instantiate directly -- use GetOrCreate() instead.
50
- GrpcXdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
47
+ GrpcXdsClient(std::unique_ptr<GrpcXdsBootstrap> bootstrap,
51
48
  const ChannelArgs& args);
52
49
  ~GrpcXdsClient() override;
53
50
 
@@ -77,26 +74,6 @@ void UnsetGlobalXdsClientForTest();
77
74
  void SetXdsFallbackBootstrapConfig(const char* config);
78
75
  } // namespace internal
79
76
 
80
- // Exposed for testing purposes only.
81
- class GrpcXdsCertificateProviderPluginMap
82
- : public XdsCertificateProviderPluginMapInterface {
83
- public:
84
- const CertificateProviderStore::PluginDefinitionMap& plugin_map() const {
85
- return plugin_map_;
86
- }
87
-
88
- absl::Status AddPlugin(const std::string& instance_name,
89
- const std::string& plugin_name,
90
- const Json& config) override;
91
-
92
- bool HasPlugin(const std::string& instance_name) const override;
93
-
94
- std::string ToString() const override;
95
-
96
- private:
97
- CertificateProviderStore::PluginDefinitionMap plugin_map_;
98
- };
99
-
100
77
  } // namespace grpc_core
101
78
 
102
79
  #endif // GRPC_CORE_EXT_XDS_XDS_CLIENT_GRPC_H
@@ -53,7 +53,7 @@ XdsClusterDropStats::XdsClusterDropStats(
53
53
  eds_service_name_(eds_service_name) {
54
54
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
55
55
  gpr_log(GPR_INFO, "[xds_client %p] created drop stats %p for {%s, %s, %s}",
56
- xds_client_.get(), this, lrs_server_.server_uri.c_str(),
56
+ xds_client_.get(), this, lrs_server_.server_uri().c_str(),
57
57
  std::string(cluster_name_).c_str(),
58
58
  std::string(eds_service_name_).c_str());
59
59
  }
@@ -63,7 +63,7 @@ XdsClusterDropStats::~XdsClusterDropStats() {
63
63
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
64
64
  gpr_log(GPR_INFO,
65
65
  "[xds_client %p] destroying drop stats %p for {%s, %s, %s}",
66
- xds_client_.get(), this, lrs_server_.server_uri.c_str(),
66
+ xds_client_.get(), this, lrs_server_.server_uri().c_str(),
67
67
  std::string(cluster_name_).c_str(),
68
68
  std::string(eds_service_name_).c_str());
69
69
  }
@@ -108,7 +108,7 @@ XdsClusterLocalityStats::XdsClusterLocalityStats(
108
108
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
109
109
  gpr_log(GPR_INFO,
110
110
  "[xds_client %p] created locality stats %p for {%s, %s, %s, %s}",
111
- xds_client_.get(), this, lrs_server_.server_uri.c_str(),
111
+ xds_client_.get(), this, lrs_server_.server_uri().c_str(),
112
112
  std::string(cluster_name_).c_str(),
113
113
  std::string(eds_service_name_).c_str(),
114
114
  name_->AsHumanReadableString().c_str());
@@ -119,7 +119,7 @@ XdsClusterLocalityStats::~XdsClusterLocalityStats() {
119
119
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
120
120
  gpr_log(GPR_INFO,
121
121
  "[xds_client %p] destroying locality stats %p for {%s, %s, %s, %s}",
122
- xds_client_.get(), this, lrs_server_.server_uri.c_str(),
122
+ xds_client_.get(), this, lrs_server_.server_uri().c_str(),
123
123
  std::string(cluster_name_).c_str(),
124
124
  std::string(eds_service_name_).c_str(),
125
125
  name_->AsHumanReadableString().c_str());
@@ -24,9 +24,10 @@
24
24
 
25
25
  #include "absl/memory/memory.h"
26
26
  #include "absl/status/status.h"
27
+ #include "absl/status/statusor.h"
27
28
  #include "absl/strings/str_cat.h"
28
- #include "absl/strings/str_format.h"
29
29
  #include "absl/strings/str_join.h"
30
+ #include "absl/strings/strip.h"
30
31
  #include "envoy/config/cluster/v3/circuit_breaker.upb.h"
31
32
  #include "envoy/config/cluster/v3/cluster.upb.h"
32
33
  #include "envoy/config/cluster/v3/cluster.upbdefs.h"
@@ -65,27 +66,26 @@ std::string XdsClusterResource::ToString() const {
65
66
  case EDS:
66
67
  contents.push_back("cluster_type=EDS");
67
68
  if (!eds_service_name.empty()) {
68
- contents.push_back(
69
- absl::StrFormat("eds_service_name=%s", eds_service_name));
69
+ contents.push_back(absl::StrCat("eds_service_name=", eds_service_name));
70
70
  }
71
71
  break;
72
72
  case LOGICAL_DNS:
73
73
  contents.push_back("cluster_type=LOGICAL_DNS");
74
- contents.push_back(absl::StrFormat("dns_hostname=%s", dns_hostname));
74
+ contents.push_back(absl::StrCat("dns_hostname=", dns_hostname));
75
75
  break;
76
76
  case AGGREGATE:
77
77
  contents.push_back("cluster_type=AGGREGATE");
78
78
  contents.push_back(
79
- absl::StrFormat("prioritized_cluster_names=[%s]",
80
- absl::StrJoin(prioritized_cluster_names, ", ")));
79
+ absl::StrCat("prioritized_cluster_names=[",
80
+ absl::StrJoin(prioritized_cluster_names, ", "), "]"));
81
81
  }
82
82
  if (!common_tls_context.Empty()) {
83
- contents.push_back(absl::StrFormat("common_tls_context=%s",
84
- common_tls_context.ToString()));
83
+ contents.push_back(
84
+ absl::StrCat("common_tls_context=", common_tls_context.ToString()));
85
85
  }
86
86
  if (lrs_load_reporting_server.has_value()) {
87
- contents.push_back(absl::StrFormat("lrs_load_reporting_server_name=%s",
88
- lrs_load_reporting_server->server_uri));
87
+ contents.push_back(absl::StrCat("lrs_load_reporting_server_name=",
88
+ lrs_load_reporting_server->server_uri()));
89
89
  }
90
90
  contents.push_back(absl::StrCat("lb_policy=", lb_policy));
91
91
  if (lb_policy == "RING_HASH") {
@@ -93,7 +93,7 @@ std::string XdsClusterResource::ToString() const {
93
93
  contents.push_back(absl::StrCat("max_ring_size=", max_ring_size));
94
94
  }
95
95
  contents.push_back(
96
- absl::StrFormat("max_concurrent_requests=%d", max_concurrent_requests));
96
+ absl::StrCat("max_concurrent_requests=", max_concurrent_requests));
97
97
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
98
98
  }
99
99
 
@@ -106,39 +106,41 @@ namespace {
106
106
  absl::StatusOr<CommonTlsContext> UpstreamTlsContextParse(
107
107
  const XdsResourceType::DecodeContext& context,
108
108
  const envoy_config_core_v3_TransportSocket* transport_socket) {
109
- CommonTlsContext common_tls_context;
110
- // Record Upstream tls context
111
- absl::string_view name = UpbStringToAbsl(
112
- envoy_config_core_v3_TransportSocket_name(transport_socket));
113
- if (name != "envoy.transport_sockets.tls") {
114
- return absl::InvalidArgumentError(
115
- absl::StrCat("Unrecognized transport socket: ", name));
116
- }
117
109
  auto* typed_config =
118
110
  envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
119
- if (typed_config != nullptr) {
120
- const upb_StringView encoded_upstream_tls_context =
121
- google_protobuf_Any_value(typed_config);
122
- auto* upstream_tls_context =
123
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
124
- encoded_upstream_tls_context.data,
125
- encoded_upstream_tls_context.size, context.arena);
126
- if (upstream_tls_context == nullptr) {
127
- return absl::InvalidArgumentError("Can't decode upstream tls context.");
128
- }
129
- auto* common_tls_context_proto =
130
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
131
- upstream_tls_context);
132
- if (common_tls_context_proto != nullptr) {
133
- auto common_context =
134
- CommonTlsContext::Parse(context, common_tls_context_proto);
135
- if (!common_context.ok()) {
136
- return absl::InvalidArgumentError(
137
- absl::StrCat("Error parsing UpstreamTlsContext: ",
138
- common_context.status().message()));
139
- }
140
- common_tls_context = std::move(*common_context);
111
+ if (typed_config == nullptr) {
112
+ return absl::InvalidArgumentError("transport_socket.typed_config not set");
113
+ }
114
+ absl::string_view type_url = absl::StripPrefix(
115
+ UpbStringToAbsl(google_protobuf_Any_type_url(typed_config)),
116
+ "type.googleapis.com/");
117
+ if (type_url !=
118
+ "envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext") {
119
+ return absl::InvalidArgumentError(
120
+ absl::StrCat("Unrecognized transport socket type: ", type_url));
121
+ }
122
+ const upb_StringView encoded_upstream_tls_context =
123
+ google_protobuf_Any_value(typed_config);
124
+ auto* upstream_tls_context =
125
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
126
+ encoded_upstream_tls_context.data, encoded_upstream_tls_context.size,
127
+ context.arena);
128
+ if (upstream_tls_context == nullptr) {
129
+ return absl::InvalidArgumentError("Can't decode upstream tls context.");
130
+ }
131
+ auto* common_tls_context_proto =
132
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
133
+ upstream_tls_context);
134
+ CommonTlsContext common_tls_context;
135
+ if (common_tls_context_proto != nullptr) {
136
+ auto common_context =
137
+ CommonTlsContext::Parse(context, common_tls_context_proto);
138
+ if (!common_context.ok()) {
139
+ return absl::InvalidArgumentError(
140
+ absl::StrCat("Error parsing UpstreamTlsContext: ",
141
+ common_context.status().message()));
141
142
  }
143
+ common_tls_context = std::move(*common_context);
142
144
  }
143
145
  if (common_tls_context.certificate_validation_context
144
146
  .ca_certificate_provider_instance.instance_name.empty()) {
@@ -245,42 +247,45 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
245
247
  absl::Status status = CdsLogicalDnsParse(cluster, &cds_update);
246
248
  if (!status.ok()) errors.emplace_back(status.message());
247
249
  } else {
248
- if (!envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
250
+ const auto* custom_cluster_type =
251
+ envoy_config_cluster_v3_Cluster_cluster_type(cluster);
252
+ if (custom_cluster_type == nullptr) {
249
253
  errors.push_back("DiscoveryType is not valid.");
250
254
  } else {
251
- const envoy_config_cluster_v3_Cluster_CustomClusterType*
252
- custom_cluster_type =
253
- envoy_config_cluster_v3_Cluster_cluster_type(cluster);
254
- upb_StringView type_name =
255
- envoy_config_cluster_v3_Cluster_CustomClusterType_name(
255
+ const auto* typed_config =
256
+ envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
256
257
  custom_cluster_type);
257
- if (UpbStringToAbsl(type_name) != "envoy.clusters.aggregate") {
258
- errors.emplace_back("DiscoveryType is not valid.");
258
+ if (typed_config == nullptr) {
259
+ errors.push_back("cluster_type.typed_config not set");
259
260
  } else {
260
- cds_update.cluster_type = XdsClusterResource::ClusterType::AGGREGATE;
261
- // Retrieve aggregate clusters.
262
- const google_protobuf_Any* typed_config =
263
- envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
264
- custom_cluster_type);
265
- const upb_StringView aggregate_cluster_config_upb_stringview =
266
- google_protobuf_Any_value(typed_config);
267
- const envoy_extensions_clusters_aggregate_v3_ClusterConfig*
268
- aggregate_cluster_config =
269
- envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
270
- aggregate_cluster_config_upb_stringview.data,
271
- aggregate_cluster_config_upb_stringview.size,
272
- context.arena);
273
- if (aggregate_cluster_config == nullptr) {
274
- errors.emplace_back("Can't parse aggregate cluster.");
261
+ absl::string_view type_url = absl::StripPrefix(
262
+ UpbStringToAbsl(google_protobuf_Any_type_url(typed_config)),
263
+ "type.googleapis.com/");
264
+ if (type_url !=
265
+ "envoy.extensions.clusters.aggregate.v3.ClusterConfig") {
266
+ errors.push_back(
267
+ absl::StrCat("unknown cluster_type extension: ", type_url));
275
268
  } else {
276
- size_t size;
277
- const upb_StringView* clusters =
278
- envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
279
- aggregate_cluster_config, &size);
280
- for (size_t i = 0; i < size; ++i) {
281
- const upb_StringView cluster = clusters[i];
282
- cds_update.prioritized_cluster_names.emplace_back(
283
- UpbStringToStdString(cluster));
269
+ cds_update.cluster_type = XdsClusterResource::ClusterType::AGGREGATE;
270
+ // Retrieve aggregate clusters.
271
+ const upb_StringView aggregate_cluster_config_upb_stringview =
272
+ google_protobuf_Any_value(typed_config);
273
+ const auto* aggregate_cluster_config =
274
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
275
+ aggregate_cluster_config_upb_stringview.data,
276
+ aggregate_cluster_config_upb_stringview.size, context.arena);
277
+ if (aggregate_cluster_config == nullptr) {
278
+ errors.emplace_back("Can't parse aggregate cluster.");
279
+ } else {
280
+ size_t size;
281
+ const upb_StringView* clusters =
282
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
283
+ aggregate_cluster_config, &size);
284
+ for (size_t i = 0; i < size; ++i) {
285
+ const upb_StringView cluster = clusters[i];
286
+ cds_update.prioritized_cluster_names.emplace_back(
287
+ UpbStringToStdString(cluster));
288
+ }
284
289
  }
285
290
  }
286
291
  }
@@ -353,7 +358,8 @@ absl::StatusOr<XdsClusterResource> CdsResourceParse(
353
358
  if (!envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
354
359
  errors.emplace_back("LRS ConfigSource is not self.");
355
360
  }
356
- cds_update.lrs_load_reporting_server.emplace(context.server);
361
+ cds_update.lrs_load_reporting_server.emplace(
362
+ static_cast<const GrpcXdsBootstrap::GrpcXdsServer&>(context.server));
357
363
  }
358
364
  // The Cluster resource encodes the circuit breaking parameters in a list of
359
365
  // Thresholds messages, where each message specifies the parameters for a
@@ -506,38 +512,40 @@ void MaybeLogCluster(const XdsResourceType::DecodeContext& context,
506
512
 
507
513
  } // namespace
508
514
 
509
- absl::StatusOr<XdsResourceType::DecodeResult> XdsClusterResourceType::Decode(
515
+ XdsResourceType::DecodeResult XdsClusterResourceType::Decode(
510
516
  const XdsResourceType::DecodeContext& context,
511
517
  absl::string_view serialized_resource, bool is_v2) const {
518
+ DecodeResult result;
512
519
  // Parse serialized proto.
513
520
  auto* resource = envoy_config_cluster_v3_Cluster_parse(
514
521
  serialized_resource.data(), serialized_resource.size(), context.arena);
515
522
  if (resource == nullptr) {
516
- return absl::InvalidArgumentError("Can't parse Cluster resource.");
523
+ result.resource =
524
+ absl::InvalidArgumentError("Can't parse Cluster resource.");
525
+ return result;
517
526
  }
518
527
  MaybeLogCluster(context, resource);
519
528
  // Validate resource.
520
- DecodeResult result;
521
529
  result.name =
522
530
  UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(resource));
523
531
  auto cds_resource = CdsResourceParse(context, resource, is_v2);
524
532
  if (!cds_resource.ok()) {
525
533
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
526
534
  gpr_log(GPR_ERROR, "[xds_client %p] invalid Cluster %s: %s",
527
- context.client, result.name.c_str(),
535
+ context.client, result.name->c_str(),
528
536
  cds_resource.status().ToString().c_str());
529
537
  }
530
538
  result.resource = cds_resource.status();
531
539
  } else {
532
540
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
533
541
  gpr_log(GPR_INFO, "[xds_client %p] parsed Cluster %s: %s", context.client,
534
- result.name.c_str(), cds_resource->ToString().c_str());
542
+ result.name->c_str(), cds_resource->ToString().c_str());
535
543
  }
536
544
  auto resource = absl::make_unique<ResourceDataSubclass>();
537
545
  resource->resource = std::move(*cds_resource);
538
546
  result.resource = std::move(resource);
539
547
  }
540
- return std::move(result);
548
+ return result;
541
549
  }
542
550
 
543
551
  } // namespace grpc_core