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
@@ -1,1173 +0,0 @@
1
- //
2
- // Copyright 2018 gRPC authors.
3
- //
4
- // Licensed under the Apache License, Version 2.0 (the "License");
5
- // you may not use this file except in compliance with the License.
6
- // You may obtain a copy of the License at
7
- //
8
- // http://www.apache.org/licenses/LICENSE-2.0
9
- //
10
- // Unless required by applicable law or agreed to in writing, software
11
- // distributed under the License is distributed on an "AS IS" BASIS,
12
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- // See the License for the specific language governing permissions and
14
- // limitations under the License.
15
- //
16
-
17
- #include <grpc/support/port_platform.h>
18
-
19
- #include <inttypes.h>
20
- #include <stddef.h>
21
-
22
- #include <algorithm>
23
- #include <map>
24
- #include <memory>
25
- #include <set>
26
- #include <string>
27
- #include <type_traits>
28
- #include <utility>
29
- #include <vector>
30
-
31
- #include "absl/status/status.h"
32
- #include "absl/status/statusor.h"
33
- #include "absl/strings/str_cat.h"
34
- #include "absl/strings/str_join.h"
35
- #include "absl/strings/string_view.h"
36
- #include "absl/types/optional.h"
37
-
38
- #include <grpc/impl/channel_arg_names.h>
39
- #include <grpc/impl/connectivity_state.h>
40
- #include <grpc/support/json.h>
41
- #include <grpc/support/log.h>
42
-
43
- #include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
44
- #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
45
- #include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
46
- #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
47
- #include "src/core/ext/xds/xds_bootstrap.h"
48
- #include "src/core/ext/xds/xds_bootstrap_grpc.h"
49
- #include "src/core/ext/xds/xds_client.h"
50
- #include "src/core/ext/xds/xds_client_grpc.h"
51
- #include "src/core/ext/xds/xds_client_stats.h"
52
- #include "src/core/ext/xds/xds_endpoint.h"
53
- #include "src/core/lib/channel/channel_args.h"
54
- #include "src/core/lib/config/core_configuration.h"
55
- #include "src/core/lib/debug/trace.h"
56
- #include "src/core/lib/gprpp/debug_location.h"
57
- #include "src/core/lib/gprpp/no_destruct.h"
58
- #include "src/core/lib/gprpp/orphanable.h"
59
- #include "src/core/lib/gprpp/ref_counted_ptr.h"
60
- #include "src/core/lib/gprpp/ref_counted_string.h"
61
- #include "src/core/lib/gprpp/validation_errors.h"
62
- #include "src/core/lib/gprpp/work_serializer.h"
63
- #include "src/core/lib/iomgr/pollset_set.h"
64
- #include "src/core/lib/json/json.h"
65
- #include "src/core/lib/json/json_args.h"
66
- #include "src/core/lib/json/json_object_loader.h"
67
- #include "src/core/lib/json/json_writer.h"
68
- #include "src/core/lib/load_balancing/delegating_helper.h"
69
- #include "src/core/lib/load_balancing/lb_policy.h"
70
- #include "src/core/lib/load_balancing/lb_policy_factory.h"
71
- #include "src/core/lib/load_balancing/lb_policy_registry.h"
72
- #include "src/core/lib/resolver/endpoint_addresses.h"
73
- #include "src/core/lib/resolver/resolver.h"
74
- #include "src/core/lib/resolver/resolver_registry.h"
75
-
76
- #define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000
77
-
78
- namespace grpc_core {
79
-
80
- TraceFlag grpc_lb_xds_cluster_resolver_trace(false, "xds_cluster_resolver_lb");
81
-
82
- namespace {
83
-
84
- constexpr absl::string_view kXdsClusterResolver =
85
- "xds_cluster_resolver_experimental";
86
-
87
- // Config for EDS LB policy.
88
- class XdsClusterResolverLbConfig : public LoadBalancingPolicy::Config {
89
- public:
90
- struct DiscoveryMechanism {
91
- std::string cluster_name;
92
- absl::optional<GrpcXdsBootstrap::GrpcXdsServer> lrs_load_reporting_server;
93
- uint32_t max_concurrent_requests;
94
- enum DiscoveryMechanismType {
95
- EDS,
96
- LOGICAL_DNS,
97
- };
98
- DiscoveryMechanismType type;
99
- std::string eds_service_name;
100
- std::string dns_hostname;
101
-
102
- Json::Array override_host_statuses;
103
-
104
- // This is type Json::Object instead of OutlierDetectionConfig, because we
105
- // don't actually need to validate the contents of the outlier detection
106
- // config here. In this case, the JSON is generated by the CDS policy
107
- // instead of coming from service config, so it's not actually any better
108
- // to catch the problem here than it is to catch it in the
109
- // outlier_detection policy itself, so here we just act as a pass-through.
110
- absl::optional<Json::Object> outlier_detection_lb_config;
111
-
112
- bool operator==(const DiscoveryMechanism& other) const {
113
- return (cluster_name == other.cluster_name &&
114
- lrs_load_reporting_server == other.lrs_load_reporting_server &&
115
- max_concurrent_requests == other.max_concurrent_requests &&
116
- type == other.type &&
117
- eds_service_name == other.eds_service_name &&
118
- dns_hostname == other.dns_hostname &&
119
- override_host_statuses == other.override_host_statuses &&
120
- outlier_detection_lb_config == other.outlier_detection_lb_config);
121
- }
122
-
123
- static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
124
- void JsonPostLoad(const Json& json, const JsonArgs& args,
125
- ValidationErrors* errors);
126
- };
127
-
128
- XdsClusterResolverLbConfig() = default;
129
-
130
- XdsClusterResolverLbConfig(const XdsClusterResolverLbConfig&) = delete;
131
- XdsClusterResolverLbConfig& operator=(const XdsClusterResolverLbConfig&) =
132
- delete;
133
-
134
- XdsClusterResolverLbConfig(XdsClusterResolverLbConfig&& other) = delete;
135
- XdsClusterResolverLbConfig& operator=(XdsClusterResolverLbConfig&& other) =
136
- delete;
137
-
138
- absl::string_view name() const override { return kXdsClusterResolver; }
139
-
140
- const std::vector<DiscoveryMechanism>& discovery_mechanisms() const {
141
- return discovery_mechanisms_;
142
- }
143
-
144
- const Json& xds_lb_policy() const { return xds_lb_policy_; }
145
-
146
- static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
147
- void JsonPostLoad(const Json& json, const JsonArgs& args,
148
- ValidationErrors* errors);
149
-
150
- private:
151
- std::vector<DiscoveryMechanism> discovery_mechanisms_;
152
- Json xds_lb_policy_;
153
- };
154
-
155
- // Xds Cluster Resolver LB policy.
156
- class XdsClusterResolverLb : public LoadBalancingPolicy {
157
- public:
158
- XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client, Args args);
159
-
160
- absl::string_view name() const override { return kXdsClusterResolver; }
161
-
162
- absl::Status UpdateLocked(UpdateArgs args) override;
163
- void ResetBackoffLocked() override;
164
- void ExitIdleLocked() override;
165
-
166
- private:
167
- // Discovery Mechanism Base class
168
- //
169
- // Implemented by EDS and LOGICAL_DNS.
170
- //
171
- // Implementations are responsible for calling the LB policy's
172
- // OnEndpointChanged(), OnError(), and OnResourceDoesNotExist()
173
- // methods when the corresponding events occur.
174
- //
175
- // Must implement Orphan() method to cancel the watchers.
176
- class DiscoveryMechanism : public InternallyRefCounted<DiscoveryMechanism> {
177
- public:
178
- DiscoveryMechanism(
179
- RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
180
- size_t index)
181
- : parent_(std::move(xds_cluster_resolver_lb)), index_(index) {}
182
-
183
- XdsClusterResolverLb* parent() const { return parent_.get(); }
184
- size_t index() const { return index_; }
185
-
186
- virtual void Start() = 0;
187
- virtual Json::Array override_child_policy() = 0;
188
- virtual bool disable_reresolution() = 0;
189
-
190
- private:
191
- RefCountedPtr<XdsClusterResolverLb> parent_;
192
- // Stores its own index in the vector of DiscoveryMechanism.
193
- size_t index_;
194
- };
195
-
196
- class EdsDiscoveryMechanism : public DiscoveryMechanism {
197
- public:
198
- EdsDiscoveryMechanism(
199
- RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
200
- size_t index)
201
- : DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
202
- void Start() override;
203
- void Orphan() override;
204
- Json::Array override_child_policy() override { return Json::Array{}; }
205
- bool disable_reresolution() override { return true; }
206
-
207
- private:
208
- class EndpointWatcher : public XdsEndpointResourceType::WatcherInterface {
209
- public:
210
- explicit EndpointWatcher(
211
- RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism)
212
- : discovery_mechanism_(std::move(discovery_mechanism)) {}
213
- ~EndpointWatcher() override {
214
- discovery_mechanism_.reset(DEBUG_LOCATION, "EndpointWatcher");
215
- }
216
- void OnResourceChanged(
217
- std::shared_ptr<const XdsEndpointResource> update) override {
218
- RefCountedPtr<EndpointWatcher> self = Ref();
219
- discovery_mechanism_->parent()->work_serializer()->Run(
220
- [self = std::move(self), update = std::move(update)]() mutable {
221
- self->OnResourceChangedHelper(std::move(update));
222
- },
223
- DEBUG_LOCATION);
224
- }
225
- void OnError(absl::Status status) override {
226
- RefCountedPtr<EndpointWatcher> self = Ref();
227
- discovery_mechanism_->parent()->work_serializer()->Run(
228
- [self = std::move(self), status = std::move(status)]() mutable {
229
- self->OnErrorHelper(std::move(status));
230
- },
231
- DEBUG_LOCATION);
232
- }
233
- void OnResourceDoesNotExist() override {
234
- RefCountedPtr<EndpointWatcher> self = Ref();
235
- discovery_mechanism_->parent()->work_serializer()->Run(
236
- [self = std::move(self)]() {
237
- self->OnResourceDoesNotExistHelper();
238
- },
239
- DEBUG_LOCATION);
240
- }
241
-
242
- private:
243
- // Code accessing protected methods of `DiscoveryMechanism` need to be
244
- // in methods of this class rather than in lambdas to work around an MSVC
245
- // bug.
246
- void OnResourceChangedHelper(
247
- std::shared_ptr<const XdsEndpointResource> update) {
248
- std::string resolution_note;
249
- if (update->priorities.empty()) {
250
- resolution_note = absl::StrCat(
251
- "EDS resource ", discovery_mechanism_->GetEdsResourceName(),
252
- " contains no localities");
253
- } else {
254
- std::set<std::string> empty_localities;
255
- for (const auto& priority : update->priorities) {
256
- for (const auto& p : priority.localities) {
257
- if (p.second.endpoints.empty()) {
258
- empty_localities.insert(p.first->AsHumanReadableString());
259
- }
260
- }
261
- }
262
- if (!empty_localities.empty()) {
263
- resolution_note = absl::StrCat(
264
- "EDS resource ", discovery_mechanism_->GetEdsResourceName(),
265
- " contains empty localities: [",
266
- absl::StrJoin(empty_localities, "; "), "]");
267
- }
268
- }
269
- discovery_mechanism_->parent()->OnEndpointChanged(
270
- discovery_mechanism_->index(), std::move(update),
271
- std::move(resolution_note));
272
- }
273
- void OnErrorHelper(absl::Status status) {
274
- discovery_mechanism_->parent()->OnError(
275
- discovery_mechanism_->index(),
276
- absl::StrCat("EDS watcher error for resource ",
277
- discovery_mechanism_->GetEdsResourceName(), " (",
278
- status.ToString(), ")"));
279
- }
280
- void OnResourceDoesNotExistHelper() {
281
- discovery_mechanism_->parent()->OnResourceDoesNotExist(
282
- discovery_mechanism_->index(),
283
- absl::StrCat("EDS resource ",
284
- discovery_mechanism_->GetEdsResourceName(),
285
- " does not exist"));
286
- }
287
- RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism_;
288
- };
289
-
290
- // This is necessary only because of a bug in msvc where nested class
291
- // cannot access protected member in base class.
292
- friend class EndpointWatcher;
293
-
294
- absl::string_view GetEdsResourceName() const {
295
- auto& config = parent()->config_->discovery_mechanisms()[index()];
296
- if (!config.eds_service_name.empty()) return config.eds_service_name;
297
- return config.cluster_name;
298
- }
299
-
300
- // Note that this is not owned, so this pointer must never be dereferenced.
301
- EndpointWatcher* watcher_ = nullptr;
302
- };
303
-
304
- class LogicalDNSDiscoveryMechanism : public DiscoveryMechanism {
305
- public:
306
- LogicalDNSDiscoveryMechanism(
307
- RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
308
- size_t index)
309
- : DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
310
- void Start() override;
311
- void Orphan() override;
312
- Json::Array override_child_policy() override {
313
- return {
314
- Json::FromObject({
315
- {"pick_first", Json::FromObject({})},
316
- }),
317
- };
318
- }
319
- bool disable_reresolution() override { return false; };
320
-
321
- private:
322
- class ResolverResultHandler : public Resolver::ResultHandler {
323
- public:
324
- explicit ResolverResultHandler(
325
- RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism)
326
- : discovery_mechanism_(std::move(discovery_mechanism)) {}
327
-
328
- ~ResolverResultHandler() override {}
329
-
330
- void ReportResult(Resolver::Result result) override;
331
-
332
- private:
333
- RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism_;
334
- };
335
-
336
- // This is necessary only because of a bug in msvc where nested class cannot
337
- // access protected member in base class.
338
- friend class ResolverResultHandler;
339
-
340
- absl::string_view GetDnsHostname() const {
341
- auto& config = parent()->config_->discovery_mechanisms()[index()];
342
- return config.dns_hostname;
343
- }
344
-
345
- OrphanablePtr<Resolver> resolver_;
346
- };
347
-
348
- struct DiscoveryMechanismEntry {
349
- OrphanablePtr<DiscoveryMechanism> discovery_mechanism;
350
- // Most recent update reported by the discovery mechanism.
351
- std::shared_ptr<const XdsEndpointResource> latest_update;
352
- // Last resolution note reported by the discovery mechanism, if any.
353
- std::string resolution_note;
354
- // State used to retain child policy names for priority policy.
355
- std::vector<size_t /*child_number*/> priority_child_numbers;
356
- size_t next_available_child_number = 0;
357
-
358
- const XdsClusterResolverLbConfig::DiscoveryMechanism& config() const;
359
-
360
- // Returns the child policy name for a given priority.
361
- std::string GetChildPolicyName(size_t priority) const;
362
- };
363
-
364
- class Helper : public ParentOwningDelegatingChannelControlHelper<
365
- XdsClusterResolverLb> {
366
- public:
367
- explicit Helper(
368
- RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_policy)
369
- : ParentOwningDelegatingChannelControlHelper(
370
- std::move(xds_cluster_resolver_policy)) {}
371
-
372
- // This is a no-op, because we get the addresses from the xds
373
- // client, which is a watch-based API.
374
- // TODO(roth): Don't we need to propagate this for LOGICAL_DNS clusters?
375
- void RequestReresolution() override {}
376
- };
377
-
378
- ~XdsClusterResolverLb() override;
379
-
380
- void ShutdownLocked() override;
381
-
382
- void OnEndpointChanged(size_t index,
383
- std::shared_ptr<const XdsEndpointResource> update,
384
- std::string resolution_note);
385
- void OnError(size_t index, std::string resolution_note);
386
- void OnResourceDoesNotExist(size_t index, std::string resolution_note);
387
-
388
- void MaybeDestroyChildPolicyLocked();
389
-
390
- absl::Status UpdateChildPolicyLocked();
391
- OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
392
- const ChannelArgs& args);
393
- EndpointAddressesList CreateChildPolicyAddressesLocked();
394
- std::string CreateChildPolicyResolutionNoteLocked();
395
- RefCountedPtr<Config> CreateChildPolicyConfigLocked();
396
- ChannelArgs CreateChildPolicyArgsLocked(const ChannelArgs& args_in);
397
-
398
- // The xds client and endpoint watcher.
399
- RefCountedPtr<XdsClient> xds_client_;
400
-
401
- // Current channel args and config from the resolver.
402
- ChannelArgs args_;
403
- RefCountedPtr<XdsClusterResolverLbConfig> config_;
404
-
405
- // Internal state.
406
- bool shutting_down_ = false;
407
-
408
- // Vector of discovery mechansism entries in priority order.
409
- std::vector<DiscoveryMechanismEntry> discovery_mechanisms_;
410
-
411
- OrphanablePtr<LoadBalancingPolicy> child_policy_;
412
- };
413
-
414
- //
415
- // XdsClusterResolverLb::EdsDiscoveryMechanism
416
- //
417
-
418
- void XdsClusterResolverLb::EdsDiscoveryMechanism::Start() {
419
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
420
- gpr_log(GPR_INFO,
421
- "[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
422
- ":%p starting xds watch for %s",
423
- parent(), index(), this, std::string(GetEdsResourceName()).c_str());
424
- }
425
- auto watcher = MakeRefCounted<EndpointWatcher>(
426
- Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"));
427
- watcher_ = watcher.get();
428
- XdsEndpointResourceType::StartWatch(parent()->xds_client_.get(),
429
- GetEdsResourceName(), std::move(watcher));
430
- }
431
-
432
- void XdsClusterResolverLb::EdsDiscoveryMechanism::Orphan() {
433
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
434
- gpr_log(GPR_INFO,
435
- "[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
436
- ":%p cancelling xds watch for %s",
437
- parent(), index(), this, std::string(GetEdsResourceName()).c_str());
438
- }
439
- XdsEndpointResourceType::CancelWatch(parent()->xds_client_.get(),
440
- GetEdsResourceName(), watcher_);
441
- Unref();
442
- }
443
-
444
- //
445
- // XdsClusterResolverLb::LogicalDNSDiscoveryMechanism
446
- //
447
-
448
- void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Start() {
449
- std::string target;
450
- ChannelArgs args = parent()->args_;
451
- auto* fake_resolver_response_generator =
452
- args.GetPointer<FakeResolverResponseGenerator>(
453
- GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR);
454
- if (fake_resolver_response_generator != nullptr) {
455
- target = absl::StrCat("fake:", GetDnsHostname());
456
- args = args.SetObject(fake_resolver_response_generator->Ref());
457
- } else {
458
- target = absl::StrCat("dns:", GetDnsHostname());
459
- }
460
- resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
461
- target.c_str(), args, parent()->interested_parties(),
462
- parent()->work_serializer(),
463
- std::make_unique<ResolverResultHandler>(
464
- Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism")));
465
- if (resolver_ == nullptr) {
466
- parent()->OnResourceDoesNotExist(
467
- index(),
468
- absl::StrCat("error creating DNS resolver for ", GetDnsHostname()));
469
- return;
470
- }
471
- resolver_->StartLocked();
472
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
473
- gpr_log(GPR_INFO,
474
- "[xds_cluster_resolver_lb %p] logical DNS discovery mechanism "
475
- "%" PRIuPTR ":%p starting dns resolver %p",
476
- parent(), index(), this, resolver_.get());
477
- }
478
- }
479
-
480
- void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Orphan() {
481
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
482
- gpr_log(
483
- GPR_INFO,
484
- "[xds_cluster_resolver_lb %p] logical DNS discovery mechanism %" PRIuPTR
485
- ":%p shutting down dns resolver %p",
486
- parent(), index(), this, resolver_.get());
487
- }
488
- resolver_.reset();
489
- Unref();
490
- }
491
-
492
- //
493
- // XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler
494
- //
495
-
496
- void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler::
497
- ReportResult(Resolver::Result result) {
498
- XdsClusterResolverLb* lb_policy = discovery_mechanism_->parent();
499
- size_t index = discovery_mechanism_->index();
500
- if (!result.addresses.ok()) {
501
- if (result.resolution_note.empty()) {
502
- result.resolution_note = absl::StrCat(
503
- "DNS resolution failed for ", discovery_mechanism_->GetDnsHostname(),
504
- " (", result.addresses.status().ToString(), ")");
505
- }
506
- lb_policy->OnError(index, result.resolution_note);
507
- return;
508
- }
509
- // Convert resolver result to EDS update.
510
- auto update = std::make_shared<XdsEndpointResource>();
511
- XdsEndpointResource::Priority::Locality locality;
512
- locality.name = MakeRefCounted<XdsLocalityName>("", "", "");
513
- locality.lb_weight = 1;
514
- locality.endpoints = std::move(*result.addresses);
515
- XdsEndpointResource::Priority priority;
516
- priority.localities.emplace(locality.name.get(), std::move(locality));
517
- update->priorities.emplace_back(std::move(priority));
518
- lb_policy->OnEndpointChanged(index, std::move(update),
519
- std::move(result.resolution_note));
520
- }
521
-
522
- //
523
- // XdsClusterResolverLb::DiscoveryMechanismEntry
524
- //
525
-
526
- const XdsClusterResolverLbConfig::DiscoveryMechanism&
527
- XdsClusterResolverLb::DiscoveryMechanismEntry::config() const {
528
- return discovery_mechanism->parent()
529
- ->config_->discovery_mechanisms()[discovery_mechanism->index()];
530
- }
531
-
532
- std::string XdsClusterResolverLb::DiscoveryMechanismEntry::GetChildPolicyName(
533
- size_t priority) const {
534
- return absl::StrCat("{cluster=", config().cluster_name,
535
- ", child_number=", priority_child_numbers[priority], "}");
536
- }
537
-
538
- //
539
- // XdsClusterResolverLb public methods
540
- //
541
-
542
- XdsClusterResolverLb::XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client,
543
- Args args)
544
- : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
545
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
546
- gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] created -- xds_client=%p",
547
- this, xds_client_.get());
548
- }
549
- }
550
-
551
- XdsClusterResolverLb::~XdsClusterResolverLb() {
552
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
553
- gpr_log(GPR_INFO,
554
- "[xds_cluster_resolver_lb %p] destroying xds_cluster_resolver LB "
555
- "policy",
556
- this);
557
- }
558
- }
559
-
560
- void XdsClusterResolverLb::ShutdownLocked() {
561
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
562
- gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] shutting down", this);
563
- }
564
- shutting_down_ = true;
565
- MaybeDestroyChildPolicyLocked();
566
- discovery_mechanisms_.clear();
567
- xds_client_.reset(DEBUG_LOCATION, "XdsClusterResolverLb");
568
- args_ = ChannelArgs();
569
- }
570
-
571
- void XdsClusterResolverLb::MaybeDestroyChildPolicyLocked() {
572
- if (child_policy_ != nullptr) {
573
- grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
574
- interested_parties());
575
- child_policy_.reset();
576
- }
577
- }
578
-
579
- absl::Status XdsClusterResolverLb::UpdateLocked(UpdateArgs args) {
580
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
581
- gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Received update", this);
582
- }
583
- const bool is_initial_update = args_ == ChannelArgs();
584
- // Update config.
585
- auto old_config = std::move(config_);
586
- config_ = std::move(args.config);
587
- // Update args.
588
- args_ = std::move(args.args);
589
- // Update child policy if needed.
590
- absl::Status status;
591
- if (child_policy_ != nullptr) status = UpdateChildPolicyLocked();
592
- // Create endpoint watcher if needed.
593
- if (is_initial_update) {
594
- for (const auto& config : config_->discovery_mechanisms()) {
595
- DiscoveryMechanismEntry entry;
596
- if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
597
- DiscoveryMechanismType::EDS) {
598
- entry.discovery_mechanism = MakeOrphanable<EdsDiscoveryMechanism>(
599
- Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"),
600
- discovery_mechanisms_.size());
601
- } else if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
602
- DiscoveryMechanismType::LOGICAL_DNS) {
603
- entry.discovery_mechanism =
604
- MakeOrphanable<LogicalDNSDiscoveryMechanism>(
605
- Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism"),
606
- discovery_mechanisms_.size());
607
- } else {
608
- GPR_ASSERT(0);
609
- }
610
- discovery_mechanisms_.push_back(std::move(entry));
611
- }
612
- // Call start() on all discovery mechanisms after creation.
613
- for (const auto& discovery_mechanism : discovery_mechanisms_) {
614
- discovery_mechanism.discovery_mechanism->Start();
615
- }
616
- }
617
- return status;
618
- }
619
-
620
- void XdsClusterResolverLb::ResetBackoffLocked() {
621
- if (child_policy_ != nullptr) {
622
- child_policy_->ResetBackoffLocked();
623
- }
624
- }
625
-
626
- void XdsClusterResolverLb::ExitIdleLocked() {
627
- if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
628
- }
629
-
630
- // We need at least one priority for each discovery mechanism, just so that we
631
- // have a child in which to create the xds_cluster_impl policy. This ensures
632
- // that we properly handle the case of a discovery mechanism dropping 100% of
633
- // calls, the OnError() case, and the OnResourceDoesNotExist() case.
634
- const XdsEndpointResource::PriorityList& GetUpdatePriorityList(
635
- const XdsEndpointResource& update) {
636
- static const NoDestruct<XdsEndpointResource::PriorityList>
637
- kPriorityListWithEmptyPriority(1);
638
- if (update.priorities.empty()) return *kPriorityListWithEmptyPriority;
639
- return update.priorities;
640
- }
641
-
642
- void XdsClusterResolverLb::OnEndpointChanged(
643
- size_t index, std::shared_ptr<const XdsEndpointResource> update,
644
- std::string resolution_note) {
645
- if (shutting_down_) return;
646
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
647
- gpr_log(GPR_INFO,
648
- "[xds_cluster_resolver_lb %p] Received update from xds client"
649
- " for discovery mechanism %" PRIuPTR " (resolution_note=\"%s\")",
650
- this, index, resolution_note.c_str());
651
- }
652
- DiscoveryMechanismEntry& discovery_entry = discovery_mechanisms_[index];
653
- const XdsEndpointResource::PriorityList& priority_list =
654
- GetUpdatePriorityList(*update);
655
- // Update priority_child_numbers, reusing old child numbers in an
656
- // intelligent way to avoid unnecessary churn.
657
- // First, build some maps from locality to child number and the reverse
658
- // from the old data in the entry's update and priority_child_numbers.
659
- std::map<XdsLocalityName*, size_t /*child_number*/, XdsLocalityName::Less>
660
- locality_child_map;
661
- std::map<size_t, std::set<XdsLocalityName*, XdsLocalityName::Less>>
662
- child_locality_map;
663
- if (discovery_entry.latest_update != nullptr) {
664
- const auto& prev_priority_list =
665
- GetUpdatePriorityList(*discovery_entry.latest_update);
666
- for (size_t priority = 0; priority < prev_priority_list.size();
667
- ++priority) {
668
- size_t child_number = discovery_entry.priority_child_numbers[priority];
669
- const auto& localities = prev_priority_list[priority].localities;
670
- for (const auto& p : localities) {
671
- XdsLocalityName* locality_name = p.first;
672
- locality_child_map[locality_name] = child_number;
673
- child_locality_map[child_number].insert(locality_name);
674
- }
675
- }
676
- }
677
- // Construct new list of children.
678
- std::vector<size_t> priority_child_numbers;
679
- for (size_t priority = 0; priority < priority_list.size(); ++priority) {
680
- const auto& localities = priority_list[priority].localities;
681
- absl::optional<size_t> child_number;
682
- // If one of the localities in this priority already existed, reuse its
683
- // child number.
684
- for (const auto& p : localities) {
685
- XdsLocalityName* locality_name = p.first;
686
- if (!child_number.has_value()) {
687
- auto it = locality_child_map.find(locality_name);
688
- if (it != locality_child_map.end()) {
689
- child_number = it->second;
690
- locality_child_map.erase(it);
691
- // Remove localities that *used* to be in this child number, so
692
- // that we don't incorrectly reuse this child number for a
693
- // subsequent priority.
694
- for (XdsLocalityName* old_locality :
695
- child_locality_map[*child_number]) {
696
- locality_child_map.erase(old_locality);
697
- }
698
- }
699
- } else {
700
- // Remove all localities that are now in this child number, so
701
- // that we don't accidentally reuse this child number for a
702
- // subsequent priority.
703
- locality_child_map.erase(locality_name);
704
- }
705
- }
706
- // If we didn't find an existing child number, assign a new one.
707
- if (!child_number.has_value()) {
708
- for (child_number = discovery_entry.next_available_child_number;
709
- child_locality_map.find(*child_number) != child_locality_map.end();
710
- ++(*child_number)) {
711
- }
712
- discovery_entry.next_available_child_number = *child_number + 1;
713
- // Add entry so we know that the child number is in use.
714
- // (Don't need to add the list of localities, since we won't use them.)
715
- child_locality_map[*child_number];
716
- }
717
- priority_child_numbers.push_back(*child_number);
718
- }
719
- // Save update.
720
- discovery_entry.latest_update = std::move(update);
721
- discovery_entry.resolution_note = std::move(resolution_note);
722
- discovery_entry.priority_child_numbers = std::move(priority_child_numbers);
723
- // If any discovery mechanism has not received its first update,
724
- // wait until that happens before creating the child policy.
725
- // TODO(roth): If this becomes problematic in the future (e.g., a
726
- // secondary discovery mechanism delaying us from starting up at all),
727
- // we can consider some sort of optimization whereby we can create the
728
- // priority policy with only a subset of its children. But we need to
729
- // make sure not to get into a situation where the priority policy
730
- // will put the channel into TRANSIENT_FAILURE instead of CONNECTING
731
- // while we're still waiting for the other discovery mechanism(s).
732
- for (DiscoveryMechanismEntry& mechanism : discovery_mechanisms_) {
733
- if (mechanism.latest_update == nullptr) return;
734
- }
735
- // Update child policy.
736
- // TODO(roth): If the child policy reports an error with the update,
737
- // we need to propagate that error back to the resolver somehow.
738
- (void)UpdateChildPolicyLocked();
739
- }
740
-
741
- void XdsClusterResolverLb::OnError(size_t index, std::string resolution_note) {
742
- gpr_log(GPR_ERROR,
743
- "[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
744
- " reported error: %s",
745
- this, index, resolution_note.c_str());
746
- if (shutting_down_) return;
747
- if (discovery_mechanisms_[index].latest_update == nullptr) {
748
- // Call OnEndpointChanged() with an empty update just like
749
- // OnResourceDoesNotExist().
750
- OnEndpointChanged(index, std::make_shared<XdsEndpointResource>(),
751
- std::move(resolution_note));
752
- }
753
- }
754
-
755
- void XdsClusterResolverLb::OnResourceDoesNotExist(size_t index,
756
- std::string resolution_note) {
757
- gpr_log(GPR_ERROR,
758
- "[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
759
- " resource does not exist: %s",
760
- this, index, resolution_note.c_str());
761
- if (shutting_down_) return;
762
- // Call OnEndpointChanged() with an empty update.
763
- OnEndpointChanged(index, std::make_shared<XdsEndpointResource>(),
764
- std::move(resolution_note));
765
- }
766
-
767
- //
768
- // child policy-related methods
769
- //
770
-
771
- EndpointAddressesList XdsClusterResolverLb::CreateChildPolicyAddressesLocked() {
772
- EndpointAddressesList addresses;
773
- for (const auto& discovery_entry : discovery_mechanisms_) {
774
- const auto& priority_list =
775
- GetUpdatePriorityList(*discovery_entry.latest_update);
776
- for (size_t priority = 0; priority < priority_list.size(); ++priority) {
777
- const auto& priority_entry = priority_list[priority];
778
- std::string priority_child_name =
779
- discovery_entry.GetChildPolicyName(priority);
780
- for (const auto& p : priority_entry.localities) {
781
- const auto& locality_name = p.first;
782
- const auto& locality = p.second;
783
- std::vector<RefCountedStringValue> hierarchical_path = {
784
- RefCountedStringValue(priority_child_name),
785
- RefCountedStringValue(locality_name->AsHumanReadableString())};
786
- auto hierarchical_path_attr =
787
- MakeRefCounted<HierarchicalPathArg>(std::move(hierarchical_path));
788
- for (const auto& endpoint : locality.endpoints) {
789
- uint32_t endpoint_weight =
790
- locality.lb_weight *
791
- endpoint.args().GetInt(GRPC_ARG_ADDRESS_WEIGHT).value_or(1);
792
- addresses.emplace_back(
793
- endpoint.addresses(),
794
- endpoint.args()
795
- .SetObject(hierarchical_path_attr)
796
- .Set(GRPC_ARG_ADDRESS_WEIGHT, endpoint_weight)
797
- .SetObject(locality_name->Ref())
798
- .Set(GRPC_ARG_XDS_LOCALITY_WEIGHT, locality.lb_weight));
799
- }
800
- }
801
- }
802
- }
803
- return addresses;
804
- }
805
-
806
- std::string XdsClusterResolverLb::CreateChildPolicyResolutionNoteLocked() {
807
- std::vector<absl::string_view> resolution_notes;
808
- for (const auto& discovery_entry : discovery_mechanisms_) {
809
- if (!discovery_entry.resolution_note.empty()) {
810
- resolution_notes.push_back(discovery_entry.resolution_note);
811
- }
812
- }
813
- return absl::StrJoin(resolution_notes, "; ");
814
- }
815
-
816
- RefCountedPtr<LoadBalancingPolicy::Config>
817
- XdsClusterResolverLb::CreateChildPolicyConfigLocked() {
818
- Json::Object priority_children;
819
- Json::Array priority_priorities;
820
- for (const auto& discovery_entry : discovery_mechanisms_) {
821
- const auto& priority_list =
822
- GetUpdatePriorityList(*discovery_entry.latest_update);
823
- const auto& discovery_config = discovery_entry.config();
824
- for (size_t priority = 0; priority < priority_list.size(); ++priority) {
825
- // Determine what xDS LB policy to use.
826
- Json child_policy;
827
- if (!discovery_entry.discovery_mechanism->override_child_policy()
828
- .empty()) {
829
- child_policy = Json::FromArray(
830
- discovery_entry.discovery_mechanism->override_child_policy());
831
- } else {
832
- child_policy = config_->xds_lb_policy();
833
- }
834
- // Wrap the xDS LB policy in the xds_override_host policy.
835
- Json::Object xds_override_host_lb_config = {
836
- {"childPolicy", std::move(child_policy)},
837
- };
838
- if (!discovery_config.override_host_statuses.empty()) {
839
- xds_override_host_lb_config["overrideHostStatus"] =
840
- Json::FromArray(discovery_config.override_host_statuses);
841
- }
842
- Json::Array xds_override_host_config = {Json::FromObject({
843
- {"xds_override_host_experimental",
844
- Json::FromObject(std::move(xds_override_host_lb_config))},
845
- })};
846
- // Wrap it in the xds_cluster_impl policy.
847
- Json::Array drop_categories;
848
- if (discovery_entry.latest_update->drop_config != nullptr) {
849
- for (const auto& category :
850
- discovery_entry.latest_update->drop_config->drop_category_list()) {
851
- drop_categories.push_back(Json::FromObject({
852
- {"category", Json::FromString(category.name)},
853
- {"requests_per_million",
854
- Json::FromNumber(category.parts_per_million)},
855
- }));
856
- }
857
- }
858
- Json::Object xds_cluster_impl_config = {
859
- {"clusterName", Json::FromString(discovery_config.cluster_name)},
860
- {"childPolicy", Json::FromArray(std::move(xds_override_host_config))},
861
- {"dropCategories", Json::FromArray(std::move(drop_categories))},
862
- {"maxConcurrentRequests",
863
- Json::FromNumber(discovery_config.max_concurrent_requests)},
864
- };
865
- if (!discovery_config.eds_service_name.empty()) {
866
- xds_cluster_impl_config["edsServiceName"] =
867
- Json::FromString(discovery_config.eds_service_name);
868
- }
869
- if (discovery_config.lrs_load_reporting_server.has_value()) {
870
- xds_cluster_impl_config["lrsLoadReportingServer"] =
871
- discovery_config.lrs_load_reporting_server->ToJson();
872
- }
873
- // Wrap it in the outlier_detection policy.
874
- Json::Object outlier_detection_config;
875
- if (discovery_entry.config().outlier_detection_lb_config.has_value()) {
876
- outlier_detection_config =
877
- discovery_entry.config().outlier_detection_lb_config.value();
878
- }
879
- outlier_detection_config["childPolicy"] =
880
- Json::FromArray({Json::FromObject({
881
- {"xds_cluster_impl_experimental",
882
- Json::FromObject(std::move(xds_cluster_impl_config))},
883
- })});
884
- Json locality_picking_policy = Json::FromArray({Json::FromObject({
885
- {"outlier_detection_experimental",
886
- Json::FromObject(std::move(outlier_detection_config))},
887
- })});
888
- // Add priority entry, with the appropriate child name.
889
- std::string child_name = discovery_entry.GetChildPolicyName(priority);
890
- priority_priorities.emplace_back(Json::FromString(child_name));
891
- Json::Object child_config = {
892
- {"config", std::move(locality_picking_policy)},
893
- };
894
- if (discovery_entry.discovery_mechanism->disable_reresolution()) {
895
- child_config["ignore_reresolution_requests"] = Json::FromBool(true);
896
- }
897
- priority_children[child_name] = Json::FromObject(std::move(child_config));
898
- }
899
- }
900
- Json json = Json::FromArray({Json::FromObject({
901
- {"priority_experimental",
902
- Json::FromObject({
903
- {"children", Json::FromObject(std::move(priority_children))},
904
- {"priorities", Json::FromArray(std::move(priority_priorities))},
905
- })},
906
- })});
907
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
908
- gpr_log(
909
- GPR_INFO,
910
- "[xds_cluster_resolver_lb %p] generated config for child policy: %s",
911
- this, JsonDump(json, /*indent=*/1).c_str());
912
- }
913
- auto config =
914
- CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
915
- json);
916
- if (!config.ok()) {
917
- // This should never happen, but if it does, we basically have no
918
- // way to fix it, so we put the channel in TRANSIENT_FAILURE.
919
- gpr_log(GPR_ERROR,
920
- "[xds_cluster_resolver_lb %p] error parsing generated child policy "
921
- "config -- "
922
- "will put channel in TRANSIENT_FAILURE: %s",
923
- this, config.status().ToString().c_str());
924
- absl::Status status = absl::InternalError(
925
- "xds_cluster_resolver LB policy: error parsing generated child policy "
926
- "config");
927
- channel_control_helper()->UpdateState(
928
- GRPC_CHANNEL_TRANSIENT_FAILURE, status,
929
- MakeRefCounted<TransientFailurePicker>(status));
930
- return nullptr;
931
- }
932
- return std::move(*config);
933
- }
934
-
935
- absl::Status XdsClusterResolverLb::UpdateChildPolicyLocked() {
936
- if (shutting_down_) return absl::OkStatus();
937
- UpdateArgs update_args;
938
- update_args.config = CreateChildPolicyConfigLocked();
939
- if (update_args.config == nullptr) return absl::OkStatus();
940
- update_args.addresses = CreateChildPolicyAddressesLocked();
941
- update_args.resolution_note = CreateChildPolicyResolutionNoteLocked();
942
- update_args.args = CreateChildPolicyArgsLocked(args_);
943
- if (child_policy_ == nullptr) {
944
- child_policy_ = CreateChildPolicyLocked(update_args.args);
945
- }
946
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
947
- gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Updating child policy %p",
948
- this, child_policy_.get());
949
- }
950
- return child_policy_->UpdateLocked(std::move(update_args));
951
- }
952
-
953
- ChannelArgs XdsClusterResolverLb::CreateChildPolicyArgsLocked(
954
- const ChannelArgs& args) {
955
- // Inhibit client-side health checking, since the balancer does this
956
- // for us.
957
- return args.Set(GRPC_ARG_INHIBIT_HEALTH_CHECKING, 1);
958
- }
959
-
960
- OrphanablePtr<LoadBalancingPolicy>
961
- XdsClusterResolverLb::CreateChildPolicyLocked(const ChannelArgs& args) {
962
- LoadBalancingPolicy::Args lb_policy_args;
963
- lb_policy_args.work_serializer = work_serializer();
964
- lb_policy_args.args = args;
965
- lb_policy_args.channel_control_helper =
966
- std::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
967
- OrphanablePtr<LoadBalancingPolicy> lb_policy =
968
- CoreConfiguration::Get().lb_policy_registry().CreateLoadBalancingPolicy(
969
- "priority_experimental", std::move(lb_policy_args));
970
- if (GPR_UNLIKELY(lb_policy == nullptr)) {
971
- gpr_log(GPR_ERROR,
972
- "[xds_cluster_resolver_lb %p] failure creating child policy", this);
973
- return nullptr;
974
- }
975
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
976
- gpr_log(GPR_INFO,
977
- "[xds_cluster_resolver_lb %p]: Created new child policy %p", this,
978
- lb_policy.get());
979
- }
980
- // Add our interested_parties pollset_set to that of the newly created
981
- // child policy. This will make the child policy progress upon activity on
982
- // this policy, which in turn is tied to the application's call.
983
- grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
984
- interested_parties());
985
- return lb_policy;
986
- }
987
-
988
- //
989
- // factory
990
- //
991
-
992
- const JsonLoaderInterface*
993
- XdsClusterResolverLbConfig::DiscoveryMechanism::JsonLoader(const JsonArgs&) {
994
- static const auto* loader =
995
- JsonObjectLoader<DiscoveryMechanism>()
996
- // Note: Several fields requires custom processing,
997
- // so they are handled in JsonPostLoad() instead.
998
- .Field("clusterName", &DiscoveryMechanism::cluster_name)
999
- .OptionalField("lrsLoadReportingServer",
1000
- &DiscoveryMechanism::lrs_load_reporting_server)
1001
- .OptionalField("max_concurrent_requests",
1002
- &DiscoveryMechanism::max_concurrent_requests)
1003
- .OptionalField("outlierDetection",
1004
- &DiscoveryMechanism::outlier_detection_lb_config)
1005
- .OptionalField("overrideHostStatus",
1006
- &DiscoveryMechanism::override_host_statuses)
1007
- .Finish();
1008
- return loader;
1009
- }
1010
-
1011
- void XdsClusterResolverLbConfig::DiscoveryMechanism::JsonPostLoad(
1012
- const Json& json, const JsonArgs& args, ValidationErrors* errors) {
1013
- // Parse "type".
1014
- {
1015
- auto type_field =
1016
- LoadJsonObjectField<std::string>(json.object(), args, "type", errors);
1017
- if (type_field.has_value()) {
1018
- if (*type_field == "EDS") {
1019
- type = DiscoveryMechanismType::EDS;
1020
- } else if (*type_field == "LOGICAL_DNS") {
1021
- type = DiscoveryMechanismType::LOGICAL_DNS;
1022
- } else {
1023
- ValidationErrors::ScopedField field(errors, ".type");
1024
- errors->AddError(absl::StrCat("unknown type \"", *type_field, "\""));
1025
- }
1026
- }
1027
- }
1028
- // Parse "edsServiceName" if type is EDS.
1029
- if (type == DiscoveryMechanismType::EDS) {
1030
- auto value = LoadJsonObjectField<std::string>(json.object(), args,
1031
- "edsServiceName", errors,
1032
- /*required=*/false);
1033
- if (value.has_value()) eds_service_name = std::move(*value);
1034
- }
1035
- // Parse "dnsHostname" if type is LOGICAL_DNS.
1036
- if (type == DiscoveryMechanismType::LOGICAL_DNS) {
1037
- auto value = LoadJsonObjectField<std::string>(json.object(), args,
1038
- "dnsHostname", errors);
1039
- if (value.has_value()) dns_hostname = std::move(*value);
1040
- }
1041
- }
1042
-
1043
- const JsonLoaderInterface* XdsClusterResolverLbConfig::JsonLoader(
1044
- const JsonArgs&) {
1045
- static const auto* loader =
1046
- JsonObjectLoader<XdsClusterResolverLbConfig>()
1047
- // Note: The "xdsLbPolicy" field requires custom processing,
1048
- // so it's handled in JsonPostLoad() instead.
1049
- .Field("discoveryMechanisms",
1050
- &XdsClusterResolverLbConfig::discovery_mechanisms_)
1051
- .Finish();
1052
- return loader;
1053
- }
1054
-
1055
- void XdsClusterResolverLbConfig::JsonPostLoad(const Json& json, const JsonArgs&,
1056
- ValidationErrors* errors) {
1057
- // Validate discoveryMechanisms.
1058
- {
1059
- ValidationErrors::ScopedField field(errors, ".discoveryMechanisms");
1060
- if (!errors->FieldHasErrors() && discovery_mechanisms_.empty()) {
1061
- errors->AddError("must be non-empty");
1062
- }
1063
- }
1064
- // Parse "xdsLbPolicy".
1065
- {
1066
- ValidationErrors::ScopedField field(errors, ".xdsLbPolicy");
1067
- auto it = json.object().find("xdsLbPolicy");
1068
- if (it == json.object().end()) {
1069
- errors->AddError("field not present");
1070
- } else {
1071
- auto lb_config = CoreConfiguration::Get()
1072
- .lb_policy_registry()
1073
- .ParseLoadBalancingConfig(it->second);
1074
- if (!lb_config.ok()) errors->AddError(lb_config.status().message());
1075
- xds_lb_policy_ = it->second;
1076
- }
1077
- }
1078
- }
1079
-
1080
- class XdsClusterResolverLbFactory : public LoadBalancingPolicyFactory {
1081
- public:
1082
- OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1083
- LoadBalancingPolicy::Args args) const override {
1084
- auto xds_client = args.args.GetObjectRef<GrpcXdsClient>(
1085
- DEBUG_LOCATION, "XdsClusterResolverLbFactory");
1086
- if (xds_client == nullptr) {
1087
- gpr_log(GPR_ERROR,
1088
- "XdsClient not present in channel args -- cannot instantiate "
1089
- "xds_cluster_resolver LB policy");
1090
- return nullptr;
1091
- }
1092
- return MakeOrphanable<XdsClusterResolverChildHandler>(std::move(xds_client),
1093
- std::move(args));
1094
- }
1095
-
1096
- absl::string_view name() const override { return kXdsClusterResolver; }
1097
-
1098
- absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
1099
- ParseLoadBalancingConfig(const Json& json) const override {
1100
- return LoadFromJson<RefCountedPtr<XdsClusterResolverLbConfig>>(
1101
- json, JsonArgs(),
1102
- "errors validating xds_cluster_resolver LB policy config");
1103
- }
1104
-
1105
- private:
1106
- class XdsClusterResolverChildHandler : public ChildPolicyHandler {
1107
- public:
1108
- XdsClusterResolverChildHandler(RefCountedPtr<XdsClient> xds_client,
1109
- Args args)
1110
- : ChildPolicyHandler(std::move(args),
1111
- &grpc_lb_xds_cluster_resolver_trace),
1112
- xds_client_(std::move(xds_client)) {}
1113
-
1114
- ~XdsClusterResolverChildHandler() override {
1115
- xds_client_.reset(DEBUG_LOCATION, "XdsClusterResolverChildHandler");
1116
- }
1117
-
1118
- bool ConfigChangeRequiresNewPolicyInstance(
1119
- LoadBalancingPolicy::Config* old_config,
1120
- LoadBalancingPolicy::Config* new_config) const override {
1121
- GPR_ASSERT(old_config->name() == kXdsClusterResolver);
1122
- GPR_ASSERT(new_config->name() == kXdsClusterResolver);
1123
- XdsClusterResolverLbConfig* old_xds_cluster_resolver_config =
1124
- static_cast<XdsClusterResolverLbConfig*>(old_config);
1125
- XdsClusterResolverLbConfig* new_xds_cluster_resolver_config =
1126
- static_cast<XdsClusterResolverLbConfig*>(new_config);
1127
- if (old_xds_cluster_resolver_config->discovery_mechanisms().size() !=
1128
- new_xds_cluster_resolver_config->discovery_mechanisms().size()) {
1129
- return true;
1130
- }
1131
- for (size_t i = 0;
1132
- i < old_xds_cluster_resolver_config->discovery_mechanisms().size();
1133
- ++i) {
1134
- auto& old_discovery_mechanism =
1135
- old_xds_cluster_resolver_config->discovery_mechanisms()[i];
1136
- auto& new_discovery_mechanism =
1137
- new_xds_cluster_resolver_config->discovery_mechanisms()[i];
1138
- if (old_discovery_mechanism.type != new_discovery_mechanism.type ||
1139
- old_discovery_mechanism.cluster_name !=
1140
- new_discovery_mechanism.cluster_name ||
1141
- old_discovery_mechanism.eds_service_name !=
1142
- new_discovery_mechanism.eds_service_name ||
1143
- old_discovery_mechanism.dns_hostname !=
1144
- new_discovery_mechanism.dns_hostname ||
1145
- !(old_discovery_mechanism.lrs_load_reporting_server ==
1146
- new_discovery_mechanism.lrs_load_reporting_server)) {
1147
- return true;
1148
- }
1149
- }
1150
- return false;
1151
- }
1152
-
1153
- OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1154
- absl::string_view /*name*/,
1155
- LoadBalancingPolicy::Args args) const override {
1156
- return MakeOrphanable<XdsClusterResolverLb>(
1157
- xds_client_->Ref(DEBUG_LOCATION, "XdsClusterResolverLb"),
1158
- std::move(args));
1159
- }
1160
-
1161
- private:
1162
- RefCountedPtr<XdsClient> xds_client_;
1163
- };
1164
- };
1165
-
1166
- } // namespace
1167
-
1168
- void RegisterXdsClusterResolverLbPolicy(CoreConfiguration::Builder* builder) {
1169
- builder->lb_policy_registry()->RegisterLoadBalancingPolicyFactory(
1170
- std::make_unique<XdsClusterResolverLbFactory>());
1171
- }
1172
-
1173
- } // namespace grpc_core