grpc 1.33.0.pre1 → 1.37.0.pre1

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

Potentially problematic release.


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

Files changed (1106) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1075 -2814
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +29 -2
  6. data/include/grpc/grpc_security.h +215 -175
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +10 -3
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +24 -55
  12. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  13. data/include/grpc/slice_buffer.h +3 -3
  14. data/include/grpc/support/sync.h +3 -3
  15. data/include/grpc/support/time.h +7 -7
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  17. data/src/core/ext/filters/client_channel/client_channel.cc +2829 -1588
  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 +15 -4
  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 +10 -7
  27. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  28. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +7 -8
  29. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  30. data/src/core/ext/filters/client_channel/lb_policy.cc +9 -2
  31. data/src/core/ext/filters/client_channel/lb_policy.h +5 -6
  32. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +1 -1
  33. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +115 -106
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +3 -3
  41. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +55 -23
  42. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  43. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +2 -2
  45. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +8 -5
  46. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +3 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +370 -109
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  49. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/xds/{eds_drop.cc → xds_cluster_impl.cc} +332 -108
  51. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +22 -27
  52. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1384 -0
  53. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  54. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  55. data/src/core/ext/filters/client_channel/resolver.cc +7 -5
  56. data/src/core/ext/filters/client_channel/resolver.h +5 -13
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +42 -58
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +5 -5
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +444 -22
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +22 -23
  64. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -18
  65. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  66. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
  67. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +37 -30
  68. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +342 -133
  69. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  70. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  71. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  72. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +24 -38
  73. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +8 -8
  74. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  75. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  76. data/src/core/ext/filters/client_channel/server_address.cc +9 -0
  77. data/src/core/ext/filters/client_channel/server_address.h +31 -4
  78. data/src/core/ext/filters/client_channel/service_config.cc +3 -1
  79. data/src/core/ext/filters/client_channel/service_config.h +1 -1
  80. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  81. data/src/core/ext/filters/client_channel/subchannel.cc +117 -207
  82. data/src/core/ext/filters/client_channel/subchannel.h +75 -113
  83. data/src/core/ext/filters/client_channel/subchannel_interface.h +7 -15
  84. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  85. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +16 -10
  86. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  87. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  88. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  89. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +495 -0
  90. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  91. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  92. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  93. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  94. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  95. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  96. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  97. data/src/core/ext/filters/max_age/max_age_filter.cc +36 -33
  98. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  99. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  100. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  101. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  102. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  103. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  104. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +23 -10
  105. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  106. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +29 -16
  107. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +629 -211
  108. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  109. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  110. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  111. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  112. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +50 -39
  114. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  115. data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -3
  116. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  119. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  120. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  121. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  122. data/src/core/ext/transport/chttp2/transport/internal.h +1 -1
  123. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  124. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  125. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  126. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  127. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  128. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  129. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  130. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  131. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -28
  132. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +139 -40
  133. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  134. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  135. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  136. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  137. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +119 -124
  138. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +450 -284
  139. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  140. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  141. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +24 -23
  142. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +62 -21
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +21 -21
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +88 -39
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +69 -45
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +275 -78
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +19 -19
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +80 -43
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +7 -7
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +27 -11
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +30 -30
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +136 -49
  157. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +41 -41
  158. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +172 -89
  159. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  160. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  161. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +53 -47
  162. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +188 -78
  163. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -2
  164. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  165. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  166. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  167. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  168. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +48 -7
  169. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -14
  170. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  171. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  172. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  173. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  174. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  175. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  176. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  177. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +34 -32
  178. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +151 -61
  179. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +33 -29
  180. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +138 -54
  181. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -3
  182. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  183. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  184. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  185. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  186. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  187. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +16 -16
  188. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +81 -35
  189. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +15 -13
  190. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +70 -37
  191. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +257 -216
  192. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +995 -495
  193. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +5 -5
  194. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +26 -6
  195. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -4
  196. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  197. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  198. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  199. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  200. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  201. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  202. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  203. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  204. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  205. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +96 -98
  206. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +378 -226
  207. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  208. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  209. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +28 -25
  210. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +124 -53
  211. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +9 -12
  212. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +29 -24
  213. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +32 -33
  214. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +118 -67
  215. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  216. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  217. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  218. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  219. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +51 -44
  220. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +179 -129
  221. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -4
  222. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  223. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -4
  224. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  225. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -8
  226. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  227. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -3
  228. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  229. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  230. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  231. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  232. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  233. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  234. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  235. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  236. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  237. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  238. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  239. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  240. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  241. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  242. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  243. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +2 -3
  244. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +16 -3
  245. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  246. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  247. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  248. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  249. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  250. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  251. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  252. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  253. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  254. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  255. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  256. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  257. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  258. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  259. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  260. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  261. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +34 -34
  262. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +149 -72
  263. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +54 -37
  264. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +171 -59
  265. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  266. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  267. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  268. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  269. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  270. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  271. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  272. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  273. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  274. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  275. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  276. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  277. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  278. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  279. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  280. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  281. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  282. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  283. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  284. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  285. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  286. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  287. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  288. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  289. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  290. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  291. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  292. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  293. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  294. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  295. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  296. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  297. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  298. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  299. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  300. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  301. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  302. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  303. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  304. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  305. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  306. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  307. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  308. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +6 -6
  309. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  310. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  311. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  312. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  313. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  314. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +36 -0
  315. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  316. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  317. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  318. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  319. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  320. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  321. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  322. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  323. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  324. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  325. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +251 -0
  327. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  328. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  331. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  332. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +543 -0
  333. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  334. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  335. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  336. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +136 -0
  337. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  338. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  339. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  340. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  341. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  342. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +272 -0
  343. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +135 -0
  344. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  345. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  346. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  347. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  348. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  349. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  350. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  351. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  352. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  353. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  354. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  355. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  356. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +231 -0
  357. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +85 -0
  358. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +43 -0
  359. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  360. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  361. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  362. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +68 -0
  363. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  364. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +107 -0
  365. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  366. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  367. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  368. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  369. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  370. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  371. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  372. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +195 -0
  373. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  374. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +193 -0
  375. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  376. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +59 -0
  377. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  378. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  379. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  380. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  381. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  382. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +101 -0
  383. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  384. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +944 -0
  385. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +290 -0
  386. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  387. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  388. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +61 -0
  389. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  390. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  391. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  392. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  393. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  394. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  395. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  396. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  397. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  398. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +505 -0
  399. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  400. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +44 -0
  401. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  402. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +170 -0
  403. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  404. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +97 -0
  405. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  406. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +246 -0
  407. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  408. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  409. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  410. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  411. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  412. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +142 -0
  413. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +65 -0
  414. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +73 -0
  415. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +72 -0
  417. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  418. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +80 -0
  419. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  420. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +80 -0
  421. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  422. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  423. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  424. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  425. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  426. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  427. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  428. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  429. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  430. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  431. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  432. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  433. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  434. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  435. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  436. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +69 -0
  437. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  438. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  439. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  440. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  441. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  442. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  443. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  444. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  445. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  446. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  447. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +30 -0
  448. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  449. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  450. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  451. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  452. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  453. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  454. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  455. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  456. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  457. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  458. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  459. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  460. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  461. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  462. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  463. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  464. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  465. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  466. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  467. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  468. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  469. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  470. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  471. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  472. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  473. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  474. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  475. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  476. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  477. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  478. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  479. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  480. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  481. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  482. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  483. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  484. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  485. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  486. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +310 -0
  487. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  488. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  489. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  490. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  491. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  492. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  493. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  494. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  495. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  496. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  497. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  498. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  499. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  500. data/src/core/ext/xds/certificate_provider_factory.h +7 -5
  501. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  502. data/src/core/ext/xds/certificate_provider_store.h +70 -8
  503. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  504. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  505. data/src/core/ext/xds/xds_api.cc +2378 -1183
  506. data/src/core/ext/xds/xds_api.h +373 -99
  507. data/src/core/ext/xds/xds_bootstrap.cc +250 -68
  508. data/src/core/ext/xds/xds_bootstrap.h +40 -13
  509. data/src/core/ext/xds/xds_certificate_provider.cc +405 -0
  510. data/src/core/ext/xds/xds_certificate_provider.h +151 -0
  511. data/src/core/ext/xds/xds_client.cc +364 -182
  512. data/src/core/ext/xds/xds_client.h +47 -12
  513. data/src/core/ext/xds/xds_client_stats.cc +43 -5
  514. data/src/core/ext/xds/xds_client_stats.h +4 -4
  515. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  516. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  517. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  518. data/src/core/ext/xds/xds_http_filters.h +130 -0
  519. data/src/core/ext/xds/xds_server_config_fetcher.cc +532 -0
  520. data/src/core/lib/channel/channel_args.cc +9 -8
  521. data/src/core/lib/channel/channel_stack.cc +12 -0
  522. data/src/core/lib/channel/channel_stack.h +7 -0
  523. data/src/core/lib/channel/channel_trace.cc +4 -2
  524. data/src/core/lib/channel/channel_trace.h +1 -1
  525. data/src/core/lib/channel/channelz.cc +105 -18
  526. data/src/core/lib/channel/channelz.h +32 -4
  527. data/src/core/lib/channel/channelz_registry.cc +14 -0
  528. data/src/core/lib/channel/channelz_registry.h +0 -1
  529. data/src/core/lib/channel/handshaker.cc +4 -46
  530. data/src/core/lib/channel/handshaker.h +3 -20
  531. data/src/core/lib/channel/status_util.cc +12 -2
  532. data/src/core/lib/channel/status_util.h +5 -0
  533. data/src/core/lib/compression/compression.cc +8 -4
  534. data/src/core/lib/compression/compression_args.cc +3 -2
  535. data/src/core/lib/compression/compression_internal.cc +10 -5
  536. data/src/core/lib/compression/compression_internal.h +2 -1
  537. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  538. data/src/core/lib/debug/stats.h +2 -2
  539. data/src/core/lib/debug/stats_data.cc +1 -0
  540. data/src/core/lib/debug/stats_data.h +13 -13
  541. data/src/core/lib/gpr/alloc.cc +3 -2
  542. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  543. data/src/core/lib/gpr/log.cc +59 -17
  544. data/src/core/lib/gpr/log_linux.cc +19 -3
  545. data/src/core/lib/gpr/log_posix.cc +15 -1
  546. data/src/core/lib/gpr/log_windows.cc +18 -4
  547. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  548. data/src/core/lib/gpr/spinlock.h +10 -2
  549. data/src/core/lib/gpr/string.cc +23 -22
  550. data/src/core/lib/gpr/string.h +5 -6
  551. data/src/core/lib/gpr/sync.cc +4 -4
  552. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  553. data/src/core/lib/gpr/sync_windows.cc +2 -2
  554. data/src/core/lib/gpr/time.cc +12 -12
  555. data/src/core/lib/gpr/time_precise.cc +3 -2
  556. data/src/core/lib/gpr/tls.h +4 -0
  557. data/src/core/lib/gpr/tls_msvc.h +2 -0
  558. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  559. data/src/core/lib/gpr/useful.h +5 -4
  560. data/src/core/lib/gprpp/arena.h +3 -2
  561. data/src/core/lib/gprpp/atomic.h +3 -3
  562. data/src/core/lib/gprpp/dual_ref_counted.h +46 -51
  563. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  564. data/src/core/lib/gprpp/examine_stack.h +46 -0
  565. data/src/core/lib/gprpp/fork.cc +2 -2
  566. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  567. data/src/core/lib/gprpp/mpscq.cc +2 -2
  568. data/src/core/lib/gprpp/orphanable.h +4 -8
  569. data/src/core/lib/gprpp/ref_counted.h +42 -48
  570. data/src/core/lib/gprpp/ref_counted_ptr.h +20 -12
  571. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  572. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  573. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  574. data/src/core/lib/gprpp/sync.h +129 -40
  575. data/src/core/lib/gprpp/thd.h +3 -3
  576. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  577. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  578. data/src/core/lib/gprpp/time_util.cc +77 -0
  579. data/src/core/lib/gprpp/time_util.h +42 -0
  580. data/src/core/lib/http/httpcli.cc +1 -1
  581. data/src/core/lib/http/httpcli.h +2 -3
  582. data/src/core/lib/http/httpcli_security_connector.cc +3 -3
  583. data/src/core/lib/http/parser.cc +47 -27
  584. data/src/core/lib/iomgr/buffer_list.h +1 -1
  585. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  586. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  587. data/src/core/lib/iomgr/combiner.cc +2 -1
  588. data/src/core/lib/iomgr/endpoint.h +1 -1
  589. data/src/core/lib/iomgr/error.cc +17 -12
  590. data/src/core/lib/iomgr/error.h +1 -1
  591. data/src/core/lib/iomgr/error_internal.h +1 -1
  592. data/src/core/lib/iomgr/ev_apple.cc +11 -8
  593. data/src/core/lib/iomgr/ev_epoll1_linux.cc +23 -16
  594. data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -21
  595. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  596. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  597. data/src/core/lib/iomgr/exec_ctx.cc +7 -3
  598. data/src/core/lib/iomgr/exec_ctx.h +6 -4
  599. data/src/core/lib/iomgr/executor.cc +2 -1
  600. data/src/core/lib/iomgr/executor.h +1 -1
  601. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  602. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  603. data/src/core/lib/iomgr/iomgr.cc +1 -1
  604. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  605. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  606. data/src/core/lib/iomgr/load_file.h +1 -1
  607. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  608. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  609. data/src/core/lib/iomgr/parse_address.cc +127 -43
  610. data/src/core/lib/iomgr/parse_address.h +32 -8
  611. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  612. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  613. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  614. data/src/core/lib/iomgr/python_util.h +4 -4
  615. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  616. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  617. data/src/core/lib/iomgr/resource_quota.cc +5 -5
  618. data/src/core/lib/iomgr/sockaddr_utils.cc +131 -11
  619. data/src/core/lib/iomgr/sockaddr_utils.h +26 -1
  620. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  621. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  622. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  623. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  624. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  625. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  626. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  627. data/src/core/lib/iomgr/tcp_posix.cc +17 -16
  628. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  629. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  630. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  631. data/src/core/lib/iomgr/timer_generic.cc +5 -5
  632. data/src/core/lib/iomgr/timer_manager.cc +3 -3
  633. data/src/core/lib/iomgr/udp_server.cc +1 -2
  634. data/src/core/lib/iomgr/udp_server.h +1 -2
  635. data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
  636. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  637. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  638. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  639. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  640. data/src/core/lib/json/json.h +12 -2
  641. data/src/core/lib/json/json_reader.cc +8 -4
  642. data/src/core/lib/json/json_util.h +167 -0
  643. data/src/core/lib/json/json_writer.cc +2 -1
  644. data/src/core/lib/matchers/matchers.cc +339 -0
  645. data/src/core/lib/matchers/matchers.h +160 -0
  646. data/src/core/lib/security/context/security_context.cc +4 -3
  647. data/src/core/lib/security/context/security_context.h +3 -1
  648. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  649. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  650. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  651. data/src/core/lib/security/credentials/credentials.cc +7 -7
  652. data/src/core/lib/security/credentials/credentials.h +5 -4
  653. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  654. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  655. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  656. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  657. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  658. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  659. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  660. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  661. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  662. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  663. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -2
  664. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -18
  665. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  666. data/src/core/lib/security/credentials/jwt/json_token.cc +3 -3
  667. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  668. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -4
  669. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  670. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  671. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
  672. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  673. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  674. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -6
  675. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  676. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +30 -5
  677. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +13 -14
  678. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  679. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  680. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
  681. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
  682. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -13
  683. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
  684. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  685. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  686. data/src/core/lib/security/credentials/xds/xds_credentials.cc +209 -10
  687. data/src/core/lib/security/credentials/xds/xds_credentials.h +27 -9
  688. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  689. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -3
  690. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  691. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  692. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  693. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  694. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
  695. data/src/core/lib/security/security_connector/security_connector.cc +4 -3
  696. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  697. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  698. data/src/core/lib/security/security_connector/ssl_utils.cc +11 -6
  699. data/src/core/lib/security/security_connector/ssl_utils.h +16 -21
  700. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +360 -279
  701. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
  702. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  703. data/src/core/lib/security/transport/security_handshaker.cc +36 -8
  704. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  705. data/src/core/lib/security/util/json_util.h +1 -0
  706. data/src/core/lib/slice/slice.cc +7 -4
  707. data/src/core/lib/slice/slice_buffer.cc +2 -1
  708. data/src/core/lib/slice/slice_intern.cc +11 -13
  709. data/src/core/lib/slice/slice_internal.h +2 -2
  710. data/src/core/lib/surface/call.cc +41 -32
  711. data/src/core/lib/surface/call_details.cc +8 -8
  712. data/src/core/lib/surface/channel.cc +16 -10
  713. data/src/core/lib/surface/channel.h +6 -5
  714. data/src/core/lib/surface/channel_init.cc +1 -1
  715. data/src/core/lib/surface/completion_queue.cc +31 -25
  716. data/src/core/lib/surface/completion_queue.h +16 -16
  717. data/src/core/lib/surface/init.cc +19 -20
  718. data/src/core/lib/surface/lame_client.cc +47 -54
  719. data/src/core/lib/surface/lame_client.h +5 -0
  720. data/src/core/lib/surface/server.cc +106 -53
  721. data/src/core/lib/surface/server.h +114 -20
  722. data/src/core/lib/surface/validate_metadata.h +3 -0
  723. data/src/core/lib/surface/version.cc +2 -2
  724. data/src/core/lib/transport/authority_override.cc +6 -4
  725. data/src/core/lib/transport/authority_override.h +7 -2
  726. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  727. data/src/core/lib/transport/byte_stream.h +3 -3
  728. data/src/core/lib/transport/connectivity_state.h +9 -7
  729. data/src/core/lib/transport/error_utils.h +1 -1
  730. data/src/core/lib/transport/metadata.cc +6 -2
  731. data/src/core/lib/transport/metadata.h +2 -2
  732. data/src/core/lib/transport/metadata_batch.cc +27 -0
  733. data/src/core/lib/transport/metadata_batch.h +18 -4
  734. data/src/core/lib/transport/static_metadata.cc +1 -1
  735. data/src/core/lib/transport/status_metadata.cc +4 -3
  736. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  737. data/src/core/lib/transport/transport.cc +5 -3
  738. data/src/core/lib/transport/transport.h +8 -8
  739. data/src/core/lib/uri/uri_parser.cc +131 -249
  740. data/src/core/lib/uri/uri_parser.h +57 -21
  741. data/src/core/plugin_registry/grpc_plugin_registry.cc +26 -8
  742. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  743. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  744. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -25
  745. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +43 -47
  746. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  747. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  748. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  749. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  750. data/src/core/tsi/fake_transport_security.cc +17 -5
  751. data/src/core/tsi/local_transport_security.cc +5 -1
  752. data/src/core/tsi/local_transport_security.h +6 -7
  753. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  754. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  755. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -2
  756. data/src/core/tsi/ssl_transport_security.cc +73 -56
  757. data/src/core/tsi/ssl_transport_security.h +6 -6
  758. data/src/core/tsi/transport_security.cc +10 -8
  759. data/src/core/tsi/transport_security_interface.h +1 -1
  760. data/src/ruby/ext/grpc/extconf.rb +10 -2
  761. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  762. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  763. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  764. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  765. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  766. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  767. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  768. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -14
  769. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -37
  770. data/src/ruby/ext/grpc/rb_server.c +13 -1
  771. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  772. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  773. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  774. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  775. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  776. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  777. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  778. data/src/ruby/lib/grpc/version.rb +1 -1
  779. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +35 -0
  780. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  781. data/src/ruby/spec/call_spec.rb +1 -1
  782. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  783. data/src/ruby/spec/channel_spec.rb +17 -6
  784. data/src/ruby/spec/client_auth_spec.rb +27 -1
  785. data/src/ruby/spec/errors_spec.rb +1 -1
  786. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  787. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  788. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  789. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  790. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  791. data/src/ruby/spec/server_spec.rb +22 -0
  792. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  793. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  794. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  795. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  796. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  797. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  798. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  799. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  800. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  801. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  802. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  803. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  804. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  805. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  806. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  807. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  808. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  809. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  810. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  811. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  812. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  813. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  814. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  815. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  816. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  817. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  818. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  819. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  820. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  821. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  822. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  823. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  824. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  825. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  826. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  827. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  828. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  829. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  830. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  831. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  832. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  833. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  834. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  835. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  836. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  837. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  838. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  839. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  840. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  841. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  842. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  843. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  844. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  845. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  846. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  847. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  848. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  849. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  850. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  851. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  852. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  853. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  854. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  855. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  856. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  857. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  858. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  859. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  860. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  861. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  862. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  863. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  864. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  865. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  866. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  867. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  868. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  869. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  870. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  871. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  872. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  873. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  874. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  875. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  876. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  877. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  878. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  879. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  880. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  881. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  882. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  883. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  884. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  885. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  886. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  887. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  888. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  889. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  890. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  891. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  892. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  893. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +4 -3
  894. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  895. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  896. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  897. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  898. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  899. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  900. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  901. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  902. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  903. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  904. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  905. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  906. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  907. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  908. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  909. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  910. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  911. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  912. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  913. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  914. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  915. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  916. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  917. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  918. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  919. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  920. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  921. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  922. data/third_party/boringssl-with-bazel/err_data.c +728 -722
  923. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  924. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  925. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  926. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  927. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  928. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  929. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  930. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
  931. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  932. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  933. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  934. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  935. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  936. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  937. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  938. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  939. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  940. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  941. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  942. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  943. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  944. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  945. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  946. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  947. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  948. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  949. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  950. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  951. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  952. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  953. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  954. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  955. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  956. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  957. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  958. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  959. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  960. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  961. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  962. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  963. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  964. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
  965. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  966. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +97 -39
  967. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +155 -2
  968. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
  969. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
  970. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  971. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  972. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  973. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  974. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  975. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  976. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +90 -63
  977. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +60 -60
  978. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +179 -47
  979. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  980. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +10 -0
  981. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  982. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -29
  983. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  984. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  985. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
  986. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  987. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  988. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  989. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
  990. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  991. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
  992. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  993. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  994. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  995. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +25 -24
  996. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  997. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  998. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  999. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  1000. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  1001. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  1002. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  1003. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +2 -2
  1004. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
  1005. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  1006. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  1007. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +10 -8
  1008. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
  1009. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  1010. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +14 -6
  1011. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  1012. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  1013. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  1014. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +19 -0
  1015. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  1016. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  1017. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  1018. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  1019. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  1020. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
  1021. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  1022. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  1023. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  1024. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  1025. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +122 -34
  1026. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -8
  1027. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +31 -23
  1028. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -99
  1029. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +546 -402
  1030. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  1031. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  1032. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
  1033. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  1034. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
  1035. data/third_party/boringssl-with-bazel/src/ssl/internal.h +73 -17
  1036. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  1037. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +49 -9
  1038. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +87 -14
  1039. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +18 -22
  1040. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  1041. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  1042. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +570 -53
  1043. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +55 -13
  1044. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  1045. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +192 -56
  1046. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  1047. data/third_party/upb/upb/decode.c +248 -167
  1048. data/third_party/upb/upb/decode.h +20 -1
  1049. data/third_party/upb/upb/decode.int.h +163 -0
  1050. data/third_party/upb/upb/decode_fast.c +1040 -0
  1051. data/third_party/upb/upb/decode_fast.h +126 -0
  1052. data/third_party/upb/upb/def.c +2178 -0
  1053. data/third_party/upb/upb/def.h +315 -0
  1054. data/third_party/upb/upb/def.hpp +439 -0
  1055. data/third_party/upb/upb/encode.c +227 -169
  1056. data/third_party/upb/upb/encode.h +27 -2
  1057. data/third_party/upb/upb/msg.c +167 -88
  1058. data/third_party/upb/upb/msg.h +174 -34
  1059. data/third_party/upb/upb/port_def.inc +74 -61
  1060. data/third_party/upb/upb/port_undef.inc +3 -7
  1061. data/third_party/upb/upb/reflection.c +408 -0
  1062. data/third_party/upb/upb/reflection.h +168 -0
  1063. data/third_party/upb/upb/table.c +34 -197
  1064. data/third_party/upb/upb/table.int.h +14 -5
  1065. data/third_party/upb/upb/text_encode.c +421 -0
  1066. data/third_party/upb/upb/text_encode.h +38 -0
  1067. data/third_party/upb/upb/upb.c +18 -41
  1068. data/third_party/upb/upb/upb.h +36 -7
  1069. data/third_party/upb/upb/upb.hpp +4 -4
  1070. data/third_party/upb/upb/upb.int.h +29 -0
  1071. data/third_party/xxhash/xxhash.h +5443 -0
  1072. metadata +335 -75
  1073. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -1136
  1074. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  1075. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  1076. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -355
  1077. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -138
  1078. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -53
  1079. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  1080. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -129
  1081. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  1082. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -77
  1083. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +0 -36
  1084. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -85
  1085. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  1086. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -160
  1087. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  1088. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -84
  1089. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +0 -377
  1090. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +0 -102
  1091. data/src/core/lib/gprpp/map.h +0 -53
  1092. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  1093. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  1094. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  1095. data/src/core/lib/security/authorization/evaluate_args.cc +0 -153
  1096. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  1097. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  1098. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -42
  1099. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -68
  1100. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -93
  1101. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  1102. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -56
  1103. data/src/core/lib/security/certificate_provider.h +0 -60
  1104. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  1105. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -503
  1106. data/third_party/upb/upb/port.c +0 -26
