grpc 1.32.0.pre1 → 1.35.0

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

Potentially problematic release.


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

Files changed (938) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1078 -3049
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +15 -7
  6. data/include/grpc/grpc_security.h +222 -171
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +10 -8
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +22 -55
  12. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  13. data/include/grpc/slice_buffer.h +3 -3
  14. data/include/grpc/support/sync.h +3 -3
  15. data/include/grpc/support/time.h +7 -7
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  17. data/src/core/ext/filters/client_channel/client_channel.cc +2776 -1529
  18. data/src/core/ext/filters/client_channel/client_channel.h +0 -4
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
  21. data/src/core/ext/filters/client_channel/config_selector.h +40 -8
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -7
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +5 -6
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +6 -2
  29. data/src/core/ext/filters/client_channel/lb_policy.h +6 -7
  30. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  32. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -3
  33. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +201 -190
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +4 -4
  39. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +50 -20
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -5
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
  42. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +341 -127
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +24 -0
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +812 -0
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1262 -0
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  50. data/src/core/ext/filters/client_channel/resolver.cc +3 -1
  51. data/src/core/ext/filters/client_channel/resolver.h +4 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +9 -16
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +3 -3
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +454 -16
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +7 -10
  58. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -3
  59. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  60. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +34 -27
  61. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +618 -366
  62. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  63. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  64. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  65. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +29 -74
  67. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +12 -10
  68. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  69. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  70. data/src/core/ext/filters/client_channel/server_address.cc +80 -0
  71. data/src/core/ext/filters/client_channel/server_address.h +21 -36
  72. data/src/core/ext/filters/client_channel/service_config.cc +18 -13
  73. data/src/core/ext/filters/client_channel/service_config.h +8 -5
  74. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  75. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  76. data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
  77. data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
  78. data/src/core/ext/filters/client_channel/subchannel.cc +51 -64
  79. data/src/core/ext/filters/client_channel/subchannel.h +14 -20
  80. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  81. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  82. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  83. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  84. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  85. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  86. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  87. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  88. data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
  89. data/src/core/ext/filters/message_size/message_size_filter.cc +3 -2
  90. data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
  91. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  93. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  94. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  95. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  96. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  97. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +185 -79
  98. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  99. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  100. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -42
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -2
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +13 -3
  103. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  104. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  105. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  107. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  108. data/src/core/ext/transport/chttp2/transport/parsing.cc +18 -3
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  110. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  111. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  112. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  113. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  114. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +52 -32
  115. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +199 -34
  116. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  117. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  118. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +177 -99
  119. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +642 -202
  120. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  121. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  122. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +22 -22
  123. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +47 -21
  124. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +36 -24
  125. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +133 -39
  126. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  127. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  128. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +45 -44
  129. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +200 -78
  130. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +31 -24
  131. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +107 -47
  132. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  133. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  134. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +74 -28
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +248 -43
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +39 -39
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +157 -89
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +63 -39
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +254 -60
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +36 -0
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +92 -0
  150. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -13
  151. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  152. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  153. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  154. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  155. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  156. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  157. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  158. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +46 -26
  159. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +179 -68
  160. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +39 -22
  161. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +149 -48
  162. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -2
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  164. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -17
  165. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +96 -33
  166. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -7
  167. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +38 -22
  168. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +321 -194
  169. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +1228 -443
  170. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +8 -7
  171. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +34 -10
  172. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -3
  173. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  174. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +132 -80
  175. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +516 -166
  176. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  177. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +24 -25
  178. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +96 -71
  179. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +12 -8
  180. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +46 -8
  181. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +71 -29
  182. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +296 -63
  183. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  184. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  185. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  186. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  187. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +41 -31
  188. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +165 -64
  189. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -1
  190. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  191. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -1
  192. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  193. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -7
  194. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  195. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -1
  196. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  197. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  198. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  199. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  200. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  201. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  202. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  203. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  204. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  205. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  206. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  207. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +4 -3
  208. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +22 -3
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  211. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  212. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  213. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  214. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  215. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  216. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  217. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  218. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  219. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  220. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  221. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  222. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  223. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  224. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
  225. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +34 -34
  226. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +142 -59
  227. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  228. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  229. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  230. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  231. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  232. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  233. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  234. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  235. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  236. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  237. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  238. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  239. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  240. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  241. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  242. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  243. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  244. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  245. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  246. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  247. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  248. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  249. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  250. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  251. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  252. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  253. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  254. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  255. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  256. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  257. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
  259. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  260. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  261. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  262. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  263. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  264. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +28 -0
  265. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +60 -0
  266. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +52 -0
  267. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +143 -0
  268. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +42 -0
  269. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +84 -0
  270. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +36 -0
  271. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +94 -0
  272. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +54 -0
  273. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +173 -0
  274. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +36 -0
  275. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +92 -0
  276. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  277. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  278. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  279. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  280. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  283. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  284. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +254 -0
  285. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +558 -0
  289. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  290. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  291. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  292. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +133 -0
  293. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +266 -0
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +125 -0
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  304. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  305. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  306. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  307. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  308. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  309. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  310. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  311. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  312. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  313. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  314. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +46 -0
  315. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  316. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  317. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  318. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +55 -0
  319. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  320. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +110 -0
  321. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  322. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  323. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  324. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  325. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  327. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  328. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +190 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +185 -0
  331. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  332. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +62 -0
  333. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  334. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +97 -0
  335. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  336. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +915 -0
  337. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +280 -0
  338. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  339. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  340. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +64 -0
  341. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  342. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +511 -0
  343. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  344. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -0
  345. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  346. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +166 -0
  347. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  348. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +105 -0
  349. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  350. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +249 -0
  351. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  352. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  353. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  354. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  355. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  356. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +152 -0
  357. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +60 -0
  358. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +83 -0
  359. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  360. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +82 -0
  361. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  362. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +83 -0
  363. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  364. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +86 -0
  365. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  366. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  367. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  368. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  369. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  370. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  371. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  372. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  373. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  374. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  375. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  376. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +72 -0
  377. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  378. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  379. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  380. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  381. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  382. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  383. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  384. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  385. data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
  386. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  387. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  388. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  389. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  390. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  391. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  392. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  393. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  394. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  395. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  396. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  397. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  398. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  399. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  400. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  401. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  402. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  403. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  404. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  405. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  406. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  407. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  408. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  409. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  410. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  411. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  412. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  413. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  414. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  415. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  417. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  418. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  419. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  420. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  421. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  422. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +42 -0
  423. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +35 -0
  424. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +62 -0
  425. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +40 -0
  426. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +45 -0
  427. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +40 -0
  428. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +49 -0
  429. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +35 -0
  430. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +68 -0
  431. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +40 -0
  432. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +51 -0
  433. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +35 -0
  434. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +307 -0
  435. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  436. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  437. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  438. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  439. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  440. data/src/core/ext/xds/certificate_provider_store.h +112 -0
  441. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  442. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  443. data/src/core/ext/xds/xds_api.cc +687 -767
  444. data/src/core/ext/xds/xds_api.h +207 -98
  445. data/src/core/ext/xds/xds_bootstrap.cc +172 -25
  446. data/src/core/ext/xds/xds_bootstrap.h +23 -8
  447. data/src/core/ext/xds/xds_certificate_provider.cc +299 -0
  448. data/src/core/ext/xds/xds_certificate_provider.h +112 -0
  449. data/src/core/ext/xds/xds_channel_args.h +6 -3
  450. data/src/core/ext/xds/xds_client.cc +617 -494
  451. data/src/core/ext/xds/xds_client.h +118 -58
  452. data/src/core/ext/xds/xds_client_stats.cc +59 -16
  453. data/src/core/ext/xds/xds_client_stats.h +35 -7
  454. data/src/core/ext/xds/xds_server_config_fetcher.cc +131 -0
  455. data/src/core/lib/channel/channel_args.cc +9 -8
  456. data/src/core/lib/channel/channel_args.h +0 -1
  457. data/src/core/lib/channel/channel_trace.cc +4 -2
  458. data/src/core/lib/channel/channel_trace.h +1 -1
  459. data/src/core/lib/channel/channelz.cc +23 -59
  460. data/src/core/lib/channel/channelz.h +13 -22
  461. data/src/core/lib/channel/channelz_registry.cc +12 -11
  462. data/src/core/lib/channel/channelz_registry.h +3 -1
  463. data/src/core/lib/channel/handshaker.cc +2 -2
  464. data/src/core/lib/channel/handshaker.h +2 -2
  465. data/src/core/lib/compression/compression.cc +8 -4
  466. data/src/core/lib/compression/compression_args.cc +3 -2
  467. data/src/core/lib/compression/compression_internal.cc +10 -5
  468. data/src/core/lib/compression/compression_internal.h +2 -1
  469. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  470. data/src/core/lib/debug/stats.h +2 -2
  471. data/src/core/lib/debug/stats_data.cc +1 -0
  472. data/src/core/lib/debug/stats_data.h +13 -13
  473. data/src/core/lib/gpr/alloc.cc +3 -2
  474. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  475. data/src/core/lib/gpr/log.cc +53 -16
  476. data/src/core/lib/gpr/log_linux.cc +19 -3
  477. data/src/core/lib/gpr/log_posix.cc +15 -1
  478. data/src/core/lib/gpr/log_windows.cc +18 -4
  479. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  480. data/src/core/lib/gpr/spinlock.h +10 -2
  481. data/src/core/lib/gpr/string.cc +23 -22
  482. data/src/core/lib/gpr/string.h +5 -6
  483. data/src/core/lib/gpr/sync.cc +4 -4
  484. data/src/core/lib/gpr/time.cc +12 -12
  485. data/src/core/lib/gpr/time_precise.cc +5 -2
  486. data/src/core/lib/gpr/time_precise.h +6 -2
  487. data/src/core/lib/gpr/tls.h +4 -0
  488. data/src/core/lib/gpr/tls_msvc.h +2 -0
  489. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  490. data/src/core/lib/gpr/useful.h +5 -4
  491. data/src/core/lib/gprpp/arena.h +3 -2
  492. data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
  493. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  494. data/src/core/lib/gprpp/examine_stack.h +46 -0
  495. data/src/core/lib/gprpp/fork.cc +2 -2
  496. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  497. data/src/core/lib/gprpp/orphanable.h +4 -8
  498. data/src/core/lib/gprpp/ref_counted.h +91 -68
  499. data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
  500. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  501. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  502. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  503. data/src/core/lib/gprpp/thd.h +2 -2
  504. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  505. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  506. data/src/core/lib/http/httpcli.cc +1 -1
  507. data/src/core/lib/http/httpcli.h +2 -3
  508. data/src/core/lib/http/httpcli_security_connector.cc +1 -1
  509. data/src/core/lib/http/parser.cc +47 -27
  510. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  511. data/src/core/lib/iomgr/combiner.cc +2 -1
  512. data/src/core/lib/iomgr/endpoint.h +1 -1
  513. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -5
  514. data/src/core/lib/iomgr/error.cc +17 -12
  515. data/src/core/lib/iomgr/error_internal.h +1 -1
  516. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  517. data/src/core/lib/iomgr/ev_epollex_linux.cc +25 -17
  518. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  519. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  520. data/src/core/lib/iomgr/exec_ctx.h +16 -12
  521. data/src/core/lib/iomgr/executor.cc +2 -1
  522. data/src/core/lib/iomgr/executor.h +1 -1
  523. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  524. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  525. data/src/core/lib/iomgr/iomgr.cc +1 -1
  526. data/src/core/lib/iomgr/load_file.h +1 -1
  527. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  528. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  529. data/src/core/lib/iomgr/parse_address.cc +127 -43
  530. data/src/core/lib/iomgr/parse_address.h +32 -8
  531. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  532. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  533. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  534. data/src/core/lib/iomgr/python_util.h +4 -4
  535. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  536. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  537. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  538. data/src/core/lib/iomgr/sockaddr_utils.cc +10 -10
  539. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  540. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  541. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  542. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  543. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  544. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  545. data/src/core/lib/iomgr/tcp_posix.cc +12 -8
  546. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  547. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  548. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  549. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  550. data/src/core/lib/iomgr/udp_server.cc +1 -2
  551. data/src/core/lib/iomgr/udp_server.h +1 -2
  552. data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
  553. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  554. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  555. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  556. data/src/core/lib/json/json.h +12 -2
  557. data/src/core/lib/json/json_reader.cc +8 -4
  558. data/src/core/lib/json/json_util.cc +58 -0
  559. data/src/core/lib/json/json_util.h +204 -0
  560. data/src/core/lib/json/json_writer.cc +2 -1
  561. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  562. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  563. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  564. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  565. data/src/core/lib/security/authorization/mock_cel/cel_value.h +4 -0
  566. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  567. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  568. data/src/core/lib/security/context/security_context.cc +4 -3
  569. data/src/core/lib/security/context/security_context.h +3 -1
  570. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  571. data/src/core/lib/security/credentials/credentials.cc +7 -7
  572. data/src/core/lib/security/credentials/credentials.h +3 -3
  573. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  574. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  575. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  576. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  577. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  578. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  579. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  580. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  581. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  582. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  583. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -1
  584. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +18 -12
  585. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  586. data/src/core/lib/security/credentials/jwt/json_token.cc +6 -3
  587. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  588. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -4
  589. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
  590. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  591. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  592. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -5
  593. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  594. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
  595. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
  596. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  597. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  598. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
  599. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
  600. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -12
  601. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  602. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  603. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  604. data/src/core/lib/security/credentials/xds/xds_credentials.cc +175 -0
  605. data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
  606. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  607. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -13
  608. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  609. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  610. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  611. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  612. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
  613. data/src/core/lib/security/security_connector/security_connector.cc +4 -3
  614. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  615. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  616. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  617. data/src/core/lib/security/security_connector/ssl_utils.h +19 -19
  618. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +342 -279
  619. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
  620. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  621. data/src/core/lib/security/transport/security_handshaker.cc +3 -3
  622. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  623. data/src/core/lib/security/util/json_util.h +1 -0
  624. data/src/core/lib/slice/slice.cc +7 -4
  625. data/src/core/lib/slice/slice_buffer.cc +2 -1
  626. data/src/core/lib/slice/slice_intern.cc +6 -7
  627. data/src/core/lib/slice/slice_internal.h +2 -2
  628. data/src/core/lib/surface/call.cc +41 -32
  629. data/src/core/lib/surface/call_details.cc +8 -8
  630. data/src/core/lib/surface/channel.cc +25 -41
  631. data/src/core/lib/surface/channel.h +9 -3
  632. data/src/core/lib/surface/channel_init.cc +1 -1
  633. data/src/core/lib/surface/completion_queue.cc +30 -24
  634. data/src/core/lib/surface/completion_queue.h +16 -16
  635. data/src/core/lib/surface/init.cc +32 -14
  636. data/src/core/lib/surface/lame_client.cc +20 -46
  637. data/src/core/lib/surface/lame_client.h +4 -0
  638. data/src/core/lib/surface/server.cc +63 -17
  639. data/src/core/lib/surface/server.h +39 -7
  640. data/src/core/lib/surface/validate_metadata.h +3 -0
  641. data/src/core/lib/surface/version.cc +2 -2
  642. data/src/core/lib/transport/authority_override.cc +6 -4
  643. data/src/core/lib/transport/authority_override.h +7 -2
  644. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  645. data/src/core/lib/transport/bdp_estimator.h +2 -1
  646. data/src/core/lib/transport/byte_stream.h +3 -3
  647. data/src/core/lib/transport/connectivity_state.h +11 -9
  648. data/src/core/lib/transport/error_utils.h +1 -1
  649. data/src/core/lib/transport/metadata.cc +11 -1
  650. data/src/core/lib/transport/metadata.h +2 -2
  651. data/src/core/lib/transport/metadata_batch.h +4 -4
  652. data/src/core/lib/transport/static_metadata.cc +1 -1
  653. data/src/core/lib/transport/status_metadata.cc +4 -3
  654. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  655. data/src/core/lib/transport/transport.cc +5 -3
  656. data/src/core/lib/transport/transport.h +8 -8
  657. data/src/core/lib/uri/uri_parser.cc +131 -249
  658. data/src/core/lib/uri/uri_parser.h +57 -21
  659. data/src/core/plugin_registry/grpc_plugin_registry.cc +41 -20
  660. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  661. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  662. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  663. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +27 -26
  664. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  665. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  666. data/src/core/tsi/fake_transport_security.cc +6 -3
  667. data/src/core/tsi/local_transport_security.cc +5 -1
  668. data/src/core/tsi/local_transport_security.h +6 -7
  669. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -0
  670. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  671. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -1
  672. data/src/core/tsi/ssl_transport_security.cc +78 -58
  673. data/src/core/tsi/ssl_transport_security.h +9 -6
  674. data/src/core/tsi/transport_security.cc +10 -8
  675. data/src/core/tsi/transport_security_interface.h +1 -1
  676. data/src/ruby/ext/grpc/extconf.rb +1 -1
  677. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  678. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -16
  679. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -40
  680. data/src/ruby/lib/grpc/version.rb +1 -1
  681. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +28 -0
  682. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  683. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  684. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  685. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  686. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  687. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  688. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  689. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  690. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  691. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  692. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  693. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  694. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  695. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  696. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  697. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  698. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  699. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  700. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  701. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  702. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  703. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  704. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  705. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  706. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  707. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  708. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  709. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  710. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  711. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  712. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  713. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  714. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  715. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  716. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  717. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  718. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  719. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  720. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  721. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  722. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  723. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  724. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  725. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  726. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  727. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  728. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  729. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  730. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  731. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  732. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  733. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  734. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  735. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  736. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  737. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  738. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  739. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  740. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  741. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  742. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  743. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  744. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  745. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  746. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  747. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  748. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  749. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  750. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  751. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  752. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  753. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  754. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  755. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  756. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  757. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  758. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  759. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  760. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  761. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  762. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  763. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  764. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  765. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  766. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  767. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  768. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  769. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  770. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  771. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  772. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  773. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  774. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  775. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  776. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  777. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  778. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  779. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  780. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  781. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  782. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  783. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  784. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  785. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  786. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +3 -3
  787. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  788. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  789. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  790. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  791. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  792. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  793. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  794. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  795. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  796. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  797. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  798. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  799. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  800. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  801. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  802. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  803. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  804. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  805. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  806. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  807. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  808. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  809. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  810. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  811. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  812. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  813. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  814. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  815. data/third_party/boringssl-with-bazel/err_data.c +469 -463
  816. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +0 -6
  817. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  818. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
  819. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  820. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  821. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  822. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  823. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  824. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  825. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  826. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
  827. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +56 -22
  828. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +8 -2
  829. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +98 -11
  830. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +51 -6
  831. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
  832. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
  833. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
  834. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  835. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
  836. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
  837. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  838. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  839. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +7 -2
  840. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +21 -18
  841. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  842. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +24 -3
  843. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
  844. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  845. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +3 -3
  846. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
  847. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +13 -2
  848. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
  849. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  850. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +2 -2
  851. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  852. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  853. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  854. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  855. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +14 -14
  856. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +7 -3
  857. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +2 -2
  858. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  859. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  860. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
  861. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -1
  862. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  863. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +7 -5
  864. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +0 -1
  865. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -3
  866. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  867. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +6 -0
  868. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
  869. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  870. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +12 -0
  871. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +9 -0
  872. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +4 -1
  873. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  874. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  875. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +64 -3
  876. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  877. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
  878. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +188 -78
  879. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +482 -432
  880. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  881. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  882. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +18 -18
  883. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -3
  884. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  885. data/third_party/boringssl-with-bazel/src/ssl/internal.h +45 -10
  886. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +42 -1
  887. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  888. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +67 -0
  889. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +11 -14
  890. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +216 -11
  891. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
  892. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +57 -19
  893. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +135 -41
  894. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  895. data/third_party/upb/upb/decode.c +248 -167
  896. data/third_party/upb/upb/decode.h +20 -1
  897. data/third_party/upb/upb/decode.int.h +163 -0
  898. data/third_party/upb/upb/decode_fast.c +1040 -0
  899. data/third_party/upb/upb/decode_fast.h +126 -0
  900. data/third_party/upb/upb/def.c +2178 -0
  901. data/third_party/upb/upb/def.h +315 -0
  902. data/third_party/upb/upb/def.hpp +439 -0
  903. data/third_party/upb/upb/encode.c +227 -169
  904. data/third_party/upb/upb/encode.h +27 -2
  905. data/third_party/upb/upb/json_decode.c +1443 -0
  906. data/third_party/upb/upb/json_decode.h +23 -0
  907. data/third_party/upb/upb/json_encode.c +713 -0
  908. data/third_party/upb/upb/json_encode.h +36 -0
  909. data/third_party/upb/upb/msg.c +167 -88
  910. data/third_party/upb/upb/msg.h +174 -34
  911. data/third_party/upb/upb/port_def.inc +74 -61
  912. data/third_party/upb/upb/port_undef.inc +3 -7
  913. data/third_party/upb/upb/reflection.c +408 -0
  914. data/third_party/upb/upb/reflection.h +168 -0
  915. data/third_party/upb/upb/table.c +34 -197
  916. data/third_party/upb/upb/table.int.h +14 -5
  917. data/third_party/upb/upb/text_encode.c +421 -0
  918. data/third_party/upb/upb/text_encode.h +38 -0
  919. data/third_party/upb/upb/upb.c +18 -41
  920. data/third_party/upb/upb/upb.h +36 -7
  921. data/third_party/upb/upb/upb.hpp +4 -4
  922. data/third_party/upb/upb/upb.int.h +29 -0
  923. metadata +291 -57
  924. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -946
  925. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -537
  926. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1141
  927. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  928. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  929. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -354
  930. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -142
  931. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  932. data/src/core/ext/xds/xds_channel.h +0 -46
  933. data/src/core/ext/xds/xds_channel_secure.cc +0 -103
  934. data/src/core/lib/gprpp/map.h +0 -53
  935. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  936. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  937. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  938. data/third_party/upb/upb/port.c +0 -26
