grpc 1.60.2 → 1.61.0.pre2

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -37,9 +37,11 @@
37
37
  #include <grpc/impl/connectivity_state.h>
38
38
  #include <grpc/support/log.h>
39
39
 
40
+ #include "src/core/ext/filters/client_channel/client_channel_internal.h"
40
41
  #include "src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h"
41
42
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
42
43
  #include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
44
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h"
43
45
  #include "src/core/ext/xds/xds_bootstrap.h"
44
46
  #include "src/core/ext/xds/xds_bootstrap_grpc.h"
45
47
  #include "src/core/ext/xds/xds_client.h"
@@ -66,6 +68,7 @@
66
68
  #include "src/core/lib/load_balancing/lb_policy_registry.h"
67
69
  #include "src/core/lib/load_balancing/subchannel_interface.h"
68
70
  #include "src/core/lib/resolver/endpoint_addresses.h"
71
+ #include "src/core/lib/security/credentials/xds/xds_credentials.h"
69
72
  #include "src/core/lib/transport/connectivity_state.h"
70
73
 
71
74
  namespace grpc_core {
@@ -74,6 +77,10 @@ TraceFlag grpc_xds_cluster_impl_lb_trace(false, "xds_cluster_impl_lb");
74
77
 
75
78
  namespace {
76
79
 
80
+ using OptionalLabelComponent =
81
+ ClientCallTracer::CallAttemptTracer::OptionalLabelComponent;
82
+ using XdsConfig = XdsDependencyManager::XdsConfig;
83
+
77
84
  //
78
85
  // global circuit breaker atomic map
79
86
  //
@@ -156,37 +163,24 @@ class XdsClusterImplLbConfig : public LoadBalancingPolicy::Config {
156
163
 
157
164
  absl::string_view name() const override { return kXdsClusterImpl; }
158
165
 
166
+ const std::string& cluster_name() const { return cluster_name_; }
159
167
  RefCountedPtr<LoadBalancingPolicy::Config> child_policy() const {
160
168
  return child_policy_;
161
169
  }
162
- const std::string& cluster_name() const { return cluster_name_; }
163
- const std::string& eds_service_name() const { return eds_service_name_; }
164
- const absl::optional<GrpcXdsBootstrap::GrpcXdsServer>&
165
- lrs_load_reporting_server() const {
166
- return lrs_load_reporting_server_;
167
- };
168
- uint32_t max_concurrent_requests() const { return max_concurrent_requests_; }
169
- RefCountedPtr<XdsEndpointResource::DropConfig> drop_config() const {
170
- return drop_config_;
171
- }
172
170
 
173
171
  static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
174
172
  void JsonPostLoad(const Json& json, const JsonArgs& args,
175
173
  ValidationErrors* errors);
176
174
 
177
175
  private:
178
- RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
179
176
  std::string cluster_name_;
180
- std::string eds_service_name_;
181
- absl::optional<GrpcXdsBootstrap::GrpcXdsServer> lrs_load_reporting_server_;
182
- uint32_t max_concurrent_requests_;
183
- RefCountedPtr<XdsEndpointResource::DropConfig> drop_config_;
177
+ RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
184
178
  };
185
179
 
186
180
  // xDS Cluster Impl LB policy.
187
181
  class XdsClusterImplLb : public LoadBalancingPolicy {
188
182
  public:
189
- XdsClusterImplLb(RefCountedPtr<XdsClient> xds_client, Args args);
183
+ XdsClusterImplLb(RefCountedPtr<GrpcXdsClient> xds_client, Args args);
190
184
 
191
185
  absl::string_view name() const override { return kXdsClusterImpl; }
192
186
 
@@ -224,6 +218,7 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
224
218
 
225
219
  RefCountedPtr<CircuitBreakerCallCounterMap::CallCounter> call_counter_;
226
220
  uint32_t max_concurrent_requests_;
221
+ std::shared_ptr<std::map<std::string, std::string>> service_labels_;
227
222
  RefCountedPtr<XdsEndpointResource::DropConfig> drop_config_;
228
223
  RefCountedPtr<XdsClusterDropStats> drop_stats_;
229
224
  RefCountedPtr<SubchannelPicker> picker_;
@@ -247,16 +242,25 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
247
242
 
248
243
  void ShutdownLocked() override;
249
244
 
245
+ void ResetState();
246
+ void ReportTransientFailure(absl::Status status);
247
+
250
248
  OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
251
249
  const ChannelArgs& args);
252
250
  absl::Status UpdateChildPolicyLocked(
253
- absl::StatusOr<EndpointAddressesList> addresses,
251
+ absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
254
252
  std::string resolution_note, const ChannelArgs& args);
255
253
 
254
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
255
+ MaybeCreateCertificateProviderLocked(
256
+ const XdsClusterResource& cluster_resource) const;
257
+
256
258
  void MaybeUpdatePickerLocked();
257
259
 
258
260
  // Current config from the resolver.
259
261
  RefCountedPtr<XdsClusterImplLbConfig> config_;
262
+ std::shared_ptr<const XdsClusterResource> cluster_resource_;
263
+ RefCountedPtr<XdsEndpointResource::DropConfig> drop_config_;
260
264
 
261
265
  // Current concurrent number of requests.
262
266
  RefCountedPtr<CircuitBreakerCallCounterMap::CallCounter> call_counter_;
@@ -265,7 +269,7 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
265
269
  bool shutting_down_ = false;
266
270
 
267
271
  // The xds client.
268
- RefCountedPtr<XdsClient> xds_client_;
272
+ RefCountedPtr<GrpcXdsClient> xds_client_;
269
273
 
270
274
  // The stats for client-side load reporting.
271
275
  RefCountedPtr<XdsClusterDropStats> drop_stats_;
@@ -357,8 +361,9 @@ XdsClusterImplLb::Picker::Picker(XdsClusterImplLb* xds_cluster_impl_lb,
357
361
  RefCountedPtr<SubchannelPicker> picker)
358
362
  : call_counter_(xds_cluster_impl_lb->call_counter_),
359
363
  max_concurrent_requests_(
360
- xds_cluster_impl_lb->config_->max_concurrent_requests()),
361
- drop_config_(xds_cluster_impl_lb->config_->drop_config()),
364
+ xds_cluster_impl_lb->cluster_resource_->max_concurrent_requests),
365
+ service_labels_(xds_cluster_impl_lb->cluster_resource_->telemetry_labels),
366
+ drop_config_(xds_cluster_impl_lb->drop_config_),
362
367
  drop_stats_(xds_cluster_impl_lb->drop_stats_),
363
368
  picker_(std::move(picker)) {
364
369
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
@@ -369,9 +374,14 @@ XdsClusterImplLb::Picker::Picker(XdsClusterImplLb* xds_cluster_impl_lb,
369
374
 
370
375
  LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick(
371
376
  LoadBalancingPolicy::PickArgs args) {
377
+ auto* call_state = static_cast<ClientChannelLbCallState*>(args.call_state);
378
+ if (call_state->GetCallAttemptTracer() != nullptr) {
379
+ call_state->GetCallAttemptTracer()->AddOptionalLabels(
380
+ OptionalLabelComponent::kXdsServiceLabels, service_labels_);
381
+ }
372
382
  // Handle EDS drops.
373
383
  const std::string* drop_category;
374
- if (drop_config_->ShouldDrop(&drop_category)) {
384
+ if (drop_config_ != nullptr && drop_config_->ShouldDrop(&drop_category)) {
375
385
  if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category);
376
386
  return PickResult::Drop(absl::UnavailableError(
377
387
  absl::StrCat("EDS-configured drop: ", *drop_category)));
@@ -423,7 +433,7 @@ LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick(
423
433
  // XdsClusterImplLb
424
434
  //
425
435
 
426
- XdsClusterImplLb::XdsClusterImplLb(RefCountedPtr<XdsClient> xds_client,
436
+ XdsClusterImplLb::XdsClusterImplLb(RefCountedPtr<GrpcXdsClient> xds_client,
427
437
  Args args)
428
438
  : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
429
439
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
@@ -445,6 +455,11 @@ void XdsClusterImplLb::ShutdownLocked() {
445
455
  gpr_log(GPR_INFO, "[xds_cluster_impl_lb %p] shutting down", this);
446
456
  }
447
457
  shutting_down_ = true;
458
+ ResetState();
459
+ xds_client_.reset(DEBUG_LOCATION, "XdsClusterImpl");
460
+ }
461
+
462
+ void XdsClusterImplLb::ResetState() {
448
463
  // Remove the child policy's interested_parties pollset_set from the
449
464
  // xDS policy.
450
465
  if (child_policy_ != nullptr) {
@@ -456,7 +471,18 @@ void XdsClusterImplLb::ShutdownLocked() {
456
471
  // the child.
457
472
  picker_.reset();
458
473
  drop_stats_.reset();
459
- xds_client_.reset(DEBUG_LOCATION, "XdsClusterImpl");
474
+ }
475
+
476
+ void XdsClusterImplLb::ReportTransientFailure(absl::Status status) {
477
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
478
+ gpr_log(GPR_INFO,
479
+ "[xds_cluster_impl_lb %p] reporting TRANSIENT_FAILURE: %s", this,
480
+ status.ToString().c_str());
481
+ }
482
+ ResetState();
483
+ channel_control_helper()->UpdateState(
484
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
485
+ MakeRefCounted<TransientFailurePicker>(status));
460
486
  }
461
487
 
462
488
  void XdsClusterImplLb::ExitIdleLocked() {
@@ -469,56 +495,174 @@ void XdsClusterImplLb::ResetBackoffLocked() {
469
495
  if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
470
496
  }
471
497
 
498
+ std::string GetEdsResourceName(const XdsClusterResource& cluster_resource) {
499
+ auto* eds = absl::get_if<XdsClusterResource::Eds>(&cluster_resource.type);
500
+ if (eds == nullptr) return "";
501
+ return eds->eds_service_name;
502
+ }
503
+
472
504
  absl::Status XdsClusterImplLb::UpdateLocked(UpdateArgs args) {
473
505
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
474
506
  gpr_log(GPR_INFO, "[xds_cluster_impl_lb %p] Received update", this);
475
507
  }
476
- // Update config.
477
- const bool is_initial_update = config_ == nullptr;
478
- auto old_config = std::move(config_);
479
- config_ = std::move(args.config);
480
- // On initial update, create drop stats.
481
- if (is_initial_update) {
482
- if (config_->lrs_load_reporting_server().has_value()) {
483
- drop_stats_ = xds_client_->AddClusterDropStats(
484
- config_->lrs_load_reporting_server().value(), config_->cluster_name(),
485
- config_->eds_service_name());
486
- if (drop_stats_ == nullptr) {
487
- gpr_log(GPR_ERROR,
488
- "[xds_cluster_impl_lb %p] Failed to get cluster drop stats for "
489
- "LRS server %s, cluster %s, EDS service name %s, load "
490
- "reporting for drops will not be done.",
491
- this,
492
- config_->lrs_load_reporting_server()->server_uri().c_str(),
493
- config_->cluster_name().c_str(),
494
- config_->eds_service_name().c_str());
495
- }
508
+ // Grab new LB policy config.
509
+ auto new_config = args.config.TakeAsSubclass<XdsClusterImplLbConfig>();
510
+ // Cluster name should never change, because the cds policy will assign a
511
+ // different priority child name if that happens, which means that this
512
+ // policy instance will get replaced instead of being updated.
513
+ if (config_ != nullptr) {
514
+ GPR_ASSERT(config_->cluster_name() == new_config->cluster_name());
515
+ }
516
+ // Get xDS config.
517
+ auto new_xds_config = args.args.GetObjectRef<XdsConfig>();
518
+ if (new_xds_config == nullptr) {
519
+ // Should never happen.
520
+ absl::Status status = absl::InternalError(
521
+ "xDS config not passed to xds_cluster_impl LB policy");
522
+ ReportTransientFailure(status);
523
+ return status;
524
+ }
525
+ auto it = new_xds_config->clusters.find(new_config->cluster_name());
526
+ if (it == new_xds_config->clusters.end() || !it->second.ok() ||
527
+ it->second->cluster == nullptr) {
528
+ // Should never happen.
529
+ absl::Status status = absl::InternalError(absl::StrCat(
530
+ "xDS config has no entry for cluster ", new_config->cluster_name()));
531
+ ReportTransientFailure(status);
532
+ return status;
533
+ }
534
+ auto& new_cluster_config = *it->second;
535
+ auto* endpoint_config =
536
+ absl::get_if<XdsConfig::ClusterConfig::EndpointConfig>(
537
+ &new_cluster_config.children);
538
+ if (endpoint_config == nullptr) {
539
+ // Should never happen.
540
+ absl::Status status = absl::InternalError(
541
+ absl::StrCat("cluster config for ", new_config->cluster_name(),
542
+ " has no endpoint config"));
543
+ ReportTransientFailure(status);
544
+ return status;
545
+ }
546
+ auto xds_cert_provider =
547
+ MaybeCreateCertificateProviderLocked(*new_cluster_config.cluster);
548
+ if (!xds_cert_provider.ok()) {
549
+ // Should never happen.
550
+ ReportTransientFailure(xds_cert_provider.status());
551
+ return xds_cert_provider.status();
552
+ }
553
+ if (*xds_cert_provider != nullptr) {
554
+ args.args = args.args.SetObject(std::move(*xds_cert_provider));
555
+ }
556
+ // Now we've verified the new config is good.
557
+ // Get new and old (if any) EDS service name.
558
+ std::string new_eds_service_name =
559
+ GetEdsResourceName(*new_cluster_config.cluster);
560
+ std::string old_eds_service_name =
561
+ cluster_resource_ == nullptr ? ""
562
+ : GetEdsResourceName(*cluster_resource_);
563
+ // Update drop stats if needed.
564
+ // Note: We need a drop stats object whenever load reporting is enabled,
565
+ // even if we have no EDS drop config, because we also use it when
566
+ // reporting circuit breaker drops.
567
+ if (!new_cluster_config.cluster->lrs_load_reporting_server.has_value()) {
568
+ drop_stats_.reset();
569
+ } else if (cluster_resource_ == nullptr ||
570
+ old_eds_service_name != new_eds_service_name ||
571
+ cluster_resource_->lrs_load_reporting_server !=
572
+ new_cluster_config.cluster->lrs_load_reporting_server) {
573
+ drop_stats_ = xds_client_->AddClusterDropStats(
574
+ *new_cluster_config.cluster->lrs_load_reporting_server,
575
+ new_config->cluster_name(), new_eds_service_name);
576
+ if (drop_stats_ == nullptr) {
577
+ gpr_log(
578
+ GPR_ERROR,
579
+ "[xds_cluster_impl_lb %p] Failed to get cluster drop stats for "
580
+ "LRS server %s, cluster %s, EDS service name %s, load "
581
+ "reporting for drops will not be done.",
582
+ this,
583
+ new_cluster_config.cluster->lrs_load_reporting_server->server_uri()
584
+ .c_str(),
585
+ new_config->cluster_name().c_str(), new_eds_service_name.c_str());
496
586
  }
497
- call_counter_ = g_call_counter_map->GetOrCreate(
498
- config_->cluster_name(), config_->eds_service_name());
499
- } else {
500
- // Cluster name, EDS service name, and LRS server name should never
501
- // change, because the xds_cluster_resolver policy above us should be
502
- // swapped out if that happens.
503
- GPR_ASSERT(config_->cluster_name() == old_config->cluster_name());
504
- GPR_ASSERT(config_->eds_service_name() == old_config->eds_service_name());
505
- GPR_ASSERT(config_->lrs_load_reporting_server() ==
506
- old_config->lrs_load_reporting_server());
507
- }
508
- // Update picker if max_concurrent_requests has changed.
509
- if (is_initial_update || config_->max_concurrent_requests() !=
510
- old_config->max_concurrent_requests()) {
511
- MaybeUpdatePickerLocked();
512
587
  }
588
+ // Update call counter if needed.
589
+ if (cluster_resource_ == nullptr ||
590
+ old_eds_service_name != new_eds_service_name) {
591
+ call_counter_ = g_call_counter_map->GetOrCreate(new_config->cluster_name(),
592
+ new_eds_service_name);
593
+ }
594
+ // Update config state, now that we're done comparing old and new fields.
595
+ config_ = std::move(new_config);
596
+ cluster_resource_ = new_cluster_config.cluster;
597
+ drop_config_ = endpoint_config->endpoints != nullptr
598
+ ? endpoint_config->endpoints->drop_config
599
+ : nullptr;
600
+ // Update picker in case some dependent config field changed.
601
+ MaybeUpdatePickerLocked();
513
602
  // Update child policy.
514
603
  return UpdateChildPolicyLocked(std::move(args.addresses),
515
604
  std::move(args.resolution_note), args.args);
516
605
  }
517
606
 
607
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
608
+ XdsClusterImplLb::MaybeCreateCertificateProviderLocked(
609
+ const XdsClusterResource& cluster_resource) const {
610
+ // If the channel is not using XdsCreds, do nothing.
611
+ auto channel_credentials = channel_control_helper()->GetChannelCredentials();
612
+ if (channel_credentials == nullptr ||
613
+ channel_credentials->type() != XdsCredentials::Type()) {
614
+ return nullptr;
615
+ }
616
+ // Configure root cert.
617
+ absl::string_view root_provider_instance_name =
618
+ cluster_resource.common_tls_context.certificate_validation_context
619
+ .ca_certificate_provider_instance.instance_name;
620
+ absl::string_view root_cert_name =
621
+ cluster_resource.common_tls_context.certificate_validation_context
622
+ .ca_certificate_provider_instance.certificate_name;
623
+ RefCountedPtr<grpc_tls_certificate_provider> root_cert_provider;
624
+ if (!root_provider_instance_name.empty()) {
625
+ root_cert_provider =
626
+ xds_client_->certificate_provider_store()
627
+ .CreateOrGetCertificateProvider(root_provider_instance_name);
628
+ if (root_cert_provider == nullptr) {
629
+ return absl::InternalError(
630
+ absl::StrCat("Certificate provider instance name: \"",
631
+ root_provider_instance_name, "\" not recognized."));
632
+ }
633
+ }
634
+ // Configure identity cert.
635
+ absl::string_view identity_provider_instance_name =
636
+ cluster_resource.common_tls_context.tls_certificate_provider_instance
637
+ .instance_name;
638
+ absl::string_view identity_cert_name =
639
+ cluster_resource.common_tls_context.tls_certificate_provider_instance
640
+ .certificate_name;
641
+ RefCountedPtr<grpc_tls_certificate_provider> identity_cert_provider;
642
+ if (!identity_provider_instance_name.empty()) {
643
+ identity_cert_provider =
644
+ xds_client_->certificate_provider_store()
645
+ .CreateOrGetCertificateProvider(identity_provider_instance_name);
646
+ if (identity_cert_provider == nullptr) {
647
+ return absl::InternalError(
648
+ absl::StrCat("Certificate provider instance name: \"",
649
+ identity_provider_instance_name, "\" not recognized."));
650
+ }
651
+ }
652
+ // Configure SAN matchers.
653
+ const std::vector<StringMatcher>& san_matchers =
654
+ cluster_resource.common_tls_context.certificate_validation_context
655
+ .match_subject_alt_names;
656
+ // Create xds cert provider.
657
+ return MakeRefCounted<XdsCertificateProvider>(
658
+ root_cert_provider, root_cert_name, identity_cert_provider,
659
+ identity_cert_name, san_matchers);
660
+ }
661
+
518
662
  void XdsClusterImplLb::MaybeUpdatePickerLocked() {
519
663
  // If we're dropping all calls, report READY, regardless of what (or
520
664
  // whether) the child has reported.
521
- if (config_->drop_config() != nullptr && config_->drop_config()->drop_all()) {
665
+ if (drop_config_ != nullptr && drop_config_->drop_all()) {
522
666
  auto drop_picker = MakeRefCounted<Picker>(this, picker_);
523
667
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
524
668
  gpr_log(GPR_INFO,
@@ -550,8 +694,8 @@ OrphanablePtr<LoadBalancingPolicy> XdsClusterImplLb::CreateChildPolicyLocked(
550
694
  LoadBalancingPolicy::Args lb_policy_args;
551
695
  lb_policy_args.work_serializer = work_serializer();
552
696
  lb_policy_args.args = args;
553
- lb_policy_args.channel_control_helper =
554
- std::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
697
+ lb_policy_args.channel_control_helper = std::make_unique<Helper>(
698
+ RefAsSubclass<XdsClusterImplLb>(DEBUG_LOCATION, "Helper"));
555
699
  OrphanablePtr<LoadBalancingPolicy> lb_policy =
556
700
  MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
557
701
  &grpc_xds_cluster_impl_lb_trace);
@@ -569,7 +713,7 @@ OrphanablePtr<LoadBalancingPolicy> XdsClusterImplLb::CreateChildPolicyLocked(
569
713
  }
570
714
 
571
715
  absl::Status XdsClusterImplLb::UpdateChildPolicyLocked(
572
- absl::StatusOr<EndpointAddressesList> addresses,
716
+ absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
573
717
  std::string resolution_note, const ChannelArgs& args) {
574
718
  // Create policy if needed.
575
719
  if (child_policy_ == nullptr) {
@@ -601,28 +745,30 @@ RefCountedPtr<SubchannelInterface> XdsClusterImplLb::Helper::CreateSubchannel(
601
745
  if (parent()->shutting_down_) return nullptr;
602
746
  // If load reporting is enabled, wrap the subchannel such that it
603
747
  // includes the locality stats object, which will be used by the Picker.
604
- if (parent()->config_->lrs_load_reporting_server().has_value()) {
748
+ if (parent()->cluster_resource_->lrs_load_reporting_server.has_value()) {
605
749
  auto locality_name = per_address_args.GetObjectRef<XdsLocalityName>();
606
750
  RefCountedPtr<XdsClusterLocalityStats> locality_stats =
607
751
  parent()->xds_client_->AddClusterLocalityStats(
608
- parent()->config_->lrs_load_reporting_server().value(),
752
+ parent()->cluster_resource_->lrs_load_reporting_server.value(),
609
753
  parent()->config_->cluster_name(),
610
- parent()->config_->eds_service_name(), std::move(locality_name));
754
+ GetEdsResourceName(*parent()->cluster_resource_),
755
+ std::move(locality_name));
611
756
  if (locality_stats != nullptr) {
612
757
  return MakeRefCounted<StatsSubchannelWrapper>(
613
758
  parent()->channel_control_helper()->CreateSubchannel(
614
759
  address, per_address_args, args),
615
760
  std::move(locality_stats));
616
761
  }
617
- gpr_log(
618
- GPR_ERROR,
619
- "[xds_cluster_impl_lb %p] Failed to get locality stats object for "
620
- "LRS server %s, cluster %s, EDS service name %s; load reports will "
621
- "not be generated (not wrapping subchannel)",
622
- parent(),
623
- parent()->config_->lrs_load_reporting_server()->server_uri().c_str(),
624
- parent()->config_->cluster_name().c_str(),
625
- parent()->config_->eds_service_name().c_str());
762
+ gpr_log(GPR_ERROR,
763
+ "[xds_cluster_impl_lb %p] Failed to get locality stats object for "
764
+ "LRS server %s, cluster %s, EDS service name %s; load reports will "
765
+ "not be generated (not wrapping subchannel)",
766
+ parent(),
767
+ parent()
768
+ ->cluster_resource_->lrs_load_reporting_server->server_uri()
769
+ .c_str(),
770
+ parent()->config_->cluster_name().c_str(),
771
+ GetEdsResourceName(*parent()->cluster_resource_).c_str());
626
772
  }
627
773
  // Load reporting not enabled, so don't wrap the subchannel.
628
774
  return parent()->channel_control_helper()->CreateSubchannel(
@@ -652,67 +798,31 @@ void XdsClusterImplLb::Helper::UpdateState(
652
798
  // factory
653
799
  //
654
800
 
655
- struct DropCategory {
656
- std::string category;
657
- uint32_t requests_per_million;
658
-
659
- static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
660
- static const auto* loader =
661
- JsonObjectLoader<DropCategory>()
662
- .Field("category", &DropCategory::category)
663
- .Field("requests_per_million", &DropCategory::requests_per_million)
664
- .Finish();
665
- return loader;
666
- }
667
- };
668
-
669
801
  const JsonLoaderInterface* XdsClusterImplLbConfig::JsonLoader(const JsonArgs&) {
670
802
  static const auto* loader =
671
803
  JsonObjectLoader<XdsClusterImplLbConfig>()
672
804
  // Note: Some fields require custom processing, so they are
673
805
  // handled in JsonPostLoad() instead.
674
806
  .Field("clusterName", &XdsClusterImplLbConfig::cluster_name_)
675
- .OptionalField("edsServiceName",
676
- &XdsClusterImplLbConfig::eds_service_name_)
677
- .OptionalField("lrsLoadReportingServer",
678
- &XdsClusterImplLbConfig::lrs_load_reporting_server_)
679
- .OptionalField("maxConcurrentRequests",
680
- &XdsClusterImplLbConfig::max_concurrent_requests_)
681
807
  .Finish();
682
808
  return loader;
683
809
  }
684
810
 
685
- void XdsClusterImplLbConfig::JsonPostLoad(const Json& json,
686
- const JsonArgs& args,
811
+ void XdsClusterImplLbConfig::JsonPostLoad(const Json& json, const JsonArgs&,
687
812
  ValidationErrors* errors) {
688
813
  // Parse "childPolicy" field.
689
- {
690
- ValidationErrors::ScopedField field(errors, ".childPolicy");
691
- auto it = json.object().find("childPolicy");
692
- if (it == json.object().end()) {
693
- errors->AddError("field not present");
814
+ ValidationErrors::ScopedField field(errors, ".childPolicy");
815
+ auto it = json.object().find("childPolicy");
816
+ if (it == json.object().end()) {
817
+ errors->AddError("field not present");
818
+ } else {
819
+ auto lb_config =
820
+ CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
821
+ it->second);
822
+ if (!lb_config.ok()) {
823
+ errors->AddError(lb_config.status().message());
694
824
  } else {
695
- auto lb_config = CoreConfiguration::Get()
696
- .lb_policy_registry()
697
- .ParseLoadBalancingConfig(it->second);
698
- if (!lb_config.ok()) {
699
- errors->AddError(lb_config.status().message());
700
- } else {
701
- child_policy_ = std::move(*lb_config);
702
- }
703
- }
704
- }
705
- // Parse "dropCategories" field.
706
- {
707
- auto value = LoadJsonObjectField<std::vector<DropCategory>>(
708
- json.object(), args, "dropCategories", errors);
709
- if (value.has_value()) {
710
- drop_config_ = MakeRefCounted<XdsEndpointResource::DropConfig>();
711
- for (size_t i = 0; i < value->size(); ++i) {
712
- DropCategory& drop_category = (*value)[i];
713
- drop_config_->AddCategory(std::move(drop_category.category),
714
- drop_category.requests_per_million);
715
- }
825
+ child_policy_ = std::move(*lb_config);
716
826
  }
717
827
  }
718
828
  }
@@ -40,7 +40,7 @@
40
40
 
41
41
  #include "src/core/ext/filters/client_channel/client_channel_internal.h"
42
42
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
43
- #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
43
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver_attributes.h"
44
44
  #include "src/core/lib/channel/channel_args.h"
45
45
  #include "src/core/lib/config/core_configuration.h"
46
46
  #include "src/core/lib/debug/trace.h"
@@ -149,7 +149,8 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
149
149
 
150
150
  absl::Status UpdateLocked(
151
151
  RefCountedPtr<LoadBalancingPolicy::Config> config,
152
- const absl::StatusOr<EndpointAddressesList>& addresses,
152
+ const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>>&
153
+ addresses,
153
154
  const ChannelArgs& args);
154
155
  void ExitIdleLocked();
155
156
  void ResetBackoffLocked();
@@ -282,7 +283,7 @@ absl::Status XdsClusterManagerLb::UpdateLocked(UpdateArgs args) {
282
283
  }
283
284
  update_in_progress_ = true;
284
285
  // Update config.
285
- config_ = std::move(args.config);
286
+ config_ = args.config.TakeAsSubclass<XdsClusterManagerLbConfig>();
286
287
  // Deactivate the children not in the new config.
287
288
  for (const auto& p : children_) {
288
289
  const std::string& name = p.first;
@@ -298,8 +299,9 @@ absl::Status XdsClusterManagerLb::UpdateLocked(UpdateArgs args) {
298
299
  const RefCountedPtr<LoadBalancingPolicy::Config>& config = p.second.config;
299
300
  auto& child = children_[name];
300
301
  if (child == nullptr) {
301
- child = MakeOrphanable<ClusterChild>(Ref(DEBUG_LOCATION, "ClusterChild"),
302
- name);
302
+ child = MakeOrphanable<ClusterChild>(
303
+ RefAsSubclass<XdsClusterManagerLb>(DEBUG_LOCATION, "ClusterChild"),
304
+ name);
303
305
  }
304
306
  absl::Status status =
305
307
  child->UpdateLocked(config, args.addresses, args.args);
@@ -482,7 +484,7 @@ XdsClusterManagerLb::ClusterChild::CreateChildPolicyLocked(
482
484
 
483
485
  absl::Status XdsClusterManagerLb::ClusterChild::UpdateLocked(
484
486
  RefCountedPtr<LoadBalancingPolicy::Config> config,
485
- const absl::StatusOr<EndpointAddressesList>& addresses,
487
+ const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>>& addresses,
486
488
  const ChannelArgs& args) {
487
489
  if (xds_cluster_manager_policy_->shutting_down_) return absl::OkStatus();
488
490
  // Update child weight.