@@ -16,18 +16,13 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
- #include <inttypes.h>
20
- #include <limits.h>
21
- #include <string.h>
19
+ #include <set>
20
+ #include <string>
21
+ #include <vector>
22
22
 
23
- #include "absl/container/inlined_vector.h"
24
- #include "absl/strings/match.h"
25
- #include "absl/strings/numbers.h"
23
+ #include "absl/status/status.h"
26
24
  #include "absl/strings/str_cat.h"
27
- #include "absl/strings/str_join.h"
28
- #include "absl/strings/str_split.h"
29
25
  #include "absl/strings/string_view.h"
30
- #include "re2/re2.h"
31
26
 
32
27
  #include <grpc/grpc.h>
33
28
 
@@ -36,7 +31,6 @@
36
31
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
37
32
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
38
33
  #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
39
- #include "src/core/ext/xds/xds_api.h"
40
34
  #include "src/core/lib/channel/channel_args.h"
41
35
  #include "src/core/lib/gpr/string.h"
42
36
  #include "src/core/lib/gprpp/orphanable.h"
@@ -61,7 +55,7 @@ class XdsClusterManagerLbConfig : public LoadBalancingPolicy::Config {
61
55
  using ClusterMap =
62
56
  std::map<std::string, RefCountedPtr<LoadBalancingPolicy::Config>>;
63
57
 
64
- XdsClusterManagerLbConfig(ClusterMap cluster_map)
58
+ explicit XdsClusterManagerLbConfig(ClusterMap cluster_map)
65
59
  : cluster_map_(std::move(cluster_map)) {}
66
60
 
67
61
  const char* name() const override { return kXdsClusterManager; }
@@ -109,17 +103,13 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
109
103
 
110
104
  // It is required that the keys of cluster_map have to live at least as long
111
105
  // as the ClusterPicker instance.
112
- ClusterPicker(ClusterMap cluster_map,
113
- RefCountedPtr<XdsClusterManagerLbConfig> config)
114
- : cluster_map_(std::move(cluster_map)), config_(std::move(config)) {}
106
+ explicit ClusterPicker(ClusterMap cluster_map)
107
+ : cluster_map_(std::move(cluster_map)) {}
115
108
 
116
109
  PickResult Pick(PickArgs args) override;
117
110
 
118
111
  private:
119
112
  ClusterMap cluster_map_;
120
- // Take a reference to config so that we can use
121
- // XdsApi::RdsUpdate::RdsRoute::Matchers from it.
122
- RefCountedPtr<XdsClusterManagerLbConfig> config_;
123
113
  };
