grpc 1.34.0 → 1.37.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 (806) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +893 -2840
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +28 -0
  6. data/include/grpc/grpc_security.h +77 -14
  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 +1 -1
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +2 -0
  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 +2823 -1559
  18. data/src/core/ext/filters/client_channel/client_channel.h +0 -6
  19. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  20. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  21. data/src/core/ext/filters/client_channel/config_selector.h +13 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +191 -0
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  24. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  26. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -6
  27. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
  28. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -7
  29. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  30. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -1
  31. data/src/core/ext/filters/client_channel/lb_policy.h +2 -3
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -35
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +8 -6
  39. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +369 -108
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +0 -8
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -27
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1384 -0
  47. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  48. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  49. data/src/core/ext/filters/client_channel/resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver.h +1 -12
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +41 -57
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +444 -22
  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 +21 -22
  58. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -17
  59. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
  60. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -34
  61. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +310 -160
  62. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  63. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  64. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  65. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +11 -13
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +8 -8
  67. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  68. data/src/core/ext/filters/client_channel/retry_throttle.h +3 -1
  69. data/src/core/ext/filters/client_channel/server_address.cc +9 -0
  70. data/src/core/ext/filters/client_channel/server_address.h +31 -0
  71. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  72. data/src/core/ext/filters/client_channel/subchannel.cc +100 -193
  73. data/src/core/ext/filters/client_channel/subchannel.h +73 -111
  74. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  75. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  76. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  77. data/src/core/ext/filters/deadline/deadline_filter.cc +4 -2
  78. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +495 -0
  79. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  80. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  81. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  82. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  83. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +35 -32
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  86. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  88. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +23 -10
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +29 -16
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +623 -219
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +46 -15
  99. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  100. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  104. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  105. data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
  106. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  107. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  108. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  109. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  110. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  111. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  112. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  113. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -28
  114. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +139 -40
  115. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  116. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  117. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  118. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  119. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +119 -124
  120. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +450 -284
  121. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  122. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  123. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +24 -23
  124. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +62 -21
  125. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +21 -21
  126. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +88 -39
  127. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  128. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  129. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +69 -45
  130. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +275 -78
  131. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +19 -19
  132. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +80 -43
  133. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  134. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +7 -7
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +27 -11
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +30 -30
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +136 -49
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +41 -41
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +172 -89
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +53 -47
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +188 -78
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -2
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +48 -7
  151. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -14
  152. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  153. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  154. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  155. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  156. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  157. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  158. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  159. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +34 -32
  160. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +151 -61
  161. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +33 -29
  162. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +138 -54
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -3
  164. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  165. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  166. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  167. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  168. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  169. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +16 -16
  170. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +81 -35
  171. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +15 -13
  172. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +70 -37
  173. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +257 -216
  174. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +995 -495
  175. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +5 -5
  176. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +26 -6
  177. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -4
  178. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  179. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  180. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  181. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  182. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  183. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  184. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  185. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  186. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  187. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +96 -98
  188. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +378 -226
  189. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  190. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  191. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +28 -25
  192. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +124 -53
  193. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +9 -12
  194. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +29 -24
  195. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +32 -33
  196. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +118 -67
  197. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  198. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  199. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  200. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  201. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +51 -44
  202. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +179 -129
  203. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -4
  204. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  205. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -4
  206. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  207. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -8
  208. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  209. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -3
  210. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  211. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  212. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  213. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  214. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  215. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  216. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  217. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  218. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  219. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  220. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  221. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  222. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  223. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  224. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  225. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +2 -3
  226. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +16 -3
  227. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  228. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  229. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  230. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  231. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  232. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  233. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  234. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  235. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  236. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  237. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  238. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  239. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  240. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  241. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  242. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  243. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +34 -34
  244. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +149 -72
  245. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +54 -37
  246. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +171 -59
  247. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  248. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  249. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  250. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  251. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  252. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  253. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  254. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  255. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  256. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  257. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  258. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  259. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  260. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  261. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  262. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  263. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  264. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  265. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  266. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  267. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  268. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  269. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  270. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  271. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  272. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  273. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  274. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  275. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  276. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  277. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  278. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  279. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  280. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  281. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  282. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  283. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  284. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  285. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  286. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  287. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  288. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  289. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  290. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +6 -6
  291. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  292. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  293. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  294. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  295. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  296. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +36 -0
  297. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  298. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  299. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  300. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  301. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  302. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  303. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  304. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
  305. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  306. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  307. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
  308. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
  309. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
  310. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
  311. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  312. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
  313. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
  314. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  315. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  316. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
  317. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
  318. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
  319. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
  320. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
  321. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
  322. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  323. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  324. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  325. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
  327. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +753 -724
  328. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
  330. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  331. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  332. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  333. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  334. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  335. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  336. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  337. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  338. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +371 -377
  339. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
  340. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
  341. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
  342. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
  343. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
  344. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  345. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
  346. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
  347. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
  348. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
  349. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  350. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  351. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  352. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  353. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
  354. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  355. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  356. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +8 -7
  357. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +9 -9
  358. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +9 -8
  359. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +8 -8
  360. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +8 -8
  361. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +9 -8
  362. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +8 -8
  363. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  364. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  365. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
  366. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  367. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  368. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  369. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  370. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  371. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  372. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  373. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  374. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  375. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  376. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  377. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  378. data/src/core/ext/xds/certificate_provider_store.cc +10 -7
  379. data/src/core/ext/xds/certificate_provider_store.h +12 -7
  380. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +25 -0
  381. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +1 -4
  382. data/src/core/ext/xds/xds_api.cc +2265 -593
  383. data/src/core/ext/xds/xds_api.h +335 -102
  384. data/src/core/ext/xds/xds_bootstrap.cc +80 -45
  385. data/src/core/ext/xds/xds_bootstrap.h +17 -6
  386. data/src/core/ext/xds/xds_certificate_provider.cc +232 -67
  387. data/src/core/ext/xds/xds_certificate_provider.h +103 -26
  388. data/src/core/ext/xds/xds_client.cc +212 -63
  389. data/src/core/ext/xds/xds_client.h +35 -1
  390. data/src/core/ext/xds/xds_client_stats.cc +4 -3
  391. data/src/core/ext/xds/xds_client_stats.h +2 -2
  392. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  393. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  394. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  395. data/src/core/ext/xds/xds_http_filters.h +130 -0
  396. data/src/core/ext/xds/xds_server_config_fetcher.cc +532 -0
  397. data/src/core/lib/channel/channel_args.cc +8 -8
  398. data/src/core/lib/channel/channel_stack.cc +12 -0
  399. data/src/core/lib/channel/channel_stack.h +7 -0
  400. data/src/core/lib/channel/channel_trace.h +1 -1
  401. data/src/core/lib/channel/channelz.cc +105 -18
  402. data/src/core/lib/channel/channelz.h +30 -2
  403. data/src/core/lib/channel/channelz_registry.cc +14 -0
  404. data/src/core/lib/channel/channelz_registry.h +0 -1
  405. data/src/core/lib/channel/handshaker.cc +4 -46
  406. data/src/core/lib/channel/handshaker.h +1 -18
  407. data/src/core/lib/channel/status_util.cc +12 -2
  408. data/src/core/lib/channel/status_util.h +5 -0
  409. data/src/core/lib/compression/compression_args.cc +3 -2
  410. data/src/core/lib/debug/stats.h +2 -2
  411. data/src/core/lib/debug/stats_data.h +13 -13
  412. data/src/core/lib/gpr/alloc.cc +3 -2
  413. data/src/core/lib/gpr/log.cc +59 -17
  414. data/src/core/lib/gpr/log_linux.cc +3 -1
  415. data/src/core/lib/gpr/log_posix.cc +3 -1
  416. data/src/core/lib/gpr/log_windows.cc +3 -1
  417. data/src/core/lib/gpr/spinlock.h +10 -2
  418. data/src/core/lib/gpr/string.cc +22 -21
  419. data/src/core/lib/gpr/string.h +5 -6
  420. data/src/core/lib/gpr/sync.cc +4 -4
  421. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  422. data/src/core/lib/gpr/sync_windows.cc +2 -2
  423. data/src/core/lib/gpr/time.cc +12 -12
  424. data/src/core/lib/gprpp/arena.h +3 -2
  425. data/src/core/lib/gprpp/atomic.h +3 -3
  426. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  427. data/src/core/lib/gprpp/mpscq.cc +2 -2
  428. data/src/core/lib/gprpp/ref_counted.h +2 -2
  429. data/src/core/lib/gprpp/ref_counted_ptr.h +11 -1
  430. data/src/core/lib/gprpp/sync.h +129 -40
  431. data/src/core/lib/gprpp/thd.h +1 -1
  432. data/src/core/lib/gprpp/thd_posix.cc +6 -1
  433. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  434. data/src/core/lib/gprpp/time_util.cc +77 -0
  435. data/src/core/lib/gprpp/time_util.h +42 -0
  436. data/src/core/lib/http/httpcli.cc +1 -1
  437. data/src/core/lib/http/httpcli.h +2 -3
  438. data/src/core/lib/http/httpcli_security_connector.cc +3 -3
  439. data/src/core/lib/http/parser.cc +1 -2
  440. data/src/core/lib/iomgr/buffer_list.h +1 -1
  441. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  442. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  443. data/src/core/lib/iomgr/combiner.cc +2 -1
  444. data/src/core/lib/iomgr/endpoint.h +1 -1
  445. data/src/core/lib/iomgr/error.cc +15 -11
  446. data/src/core/lib/iomgr/error.h +1 -1
  447. data/src/core/lib/iomgr/error_internal.h +1 -1
  448. data/src/core/lib/iomgr/ev_apple.cc +11 -8
  449. data/src/core/lib/iomgr/ev_epoll1_linux.cc +23 -16
  450. data/src/core/lib/iomgr/ev_epollex_linux.cc +21 -17
  451. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  452. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  453. data/src/core/lib/iomgr/exec_ctx.cc +6 -2
  454. data/src/core/lib/iomgr/exec_ctx.h +6 -4
  455. data/src/core/lib/iomgr/executor.cc +2 -1
  456. data/src/core/lib/iomgr/executor.h +1 -1
  457. data/src/core/lib/iomgr/executor/threadpool.h +1 -1
  458. data/src/core/lib/iomgr/iomgr.cc +1 -1
  459. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  460. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  461. data/src/core/lib/iomgr/load_file.h +1 -1
  462. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  463. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  464. data/src/core/lib/iomgr/parse_address.cc +52 -46
  465. data/src/core/lib/iomgr/parse_address.h +13 -9
  466. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  467. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  468. data/src/core/lib/iomgr/python_util.h +1 -1
  469. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  470. data/src/core/lib/iomgr/resource_quota.cc +5 -5
  471. data/src/core/lib/iomgr/sockaddr_utils.cc +131 -11
  472. data/src/core/lib/iomgr/sockaddr_utils.h +26 -1
  473. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  474. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  475. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  476. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  477. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  478. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  479. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  480. data/src/core/lib/iomgr/tcp_posix.cc +14 -14
  481. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  482. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  483. data/src/core/lib/iomgr/timer_custom.cc +3 -3
  484. data/src/core/lib/iomgr/timer_generic.cc +5 -5
  485. data/src/core/lib/iomgr/timer_manager.cc +3 -3
  486. data/src/core/lib/iomgr/udp_server.cc +1 -2
  487. data/src/core/lib/iomgr/udp_server.h +1 -2
  488. data/src/core/lib/iomgr/unix_sockets_posix.cc +17 -18
  489. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  490. data/src/core/lib/json/json.h +10 -0
  491. data/src/core/lib/matchers/matchers.cc +339 -0
  492. data/src/core/lib/matchers/matchers.h +160 -0
  493. data/src/core/lib/security/context/security_context.cc +4 -3
  494. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  495. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  496. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  497. data/src/core/lib/security/credentials/credentials.cc +6 -6
  498. data/src/core/lib/security/credentials/credentials.h +2 -1
  499. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  500. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  501. data/src/core/lib/security/credentials/external/aws_request_signer.cc +15 -10
  502. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -2
  503. data/src/core/lib/security/credentials/external/external_account_credentials.cc +217 -31
  504. data/src/core/lib/security/credentials/external/external_account_credentials.h +7 -5
  505. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  506. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +3 -4
  507. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -18
  508. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +5 -6
  509. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -2
  510. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -18
  511. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +18 -5
  512. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -4
  513. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -6
  514. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  515. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  516. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +37 -44
  517. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  518. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  519. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -6
  520. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  521. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +1 -6
  522. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +1 -6
  523. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +326 -5
  524. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +64 -0
  525. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +1 -1
  526. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +0 -1
  527. data/src/core/lib/security/credentials/tls/tls_credentials.cc +3 -2
  528. data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
  529. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  530. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  531. data/src/core/lib/security/credentials/xds/xds_credentials.cc +209 -10
  532. data/src/core/lib/security/credentials/xds/xds_credentials.h +27 -9
  533. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  534. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  535. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +50 -17
  536. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +23 -6
  537. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  538. data/src/core/lib/security/security_connector/security_connector.cc +3 -2
  539. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  540. data/src/core/lib/security/security_connector/ssl_utils.cc +11 -6
  541. data/src/core/lib/security/security_connector/ssl_utils.h +12 -19
  542. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +89 -26
  543. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +2 -3
  544. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  545. data/src/core/lib/security/transport/security_handshaker.cc +35 -7
  546. data/src/core/lib/slice/slice_intern.cc +9 -11
  547. data/src/core/lib/slice/slice_internal.h +2 -2
  548. data/src/core/lib/surface/call.cc +32 -24
  549. data/src/core/lib/surface/call_details.cc +8 -8
  550. data/src/core/lib/surface/channel.cc +16 -10
  551. data/src/core/lib/surface/channel.h +6 -5
  552. data/src/core/lib/surface/channel_init.cc +1 -1
  553. data/src/core/lib/surface/completion_queue.cc +24 -19
  554. data/src/core/lib/surface/completion_queue.h +16 -16
  555. data/src/core/lib/surface/init.cc +19 -20
  556. data/src/core/lib/surface/lame_client.cc +47 -54
  557. data/src/core/lib/surface/lame_client.h +5 -0
  558. data/src/core/lib/surface/server.cc +102 -51
  559. data/src/core/lib/surface/server.h +112 -18
  560. data/src/core/lib/surface/version.cc +2 -2
  561. data/src/core/lib/transport/authority_override.cc +6 -4
  562. data/src/core/lib/transport/authority_override.h +5 -2
  563. data/src/core/lib/transport/connectivity_state.h +6 -4
  564. data/src/core/lib/transport/error_utils.h +1 -1
  565. data/src/core/lib/transport/metadata.cc +6 -2
  566. data/src/core/lib/transport/metadata_batch.cc +27 -0
  567. data/src/core/lib/transport/metadata_batch.h +18 -4
  568. data/src/core/lib/transport/static_metadata.cc +1 -1
  569. data/src/core/lib/transport/status_metadata.cc +4 -3
  570. data/src/core/lib/transport/transport.h +7 -7
  571. data/src/core/lib/uri/uri_parser.cc +131 -249
  572. data/src/core/lib/uri/uri_parser.h +57 -21
  573. data/src/core/plugin_registry/grpc_plugin_registry.cc +22 -4
  574. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  575. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  576. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -25
  577. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -44
  578. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  579. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  580. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  581. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  582. data/src/core/tsi/fake_transport_security.cc +16 -5
  583. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
  584. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  585. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  586. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
  587. data/src/core/tsi/ssl_transport_security.cc +62 -52
  588. data/src/core/tsi/ssl_transport_security.h +6 -9
  589. data/src/core/tsi/transport_security.cc +6 -6
  590. data/src/core/tsi/transport_security_interface.h +1 -1
  591. data/src/ruby/ext/grpc/extconf.rb +9 -1
  592. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  593. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  594. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  595. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  596. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  597. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  598. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  599. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +14 -0
  600. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +34 -13
  601. data/src/ruby/ext/grpc/rb_server.c +13 -1
  602. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  603. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  604. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  605. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  606. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  607. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  608. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  609. data/src/ruby/lib/grpc/version.rb +1 -1
  610. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +35 -0
  611. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  612. data/src/ruby/spec/call_spec.rb +1 -1
  613. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  614. data/src/ruby/spec/channel_spec.rb +17 -6
  615. data/src/ruby/spec/client_auth_spec.rb +27 -1
  616. data/src/ruby/spec/errors_spec.rb +1 -1
  617. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  618. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  619. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  620. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  621. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  622. data/src/ruby/spec/server_spec.rb +22 -0
  623. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  624. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  625. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  626. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  627. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  628. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
  629. data/third_party/boringssl-with-bazel/err_data.c +715 -713
  630. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  631. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  632. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  633. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  634. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  635. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  636. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  637. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
  638. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  639. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  640. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  641. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  642. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  643. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  644. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  645. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  646. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  647. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  648. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  649. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  650. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  651. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  652. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  653. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  654. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  655. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  656. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  657. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  658. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  659. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  660. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  661. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  662. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  663. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  664. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  665. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  666. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  667. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  668. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  669. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
  670. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  671. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
  672. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +147 -0
  673. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
  674. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
  675. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  676. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  677. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  678. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  679. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  680. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  681. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  682. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -29
  683. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  684. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
  686. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  687. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  688. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  689. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
  690. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  691. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
  692. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  693. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  694. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
  695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  696. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  697. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  698. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  700. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  701. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  702. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  703. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
  704. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  705. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
  706. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
  707. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  708. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
  709. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  710. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  711. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +19 -0
  712. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  713. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  714. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  715. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  716. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
  717. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  718. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  719. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +67 -33
  720. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +27 -8
  721. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -99
  722. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +139 -36
  723. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
  724. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  725. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
  726. data/third_party/boringssl-with-bazel/src/ssl/internal.h +37 -16
  727. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  728. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
  729. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +20 -14
  730. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
  731. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  732. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  733. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +362 -50
  734. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
  735. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  736. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +66 -24
  737. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  738. data/third_party/upb/upb/decode.c +248 -167
  739. data/third_party/upb/upb/decode.h +20 -1
  740. data/third_party/upb/upb/decode.int.h +163 -0
  741. data/third_party/upb/upb/decode_fast.c +1040 -0
  742. data/third_party/upb/upb/decode_fast.h +126 -0
  743. data/third_party/upb/upb/def.c +525 -516
  744. data/third_party/upb/upb/def.h +16 -31
  745. data/third_party/upb/upb/def.hpp +37 -123
  746. data/third_party/upb/upb/encode.c +227 -169
  747. data/third_party/upb/upb/encode.h +27 -2
  748. data/third_party/upb/upb/msg.c +167 -88
  749. data/third_party/upb/upb/msg.h +174 -34
  750. data/third_party/upb/upb/port_def.inc +74 -61
  751. data/third_party/upb/upb/port_undef.inc +3 -7
  752. data/third_party/upb/upb/reflection.c +36 -19
  753. data/third_party/upb/upb/table.c +34 -197
  754. data/third_party/upb/upb/table.int.h +14 -5
  755. data/third_party/upb/upb/text_encode.c +45 -22
  756. data/third_party/upb/upb/text_encode.h +4 -1
  757. data/third_party/upb/upb/upb.c +18 -41
  758. data/third_party/upb/upb/upb.h +36 -7
  759. data/third_party/upb/upb/upb.hpp +4 -4
  760. data/third_party/upb/upb/upb.int.h +29 -0
  761. data/third_party/xxhash/xxhash.h +5443 -0
  762. metadata +152 -82
  763. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -909
  764. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  765. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  766. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -355
  767. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -138
  768. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -53
  769. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  770. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -129
  771. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  772. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -77
  773. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +0 -36
  774. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -85
  775. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  776. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -160
  777. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  778. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -84
  779. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
  780. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
  781. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
  782. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
  783. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
  784. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
  785. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
  786. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
  787. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
  788. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
  789. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
  790. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
  791. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +0 -265
  792. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +0 -104
  793. data/src/core/lib/gprpp/map.h +0 -53
  794. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  795. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  796. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  797. data/src/core/lib/security/authorization/evaluate_args.cc +0 -153
  798. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  799. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  800. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  801. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  802. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -97
  803. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  804. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  805. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  806. data/third_party/upb/upb/port.c +0 -26