@@ -0,0 +1,1262 @@
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 <limits.h>
21
+
22
+ #include "absl/strings/str_cat.h"
23
+ #include "absl/types/optional.h"
24
+
25
+ #include <grpc/grpc.h>
26
+
27
+ #include "src/core/ext/filters/client_channel/client_channel.h"
28
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
29
+ #include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
30
+ #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
31
+ #include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h"
32
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
33
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
34
+ #include "src/core/ext/filters/client_channel/resolver_registry.h"
35
+ #include "src/core/ext/filters/client_channel/server_address.h"
36
+ #include "src/core/ext/xds/xds_channel_args.h"
37
+ #include "src/core/ext/xds/xds_client.h"
38
+ #include "src/core/ext/xds/xds_client_stats.h"
39
+ #include "src/core/lib/channel/channel_args.h"
40
+ #include "src/core/lib/gpr/string.h"
41
+ #include "src/core/lib/gprpp/orphanable.h"
42
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
43
+ #include "src/core/lib/iomgr/work_serializer.h"
44
+ #include "src/core/lib/transport/error_utils.h"
45
+ #include "src/core/lib/uri/uri_parser.h"
46
+
47
+ #define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000
48
+
49
+ namespace grpc_core {
50
+
51
+ TraceFlag grpc_lb_xds_cluster_resolver_trace(false, "xds_cluster_resolver_lb");
52
+
53
+ const char* kXdsLocalityNameAttributeKey = "xds_locality_name";
54
+
55
+ namespace {
56
+
57
+ constexpr char kXdsClusterResolver[] = "xds_cluster_resolver_experimental";
58
+
59
+ // Config for EDS LB policy.
60
+ class XdsClusterResolverLbConfig : public LoadBalancingPolicy::Config {
61
+ public:
62
+ struct DiscoveryMechanism {
63
+ std::string cluster_name;
64
+ absl::optional<std::string> lrs_load_reporting_server_name;
65
+ uint32_t max_concurrent_requests;
66
+ enum DiscoveryMechanismType {
67
+ EDS,
68
+ LOGICAL_DNS,
69
+ };
70
+ DiscoveryMechanismType type;
71
+ std::string eds_service_name;
72
+
73
+ bool operator==(const DiscoveryMechanism& other) const {
74
+ return (cluster_name == other.cluster_name &&
75
+ lrs_load_reporting_server_name ==
76
+ other.lrs_load_reporting_server_name &&
77
+ max_concurrent_requests == other.max_concurrent_requests &&
78
+ type == other.type && eds_service_name == other.eds_service_name);
79
+ }
80
+ };
81
+
82
+ XdsClusterResolverLbConfig(
83
+ std::vector<DiscoveryMechanism> discovery_mechanisms,
84
+ Json locality_picking_policy, Json endpoint_picking_policy)
85
+ : discovery_mechanisms_(std::move(discovery_mechanisms)),
86
+ locality_picking_policy_(std::move(locality_picking_policy)),
87
+ endpoint_picking_policy_(std::move(endpoint_picking_policy)) {}
88
+
89
+ const char* name() const override { return kXdsClusterResolver; }
90
+
91
+ const std::vector<DiscoveryMechanism>& discovery_mechanisms() const {
92
+ return discovery_mechanisms_;
93
+ }
94
+ const Json& locality_picking_policy() const {
95
+ return locality_picking_policy_;
96
+ }
97
+ const Json& endpoint_picking_policy() const {
98
+ return endpoint_picking_policy_;
99
+ }
100
+
101
+ private:
102
+ std::vector<DiscoveryMechanism> discovery_mechanisms_;
103
+ Json locality_picking_policy_;
104
+ Json endpoint_picking_policy_;
105
+ };
106
+
107
+ // Xds Cluster Resolver LB policy.
108
+ class XdsClusterResolverLb : public LoadBalancingPolicy {
109
+ public:
110
+ XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client, Args args);
111
+
112
+ const char* name() const override { return kXdsClusterResolver; }
113
+
114
+ void UpdateLocked(UpdateArgs args) override;
115
+ void ResetBackoffLocked() override;
116
+
117
+ private:
118
+ // Discovery Mechanism Base class
119
+ //
120
+ // Implemented by EDS and LOGICAL_DNS.
121
+ //
122
+ // Implementations are responsible for calling the LB policy's
123
+ // OnEndpointChanged(), OnError(), and OnResourceDoesNotExist()
124
+ // methods when the corresponding events occur.
125
+ //
126
+ // Must implement Orphan() method to cancel the watchers.
127
+ class DiscoveryMechanism : public InternallyRefCounted<DiscoveryMechanism> {
128
+ public:
129
+ DiscoveryMechanism(
130
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
131
+ size_t index)
132
+ : parent_(std::move(xds_cluster_resolver_lb)), index_(index) {}
133
+ virtual void Start() = 0;
134
+ void Orphan() override = 0;
135
+
136
+ // Caller must ensure that config_ is set before calling.
137
+ const absl::string_view GetXdsClusterResolverResourceName() const {
138
+ if (!parent_->is_xds_uri_) return parent_->server_name_;
139
+ if (!parent_->config_->discovery_mechanisms()[index_]
140
+ .eds_service_name.empty()) {
141
+ return parent_->config_->discovery_mechanisms()[index_]
142
+ .eds_service_name;
143
+ }
144
+ return parent_->config_->discovery_mechanisms()[index_].cluster_name;
145
+ }
146
+
147
+ // Returns a pair containing the cluster and eds_service_name
148
+ // to use for LRS load reporting. Caller must ensure that config_ is set
149
+ // before calling.
150
+ std::pair<absl::string_view, absl::string_view> GetLrsClusterKey() const {
151
+ if (!parent_->is_xds_uri_) return {parent_->server_name_, nullptr};
152
+ return {
153
+ parent_->config_->discovery_mechanisms()[index_].cluster_name,
154
+ parent_->config_->discovery_mechanisms()[index_].eds_service_name};
155
+ }
156
+
157
+ protected:
158
+ XdsClusterResolverLb* parent() const { return parent_.get(); }
159
+ size_t index() const { return index_; }
160
+
161
+ private:
162
+ RefCountedPtr<XdsClusterResolverLb> parent_;
163
+ // Stores its own index in the vector of DiscoveryMechanism.
164
+ size_t index_;
165
+ };
166
+
167
+ class EdsDiscoveryMechanism : public DiscoveryMechanism {
168
+ public:
169
+ EdsDiscoveryMechanism(
170
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
171
+ size_t index)
172
+ : DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
173
+ void Start() override;
174
+ void Orphan() override;
175
+
176
+ private:
177
+ class EndpointWatcher : public XdsClient::EndpointWatcherInterface {
178
+ public:
179
+ explicit EndpointWatcher(
180
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism)
181
+ : discovery_mechanism_(std::move(discovery_mechanism)) {}
182
+ ~EndpointWatcher() override {
183
+ discovery_mechanism_.reset(DEBUG_LOCATION, "EndpointWatcher");
184
+ }
185
+ void OnEndpointChanged(XdsApi::EdsUpdate update) override {
186
+ new Notifier(discovery_mechanism_, std::move(update));
187
+ }
188
+ void OnError(grpc_error* error) override {
189
+ new Notifier(discovery_mechanism_, error);
190
+ }
191
+ void OnResourceDoesNotExist() override {
192
+ new Notifier(discovery_mechanism_);
193
+ }
194
+
195
+ private:
196
+ class Notifier {
197
+ public:
198
+ Notifier(RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism,
199
+ XdsApi::EdsUpdate update);
200
+ Notifier(RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism,
201
+ grpc_error* error);
202
+ explicit Notifier(
203
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism);
204
+ ~Notifier() { discovery_mechanism_.reset(DEBUG_LOCATION, "Notifier"); }
205
+
206
+ private:
207
+ enum Type { kUpdate, kError, kDoesNotExist };
208
+
209
+ static void RunInExecCtx(void* arg, grpc_error* error);
210
+ void RunInWorkSerializer(grpc_error* error);
211
+
212
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism_;
213
+ grpc_closure closure_;
214
+ XdsApi::EdsUpdate update_;
215
+ Type type_;
216
+ };
217
+
218
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism_;
219
+ };
220
+
221
+ // Note that this is not owned, so this pointer must never be dereferenced.
222
+ EndpointWatcher* watcher_ = nullptr;
223
+ };
224
+
225
+ class LogicalDNSDiscoveryMechanism : public DiscoveryMechanism {
226
+ public:
227
+ LogicalDNSDiscoveryMechanism(
228
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
229
+ size_t index)
230
+ : DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
231
+ void Start() override;
232
+ void Orphan() override;
233
+
234
+ private:
235
+ class ResolverResultHandler : public Resolver::ResultHandler {
236
+ public:
237
+ explicit ResolverResultHandler(
238
+ RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism)
239
+ : discovery_mechanism_(std::move(discovery_mechanism)) {}
240
+
241
+ ~ResolverResultHandler() override {}
242
+
243
+ void ReturnResult(Resolver::Result result) override;
244
+
245
+ void ReturnError(grpc_error* error) override;
246
+
247
+ private:
248
+ RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism_;
249
+ };
250
+ // This is only necessary because of a bug in msvc where nested class cannot
251
+ // access protected member in base class.
252
+ friend class ResolverResultHandler;
253
+ OrphanablePtr<Resolver> resolver_;
254
+ };
255
+
256
+ struct DiscoveryMechanismEntry {
257
+ OrphanablePtr<DiscoveryMechanism> discovery_mechanism;
258
+ bool first_update_received = false;
259
+ // Number of priorities this mechanism has contributed to priority_list_.
260
+ // (The sum of this across all discovery mechanisms should always equal
261
+ // the number of priorities in priority_list_.)
262
+ uint32_t num_priorities = 0;
263
+ RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config;
264
+ // Populated only when an update has been delivered by the mechanism
265
+ // but has not yet been applied to the LB policy's combined priority_list_.
266
+ absl::optional<XdsApi::EdsUpdate::PriorityList> pending_priority_list;
267
+ };
268
+
269
+ class Helper : public ChannelControlHelper {
270
+ public:
271
+ explicit Helper(
272
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_policy)
273
+ : xds_cluster_resolver_policy_(std::move(xds_cluster_resolver_policy)) {
274
+ }
275
+
276
+ ~Helper() override {
277
+ xds_cluster_resolver_policy_.reset(DEBUG_LOCATION, "Helper");
278
+ }
279
+
280
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
281
+ ServerAddress address, const grpc_channel_args& args) override;
282
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
283
+ std::unique_ptr<SubchannelPicker> picker) override;
284
+ // This is a no-op, because we get the addresses from the xds
285
+ // client, which is a watch-based API.
286
+ void RequestReresolution() override {}
287
+ void AddTraceEvent(TraceSeverity severity,
288
+ absl::string_view message) override;
289
+
290
+ private:
291
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_policy_;
292
+ };
293
+
294
+ ~XdsClusterResolverLb() override;
295
+
296
+ void ShutdownLocked() override;
297
+
298
+ void OnEndpointChanged(size_t index, XdsApi::EdsUpdate update);
299
+ void OnError(size_t index, grpc_error* error);
300
+ void OnResourceDoesNotExist(size_t index);
301
+
302
+ void MaybeDestroyChildPolicyLocked();
303
+
304
+ void UpdatePriorityList(XdsApi::EdsUpdate::PriorityList priority_list);
305
+ void UpdateChildPolicyLocked();
306
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
307
+ const grpc_channel_args* args);
308
+ ServerAddressList CreateChildPolicyAddressesLocked();
309
+ RefCountedPtr<Config> CreateChildPolicyConfigLocked();
310
+ grpc_channel_args* CreateChildPolicyArgsLocked(
311
+ const grpc_channel_args* args_in);
312
+
313
+ // Server name from target URI.
314
+ std::string server_name_;
315
+ bool is_xds_uri_;
316
+
317
+ // Current channel args and config from the resolver.
318
+ const grpc_channel_args* args_ = nullptr;
319
+ RefCountedPtr<XdsClusterResolverLbConfig> config_;
320
+
321
+ // Internal state.
322
+ bool shutting_down_ = false;
323
+
324
+ // The xds client and endpoint watcher.
325
+ RefCountedPtr<XdsClient> xds_client_;
326
+
327
+ // Vector of discovery mechansism entries in priority order.
328
+ std::vector<DiscoveryMechanismEntry> discovery_mechanisms_;
329
+
330
+ // The latest data from the endpoint watcher.
331
+ XdsApi::EdsUpdate::PriorityList priority_list_;
332
+ // State used to retain child policy names for priority policy.
333
+ std::vector<size_t /*child_number*/> priority_child_numbers_;
334
+
335
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
336
+ };
337
+
338
+ //
339
+ // XdsClusterResolverLb::Helper
340
+ //
341
+
342
+ RefCountedPtr<SubchannelInterface>
343
+ XdsClusterResolverLb::Helper::CreateSubchannel(ServerAddress address,
344
+ const grpc_channel_args& args) {
345
+ if (xds_cluster_resolver_policy_->shutting_down_) return nullptr;
346
+ return xds_cluster_resolver_policy_->channel_control_helper()
347
+ ->CreateSubchannel(std::move(address), args);
348
+ }
349
+
350
+ void XdsClusterResolverLb::Helper::UpdateState(
351
+ grpc_connectivity_state state, const absl::Status& status,
352
+ std::unique_ptr<SubchannelPicker> picker) {
353
+ if (xds_cluster_resolver_policy_->shutting_down_ ||
354
+ xds_cluster_resolver_policy_->child_policy_ == nullptr) {
355
+ return;
356
+ }
357
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
358
+ gpr_log(GPR_INFO,
359
+ "[xds_cluster_resolver_lb %p] child policy updated state=%s (%s) "
360
+ "picker=%p",
361
+ xds_cluster_resolver_policy_.get(), ConnectivityStateName(state),
362
+ status.ToString().c_str(), picker.get());
363
+ }
364
+ xds_cluster_resolver_policy_->channel_control_helper()->UpdateState(
365
+ state, status, std::move(picker));
366
+ }
367
+
368
+ void XdsClusterResolverLb::Helper::AddTraceEvent(TraceSeverity severity,
369
+ absl::string_view message) {
370
+ if (xds_cluster_resolver_policy_->shutting_down_) return;
371
+ xds_cluster_resolver_policy_->channel_control_helper()->AddTraceEvent(
372
+ severity, message);
373
+ }
374
+
375
+ //
376
+ // XdsClusterResolverLb::EdsDiscoveryMechanism
377
+ //
378
+
379
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::Start() {
380
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
381
+ gpr_log(GPR_INFO,
382
+ "[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
383
+ ":%p starting xds watch for %s",
384
+ parent(), index(), this,
385
+ std::string(GetXdsClusterResolverResourceName()).c_str());
386
+ }
387
+ auto watcher = absl::make_unique<EndpointWatcher>(
388
+ Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"));
389
+ watcher_ = watcher.get();
390
+ parent()->xds_client_->WatchEndpointData(GetXdsClusterResolverResourceName(),
391
+ std::move(watcher));
392
+ }
393
+
394
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::Orphan() {
395
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
396
+ gpr_log(GPR_INFO,
397
+ "[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
398
+ ":%p cancelling xds watch for %s",
399
+ parent(), index(), this,
400
+ std::string(GetXdsClusterResolverResourceName()).c_str());
401
+ }
402
+ parent()->xds_client_->CancelEndpointDataWatch(
403
+ GetXdsClusterResolverResourceName(), watcher_);
404
+ Unref();
405
+ }
406
+
407
+ //
408
+ // XdsClusterResolverLb::EndpointWatcher::Notifier
409
+ //
410
+
411
+ XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
412
+ Notifier(RefCountedPtr<XdsClusterResolverLb::EdsDiscoveryMechanism>
413
+ discovery_mechanism,
414
+ XdsApi::EdsUpdate update)
415
+ : discovery_mechanism_(std::move(discovery_mechanism)),
416
+ update_(std::move(update)),
417
+ type_(kUpdate) {
418
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
419
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
420
+ }
421
+
422
+ XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
423
+ Notifier(RefCountedPtr<XdsClusterResolverLb::EdsDiscoveryMechanism>
424
+ discovery_mechanism,
425
+ grpc_error* error)
426
+ : discovery_mechanism_(std::move(discovery_mechanism)), type_(kError) {
427
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
428
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
429
+ }
430
+
431
+ XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
432
+ Notifier(RefCountedPtr<XdsClusterResolverLb::EdsDiscoveryMechanism>
433
+ discovery_mechanism)
434
+ : discovery_mechanism_(std::move(discovery_mechanism)),
435
+ type_(kDoesNotExist) {
436
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
437
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
438
+ }
439
+
440
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
441
+ RunInExecCtx(void* arg, grpc_error* error) {
442
+ Notifier* self = static_cast<Notifier*>(arg);
443
+ GRPC_ERROR_REF(error);
444
+ self->discovery_mechanism_->parent()->work_serializer()->Run(
445
+ [self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
446
+ }
447
+
448
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
449
+ RunInWorkSerializer(grpc_error* error) {
450
+ switch (type_) {
451
+ case kUpdate:
452
+ discovery_mechanism_->parent()->OnEndpointChanged(
453
+ discovery_mechanism_->index(), std::move(update_));
454
+ break;
455
+ case kError:
456
+ discovery_mechanism_->parent()->OnError(discovery_mechanism_->index(),
457
+ error);
458
+ break;
459
+ case kDoesNotExist:
460
+ discovery_mechanism_->parent()->OnResourceDoesNotExist(
461
+ discovery_mechanism_->index());
462
+ break;
463
+ };
464
+ delete this;
465
+ }
466
+
467
+ //
468
+ // XdsClusterResolverLb::LogicalDNSDiscoveryMechanism
469
+ //
470
+
471
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Start() {
472
+ resolver_ = ResolverRegistry::CreateResolver(
473
+ parent()->server_name_.c_str(), parent()->args_,
474
+ grpc_pollset_set_create(), parent()->work_serializer(),
475
+ absl::make_unique<ResolverResultHandler>(
476
+ Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism")));
477
+ if (resolver_ == nullptr) {
478
+ parent()->OnResourceDoesNotExist(index());
479
+ return;
480
+ }
481
+ resolver_->StartLocked();
482
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
483
+ gpr_log(GPR_INFO,
484
+ "[xds_cluster_resolver_lb %p] logical DNS discovery mechanism "
485
+ "%" PRIuPTR ":%p starting dns resolver %p",
486
+ parent(), index(), this, resolver_.get());
487
+ }
488
+ }
489
+
490
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Orphan() {
491
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
492
+ gpr_log(
493
+ GPR_INFO,
494
+ "[xds_cluster_resolver_lb %p] logical DNS discovery mechanism %" PRIuPTR
495
+ ":%p shutting down dns resolver %p",
496
+ parent(), index(), this, resolver_.get());
497
+ }
498
+ resolver_.reset();
499
+ Unref();
500
+ }
501
+
502
+ //
503
+ // XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler
504
+ //
505
+
506
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler::
507
+ ReturnResult(Resolver::Result result) {
508
+ // convert result to eds update
509
+ XdsApi::EdsUpdate update;
510
+ XdsApi::EdsUpdate::Priority::Locality locality;
511
+ locality.name = MakeRefCounted<XdsLocalityName>("", "", "");
512
+ locality.endpoints = std::move(result.addresses);
513
+ update.priorities[0].localities.emplace(locality.name.get(),
514
+ std::move(locality));
515
+ discovery_mechanism_->parent()->OnEndpointChanged(
516
+ discovery_mechanism_->index(), std::move(update));
517
+ }
518
+
519
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler::
520
+ ReturnError(grpc_error* error) {
521
+ discovery_mechanism_->parent()->OnError(discovery_mechanism_->index(), error);
522
+ }
523
+
524
+ //
525
+ // XdsClusterResolverLb public methods
526
+ //
527
+
528
+ XdsClusterResolverLb::XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client,
529
+ Args args)
530
+ : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
531
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
532
+ gpr_log(GPR_INFO,
533
+ "[xds_cluster_resolver_lb %p] created -- using xds client %p", this,
534
+ xds_client_.get());
535
+ }
536
+ // Record server name.
537
+ const char* server_uri =
538
+ grpc_channel_args_find_string(args.args, GRPC_ARG_SERVER_URI);
539
+ GPR_ASSERT(server_uri != nullptr);
540
+ absl::StatusOr<URI> uri = URI::Parse(server_uri);
541
+ GPR_ASSERT(uri.ok() && !uri->path().empty());
542
+ server_name_ = std::string(absl::StripPrefix(uri->path(), "/"));
543
+ is_xds_uri_ = uri->scheme() == "xds";
544
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
545
+ gpr_log(GPR_INFO,
546
+ "[xds_cluster_resolver_lb %p] server name from channel "
547
+ "(is_xds_uri=%d): %s",
548
+ this, is_xds_uri_, server_name_.c_str());
549
+ }
550
+ // EDS-only flow.
551
+ if (!is_xds_uri_) {
552
+ // Setup channelz linkage.
553
+ channelz::ChannelNode* parent_channelz_node =
554
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
555
+ args.args, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
556
+ if (parent_channelz_node != nullptr) {
557
+ xds_client_->AddChannelzLinkage(parent_channelz_node);
558
+ }
559
+ // Couple polling.
560
+ grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
561
+ interested_parties());
562
+ }
563
+ }
564
+
565
+ XdsClusterResolverLb::~XdsClusterResolverLb() {
566
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
567
+ gpr_log(GPR_INFO,
568
+ "[xds_cluster_resolver_lb %p] destroying xds_cluster_resolver LB "
569
+ "policy",
570
+ this);
571
+ }
572
+ }
573
+
574
+ void XdsClusterResolverLb::ShutdownLocked() {
575
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
576
+ gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] shutting down", this);
577
+ }
578
+ shutting_down_ = true;
579
+ MaybeDestroyChildPolicyLocked();
580
+ discovery_mechanisms_.clear();
581
+ if (!is_xds_uri_) {
582
+ // Remove channelz linkage.
583
+ channelz::ChannelNode* parent_channelz_node =
584
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
585
+ args_, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
586
+ if (parent_channelz_node != nullptr) {
587
+ xds_client_->RemoveChannelzLinkage(parent_channelz_node);
588
+ }
589
+ // Decouple polling.
590
+ grpc_pollset_set_del_pollset_set(xds_client_->interested_parties(),
591
+ interested_parties());
592
+ }
593
+ xds_client_.reset(DEBUG_LOCATION, "XdsClusterResolverLb");
594
+ // Destroy channel args.
595
+ grpc_channel_args_destroy(args_);
596
+ args_ = nullptr;
597
+ }
598
+
599
+ void XdsClusterResolverLb::MaybeDestroyChildPolicyLocked() {
600
+ if (child_policy_ != nullptr) {
601
+ grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
602
+ interested_parties());
603
+ child_policy_.reset();
604
+ }
605
+ }
606
+
607
+ void XdsClusterResolverLb::UpdateLocked(UpdateArgs args) {
608
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
609
+ gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Received update", this);
610
+ }
611
+ const bool is_initial_update = args_ == nullptr;
612
+ // Update config.
613
+ auto old_config = std::move(config_);
614
+ config_ = std::move(args.config);
615
+ // Update args.
616
+ grpc_channel_args_destroy(args_);
617
+ args_ = args.args;
618
+ args.args = nullptr;
619
+ // Update child policy if needed.
620
+ if (child_policy_ != nullptr) UpdateChildPolicyLocked();
621
+ // Create endpoint watcher if needed.
622
+ if (is_initial_update) {
623
+ for (const auto& config : config_->discovery_mechanisms()) {
624
+ DiscoveryMechanismEntry entry;
625
+ if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
626
+ DiscoveryMechanismType::EDS) {
627
+ entry.discovery_mechanism =
628
+ grpc_core::MakeOrphanable<EdsDiscoveryMechanism>(
629
+ Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"),
630
+ discovery_mechanisms_.size());
631
+ } else if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
632
+ DiscoveryMechanismType::LOGICAL_DNS) {
633
+ entry.discovery_mechanism =
634
+ grpc_core::MakeOrphanable<LogicalDNSDiscoveryMechanism>(
635
+ Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism"),
636
+ discovery_mechanisms_.size());
637
+ } else {
638
+ GPR_ASSERT(0);
639
+ }
640
+ discovery_mechanisms_.push_back(std::move(entry));
641
+ }
642
+ // Call start() on all discovery mechanisms after creation.
643
+ for (const auto& discovery_mechanism : discovery_mechanisms_) {
644
+ discovery_mechanism.discovery_mechanism->Start();
645
+ }
646
+ }
647
+ }
648
+
649
+ void XdsClusterResolverLb::ResetBackoffLocked() {
650
+ // When the XdsClient is instantiated in the resolver instead of in this
651
+ // LB policy, this is done via the resolver, so we don't need to do it here.
652
+ if (!is_xds_uri_ && xds_client_ != nullptr) xds_client_->ResetBackoff();
653
+ if (child_policy_ != nullptr) {
654
+ child_policy_->ResetBackoffLocked();
655
+ }
656
+ }
657
+
658
+ void XdsClusterResolverLb::OnEndpointChanged(size_t index,
659
+ XdsApi::EdsUpdate update) {
660
+ if (shutting_down_) return;
661
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
662
+ gpr_log(GPR_INFO,
663
+ "[xds_cluster_resolver_lb %p] Received update from xds client"
664
+ " for discovery mechanism %" PRIuPTR "",
665
+ this, index);
666
+ }
667
+ // We need at least one priority for each discovery mechanism, just so that we
668
+ // have a child in which to create the xds_cluster_impl policy. This ensures
669
+ // that we properly handle the case of a discovery mechanism dropping 100% of
670
+ // calls, the OnError() case, and the OnResourceDoesNotExist() case.
671
+ if (update.priorities.empty()) update.priorities.emplace_back();
672
+ discovery_mechanisms_[index].drop_config = std::move(update.drop_config);
673
+ discovery_mechanisms_[index].pending_priority_list =
674
+ std::move(update.priorities);
675
+ discovery_mechanisms_[index].first_update_received = true;
676
+ if (!discovery_mechanisms_[0].first_update_received) {
677
+ // We have not yet received an update for index 0, so wait until that
678
+ // happens to create the child policy.
679
+ return;
680
+ }
681
+ // Construct new priority list.
682
+ XdsApi::EdsUpdate::PriorityList priority_list;
683
+ size_t priority_index = 0;
684
+ for (DiscoveryMechanismEntry& mechanism : discovery_mechanisms_) {
685
+ // If the mechanism has a pending update, use that.
686
+ // Otherwise, use the priorities that it previously contributed to the
687
+ // combined list.
688
+ if (mechanism.pending_priority_list.has_value()) {
689
+ priority_list.insert(priority_list.end(),
690
+ mechanism.pending_priority_list->begin(),
691
+ mechanism.pending_priority_list->end());
692
+ priority_index += mechanism.num_priorities;
693
+ mechanism.num_priorities = mechanism.pending_priority_list->size();
694
+ mechanism.pending_priority_list.reset();
695
+ } else {
696
+ priority_list.insert(
697
+ priority_list.end(), priority_list_.begin() + priority_index,
698
+ priority_list_.begin() + priority_index + mechanism.num_priorities);
699
+ priority_index += mechanism.num_priorities;
700
+ }
701
+ }
702
+ // Update child policy.
703
+ UpdatePriorityList(std::move(priority_list));
704
+ }
705
+
706
+ void XdsClusterResolverLb::OnError(size_t index, grpc_error* error) {
707
+ gpr_log(GPR_ERROR,
708
+ "[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
709
+ " xds watcher reported error: %s",
710
+ this, index, grpc_error_string(error));
711
+ GRPC_ERROR_UNREF(error);
712
+ if (shutting_down_) return;
713
+ if (!discovery_mechanisms_[index].first_update_received) {
714
+ // Call OnEndpointChanged with an empty update just like
715
+ // OnResourceDoesNotExist.
716
+ OnEndpointChanged(index, XdsApi::EdsUpdate());
717
+ }
718
+ }
719
+
720
+ void XdsClusterResolverLb::OnResourceDoesNotExist(size_t index) {
721
+ gpr_log(GPR_ERROR,
722
+ "[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
723
+ " resource does not exist",
724
+ this, index);
725
+ if (shutting_down_) return;
726
+ // Call OnEndpointChanged with an empty update.
727
+ OnEndpointChanged(index, XdsApi::EdsUpdate());
728
+ }
729
+
730
+ //
731
+ // child policy-related methods
732
+ //
733
+
734
+ void XdsClusterResolverLb::UpdatePriorityList(
735
+ XdsApi::EdsUpdate::PriorityList priority_list) {
736
+ // Build some maps from locality to child number and the reverse from
737
+ // the old data in priority_list_ and priority_child_numbers_.
738
+ std::map<XdsLocalityName*, size_t /*child_number*/, XdsLocalityName::Less>
739
+ locality_child_map;
740
+ std::map<size_t, std::set<XdsLocalityName*>> child_locality_map;
741
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
742
+ size_t child_number = priority_child_numbers_[priority];
743
+ const auto& localities = priority_list_[priority].localities;
744
+ for (const auto& p : localities) {
745
+ XdsLocalityName* locality_name = p.first;
746
+ locality_child_map[locality_name] = child_number;
747
+ child_locality_map[child_number].insert(locality_name);
748
+ }
749
+ }
750
+ // Construct new list of children.
751
+ std::vector<size_t> priority_child_numbers;
752
+ for (size_t priority = 0; priority < priority_list.size(); ++priority) {
753
+ const auto& localities = priority_list[priority].localities;
754
+ absl::optional<size_t> child_number;
755
+ // If one of the localities in this priority already existed, reuse its
756
+ // child number.
757
+ for (const auto& p : localities) {
758
+ XdsLocalityName* locality_name = p.first;
759
+ if (!child_number.has_value()) {
760
+ auto it = locality_child_map.find(locality_name);
761
+ if (it != locality_child_map.end()) {
762
+ child_number = it->second;
763
+ locality_child_map.erase(it);
764
+ // Remove localities that *used* to be in this child number, so
765
+ // that we don't incorrectly reuse this child number for a
766
+ // subsequent priority.
767
+ for (XdsLocalityName* old_locality :
768
+ child_locality_map[*child_number]) {
769
+ locality_child_map.erase(old_locality);
770
+ }
771
+ }
772
+ } else {
773
+ // Remove all localities that are now in this child number, so
774
+ // that we don't accidentally reuse this child number for a
775
+ // subsequent priority.
776
+ locality_child_map.erase(locality_name);
777
+ }
778
+ }
779
+ // If we didn't find an existing child number, assign a new one.
780
+ if (!child_number.has_value()) {
781
+ for (child_number = 0;
782
+ child_locality_map.find(*child_number) != child_locality_map.end();
783
+ ++(*child_number)) {
784
+ }
785
+ // Add entry so we know that the child number is in use.
786
+ // (Don't need to add the list of localities, since we won't use them.)
787
+ child_locality_map[*child_number];
788
+ }
789
+ priority_child_numbers.push_back(*child_number);
790
+ }
791
+ // Save update.
792
+ priority_list_ = std::move(priority_list);
793
+ priority_child_numbers_ = std::move(priority_child_numbers);
794
+ // Update child policy.
795
+ UpdateChildPolicyLocked();
796
+ }
797
+
798
+ ServerAddressList XdsClusterResolverLb::CreateChildPolicyAddressesLocked() {
799
+ ServerAddressList addresses;
800
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
801
+ const auto& localities = priority_list_[priority].localities;
802
+ std::string priority_child_name =
803
+ absl::StrCat("child", priority_child_numbers_[priority]);
804
+ for (const auto& p : localities) {
805
+ const auto& locality_name = p.first;
806
+ const auto& locality = p.second;
807
+ std::vector<std::string> hierarchical_path = {
808
+ priority_child_name, locality_name->AsHumanReadableString()};
809
+ for (const auto& endpoint : locality.endpoints) {
810
+ addresses.emplace_back(
811
+ endpoint
812
+ .WithAttribute(kHierarchicalPathAttributeKey,
813
+ MakeHierarchicalPathAttribute(hierarchical_path))
814
+ .WithAttribute(kXdsLocalityNameAttributeKey,
815
+ absl::make_unique<XdsLocalityAttribute>(
816
+ locality_name->Ref())));
817
+ }
818
+ }
819
+ }
820
+ return addresses;
821
+ }
822
+
823
+ RefCountedPtr<LoadBalancingPolicy::Config>
824
+ XdsClusterResolverLb::CreateChildPolicyConfigLocked() {
825
+ Json::Object priority_children;
826
+ Json::Array priority_priorities;
827
+ // Setting up index to iterate through the discovery mechanisms and keeping
828
+ // track the discovery_mechanism each prioirty belongs to.
829
+ size_t discovery_index = 0;
830
+ // Setting up num_priorities_remaining to track the priorities in each
831
+ // discovery_mechanism.
832
+ size_t num_priorities_remaining_in_discovery =
833
+ discovery_mechanisms_[discovery_index].num_priorities;
834
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
835
+ // Each prioirty in the priority_list_ should correspond to a priority in a
836
+ // discovery mechanism in discovery_mechanisms_ (both in the same order).
837
+ // Keeping track of the discovery_mechanism each prioirty belongs to.
838
+ if (num_priorities_remaining_in_discovery == 0) {
839
+ ++discovery_index;
840
+ num_priorities_remaining_in_discovery =
841
+ discovery_mechanisms_[discovery_index].num_priorities;
842
+ } else {
843
+ --num_priorities_remaining_in_discovery;
844
+ }
845
+ const auto& localities = priority_list_[priority].localities;
846
+ Json::Object weighted_targets;
847
+ for (const auto& p : localities) {
848
+ XdsLocalityName* locality_name = p.first;
849
+ const auto& locality = p.second;
850
+ // Construct JSON object containing locality name.
851
+ Json::Object locality_name_json;
852
+ if (!locality_name->region().empty()) {
853
+ locality_name_json["region"] = locality_name->region();
854
+ }
855
+ if (!locality_name->zone().empty()) {
856
+ locality_name_json["zone"] = locality_name->zone();
857
+ }
858
+ if (!locality_name->sub_zone().empty()) {
859
+ locality_name_json["subzone"] = locality_name->sub_zone();
860
+ }
861
+ // Add weighted target entry.
862
+ weighted_targets[locality_name->AsHumanReadableString()] = Json::Object{
863
+ {"weight", locality.lb_weight},
864
+ {"childPolicy", config_->endpoint_picking_policy()},
865
+ };
866
+ }
867
+ // Construct locality-picking policy.
868
+ // Start with field from our config and add the "targets" field.
869
+ Json locality_picking_config = config_->locality_picking_policy();
870
+ Json::Object& config =
871
+ *(*locality_picking_config.mutable_array())[0].mutable_object();
872
+ auto it = config.begin();
873
+ GPR_ASSERT(it != config.end());
874
+ (*it->second.mutable_object())["targets"] = std::move(weighted_targets);
875
+ // Wrap it in the drop policy.
876
+ Json::Array drop_categories;
877
+ if (discovery_mechanisms_[discovery_index].drop_config != nullptr) {
878
+ for (const auto& category : discovery_mechanisms_[discovery_index]
879
+ .drop_config->drop_category_list()) {
880
+ drop_categories.push_back(Json::Object{
881
+ {"category", category.name},
882
+ {"requests_per_million", category.parts_per_million},
883
+ });
884
+ }
885
+ }
886
+ const auto lrs_key = discovery_mechanisms_[discovery_index]
887
+ .discovery_mechanism->GetLrsClusterKey();
888
+ Json::Object xds_cluster_impl_config = {
889
+ {"clusterName", std::string(lrs_key.first)},
890
+ {"childPolicy", std::move(locality_picking_config)},
891
+ {"dropCategories", std::move(drop_categories)},
892
+ {"maxConcurrentRequests",
893
+ config_->discovery_mechanisms()[discovery_index]
894
+ .max_concurrent_requests},
895
+ };
896
+ if (!lrs_key.second.empty()) {
897
+ xds_cluster_impl_config["edsServiceName"] = std::string(lrs_key.second);
898
+ }
899
+ if (config_->discovery_mechanisms()[discovery_index]
900
+ .lrs_load_reporting_server_name.has_value()) {
901
+ xds_cluster_impl_config["lrsLoadReportingServerName"] =
902
+ config_->discovery_mechanisms()[discovery_index]
903
+ .lrs_load_reporting_server_name.value();
904
+ }
905
+ Json locality_picking_policy = Json::Array{Json::Object{
906
+ {"xds_cluster_impl_experimental", std::move(xds_cluster_impl_config)},
907
+ }};
908
+ // Add priority entry.
909
+ const size_t child_number = priority_child_numbers_[priority];
910
+ std::string child_name = absl::StrCat("child", child_number);
911
+ priority_priorities.emplace_back(child_name);
912
+ priority_children[child_name] = Json::Object{
913
+ {"config", std::move(locality_picking_policy)},
914
+ {"ignore_reresolution_requests", true},
915
+ };
916
+ }
917
+ // There should be matching number of priorities in discovery_mechanisms_ and
918
+ // in priority_list_; therefore at the end of looping through all the
919
+ // priorities, num_priorities_remaining should be down to 0, and index should
920
+ // be the last index in discovery_mechanisms_.
921
+ GPR_ASSERT(num_priorities_remaining_in_discovery == 0);
922
+ GPR_ASSERT(discovery_index == discovery_mechanisms_.size() - 1);
923
+ Json json = Json::Array{Json::Object{
924
+ {"priority_experimental",
925
+ Json::Object{
926
+ {"children", std::move(priority_children)},
927
+ {"priorities", std::move(priority_priorities)},
928
+ }},
929
+ }};
930
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
931
+ std::string json_str = json.Dump(/*indent=*/1);
932
+ gpr_log(
933
+ GPR_INFO,
934
+ "[xds_cluster_resolver_lb %p] generated config for child policy: %s",
935
+ this, json_str.c_str());
936
+ }
937
+ grpc_error* error = GRPC_ERROR_NONE;
938
+ RefCountedPtr<LoadBalancingPolicy::Config> config =
939
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
940
+ if (error != GRPC_ERROR_NONE) {
941
+ // This should never happen, but if it does, we basically have no
942
+ // way to fix it, so we put the channel in TRANSIENT_FAILURE.
943
+ gpr_log(GPR_ERROR,
944
+ "[xds_cluster_resolver_lb %p] error parsing generated child policy "
945
+ "config -- "
946
+ "will put channel in TRANSIENT_FAILURE: %s",
947
+ this, grpc_error_string(error));
948
+ error = grpc_error_set_int(
949
+ grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
950
+ "xds_cluster_resolver LB policy: error "
951
+ "parsing generated child policy config"),
952
+ error),
953
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
954
+ channel_control_helper()->UpdateState(
955
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
956
+ absl::make_unique<TransientFailurePicker>(error));
957
+ return nullptr;
958
+ }
959
+ return config;
960
+ }
961
+
962
+ void XdsClusterResolverLb::UpdateChildPolicyLocked() {
963
+ if (shutting_down_) return;
964
+ UpdateArgs update_args;
965
+ update_args.config = CreateChildPolicyConfigLocked();
966
+ if (update_args.config == nullptr) return;
967
+ update_args.addresses = CreateChildPolicyAddressesLocked();
968
+ update_args.args = CreateChildPolicyArgsLocked(args_);
969
+ if (child_policy_ == nullptr) {
970
+ child_policy_ = CreateChildPolicyLocked(update_args.args);
971
+ }
972
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
973
+ gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Updating child policy %p",
974
+ this, child_policy_.get());
975
+ }
976
+ child_policy_->UpdateLocked(std::move(update_args));
977
+ }
978
+
979
+ grpc_channel_args* XdsClusterResolverLb::CreateChildPolicyArgsLocked(
980
+ const grpc_channel_args* args) {
981
+ // Inhibit client-side health checking, since the balancer does this for us.
982
+ grpc_arg new_arg = grpc_channel_arg_integer_create(
983
+ const_cast<char*>(GRPC_ARG_INHIBIT_HEALTH_CHECKING), 1);
984
+ return grpc_channel_args_copy_and_add(args, &new_arg, 1);
985
+ }
986
+
987
+ OrphanablePtr<LoadBalancingPolicy>
988
+ XdsClusterResolverLb::CreateChildPolicyLocked(const grpc_channel_args* args) {
989
+ LoadBalancingPolicy::Args lb_policy_args;
990
+ lb_policy_args.work_serializer = work_serializer();
991
+ lb_policy_args.args = args;
992
+ lb_policy_args.channel_control_helper =
993
+ absl::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
994
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
995
+ LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
996
+ "priority_experimental", std::move(lb_policy_args));
997
+ if (GPR_UNLIKELY(lb_policy == nullptr)) {
998
+ gpr_log(GPR_ERROR,
999
+ "[xds_cluster_resolver_lb %p] failure creating child policy", this);
1000
+ return nullptr;
1001
+ }
1002
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
1003
+ gpr_log(GPR_INFO,
1004
+ "[xds_cluster_resolver_lb %p]: Created new child policy %p", this,
1005
+ lb_policy.get());
1006
+ }
1007
+ // Add our interested_parties pollset_set to that of the newly created
1008
+ // child policy. This will make the child policy progress upon activity on
1009
+ // this policy, which in turn is tied to the application's call.
1010
+ grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
1011
+ interested_parties());
1012
+ return lb_policy;
1013
+ }
1014
+
1015
+ //
1016
+ // factory
1017
+ //
1018
+
1019
+ class XdsClusterResolverLbFactory : public LoadBalancingPolicyFactory {
1020
+ public:
1021
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1022
+ LoadBalancingPolicy::Args args) const override {
1023
+ grpc_error* error = GRPC_ERROR_NONE;
1024
+ RefCountedPtr<XdsClient> xds_client = XdsClient::GetOrCreate(&error);
1025
+ if (error != GRPC_ERROR_NONE) {
1026
+ gpr_log(GPR_ERROR,
1027
+ "cannot get XdsClient to instantiate xds_cluster_resolver LB "
1028
+ "policy: %s",
1029
+ grpc_error_string(error));
1030
+ GRPC_ERROR_UNREF(error);
1031
+ return nullptr;
1032
+ }
1033
+ return MakeOrphanable<XdsClusterResolverChildHandler>(std::move(xds_client),
1034
+ std::move(args));
1035
+ }
1036
+
1037
+ const char* name() const override { return kXdsClusterResolver; }
1038
+
1039
+ RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
1040
+ const Json& json, grpc_error** error) const override {
1041
+ GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
1042
+ if (json.type() == Json::Type::JSON_NULL) {
1043
+ // xds_cluster_resolver was mentioned as a policy in the deprecated
1044
+ // loadBalancingPolicy field or in the client API.
1045
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1046
+ "field:loadBalancingPolicy error:xds_cluster_resolver policy "
1047
+ "requires configuration. "
1048
+ "Please use loadBalancingConfig field of service config instead.");
1049
+ return nullptr;
1050
+ }
1051
+ std::vector<grpc_error*> error_list;
1052
+ std::vector<XdsClusterResolverLbConfig::DiscoveryMechanism>
1053
+ discovery_mechanisms;
1054
+ auto it = json.object_value().find("discoveryMechanisms");
1055
+ if (it == json.object_value().end()) {
1056
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1057
+ "field:discoveryMechanisms error:required field missing"));
1058
+ } else if (it->second.type() != Json::Type::ARRAY) {
1059
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1060
+ "field:discoveryMechanisms error:type should be array"));
1061
+ } else {
1062
+ const Json::Array& array = it->second.array_value();
1063
+ for (size_t i = 0; i < array.size(); ++i) {
1064
+ XdsClusterResolverLbConfig::DiscoveryMechanism discovery_mechanism;
1065
+ std::vector<grpc_error*> discovery_mechanism_errors =
1066
+ ParseDiscoveryMechanism(array[i], &discovery_mechanism);
1067
+ if (!discovery_mechanism_errors.empty()) {
1068
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1069
+ absl::StrCat("field:discovery_mechanism element: ", i, " error")
1070
+ .c_str());
1071
+ for (grpc_error* discovery_mechanism_error :
1072
+ discovery_mechanism_errors) {
1073
+ error = grpc_error_add_child(error, discovery_mechanism_error);
1074
+ }
1075
+ error_list.push_back(error);
1076
+ }
1077
+ discovery_mechanisms.emplace_back(std::move(discovery_mechanism));
1078
+ }
1079
+ }
1080
+ // Locality-picking policy.
1081
+ Json locality_picking_policy;
1082
+ it = json.object_value().find("localityPickingPolicy");
1083
+ if (it == json.object_value().end()) {
1084
+ locality_picking_policy = Json::Array{
1085
+ Json::Object{
1086
+ {"weighted_target_experimental",
1087
+ Json::Object{
1088
+ {"targets", Json::Object()},
1089
+ }},
1090
+ },
1091
+ };
1092
+ } else {
1093
+ locality_picking_policy = it->second;
1094
+ }
1095
+ grpc_error* parse_error = GRPC_ERROR_NONE;
1096
+ if (LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1097
+ locality_picking_policy, &parse_error) == nullptr) {
1098
+ GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
1099
+ error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1100
+ "localityPickingPolicy", &parse_error, 1));
1101
+ GRPC_ERROR_UNREF(parse_error);
1102
+ }
1103
+ // Endpoint-picking policy. Called "childPolicy" for xds policy.
1104
+ Json endpoint_picking_policy;
1105
+ it = json.object_value().find("endpointPickingPolicy");
1106
+ if (it == json.object_value().end()) {
1107
+ endpoint_picking_policy = Json::Array{
1108
+ Json::Object{
1109
+ {"round_robin", Json::Object()},
1110
+ },
1111
+ };
1112
+ } else {
1113
+ endpoint_picking_policy = it->second;
1114
+ }
1115
+ parse_error = GRPC_ERROR_NONE;
1116
+ if (LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1117
+ endpoint_picking_policy, &parse_error) == nullptr) {
1118
+ GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
1119
+ error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
1120
+ "endpointPickingPolicy", &parse_error, 1));
1121
+ GRPC_ERROR_UNREF(parse_error);
1122
+ }
1123
+ if (discovery_mechanisms.empty()) {
1124
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1125
+ "field:discovery_mechanism error:list is missing or empty"));
1126
+ }
1127
+ // Construct config.
1128
+ if (error_list.empty()) {
1129
+ return MakeRefCounted<XdsClusterResolverLbConfig>(
1130
+ std::move(discovery_mechanisms), std::move(locality_picking_policy),
1131
+ std::move(endpoint_picking_policy));
1132
+ } else {
1133
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR(
1134
+ "xds_cluster_resolver_experimental LB policy config", &error_list);
1135
+ return nullptr;
1136
+ }
1137
+ }
1138
+
1139
+ private:
1140
+ static std::vector<grpc_error*> ParseDiscoveryMechanism(
1141
+ const Json& json,
1142
+ XdsClusterResolverLbConfig::DiscoveryMechanism* discovery_mechanism) {
1143
+ std::vector<grpc_error*> error_list;
1144
+ if (json.type() != Json::Type::OBJECT) {
1145
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1146
+ "value should be of type object"));
1147
+ return error_list;
1148
+ }
1149
+ // Cluster name.
1150
+ auto it = json.object_value().find("clusterName");
1151
+ if (it == json.object_value().end()) {
1152
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1153
+ "field:clusterName error:required field missing"));
1154
+ } else if (it->second.type() != Json::Type::STRING) {
1155
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1156
+ "field:clusterName error:type should be string"));
1157
+ } else {
1158
+ discovery_mechanism->cluster_name = it->second.string_value();
1159
+ }
1160
+ // LRS load reporting server name.
1161
+ it = json.object_value().find("lrsLoadReportingServerName");
1162
+ if (it != json.object_value().end()) {
1163
+ if (it->second.type() != Json::Type::STRING) {
1164
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1165
+ "field:lrsLoadReportingServerName error:type should be string"));
1166
+ } else {
1167
+ discovery_mechanism->lrs_load_reporting_server_name.emplace(
1168
+ it->second.string_value());
1169
+ }
1170
+ }
1171
+ // Max concurrent requests.
1172
+ discovery_mechanism->max_concurrent_requests = 1024;
1173
+ it = json.object_value().find("max_concurrent_requests");
1174
+ if (it != json.object_value().end()) {
1175
+ if (it->second.type() != Json::Type::NUMBER) {
1176
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1177
+ "field:max_concurrent_requests error:must be of type number"));
1178
+ } else {
1179
+ discovery_mechanism->max_concurrent_requests =
1180
+ gpr_parse_nonnegative_int(it->second.string_value().c_str());
1181
+ }
1182
+ }
1183
+ // Discovery Mechanism type
1184
+ it = json.object_value().find("type");
1185
+ if (it == json.object_value().end()) {
1186
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1187
+ "field:type error:required field missing"));
1188
+ } else if (it->second.type() != Json::Type::STRING) {
1189
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1190
+ "field:type error:type should be string"));
1191
+ } else {
1192
+ if (it->second.string_value() == "EDS") {
1193
+ discovery_mechanism->type = XdsClusterResolverLbConfig::
1194
+ DiscoveryMechanism::DiscoveryMechanismType::EDS;
1195
+ } else if (it->second.string_value() == "LOGICAL_DNS") {
1196
+ discovery_mechanism->type = XdsClusterResolverLbConfig::
1197
+ DiscoveryMechanism::DiscoveryMechanismType::LOGICAL_DNS;
1198
+ } else {
1199
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1200
+ "field:type error:invalid type"));
1201
+ }
1202
+ }
1203
+ // EDS service name.
1204
+ it = json.object_value().find("edsServiceName");
1205
+ if (it != json.object_value().end()) {
1206
+ if (it->second.type() != Json::Type::STRING) {
1207
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1208
+ "field:xds_cluster_resolverServiceName error:type should be "
1209
+ "string"));
1210
+ } else {
1211
+ discovery_mechanism->eds_service_name = it->second.string_value();
1212
+ }
1213
+ }
1214
+ return error_list;
1215
+ }
1216
+
1217
+ class XdsClusterResolverChildHandler : public ChildPolicyHandler {
1218
+ public:
1219
+ XdsClusterResolverChildHandler(RefCountedPtr<XdsClient> xds_client,
1220
+ Args args)
1221
+ : ChildPolicyHandler(std::move(args),
1222
+ &grpc_lb_xds_cluster_resolver_trace),
1223
+ xds_client_(std::move(xds_client)) {}
1224
+
1225
+ bool ConfigChangeRequiresNewPolicyInstance(
1226
+ LoadBalancingPolicy::Config* old_config,
1227
+ LoadBalancingPolicy::Config* new_config) const override {
1228
+ GPR_ASSERT(old_config->name() == kXdsClusterResolver);
1229
+ GPR_ASSERT(new_config->name() == kXdsClusterResolver);
1230
+ XdsClusterResolverLbConfig* old_xds_cluster_resolver_config =
1231
+ static_cast<XdsClusterResolverLbConfig*>(old_config);
1232
+ XdsClusterResolverLbConfig* new_xds_cluster_resolver_config =
1233
+ static_cast<XdsClusterResolverLbConfig*>(new_config);
1234
+ return old_xds_cluster_resolver_config->discovery_mechanisms() !=
1235
+ new_xds_cluster_resolver_config->discovery_mechanisms();
1236
+ }
1237
+
1238
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1239
+ const char* name, LoadBalancingPolicy::Args args) const override {
1240
+ return MakeOrphanable<XdsClusterResolverLb>(xds_client_, std::move(args));
1241
+ }
1242
+
1243
+ private:
1244
+ RefCountedPtr<XdsClient> xds_client_;
1245
+ };
1246
+ };
1247
+
1248
+ } // namespace
1249
+
1250
+ } // namespace grpc_core
1251
+
1252
+ //
1253
+ // Plugin registration
1254
+ //
1255
+
1256
+ void grpc_lb_policy_xds_cluster_resolver_init() {
1257
+ grpc_core::LoadBalancingPolicyRegistry::Builder::
1258
+ RegisterLoadBalancingPolicyFactory(
1259
+ absl::make_unique<grpc_core::XdsClusterResolverLbFactory>());
1260
+ }
1261
+
1262
+ void grpc_lb_policy_xds_cluster_resolver_shutdown() {}