124
114
 
125
115
  // Each ClusterChild holds a ref to its parent XdsClusterManagerLb.
@@ -127,7 +117,7 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
127
117
  public:
128
118
  ClusterChild(RefCountedPtr<XdsClusterManagerLb> xds_cluster_manager_policy,
129
119
  const std::string& name);
130
- ~ClusterChild();
120
+ ~ClusterChild() override;
131
121
 
132
122
  void Orphan() override;
133
123
 
@@ -151,7 +141,9 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
151
141
  explicit Helper(RefCountedPtr<ClusterChild> xds_cluster_manager_child)
152
142
  : xds_cluster_manager_child_(std::move(xds_cluster_manager_child)) {}
153
143
 
154
- ~Helper() { xds_cluster_manager_child_.reset(DEBUG_LOCATION, "Helper"); }
144
+ ~Helper() override {
145
+ xds_cluster_manager_child_.reset(DEBUG_LOCATION, "Helper");
146
+ }
155
147
 
156
148
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
157
149
  ServerAddress address, const grpc_channel_args& args) override;
@@ -192,7 +184,7 @@ class XdsClusterManagerLb : public LoadBalancingPolicy {
192
184
  bool shutdown_ = false;
193
185
  };
194
186
 
195
- ~XdsClusterManagerLb();
187
+ ~XdsClusterManagerLb() override;
196
188
 