@@ -23,14 +23,6 @@
23
23
  #include "src/core/ext/xds/xds_client_stats.h"
24
24
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
25
25
 
26
- /** Channel arg indicating if a target corresponding to the address is a backend
27
- * received from a balancer. The type of this arg is an integer and the value is
28
- * treated as a bool. */
29
- // TODO(roth): Depending on how we ultimately decide to handle fallback,
30
- // this may no longer be needed.
31
- #define GRPC_ARG_ADDRESS_IS_BACKEND_FROM_XDS_LOAD_BALANCER \
32
- "grpc.address_is_backend_from_xds_load_balancer"
33
-
34
26
  namespace grpc_core {
35
27
 
36
28
  // Defined in the EDS policy.
@@ -0,0 +1,29 @@
1
+ //
2
+ // Copyright 2020 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
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_CHANNEL_ARGS_H
18
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_CHANNEL_ARGS_H
19
+
20
+ // Channel arg indicating the xDS cluster name.
21
+ // Set by xds_cluster_impl LB policy and used by GoogleDefaultCredentials.
22
+ #define GRPC_ARG_XDS_CLUSTER_NAME "grpc.internal.xds_cluster_name"
23
+
24
+ // For testing purpose, this channel arg indicating xds_cluster_resolver LB
25
+ // policy should use the fake DNS resolver to resolve logical dns cluster.
26
+ #define GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR \
27
+ "grpc.internal.xds_logical_dns_cluster_fake_resolver_response_generator"
28
+
29
+ #endif // GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_CHANNEL_ARGS_H
@@ -23,6 +23,7 @@
23
23
  #include "src/core/ext/filters/client_channel/lb_policy.h"
24
24
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
25
25
  #include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h"
26
+ #include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
26
27
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
27
28
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
28
29
  #include "src/core/ext/xds/xds_client.h"
@@ -106,17 +107,6 @@ CircuitBreakerCallCounterMap::CallCounter::~CallCounter() {
106
107
 
107
108
  constexpr char kXdsClusterImpl[] = "xds_cluster_impl_experimental";
108
109
 
109
- // TODO (donnadionne): Check to see if circuit breaking is enabled, this will be
110
- // removed once circuit breaking feature is fully integrated and enabled by
111
- // default.
112
- bool XdsCircuitBreakingEnabled() {
113
- char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING");
114
- bool parsed_value;
115
- bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
116
- gpr_free(value);
117
- return parse_succeeded && parsed_value;
118
- }
119
-
120
110
  // Config for xDS Cluster Impl LB policy.
121
111
  class XdsClusterImplLbConfig : public LoadBalancingPolicy::Config {
122
112
  public:
@@ -144,9 +134,7 @@ class XdsClusterImplLbConfig : public LoadBalancingPolicy::Config {
144
134
  const absl::optional<std::string>& lrs_load_reporting_server_name() const {
145
135
  return lrs_load_reporting_server_name_;
146
136
  };
147
- const uint32_t max_concurrent_requests() const {
148
- return max_concurrent_requests_;
149
- }
137
+ uint32_t max_concurrent_requests() const { return max_concurrent_requests_; }
150
138
  RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config() const {
151
139
  return drop_config_;
152
140
  }
@@ -209,7 +197,6 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
209
197
 
210
198
  private:
211
199
  RefCountedPtr<CircuitBreakerCallCounterMap::CallCounter> call_counter_;
212
- bool xds_circuit_breaking_enabled_;
213
200
  uint32_t max_concurrent_requests_;
214
201
  RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
215
202
  RefCountedPtr<XdsClusterDropStats> drop_stats_;
@@ -278,7 +265,6 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
278
265
  XdsClusterImplLb::Picker::Picker(XdsClusterImplLb* xds_cluster_impl_lb,
279
266
  RefCountedPtr<RefCountedPicker> picker)
280
267
  : call_counter_(xds_cluster_impl_lb->call_counter_),
281
- xds_circuit_breaking_enabled_(XdsCircuitBreakingEnabled()),
282
268
  max_concurrent_requests_(
283
269
  xds_cluster_impl_lb->config_->max_concurrent_requests()),
284
270
  drop_config_(xds_cluster_impl_lb->config_->drop_config()),
@@ -302,15 +288,13 @@ LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick(
302
288
  }
303
289
  // Handle circuit breaking.
304
290
  uint32_t current = call_counter_->Increment();
305
- if (xds_circuit_breaking_enabled_) {
306
- // Check and see if we exceeded the max concurrent requests count.
307
- if (current >= max_concurrent_requests_) {
308
- call_counter_->Decrement();
309
- if (drop_stats_ != nullptr) drop_stats_->AddUncategorizedDrops();
310
- PickResult result;
311
- result.type = PickResult::PICK_COMPLETE;
312
- return result;
313
- }
291
+ // Check and see if we exceeded the max concurrent requests count.
292
+ if (current >= max_concurrent_requests_) {
293
+ call_counter_->Decrement();
294
+ if (drop_stats_ != nullptr) drop_stats_->AddUncategorizedDrops();
295
+ PickResult result;
296
+ result.type = PickResult::PICK_COMPLETE;
297
+ return result;
314
298
  }
315
299
  // If we're not dropping the call, we should always have a child picker.
316
300
  if (picker_ == nullptr) { // Should never happen.
@@ -454,7 +438,6 @@ void XdsClusterImplLb::UpdateLocked(UpdateArgs args) {
454
438
  }
455
439
  // Update child policy.
456
440
  UpdateChildPolicyLocked(std::move(args.addresses), args.args);
457
- args.args = nullptr;
458
441
  }
459
442
 
460
443
  void XdsClusterImplLb::MaybeUpdatePickerLocked() {
@@ -522,7 +505,10 @@ void XdsClusterImplLb::UpdateChildPolicyLocked(ServerAddressList addresses,
522
505
  UpdateArgs update_args;
523
506
  update_args.addresses = std::move(addresses);
524
507
  update_args.config = config_->child_policy();
525
- update_args.args = args;
508
+ grpc_arg cluster_arg = grpc_channel_arg_string_create(
509
+ const_cast<char*>(GRPC_ARG_XDS_CLUSTER_NAME),
510
+ const_cast<char*>(config_->cluster_name().c_str()));
511
+ update_args.args = grpc_channel_args_copy_and_add(args, &cluster_arg, 1);
526
512
  // Update the policy.
527
513
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_cluster_impl_lb_trace)) {
528
514
  gpr_log(GPR_INFO,
@@ -55,7 +55,7 @@ class XdsClusterManagerLbConfig : public LoadBalancingPolicy::Config {
55
55
  using ClusterMap =
56
56
  std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>;
57
57
 
58
- XdsClusterManagerLbConfig(ClusterMap cluster_map)
58
+ explicit XdsClusterManagerLbConfig(ClusterMap cluster_map)
59
59
  : cluster_map_(std::move(cluster_map)) {}
60
60
 
61
61
  const char* name() const override { return kXdsClusterManager; }
@@ -501,7 +501,7 @@ void XdsClusterManagerLb::ClusterChild::ResetBackoffLocked() {
501
501
 
502
502
  void XdsClusterManagerLb::ClusterChild::DeactivateLocked() {
503
503
  // If already deactivated, don't do that again.
504
- if (delayed_removal_timer_callback_pending_ == true) return;
504
+ if (delayed_removal_timer_callback_pending_) return;
505
505
  // Set the child weight to 0 so that future picker won't contain this child.
506
506
  // Start a timer to delete the child.
507
507
  Ref(DEBUG_LOCATION, "ClusterChild+timer").release();
@@ -0,0 +1,1384 @@
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/xds/xds_channel_args.h"
33
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
34
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
35
+ #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
36
+ #include "src/core/ext/filters/client_channel/resolver_registry.h"
37
+ #include "src/core/ext/filters/client_channel/server_address.h"
38
+ #include "src/core/ext/xds/xds_channel_args.h"
39
+ #include "src/core/ext/xds/xds_client.h"
40
+ #include "src/core/ext/xds/xds_client_stats.h"
41
+ #include "src/core/lib/channel/channel_args.h"
42
+ #include "src/core/lib/gpr/string.h"
43
+ #include "src/core/lib/gprpp/orphanable.h"
44
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
45
+ #include "src/core/lib/iomgr/work_serializer.h"
46
+ #include "src/core/lib/transport/error_utils.h"
47
+ #include "src/core/lib/uri/uri_parser.h"
48
+
49
+ #define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000
50
+
51
+ namespace grpc_core {
52
+
53
+ TraceFlag grpc_lb_xds_cluster_resolver_trace(false, "xds_cluster_resolver_lb");
54
+
55
+ const char* kXdsLocalityNameAttributeKey = "xds_locality_name";
56
+
57
+ namespace {
58
+
59
+ constexpr char kXdsClusterResolver[] = "xds_cluster_resolver_experimental";
60
+
61
+ // Config for EDS LB policy.
62
+ class XdsClusterResolverLbConfig : public LoadBalancingPolicy::Config {
63
+ public:
64
+ struct DiscoveryMechanism {
65
+ std::string cluster_name;
66
+ absl::optional<std::string> lrs_load_reporting_server_name;
67
+ uint32_t max_concurrent_requests;
68
+ enum DiscoveryMechanismType {
69
+ EDS,
70
+ LOGICAL_DNS,
71
+ };
72
+ DiscoveryMechanismType type;
73
+ std::string eds_service_name;
74
+
75
+ bool operator==(const DiscoveryMechanism& other) const {
76
+ return (cluster_name == other.cluster_name &&
77
+ lrs_load_reporting_server_name ==
78
+ other.lrs_load_reporting_server_name &&
79
+ max_concurrent_requests == other.max_concurrent_requests &&
80
+ type == other.type && eds_service_name == other.eds_service_name);
81
+ }
82
+ };
83
+
84
+ XdsClusterResolverLbConfig(
85
+ std::vector<DiscoveryMechanism> discovery_mechanisms, Json xds_lb_policy)
86
+ : discovery_mechanisms_(std::move(discovery_mechanisms)),
87
+ xds_lb_policy_(std::move(xds_lb_policy)) {}
88
+
89
+ const char* name() const override { return kXdsClusterResolver; }
90
+ const std::vector<DiscoveryMechanism>& discovery_mechanisms() const {
91
+ return discovery_mechanisms_;
92
+ }
93
+
94
+ const Json& xds_lb_policy() const { return xds_lb_policy_; }
95
+
96
+ private:
97
+ std::vector<DiscoveryMechanism> discovery_mechanisms_;
98
+ Json xds_lb_policy_;
99
+ };
100
+
101
+ // Xds Cluster Resolver LB policy.
102
+ class XdsClusterResolverLb : public LoadBalancingPolicy {
103
+ public:
104
+ XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client, Args args);
105
+
106
+ const char* name() const override { return kXdsClusterResolver; }
107
+
108
+ void UpdateLocked(UpdateArgs args) override;
109
+ void ResetBackoffLocked() override;
110
+ void ExitIdleLocked() override;
111
+
112
+ private:
113
+ // Discovery Mechanism Base class
114
+ //
115
+ // Implemented by EDS and LOGICAL_DNS.
116
+ //
117
+ // Implementations are responsible for calling the LB policy's
118
+ // OnEndpointChanged(), OnError(), and OnResourceDoesNotExist()
119
+ // methods when the corresponding events occur.
120
+ //
121
+ // Must implement Orphan() method to cancel the watchers.
122
+ class DiscoveryMechanism : public InternallyRefCounted<DiscoveryMechanism> {
123
+ public:
124
+ DiscoveryMechanism(
125
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
126
+ size_t index)
127
+ : parent_(std::move(xds_cluster_resolver_lb)), index_(index) {}
128
+ virtual void Start() = 0;
129
+ void Orphan() override = 0;
130
+ virtual Json::Array override_child_policy() = 0;
131
+ virtual bool disable_reresolution() = 0;
132
+
133
+ // Caller must ensure that config_ is set before calling.
134
+ absl::string_view GetXdsClusterResolverResourceName() const {
135
+ if (!parent_->is_xds_uri_) return parent_->server_name_;
136
+ if (!parent_->config_->discovery_mechanisms()[index_]
137
+ .eds_service_name.empty()) {
138
+ return parent_->config_->discovery_mechanisms()[index_]
139
+ .eds_service_name;
140
+ }
141
+ return parent_->config_->discovery_mechanisms()[index_].cluster_name;
142
+ }
143
+
144
+ // Returns a pair containing the cluster and eds_service_name
145
+ // to use for LRS load reporting. Caller must ensure that config_ is set
146
+ // before calling.
147
+ std::pair<absl::string_view, absl::string_view> GetLrsClusterKey() const {
148
+ if (!parent_->is_xds_uri_) return {parent_->server_name_, nullptr};
149
+ return {
150
+ parent_->config_->discovery_mechanisms()[index_].cluster_name,
151
+ parent_->config_->discovery_mechanisms()[index_].eds_service_name};
152
+ }
153
+
154
+ protected:
155
+ XdsClusterResolverLb* parent() const { return parent_.get(); }
156
+ size_t index() const { return index_; }
157
+
158
+ private:
159
+ RefCountedPtr<XdsClusterResolverLb> parent_;
160
+ // Stores its own index in the vector of DiscoveryMechanism.
161
+ size_t index_;
162
+ };
163
+
164
+ class EdsDiscoveryMechanism : public DiscoveryMechanism {
165
+ public:
166
+ EdsDiscoveryMechanism(
167
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
168
+ size_t index)
169
+ : DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
170
+ void Start() override;
171
+ void Orphan() override;
172
+ Json::Array override_child_policy() override { return Json::Array{}; }
173
+ bool disable_reresolution() override { return true; }
174
+
175
+ private:
176
+ class EndpointWatcher : public XdsClient::EndpointWatcherInterface {
177
+ public:
178
+ explicit EndpointWatcher(
179
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism)
180
+ : discovery_mechanism_(std::move(discovery_mechanism)) {}
181
+ ~EndpointWatcher() override {
182
+ discovery_mechanism_.reset(DEBUG_LOCATION, "EndpointWatcher");
183
+ }
184
+ void OnEndpointChanged(XdsApi::EdsUpdate update) override {
185
+ new Notifier(discovery_mechanism_, std::move(update));
186
+ }
187
+ void OnError(grpc_error* error) override {
188
+ new Notifier(discovery_mechanism_, error);
189
+ }
190
+ void OnResourceDoesNotExist() override {
191
+ new Notifier(discovery_mechanism_);
192
+ }
193
+
194
+ private:
195
+ class Notifier {
196
+ public:
197
+ Notifier(RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism,
198
+ XdsApi::EdsUpdate update);
199
+ Notifier(RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism,
200
+ grpc_error* error);
201
+ explicit Notifier(
202
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism);
203
+ ~Notifier() { discovery_mechanism_.reset(DEBUG_LOCATION, "Notifier"); }
204
+
205
+ private:
206
+ enum Type { kUpdate, kError, kDoesNotExist };
207
+
208
+ static void RunInExecCtx(void* arg, grpc_error* error);
209
+ void RunInWorkSerializer(grpc_error* error);
210
+
211
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism_;
212
+ grpc_closure closure_;
213
+ XdsApi::EdsUpdate update_;
214
+ Type type_;
215
+ };
216
+
217
+ RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism_;
218
+ };
219
+
220
+ // Note that this is not owned, so this pointer must never be dereferenced.
221
+ EndpointWatcher* watcher_ = nullptr;
222
+ };
223
+
224
+ class LogicalDNSDiscoveryMechanism : public DiscoveryMechanism {
225
+ public:
226
+ LogicalDNSDiscoveryMechanism(
227
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
228
+ size_t index)
229
+ : DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
230
+ void Start() override;
231
+ void Orphan() override;
232
+ Json::Array override_child_policy() override {
233
+ return Json::Array{
234
+ Json::Object{
235
+ {"pick_first", Json::Object()},
236
+ },
237
+ };
238
+ }
239
+ bool disable_reresolution() override { return false; };
240
+
241
+ private:
242
+ class ResolverResultHandler : public Resolver::ResultHandler {
243
+ public:
244
+ explicit ResolverResultHandler(
245
+ RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism)
246
+ : discovery_mechanism_(std::move(discovery_mechanism)) {}
247
+
248
+ ~ResolverResultHandler() override {}
249
+
250
+ void ReturnResult(Resolver::Result result) override;
251
+
252
+ void ReturnError(grpc_error* error) override;
253
+
254
+ private:
255
+ RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism_;
256
+ };
257
+ // This is only necessary because of a bug in msvc where nested class cannot
258
+ // access protected member in base class.
259
+ friend class ResolverResultHandler;
260
+ OrphanablePtr<Resolver> resolver_;
261
+ };
262
+
263
+ struct DiscoveryMechanismEntry {
264
+ OrphanablePtr<DiscoveryMechanism> discovery_mechanism;
265
+ bool first_update_received = false;
266
+ // Number of priorities this mechanism has contributed to priority_list_.
267
+ // (The sum of this across all discovery mechanisms should always equal
268
+ // the number of priorities in priority_list_.)
269
+ uint32_t num_priorities = 0;
270
+ RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config;
271
+ // Populated only when an update has been delivered by the mechanism
272
+ // but has not yet been applied to the LB policy's combined priority_list_.
273
+ absl::optional<XdsApi::EdsUpdate::PriorityList> pending_priority_list;
274
+ };
275
+
276
+ class Helper : public ChannelControlHelper {
277
+ public:
278
+ explicit Helper(
279
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_policy)
280
+ : xds_cluster_resolver_policy_(std::move(xds_cluster_resolver_policy)) {
281
+ }
282
+
283
+ ~Helper() override {
284
+ xds_cluster_resolver_policy_.reset(DEBUG_LOCATION, "Helper");
285
+ }
286
+
287
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
288
+ ServerAddress address, const grpc_channel_args& args) override;
289
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
290
+ std::unique_ptr<SubchannelPicker> picker) override;
291
+ // This is a no-op, because we get the addresses from the xds
292
+ // client, which is a watch-based API.
293
+ void RequestReresolution() override {}
294
+ void AddTraceEvent(TraceSeverity severity,
295
+ absl::string_view message) override;
296
+
297
+ private:
298
+ RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_policy_;
299
+ };
300
+
301
+ ~XdsClusterResolverLb() override;
302
+
303
+ void ShutdownLocked() override;
304
+
305
+ void OnEndpointChanged(size_t index, XdsApi::EdsUpdate update);
306
+ void OnError(size_t index, grpc_error* error);
307
+ void OnResourceDoesNotExist(size_t index);
308
+
309
+ void MaybeDestroyChildPolicyLocked();
310
+
311
+ void UpdatePriorityList(XdsApi::EdsUpdate::PriorityList priority_list);
312
+ void UpdateChildPolicyLocked();
313
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
314
+ const grpc_channel_args* args);
315
+ ServerAddressList CreateChildPolicyAddressesLocked();
316
+ RefCountedPtr<Config> CreateChildPolicyConfigLocked();
317
+ grpc_channel_args* CreateChildPolicyArgsLocked(
318
+ const grpc_channel_args* args_in);
319
+
320
+ // Server name from target URI.
321
+ std::string server_name_;
322
+ bool is_xds_uri_;
323
+
324
+ // Current channel args and config from the resolver.
325
+ const grpc_channel_args* args_ = nullptr;
326
+ RefCountedPtr<XdsClusterResolverLbConfig> config_;
327
+
328
+ // Internal state.
329
+ bool shutting_down_ = false;
330
+
331
+ // The xds client and endpoint watcher.
332
+ RefCountedPtr<XdsClient> xds_client_;
333
+
334
+ // Vector of discovery mechansism entries in priority order.
335
+ std::vector<DiscoveryMechanismEntry> discovery_mechanisms_;
336
+
337
+ // The latest data from the endpoint watcher.
338
+ XdsApi::EdsUpdate::PriorityList priority_list_;
339
+ // State used to retain child policy names for priority policy.
340
+ std::vector<size_t /*child_number*/> priority_child_numbers_;
341
+
342
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
343
+ };
344
+
345
+ //
346
+ // XdsClusterResolverLb::Helper
347
+ //
348
+
349
+ RefCountedPtr<SubchannelInterface>
350
+ XdsClusterResolverLb::Helper::CreateSubchannel(ServerAddress address,
351
+ const grpc_channel_args& args) {
352
+ if (xds_cluster_resolver_policy_->shutting_down_) return nullptr;
353
+ return xds_cluster_resolver_policy_->channel_control_helper()
354
+ ->CreateSubchannel(std::move(address), args);
355
+ }
356
+
357
+ void XdsClusterResolverLb::Helper::UpdateState(
358
+ grpc_connectivity_state state, const absl::Status& status,
359
+ std::unique_ptr<SubchannelPicker> picker) {
360
+ if (xds_cluster_resolver_policy_->shutting_down_ ||
361
+ xds_cluster_resolver_policy_->child_policy_ == nullptr) {
362
+ return;
363
+ }
364
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
365
+ gpr_log(GPR_INFO,
366
+ "[xds_cluster_resolver_lb %p] child policy updated state=%s (%s) "
367
+ "picker=%p",
368
+ xds_cluster_resolver_policy_.get(), ConnectivityStateName(state),
369
+ status.ToString().c_str(), picker.get());
370
+ }
371
+ xds_cluster_resolver_policy_->channel_control_helper()->UpdateState(
372
+ state, status, std::move(picker));
373
+ }
374
+
375
+ void XdsClusterResolverLb::Helper::AddTraceEvent(TraceSeverity severity,
376
+ absl::string_view message) {
377
+ if (xds_cluster_resolver_policy_->shutting_down_) return;
378
+ xds_cluster_resolver_policy_->channel_control_helper()->AddTraceEvent(
379
+ severity, message);
380
+ }
381
+
382
+ //
383
+ // XdsClusterResolverLb::EdsDiscoveryMechanism
384
+ //
385
+
386
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::Start() {
387
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
388
+ gpr_log(GPR_INFO,
389
+ "[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
390
+ ":%p starting xds watch for %s",
391
+ parent(), index(), this,
392
+ std::string(GetXdsClusterResolverResourceName()).c_str());
393
+ }
394
+ auto watcher = absl::make_unique<EndpointWatcher>(
395
+ Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"));
396
+ watcher_ = watcher.get();
397
+ parent()->xds_client_->WatchEndpointData(GetXdsClusterResolverResourceName(),
398
+ std::move(watcher));
399
+ }
400
+
401
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::Orphan() {
402
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
403
+ gpr_log(GPR_INFO,
404
+ "[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
405
+ ":%p cancelling xds watch for %s",
406
+ parent(), index(), this,
407
+ std::string(GetXdsClusterResolverResourceName()).c_str());
408
+ }
409
+ parent()->xds_client_->CancelEndpointDataWatch(
410
+ GetXdsClusterResolverResourceName(), watcher_);
411
+ Unref();
412
+ }
413
+
414
+ //
415
+ // XdsClusterResolverLb::EndpointWatcher::Notifier
416
+ //
417
+
418
+ XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
419
+ Notifier(RefCountedPtr<XdsClusterResolverLb::EdsDiscoveryMechanism>
420
+ discovery_mechanism,
421
+ XdsApi::EdsUpdate update)
422
+ : discovery_mechanism_(std::move(discovery_mechanism)),
423
+ update_(std::move(update)),
424
+ type_(kUpdate) {
425
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
426
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
427
+ }
428
+
429
+ XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
430
+ Notifier(RefCountedPtr<XdsClusterResolverLb::EdsDiscoveryMechanism>
431
+ discovery_mechanism,
432
+ grpc_error* error)
433
+ : discovery_mechanism_(std::move(discovery_mechanism)), type_(kError) {
434
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
435
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
436
+ }
437
+
438
+ XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
439
+ Notifier(RefCountedPtr<XdsClusterResolverLb::EdsDiscoveryMechanism>
440
+ discovery_mechanism)
441
+ : discovery_mechanism_(std::move(discovery_mechanism)),
442
+ type_(kDoesNotExist) {
443
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
444
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
445
+ }
446
+
447
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
448
+ RunInExecCtx(void* arg, grpc_error* error) {
449
+ Notifier* self = static_cast<Notifier*>(arg);
450
+ GRPC_ERROR_REF(error);
451
+ self->discovery_mechanism_->parent()->work_serializer()->Run(
452
+ [self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
453
+ }
454
+
455
+ void XdsClusterResolverLb::EdsDiscoveryMechanism::EndpointWatcher::Notifier::
456
+ RunInWorkSerializer(grpc_error* error) {
457
+ switch (type_) {
458
+ case kUpdate:
459
+ discovery_mechanism_->parent()->OnEndpointChanged(
460
+ discovery_mechanism_->index(), std::move(update_));
461
+ break;
462
+ case kError:
463
+ discovery_mechanism_->parent()->OnError(discovery_mechanism_->index(),
464
+ error);
465
+ break;
466
+ case kDoesNotExist:
467
+ discovery_mechanism_->parent()->OnResourceDoesNotExist(
468
+ discovery_mechanism_->index());
469
+ break;
470
+ };
471
+ delete this;
472
+ }
473
+
474
+ //
475
+ // XdsClusterResolverLb::LogicalDNSDiscoveryMechanism
476
+ //
477
+
478
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Start() {
479
+ std::string target = parent()->server_name_;
480
+ grpc_channel_args* args = nullptr;
481
+ FakeResolverResponseGenerator* fake_resolver_response_generator =
482
+ grpc_channel_args_find_pointer<FakeResolverResponseGenerator>(
483
+ parent()->args_,
484
+ GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR);
485
+ if (fake_resolver_response_generator != nullptr) {
486
+ target = absl::StrCat("fake:", target);
487
+ grpc_arg new_arg = FakeResolverResponseGenerator::MakeChannelArg(
488
+ fake_resolver_response_generator);
489
+ args = grpc_channel_args_copy_and_add(parent()->args_, &new_arg, 1);
490
+ } else {
491
+ args = grpc_channel_args_copy(parent()->args_);
492
+ }
493
+ resolver_ = ResolverRegistry::CreateResolver(
494
+ target.c_str(), args, parent()->interested_parties(),
495
+ parent()->work_serializer(),
496
+ absl::make_unique<ResolverResultHandler>(
497
+ Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism")));
498
+ grpc_channel_args_destroy(args);
499
+ if (resolver_ == nullptr) {
500
+ parent()->OnResourceDoesNotExist(index());
501
+ return;
502
+ }
503
+ resolver_->StartLocked();
504
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
505
+ gpr_log(GPR_INFO,
506
+ "[xds_cluster_resolver_lb %p] logical DNS discovery mechanism "
507
+ "%" PRIuPTR ":%p starting dns resolver %p",
508
+ parent(), index(), this, resolver_.get());
509
+ }
510
+ }
511
+
512
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Orphan() {
513
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
514
+ gpr_log(
515
+ GPR_INFO,
516
+ "[xds_cluster_resolver_lb %p] logical DNS discovery mechanism %" PRIuPTR
517
+ ":%p shutting down dns resolver %p",
518
+ parent(), index(), this, resolver_.get());
519
+ }
520
+ resolver_.reset();
521
+ Unref();
522
+ }
523
+
524
+ //
525
+ // XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler
526
+ //
527
+
528
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler::
529
+ ReturnResult(Resolver::Result result) {
530
+ // convert result to eds update
531
+ XdsApi::EdsUpdate update;
532
+ XdsApi::EdsUpdate::Priority::Locality locality;
533
+ locality.name = MakeRefCounted<XdsLocalityName>("", "", "");
534
+ locality.lb_weight = 1;
535
+ locality.endpoints = std::move(result.addresses);
536
+ XdsApi::EdsUpdate::Priority priority;
537
+ priority.localities.emplace(locality.name.get(), std::move(locality));
538
+ update.priorities.emplace_back(std::move(priority));
539
+ discovery_mechanism_->parent()->OnEndpointChanged(
540
+ discovery_mechanism_->index(), std::move(update));
541
+ }
542
+
543
+ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler::
544
+ ReturnError(grpc_error* error) {
545
+ discovery_mechanism_->parent()->OnError(discovery_mechanism_->index(), error);
546
+ }
547
+
548
+ //
549
+ // XdsClusterResolverLb public methods
550
+ //
551
+
552
+ XdsClusterResolverLb::XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client,
553
+ Args args)
554
+ : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
555
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
556
+ gpr_log(GPR_INFO,
557
+ "[xds_cluster_resolver_lb %p] created -- using xds client %p", this,
558
+ xds_client_.get());
559
+ }
560
+ // Record server name.
561
+ const char* server_uri =
562
+ grpc_channel_args_find_string(args.args, GRPC_ARG_SERVER_URI);
563
+ GPR_ASSERT(server_uri != nullptr);
564
+ absl::StatusOr<URI> uri = URI::Parse(server_uri);
565
+ GPR_ASSERT(uri.ok() && !uri->path().empty());
566
+ server_name_ = std::string(absl::StripPrefix(uri->path(), "/"));
567
+ is_xds_uri_ = uri->scheme() == "xds";
568
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
569
+ gpr_log(GPR_INFO,
570
+ "[xds_cluster_resolver_lb %p] server name from channel "
571
+ "(is_xds_uri=%d): %s",
572
+ this, is_xds_uri_, server_name_.c_str());
573
+ }
574
+ // EDS-only flow.
575
+ if (!is_xds_uri_) {
576
+ // Setup channelz linkage.
577
+ channelz::ChannelNode* parent_channelz_node =
578
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
579
+ args.args, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
580
+ if (parent_channelz_node != nullptr) {
581
+ xds_client_->AddChannelzLinkage(parent_channelz_node);
582
+ }
583
+ // Couple polling.
584
+ grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
585
+ interested_parties());
586
+ }
587
+ }
588
+
589
+ XdsClusterResolverLb::~XdsClusterResolverLb() {
590
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
591
+ gpr_log(GPR_INFO,
592
+ "[xds_cluster_resolver_lb %p] destroying xds_cluster_resolver LB "
593
+ "policy",
594
+ this);
595
+ }
596
+ }
597
+
598
+ void XdsClusterResolverLb::ShutdownLocked() {
599
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
600
+ gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] shutting down", this);
601
+ }
602
+ shutting_down_ = true;
603
+ MaybeDestroyChildPolicyLocked();
604
+ discovery_mechanisms_.clear();
605
+ if (!is_xds_uri_) {
606
+ // Remove channelz linkage.
607
+ channelz::ChannelNode* parent_channelz_node =
608
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
609
+ args_, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
610
+ if (parent_channelz_node != nullptr) {
611
+ xds_client_->RemoveChannelzLinkage(parent_channelz_node);
612
+ }
613
+ // Decouple polling.
614
+ grpc_pollset_set_del_pollset_set(xds_client_->interested_parties(),
615
+ interested_parties());
616
+ }
617
+ xds_client_.reset(DEBUG_LOCATION, "XdsClusterResolverLb");
618
+ // Destroy channel args.
619
+ grpc_channel_args_destroy(args_);
620
+ args_ = nullptr;
621
+ }
622
+
623
+ void XdsClusterResolverLb::MaybeDestroyChildPolicyLocked() {
624
+ if (child_policy_ != nullptr) {
625
+ grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
626
+ interested_parties());
627
+ child_policy_.reset();
628
+ }
629
+ }
630
+
631
+ void XdsClusterResolverLb::UpdateLocked(UpdateArgs args) {
632
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
633
+ gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Received update", this);
634
+ }
635
+ const bool is_initial_update = args_ == nullptr;
636
+ // Update config.
637
+ auto old_config = std::move(config_);
638
+ config_ = std::move(args.config);
639
+ // Update args.
640
+ grpc_channel_args_destroy(args_);
641
+ args_ = args.args;
642
+ args.args = nullptr;
643
+ // Update child policy if needed.
644
+ if (child_policy_ != nullptr) UpdateChildPolicyLocked();
645
+ // Create endpoint watcher if needed.
646
+ if (is_initial_update) {
647
+ for (const auto& config : config_->discovery_mechanisms()) {
648
+ DiscoveryMechanismEntry entry;
649
+ if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
650
+ DiscoveryMechanismType::EDS) {
651
+ entry.discovery_mechanism =
652
+ grpc_core::MakeOrphanable<EdsDiscoveryMechanism>(
653
+ Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"),
654
+ discovery_mechanisms_.size());
655
+ } else if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
656
+ DiscoveryMechanismType::LOGICAL_DNS) {
657
+ entry.discovery_mechanism =
658
+ grpc_core::MakeOrphanable<LogicalDNSDiscoveryMechanism>(
659
+ Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism"),
660
+ discovery_mechanisms_.size());
661
+ } else {
662
+ GPR_ASSERT(0);
663
+ }
664
+ discovery_mechanisms_.push_back(std::move(entry));
665
+ }
666
+ // Call start() on all discovery mechanisms after creation.
667
+ for (const auto& discovery_mechanism : discovery_mechanisms_) {
668
+ discovery_mechanism.discovery_mechanism->Start();
669
+ }
670
+ }
671
+ }
672
+
673
+ void XdsClusterResolverLb::ResetBackoffLocked() {
674
+ // When the XdsClient is instantiated in the resolver instead of in this
675
+ // LB policy, this is done via the resolver, so we don't need to do it here.
676
+ if (!is_xds_uri_ && xds_client_ != nullptr) xds_client_->ResetBackoff();
677
+ if (child_policy_ != nullptr) {
678
+ child_policy_->ResetBackoffLocked();
679
+ }
680
+ }
681
+
682
+ void XdsClusterResolverLb::ExitIdleLocked() {
683
+ if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
684
+ }
685
+
686
+ void XdsClusterResolverLb::OnEndpointChanged(size_t index,
687
+ XdsApi::EdsUpdate update) {
688
+ if (shutting_down_) return;
689
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
690
+ gpr_log(GPR_INFO,
691
+ "[xds_cluster_resolver_lb %p] Received update from xds client"
692
+ " for discovery mechanism %" PRIuPTR "",
693
+ this, index);
694
+ }
695
+ // We need at least one priority for each discovery mechanism, just so that we
696
+ // have a child in which to create the xds_cluster_impl policy. This ensures
697
+ // that we properly handle the case of a discovery mechanism dropping 100% of
698
+ // calls, the OnError() case, and the OnResourceDoesNotExist() case.
699
+ if (update.priorities.empty()) update.priorities.emplace_back();
700
+ discovery_mechanisms_[index].drop_config = std::move(update.drop_config);
701
+ discovery_mechanisms_[index].pending_priority_list =
702
+ std::move(update.priorities);
703
+ discovery_mechanisms_[index].first_update_received = true;
704
+ // If any discovery mechanism has not received its first update,
705
+ // wait until that happens before creating the child policy.
706
+ // TODO(roth): If this becomes problematic in the future (e.g., a
707
+ // secondary discovery mechanism delaying us from starting up at all),
708
+ // we can consider some sort of optimization whereby we can create the
709
+ // priority policy with only a subset of its children. But we need to
710
+ // make sure not to get into a situation where the priority policy
711
+ // will put the channel into TRANSIENT_FAILURE instead of CONNECTING
712
+ // while we're still waiting for the other discovery mechanism(s).
713
+ for (DiscoveryMechanismEntry& mechanism : discovery_mechanisms_) {
714
+ if (!mechanism.first_update_received) return;
715
+ }
716
+ // Construct new priority list.
717
+ XdsApi::EdsUpdate::PriorityList priority_list;
718
+ size_t priority_index = 0;
719
+ for (DiscoveryMechanismEntry& mechanism : discovery_mechanisms_) {
720
+ // If the mechanism has a pending update, use that.
721
+ // Otherwise, use the priorities that it previously contributed to the
722
+ // combined list.
723
+ if (mechanism.pending_priority_list.has_value()) {
724
+ priority_list.insert(priority_list.end(),
725
+ mechanism.pending_priority_list->begin(),
726
+ mechanism.pending_priority_list->end());
727
+ priority_index += mechanism.num_priorities;
728
+ mechanism.num_priorities = mechanism.pending_priority_list->size();
729
+ mechanism.pending_priority_list.reset();
730
+ } else {
731
+ priority_list.insert(
732
+ priority_list.end(), priority_list_.begin() + priority_index,
733
+ priority_list_.begin() + priority_index + mechanism.num_priorities);
734
+ priority_index += mechanism.num_priorities;
735
+ }
736
+ }
737
+ // Update child policy.
738
+ UpdatePriorityList(std::move(priority_list));
739
+ }
740
+
741
+ void XdsClusterResolverLb::OnError(size_t index, grpc_error* error) {
742
+ gpr_log(GPR_ERROR,
743
+ "[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
744
+ " xds watcher reported error: %s",
745
+ this, index, grpc_error_string(error));
746
+ GRPC_ERROR_UNREF(error);
747
+ if (shutting_down_) return;
748
+ if (!discovery_mechanisms_[index].first_update_received) {
749
+ // Call OnEndpointChanged with an empty update just like
750
+ // OnResourceDoesNotExist.
751
+ OnEndpointChanged(index, XdsApi::EdsUpdate());
752
+ }
753
+ }
754
+
755
+ void XdsClusterResolverLb::OnResourceDoesNotExist(size_t index) {
756
+ gpr_log(GPR_ERROR,
757
+ "[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
758
+ " resource does not exist",
759
+ this, index);
760
+ if (shutting_down_) return;
761
+ // Call OnEndpointChanged with an empty update.
762
+ OnEndpointChanged(index, XdsApi::EdsUpdate());
763
+ }
764
+
765
+ //
766
+ // child policy-related methods
767
+ //
768
+
769
+ void XdsClusterResolverLb::UpdatePriorityList(
770
+ XdsApi::EdsUpdate::PriorityList priority_list) {
771
+ // Build some maps from locality to child number and the reverse from
772
+ // the old data in priority_list_ and priority_child_numbers_.
773
+ std::map<XdsLocalityName*, size_t /*child_number*/, XdsLocalityName::Less>
774
+ locality_child_map;
775
+ std::map<size_t, std::set<XdsLocalityName*>> child_locality_map;
776
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
777
+ size_t child_number = priority_child_numbers_[priority];
778
+ const auto& localities = priority_list_[priority].localities;
779
+ for (const auto& p : localities) {
780
+ XdsLocalityName* locality_name = p.first;
781
+ locality_child_map[locality_name] = child_number;
782
+ child_locality_map[child_number].insert(locality_name);
783
+ }
784
+ }
785
+ // Construct new list of children.
786
+ std::vector<size_t> priority_child_numbers;
787
+ for (size_t priority = 0; priority < priority_list.size(); ++priority) {
788
+ const auto& localities = priority_list[priority].localities;
789
+ absl::optional<size_t> child_number;
790
+ // If one of the localities in this priority already existed, reuse its
791
+ // child number.
792
+ for (const auto& p : localities) {
793
+ XdsLocalityName* locality_name = p.first;
794
+ if (!child_number.has_value()) {
795
+ auto it = locality_child_map.find(locality_name);
796
+ if (it != locality_child_map.end()) {
797
+ child_number = it->second;
798
+ locality_child_map.erase(it);
799
+ // Remove localities that *used* to be in this child number, so
800
+ // that we don't incorrectly reuse this child number for a
801
+ // subsequent priority.
802
+ for (XdsLocalityName* old_locality :
803
+ child_locality_map[*child_number]) {
804
+ locality_child_map.erase(old_locality);
805
+ }
806
+ }
807
+ } else {
808
+ // Remove all localities that are now in this child number, so
809
+ // that we don't accidentally reuse this child number for a
810
+ // subsequent priority.
811
+ locality_child_map.erase(locality_name);
812
+ }
813
+ }
814
+ // If we didn't find an existing child number, assign a new one.
815
+ if (!child_number.has_value()) {
816
+ for (child_number = 0;
817
+ child_locality_map.find(*child_number) != child_locality_map.end();
818
+ ++(*child_number)) {
819
+ }
820
+ // Add entry so we know that the child number is in use.
821
+ // (Don't need to add the list of localities, since we won't use them.)
822
+ child_locality_map[*child_number];
823
+ }
824
+ priority_child_numbers.push_back(*child_number);
825
+ }
826
+ // Save update.
827
+ priority_list_ = std::move(priority_list);
828
+ priority_child_numbers_ = std::move(priority_child_numbers);
829
+ // Update child policy.
830
+ UpdateChildPolicyLocked();
831
+ }
832
+
833
+ ServerAddressList XdsClusterResolverLb::CreateChildPolicyAddressesLocked() {
834
+ ServerAddressList addresses;
835
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
836
+ const auto& localities = priority_list_[priority].localities;
837
+ std::string priority_child_name =
838
+ absl::StrCat("child", priority_child_numbers_[priority]);
839
+ for (const auto& p : localities) {
840
+ const auto& locality_name = p.first;
841
+ const auto& locality = p.second;
842
+ std::vector<std::string> hierarchical_path = {
843
+ priority_child_name, locality_name->AsHumanReadableString()};
844
+ for (const auto& endpoint : locality.endpoints) {
845
+ addresses.emplace_back(
846
+ endpoint
847
+ .WithAttribute(kHierarchicalPathAttributeKey,
848
+ MakeHierarchicalPathAttribute(hierarchical_path))
849
+ .WithAttribute(kXdsLocalityNameAttributeKey,
850
+ absl::make_unique<XdsLocalityAttribute>(
851
+ locality_name->Ref()))
852
+ .WithAttribute(ServerAddressWeightAttribute::
853
+ kServerAddressWeightAttributeKey,
854
+ absl::make_unique<ServerAddressWeightAttribute>(
855
+ locality.lb_weight)));
856
+ }
857
+ }
858
+ }
859
+ return addresses;
860
+ }
861
+
862
+ RefCountedPtr<LoadBalancingPolicy::Config>
863
+ XdsClusterResolverLb::CreateChildPolicyConfigLocked() {
864
+ Json::Object priority_children;
865
+ Json::Array priority_priorities;
866
+ // Setting up index to iterate through the discovery mechanisms and keeping
867
+ // track the discovery_mechanism each priority belongs to.
868
+ size_t discovery_index = 0;
869
+ // Setting up num_priorities_remaining to track the priorities in each
870
+ // discovery_mechanism.
871
+ size_t num_priorities_remaining_in_discovery =
872
+ discovery_mechanisms_[discovery_index].num_priorities;
873
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
874
+ Json child_policy;
875
+ if (!discovery_mechanisms_[discovery_index]
876
+ .discovery_mechanism->override_child_policy()
877
+ .empty()) {
878
+ child_policy = discovery_mechanisms_[discovery_index]
879
+ .discovery_mechanism->override_child_policy();
880
+ } else {
881
+ const auto& xds_lb_policy = config_->xds_lb_policy().object_value();
882
+ if (xds_lb_policy.find("ROUND_ROBIN") != xds_lb_policy.end()) {
883
+ const auto& localities = priority_list_[priority].localities;
884
+ Json::Object weighted_targets;
885
+ for (const auto& p : localities) {
886
+ XdsLocalityName* locality_name = p.first;
887
+ const auto& locality = p.second;
888
+ // Construct JSON object containing locality name.
889
+ Json::Object locality_name_json;
890
+ if (!locality_name->region().empty()) {
891
+ locality_name_json["region"] = locality_name->region();
892
+ }
893
+ if (!locality_name->zone().empty()) {
894
+ locality_name_json["zone"] = locality_name->zone();
895
+ }
896
+ if (!locality_name->sub_zone().empty()) {
897
+ locality_name_json["sub_zone"] = locality_name->sub_zone();
898
+ }
899
+ // Add weighted target entry.
900
+ weighted_targets[locality_name->AsHumanReadableString()] =
901
+ Json::Object{
902
+ {"weight", locality.lb_weight},
903
+ {"childPolicy",
904
+ Json::Array{
905
+ Json::Object{
906
+ {"round_robin", Json::Object()},
907
+ },
908
+ }},
909
+ };
910
+ }
911
+ // Construct locality-picking policy.
912
+ // Start with field from our config and add the "targets" field.
913
+ child_policy = Json::Array{
914
+ Json::Object{
915
+ {"weighted_target_experimental",
916
+ Json::Object{
917
+ {"targets", Json::Object()},
918
+ }},
919
+ },
920
+ };
921
+ Json::Object& config =
922
+ *(*child_policy.mutable_array())[0].mutable_object();
923
+ auto it = config.begin();
924
+ GPR_ASSERT(it != config.end());
925
+ (*it->second.mutable_object())["targets"] = std::move(weighted_targets);
926
+ } else {
927
+ auto it = xds_lb_policy.find("RING_HASH");
928
+ GPR_ASSERT(it != xds_lb_policy.end());
929
+ Json::Object ring_hash_experimental_policy = it->second.object_value();
930
+ child_policy = Json::Array{
931
+ Json::Object{
932
+ {"ring_hash_experimental", ring_hash_experimental_policy},
933
+ },
934
+ };
935
+ }
936
+ }
937
+ // Wrap it in the drop policy.
938
+ Json::Array drop_categories;
939
+ if (discovery_mechanisms_[discovery_index].drop_config != nullptr) {
940
+ for (const auto& category : discovery_mechanisms_[discovery_index]
941
+ .drop_config->drop_category_list()) {
942
+ drop_categories.push_back(Json::Object{
943
+ {"category", category.name},
944
+ {"requests_per_million", category.parts_per_million},
945
+ });
946
+ }
947
+ }
948
+ const auto lrs_key = discovery_mechanisms_[discovery_index]
949
+ .discovery_mechanism->GetLrsClusterKey();
950
+ Json::Object xds_cluster_impl_config = {
951
+ {"clusterName", std::string(lrs_key.first)},
952
+ {"childPolicy", std::move(child_policy)},
953
+ {"dropCategories", std::move(drop_categories)},
954
+ {"maxConcurrentRequests",
955
+ config_->discovery_mechanisms()[discovery_index]
956
+ .max_concurrent_requests},
957
+ };
958
+ if (!lrs_key.second.empty()) {
959
+ xds_cluster_impl_config["edsServiceName"] = std::string(lrs_key.second);
960
+ }
961
+ if (config_->discovery_mechanisms()[discovery_index]
962
+ .lrs_load_reporting_server_name.has_value()) {
963
+ xds_cluster_impl_config["lrsLoadReportingServerName"] =
964
+ config_->discovery_mechanisms()[discovery_index]
965
+ .lrs_load_reporting_server_name.value();
966
+ }
967
+ Json locality_picking_policy = Json::Array{Json::Object{
968
+ {"xds_cluster_impl_experimental", std::move(xds_cluster_impl_config)},
969
+ }};
970
+ // Add priority entry.
971
+ const size_t child_number = priority_child_numbers_[priority];
972
+ std::string child_name = absl::StrCat("child", child_number);
973
+ priority_priorities.emplace_back(child_name);
974
+ Json::Object child_config = {
975
+ {"config", std::move(locality_picking_policy)},
976
+ };
977
+ if (discovery_mechanisms_[discovery_index]
978
+ .discovery_mechanism->disable_reresolution()) {
979
+ child_config["ignore_reresolution_requests"] = true;
980
+ }
981
+ priority_children[child_name] = std::move(child_config);
982
+ // Each priority in the priority_list_ should correspond to a priority in a
983
+ // discovery mechanism in discovery_mechanisms_ (both in the same order).
984
+ // Keeping track of the discovery_mechanism each priority belongs to.
985
+ --num_priorities_remaining_in_discovery;
986
+ while (num_priorities_remaining_in_discovery == 0 &&
987
+ discovery_index < discovery_mechanisms_.size() - 1) {
988
+ ++discovery_index;
989
+ num_priorities_remaining_in_discovery =
990
+ discovery_mechanisms_[discovery_index].num_priorities;
991
+ }
992
+ }
993
+ // There should be matching number of priorities in discovery_mechanisms_ and
994
+ // in priority_list_; therefore at the end of looping through all the
995
+ // priorities, num_priorities_remaining should be down to 0, and index should
996
+ // be the last index in discovery_mechanisms_.
997
+ GPR_ASSERT(num_priorities_remaining_in_discovery == 0);
998
+ GPR_ASSERT(discovery_index == discovery_mechanisms_.size() - 1);
999
+ Json json = Json::Array{Json::Object{
1000
+ {"priority_experimental",
1001
+ Json::Object{
1002
+ {"children", std::move(priority_children)},
1003
+ {"priorities", std::move(priority_priorities)},
1004
+ }},
1005
+ }};
1006
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
1007
+ std::string json_str = json.Dump(/*indent=*/1);
1008
+ gpr_log(
1009
+ GPR_INFO,
1010
+ "[xds_cluster_resolver_lb %p] generated config for child policy: %s",
1011
+ this, json_str.c_str());
1012
+ }
1013
+ grpc_error* error = GRPC_ERROR_NONE;
1014
+ RefCountedPtr<LoadBalancingPolicy::Config> config =
1015
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
1016
+ if (error != GRPC_ERROR_NONE) {
1017
+ // This should never happen, but if it does, we basically have no
1018
+ // way to fix it, so we put the channel in TRANSIENT_FAILURE.
1019
+ gpr_log(GPR_ERROR,
1020
+ "[xds_cluster_resolver_lb %p] error parsing generated child policy "
1021
+ "config -- "
1022
+ "will put channel in TRANSIENT_FAILURE: %s",
1023
+ this, grpc_error_string(error));
1024
+ error = grpc_error_set_int(
1025
+ grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1026
+ "xds_cluster_resolver LB policy: error "
1027
+ "parsing generated child policy config"),
1028
+ error),
1029
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
1030
+ channel_control_helper()->UpdateState(
1031
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
1032
+ absl::make_unique<TransientFailurePicker>(error));
1033
+ return nullptr;
1034
+ }
1035
+ return config;
1036
+ }
1037
+
1038
+ void XdsClusterResolverLb::UpdateChildPolicyLocked() {
1039
+ if (shutting_down_) return;
1040
+ UpdateArgs update_args;
1041
+ update_args.config = CreateChildPolicyConfigLocked();
1042
+ if (update_args.config == nullptr) return;
1043
+ update_args.addresses = CreateChildPolicyAddressesLocked();
1044
+ update_args.args = CreateChildPolicyArgsLocked(args_);
1045
+ if (child_policy_ == nullptr) {
1046
+ child_policy_ = CreateChildPolicyLocked(update_args.args);
1047
+ }
1048
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
1049
+ gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Updating child policy %p",
1050
+ this, child_policy_.get());
1051
+ }
1052
+ child_policy_->UpdateLocked(std::move(update_args));
1053
+ }
1054
+
1055
+ grpc_channel_args* XdsClusterResolverLb::CreateChildPolicyArgsLocked(
1056
+ const grpc_channel_args* args) {
1057
+ // Inhibit client-side health checking, since the balancer does this for us.
1058
+ grpc_arg new_arg = grpc_channel_arg_integer_create(
1059
+ const_cast<char*>(GRPC_ARG_INHIBIT_HEALTH_CHECKING), 1);
1060
+ return grpc_channel_args_copy_and_add(args, &new_arg, 1);
1061
+ }
1062
+
1063
+ OrphanablePtr<LoadBalancingPolicy>
1064
+ XdsClusterResolverLb::CreateChildPolicyLocked(const grpc_channel_args* args) {
1065
+ LoadBalancingPolicy::Args lb_policy_args;
1066
+ lb_policy_args.work_serializer = work_serializer();
1067
+ lb_policy_args.args = args;
1068
+ lb_policy_args.channel_control_helper =
1069
+ absl::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
1070
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
1071
+ LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
1072
+ "priority_experimental", std::move(lb_policy_args));
1073
+ if (GPR_UNLIKELY(lb_policy == nullptr)) {
1074
+ gpr_log(GPR_ERROR,
1075
+ "[xds_cluster_resolver_lb %p] failure creating child policy", this);
1076
+ return nullptr;
1077
+ }
1078
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
1079
+ gpr_log(GPR_INFO,
1080
+ "[xds_cluster_resolver_lb %p]: Created new child policy %p", this,
1081
+ lb_policy.get());
1082
+ }
1083
+ // Add our interested_parties pollset_set to that of the newly created
1084
+ // child policy. This will make the child policy progress upon activity on
1085
+ // this policy, which in turn is tied to the application's call.
1086
+ grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
1087
+ interested_parties());
1088
+ return lb_policy;
1089
+ }
1090
+
1091
+ //
1092
+ // factory
1093
+ //
1094
+
1095
+ class XdsClusterResolverLbFactory : public LoadBalancingPolicyFactory {
1096
+ public:
1097
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1098
+ LoadBalancingPolicy::Args args) const override {
1099
+ grpc_error* error = GRPC_ERROR_NONE;
1100
+ RefCountedPtr<XdsClient> xds_client = XdsClient::GetOrCreate(&error);
1101
+ if (error != GRPC_ERROR_NONE) {
1102
+ gpr_log(GPR_ERROR,
1103
+ "cannot get XdsClient to instantiate xds_cluster_resolver LB "
1104
+ "policy: %s",
1105
+ grpc_error_string(error));
1106
+ GRPC_ERROR_UNREF(error);
1107
+ return nullptr;
1108
+ }
1109
+ return MakeOrphanable<XdsClusterResolverChildHandler>(std::move(xds_client),
1110
+ std::move(args));
1111
+ }
1112
+
1113
+ const char* name() const override { return kXdsClusterResolver; }
1114
+
1115
+ RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
1116
+ const Json& json, grpc_error** error) const override {
1117
+ GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
1118
+ if (json.type() == Json::Type::JSON_NULL) {
1119
+ // xds_cluster_resolver was mentioned as a policy in the deprecated
1120
+ // loadBalancingPolicy field or in the client API.
1121
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1122
+ "field:loadBalancingPolicy error:xds_cluster_resolver policy "
1123
+ "requires configuration. "
1124
+ "Please use loadBalancingConfig field of service config instead.");
1125
+ return nullptr;
1126
+ }
1127
+ std::vector<grpc_error*> error_list;
1128
+ std::vector<XdsClusterResolverLbConfig::DiscoveryMechanism>
1129
+ discovery_mechanisms;
1130
+ auto it = json.object_value().find("discoveryMechanisms");
1131
+ if (it == json.object_value().end()) {
1132
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1133
+ "field:discoveryMechanisms error:required field missing"));
1134
+ } else if (it->second.type() != Json::Type::ARRAY) {
1135
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1136
+ "field:discoveryMechanisms error:type should be array"));
1137
+ } else {
1138
+ const Json::Array& array = it->second.array_value();
1139
+ for (size_t i = 0; i < array.size(); ++i) {
1140
+ XdsClusterResolverLbConfig::DiscoveryMechanism discovery_mechanism;
1141
+ std::vector<grpc_error*> discovery_mechanism_errors =
1142
+ ParseDiscoveryMechanism(array[i], &discovery_mechanism);
1143
+ if (!discovery_mechanism_errors.empty()) {
1144
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1145
+ absl::StrCat("field:discovery_mechanism element: ", i, " error")
1146
+ .c_str());
1147
+ for (grpc_error* discovery_mechanism_error :
1148
+ discovery_mechanism_errors) {
1149
+ error = grpc_error_add_child(error, discovery_mechanism_error);
1150
+ }
1151
+ error_list.push_back(error);
1152
+ }
1153
+ discovery_mechanisms.emplace_back(std::move(discovery_mechanism));
1154
+ }
1155
+ }
1156
+ if (discovery_mechanisms.empty()) {
1157
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1158
+ "field:discovery_mechanism error:list is missing or empty"));
1159
+ }
1160
+ Json xds_lb_policy = Json::Object{
1161
+ {"ROUND_ROBIN", Json::Object()},
1162
+ };
1163
+ it = json.object_value().find("xdsLbPolicy");
1164
+ if (it != json.object_value().end()) {
1165
+ if (it->second.type() != Json::Type::ARRAY) {
1166
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1167
+ "field:xdsLbPolicy error:type should be array"));
1168
+ } else {
1169
+ const Json::Array& array = it->second.array_value();
1170
+ for (size_t i = 0; i < array.size(); ++i) {
1171
+ if (array[i].type() != Json::Type::OBJECT) {
1172
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1173
+ "field:xdsLbPolicy error:element should be of type object"));
1174
+ continue;
1175
+ }
1176
+ const Json::Object& policy = array[i].object_value();
1177
+ auto policy_it = policy.find("ROUND_ROBIN");
1178
+ if (policy_it != policy.end()) {
1179
+ if (policy_it->second.type() != Json::Type::OBJECT) {
1180
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1181
+ "field:ROUND_ROBIN error:type should be object"));
1182
+ }
1183
+ break;
1184
+ }
1185
+ policy_it = policy.find("RING_HASH");
1186
+ if (policy_it != policy.end()) {
1187
+ if (policy_it->second.type() != Json::Type::OBJECT) {
1188
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1189
+ "field:RING_HASH error:type should be object"));
1190
+ continue;
1191
+ }
1192
+ // TODO(donnadionne): Move this to a method in
1193
+ // ring_hash_experimental and call it here.
1194
+ const Json::Object& ring_hash = policy_it->second.object_value();
1195
+ xds_lb_policy = array[i];
1196
+ size_t min_ring_size = 1024;
1197
+ size_t max_ring_size = 8388608;
1198
+ auto ring_hash_it = ring_hash.find("min_ring_size");
1199
+ if (ring_hash_it == ring_hash.end()) {
1200
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1201
+ "field:min_ring_size missing"));
1202
+ } else if (ring_hash_it->second.type() != Json::Type::NUMBER) {
1203
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1204
+ "field:min_ring_size error: should be of "
1205
+ "number"));
1206
+ } else {
1207
+ min_ring_size = gpr_parse_nonnegative_int(
1208
+ ring_hash_it->second.string_value().c_str());
1209
+ }
1210
+ ring_hash_it = ring_hash.find("max_ring_size");
1211
+ if (ring_hash_it == ring_hash.end()) {
1212
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1213
+ "field:max_ring_size missing"));
1214
+ } else if (ring_hash_it->second.type() != Json::Type::NUMBER) {
1215
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1216
+ "field:max_ring_size error: should be of "
1217
+ "number"));
1218
+ } else {
1219
+ max_ring_size = gpr_parse_nonnegative_int(
1220
+ ring_hash_it->second.string_value().c_str());
1221
+ }
1222
+ if (min_ring_size <= 0 || min_ring_size > 8388608 ||
1223
+ max_ring_size <= 0 || max_ring_size > 8388608 ||
1224
+ min_ring_size > max_ring_size) {
1225
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1226
+ "field:max_ring_size and or min_ring_size error: "
1227
+ "values need to be in the range of 1 to 8388608 "
1228
+ "and max_ring_size cannot be smaller than "
1229
+ "min_ring_size"));
1230
+ }
1231
+ ring_hash_it = ring_hash.find("hash_function");
1232
+ if (ring_hash_it == ring_hash.end()) {
1233
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1234
+ "field:hash_function missing"));
1235
+ } else if (ring_hash_it->second.type() != Json::Type::STRING) {
1236
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1237
+ "field:hash_function error: should be a "
1238
+ "string"));
1239
+ } else if (ring_hash_it->second.string_value() != "XX_HASH" &&
1240
+ ring_hash_it->second.string_value() != "MURMUR_HASH_2") {
1241
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1242
+ "field:hash_function error: unsupported "
1243
+ "hash_function"));
1244
+ }
1245
+ break;
1246
+ }
1247
+ }
1248
+ }
1249
+ }
1250
+ // Construct config.
1251
+ if (error_list.empty()) {
1252
+ return MakeRefCounted<XdsClusterResolverLbConfig>(
1253
+ std::move(discovery_mechanisms), std::move(xds_lb_policy));
1254
+ } else {
1255
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR(
1256
+ "xds_cluster_resolver_experimental LB policy config", &error_list);
1257
+ return nullptr;
1258
+ }
1259
+ }
1260
+
1261
+ private:
1262
+ static std::vector<grpc_error*> ParseDiscoveryMechanism(
1263
+ const Json& json,
1264
+ XdsClusterResolverLbConfig::DiscoveryMechanism* discovery_mechanism) {
1265
+ std::vector<grpc_error*> error_list;
1266
+ if (json.type() != Json::Type::OBJECT) {
1267
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1268
+ "value should be of type object"));
1269
+ return error_list;
1270
+ }
1271
+ // Cluster name.
1272
+ auto it = json.object_value().find("clusterName");
1273
+ if (it == json.object_value().end()) {
1274
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1275
+ "field:clusterName error:required field missing"));
1276
+ } else if (it->second.type() != Json::Type::STRING) {
1277
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1278
+ "field:clusterName error:type should be string"));
1279
+ } else {
1280
+ discovery_mechanism->cluster_name = it->second.string_value();
1281
+ }
1282
+ // LRS load reporting server name.
1283
+ it = json.object_value().find("lrsLoadReportingServerName");
1284
+ if (it != json.object_value().end()) {
1285
+ if (it->second.type() != Json::Type::STRING) {
1286
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1287
+ "field:lrsLoadReportingServerName error:type should be string"));
1288
+ } else {
1289
+ discovery_mechanism->lrs_load_reporting_server_name.emplace(
1290
+ it->second.string_value());
1291
+ }
1292
+ }
1293
+ // Max concurrent requests.
1294
+ discovery_mechanism->max_concurrent_requests = 1024;
1295
+ it = json.object_value().find("max_concurrent_requests");
1296
+ if (it != json.object_value().end()) {
1297
+ if (it->second.type() != Json::Type::NUMBER) {
1298
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1299
+ "field:max_concurrent_requests error:must be of type number"));
1300
+ } else {
1301
+ discovery_mechanism->max_concurrent_requests =
1302
+ gpr_parse_nonnegative_int(it->second.string_value().c_str());
1303
+ }
1304
+ }
1305
+ // Discovery Mechanism type
1306
+ it = json.object_value().find("type");
1307
+ if (it == json.object_value().end()) {
1308
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1309
+ "field:type error:required field missing"));
1310
+ } else if (it->second.type() != Json::Type::STRING) {
1311
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1312
+ "field:type error:type should be string"));
1313
+ } else {
1314
+ if (it->second.string_value() == "EDS") {
1315
+ discovery_mechanism->type = XdsClusterResolverLbConfig::
1316
+ DiscoveryMechanism::DiscoveryMechanismType::EDS;
1317
+ } else if (it->second.string_value() == "LOGICAL_DNS") {
1318
+ discovery_mechanism->type = XdsClusterResolverLbConfig::
1319
+ DiscoveryMechanism::DiscoveryMechanismType::LOGICAL_DNS;
1320
+ } else {
1321
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1322
+ "field:type error:invalid type"));
1323
+ }
1324
+ }
1325
+ // EDS service name.
1326
+ it = json.object_value().find("edsServiceName");
1327
+ if (it != json.object_value().end()) {
1328
+ if (it->second.type() != Json::Type::STRING) {
1329
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1330
+ "field:xds_cluster_resolverServiceName error:type should be "
1331
+ "string"));
1332
+ } else {
1333
+ discovery_mechanism->eds_service_name = it->second.string_value();
1334
+ }
1335
+ }
1336
+ return error_list;
1337
+ }
1338
+
1339
+ class XdsClusterResolverChildHandler : public ChildPolicyHandler {
1340
+ public:
1341
+ XdsClusterResolverChildHandler(RefCountedPtr<XdsClient> xds_client,
1342
+ Args args)
1343
+ : ChildPolicyHandler(std::move(args),
1344
+ &grpc_lb_xds_cluster_resolver_trace),
1345
+ xds_client_(std::move(xds_client)) {}
1346
+
1347
+ bool ConfigChangeRequiresNewPolicyInstance(
1348
+ LoadBalancingPolicy::Config* old_config,
1349
+ LoadBalancingPolicy::Config* new_config) const override {
1350
+ GPR_ASSERT(old_config->name() == kXdsClusterResolver);
1351
+ GPR_ASSERT(new_config->name() == kXdsClusterResolver);
1352
+ XdsClusterResolverLbConfig* old_xds_cluster_resolver_config =
1353
+ static_cast<XdsClusterResolverLbConfig*>(old_config);
1354
+ XdsClusterResolverLbConfig* new_xds_cluster_resolver_config =
1355
+ static_cast<XdsClusterResolverLbConfig*>(new_config);
1356
+ return old_xds_cluster_resolver_config->discovery_mechanisms() !=
1357
+ new_xds_cluster_resolver_config->discovery_mechanisms();
1358
+ }
1359
+
1360
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1361
+ const char* /*name*/, LoadBalancingPolicy::Args args) const override {
1362
+ return MakeOrphanable<XdsClusterResolverLb>(xds_client_, std::move(args));
1363
+ }
1364
+
1365
+ private:
1366
+ RefCountedPtr<XdsClient> xds_client_;
1367
+ };
1368
+ };
1369
+
1370
+ } // namespace
1371
+
1372
+ } // namespace grpc_core
1373
+
1374
+ //
1375
+ // Plugin registration
1376
+ //
1377
+
1378
+ void grpc_lb_policy_xds_cluster_resolver_init() {
1379
+ grpc_core::LoadBalancingPolicyRegistry::Builder::
1380
+ RegisterLoadBalancingPolicyFactory(
1381
+ absl::make_unique<grpc_core::XdsClusterResolverLbFactory>());
1382
+ }
1383
+
1384
+ void grpc_lb_policy_xds_cluster_resolver_shutdown() {}