197
189
  void ShutdownLocked() override;
198
190
 
@@ -368,8 +360,7 @@ void XdsClusterManagerLb::UpdateStateLocked() {
368
360
  Ref(DEBUG_LOCATION, "QueuePicker")));
369
361
  }
370
362
  }
371
- picker =
372
- absl::make_unique<ClusterPicker>(std::move(cluster_map), config_);
363
+ picker = absl::make_unique<ClusterPicker>(std::move(cluster_map));
373
364
  break;
374
365
  }
375
366
  case GRPC_CHANNEL_CONNECTING:
@@ -510,7 +501,7 @@ void XdsClusterManagerLb::ClusterChild::ResetBackoffLocked() {
510
501
 
511
502
  void XdsClusterManagerLb::ClusterChild::DeactivateLocked() {
512
503
  // If already deactivated, don't do that again.
513
- if (delayed_removal_timer_callback_pending_ == true) return;
504
+ if (delayed_removal_timer_callback_pending_) return;
514
505
  // Set the child weight to 0 so that future picker won't contain this child.
515
506
  // Start a timer to delete the child.
516
507
  Ref(DEBUG_LOCATION, "ClusterChild+timer").release();
@@ -547,8 +538,9 @@ void XdsClusterManagerLb::ClusterChild::OnDelayedRemovalTimerLocked(
547
538
  RefCountedPtr<SubchannelInterface>
548
539
  XdsClusterManagerLb::ClusterChild::Helper::CreateSubchannel(
549
540
  ServerAddress address, const grpc_channel_args& args) {
550
- if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
541
+ if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
551
542
  return nullptr;
543
+ }
552
544
  return xds_cluster_manager_child_->xds_cluster_manager_policy_
553
545
  ->channel_control_helper()
554
546
  ->CreateSubchannel(std::move(address), args);
@@ -566,8 +558,9 @@ void XdsClusterManagerLb::ClusterChild::Helper::UpdateState(
566
558
  xds_cluster_manager_child_->name_.c_str(), ConnectivityStateName(state),
567
559
  status.ToString().c_str(), picker.get());
568
560
  }
569
- if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
561
+ if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
570
562
  return;
563
+ }
571
564
  // Cache the picker in the ClusterChild.
572
565
  xds_cluster_manager_child_->picker_wrapper_ =
573
566
  MakeRefCounted<ChildPickerWrapper>(xds_cluster_manager_child_->name_,
@@ -591,8 +584,9 @@ void XdsClusterManagerLb::ClusterChild::Helper::UpdateState(
591
584
  }
592
585
 
593
586
  void XdsClusterManagerLb::ClusterChild::Helper::RequestReresolution() {
594
- if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
587
+ if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
595
588
  return;
589
+ }
596
590
  xds_cluster_manager_child_->xds_cluster_manager_policy_
597
591
  ->channel_control_helper()
598
592
  ->RequestReresolution();
@@ -600,8 +594,9 @@ void XdsClusterManagerLb::ClusterChild::Helper::RequestReresolution() {
600
594
 
601
595
  void XdsClusterManagerLb::ClusterChild::Helper::AddTraceEvent(
602
596
  TraceSeverity severity, absl::string_view message) {
603
- if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_)
597
+ if (xds_cluster_manager_child_->xds_cluster_manager_policy_->shutting_down_) {
604
598
  return;
599
+ }
605
600
  xds_cluster_manager_child_->xds_cluster_manager_policy_
606
601
  ->channel_control_helper()
607
602
  ->AddTraceEvent(severity, message);
@@ -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() {}