grpc 1.32.0 → 1.35.0

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

Potentially problematic release.


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

Files changed (938) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1078 -3049
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +15 -7
  6. data/include/grpc/grpc_security.h +222 -171
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +10 -8
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +22 -55
  12. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  13. data/include/grpc/slice_buffer.h +3 -3
  14. data/include/grpc/support/sync.h +3 -3
  15. data/include/grpc/support/time.h +7 -7
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  17. data/src/core/ext/filters/client_channel/client_channel.cc +2776 -1529
  18. data/src/core/ext/filters/client_channel/client_channel.h +0 -4
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
  21. data/src/core/ext/filters/client_channel/config_selector.h +40 -8
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -7
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +5 -6
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +6 -2
  29. data/src/core/ext/filters/client_channel/lb_policy.h +6 -7
  30. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  32. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -3
  33. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +201 -190
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +4 -4
  39. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +50 -20
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -5
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
  42. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +341 -127
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +24 -0
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +812 -0
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1262 -0
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  50. data/src/core/ext/filters/client_channel/resolver.cc +3 -1
  51. data/src/core/ext/filters/client_channel/resolver.h +4 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +9 -16
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +3 -3
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +454 -16
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +7 -10
  58. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -3
  59. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  60. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +34 -27
  61. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +618 -366
  62. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  63. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  64. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  65. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +29 -74
  67. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +12 -10
  68. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  69. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  70. data/src/core/ext/filters/client_channel/server_address.cc +80 -0
  71. data/src/core/ext/filters/client_channel/server_address.h +21 -36
  72. data/src/core/ext/filters/client_channel/service_config.cc +18 -13
  73. data/src/core/ext/filters/client_channel/service_config.h +8 -5
  74. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  75. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  76. data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
  77. data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
  78. data/src/core/ext/filters/client_channel/subchannel.cc +51 -64
  79. data/src/core/ext/filters/client_channel/subchannel.h +14 -20
  80. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  81. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  82. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  83. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  84. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  85. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  86. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  87. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  88. data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
  89. data/src/core/ext/filters/message_size/message_size_filter.cc +3 -2
  90. data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
  91. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  93. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  94. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  95. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  96. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  97. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +185 -79
  98. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  99. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  100. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -42
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -2
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +13 -3
  103. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  104. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  105. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  107. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  108. data/src/core/ext/transport/chttp2/transport/parsing.cc +18 -3
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  110. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  111. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  112. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  113. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  114. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +52 -32
  115. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +199 -34
  116. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  117. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  118. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +177 -99
  119. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +642 -202
  120. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  121. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  122. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +22 -22
  123. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +47 -21
  124. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +36 -24
  125. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +133 -39
  126. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  127. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  128. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +45 -44
  129. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +200 -78
  130. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +31 -24
  131. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +107 -47
  132. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  133. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  134. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +74 -28
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +248 -43
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +39 -39
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +157 -89
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +63 -39
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +254 -60
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +36 -0
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +92 -0
  150. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -13
  151. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  152. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  153. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  154. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  155. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  156. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  157. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  158. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +46 -26
  159. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +179 -68
  160. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +39 -22
  161. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +149 -48
  162. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -2
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  164. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -17
  165. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +96 -33
  166. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -7
  167. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +38 -22
  168. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +321 -194
  169. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +1228 -443
  170. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +8 -7
  171. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +34 -10
  172. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -3
  173. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  174. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +132 -80
  175. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +516 -166
  176. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  177. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +24 -25
  178. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +96 -71
  179. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +12 -8
  180. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +46 -8
  181. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +71 -29
  182. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +296 -63
  183. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  184. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  185. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  186. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  187. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +41 -31
  188. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +165 -64
  189. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -1
  190. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  191. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -1
  192. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  193. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -7
  194. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  195. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -1
  196. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  197. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  198. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  199. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  200. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  201. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  202. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  203. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  204. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  205. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  206. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  207. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +4 -3
  208. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +22 -3
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  211. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  212. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  213. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  214. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  215. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  216. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  217. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  218. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  219. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  220. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  221. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  222. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  223. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  224. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
  225. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +34 -34
  226. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +142 -59
  227. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  228. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  229. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  230. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  231. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  232. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  233. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  234. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  235. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  236. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  237. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  238. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  239. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  240. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  241. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  242. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  243. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  244. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  245. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  246. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  247. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  248. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  249. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  250. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  251. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  252. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  253. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  254. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  255. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  256. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  257. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
  259. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  260. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  261. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  262. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  263. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  264. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +28 -0
  265. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +60 -0
  266. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +52 -0
  267. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +143 -0
  268. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +42 -0
  269. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +84 -0
  270. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +36 -0
  271. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +94 -0
  272. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +54 -0
  273. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +173 -0
  274. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +36 -0
  275. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +92 -0
  276. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  277. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  278. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  279. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  280. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  283. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  284. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +254 -0
  285. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +558 -0
  289. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  290. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  291. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  292. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +133 -0
  293. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +266 -0
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +125 -0
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  304. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  305. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  306. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  307. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  308. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  309. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  310. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  311. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  312. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  313. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  314. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +46 -0
  315. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  316. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  317. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  318. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +55 -0
  319. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  320. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +110 -0
  321. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  322. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  323. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  324. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  325. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  327. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  328. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +190 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +185 -0
  331. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  332. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +62 -0
  333. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  334. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +97 -0
  335. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  336. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +915 -0
  337. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +280 -0
  338. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  339. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  340. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +64 -0
  341. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  342. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +511 -0
  343. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  344. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -0
  345. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  346. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +166 -0
  347. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  348. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +105 -0
  349. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  350. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +249 -0
  351. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  352. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  353. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  354. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  355. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  356. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +152 -0
  357. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +60 -0
  358. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +83 -0
  359. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  360. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +82 -0
  361. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  362. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +83 -0
  363. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  364. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +86 -0
  365. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  366. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  367. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  368. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  369. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  370. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  371. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  372. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  373. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  374. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  375. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  376. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +72 -0
  377. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  378. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  379. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  380. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  381. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  382. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  383. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  384. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  385. data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
  386. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  387. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  388. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  389. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  390. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  391. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  392. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  393. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  394. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  395. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  396. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  397. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  398. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  399. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  400. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  401. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  402. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  403. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  404. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  405. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  406. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  407. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  408. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  409. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  410. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  411. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  412. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  413. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  414. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  415. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  417. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  418. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  419. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  420. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  421. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  422. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +42 -0
  423. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +35 -0
  424. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +62 -0
  425. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +40 -0
  426. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +45 -0
  427. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +40 -0
  428. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +49 -0
  429. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +35 -0
  430. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +68 -0
  431. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +40 -0
  432. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +51 -0
  433. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +35 -0
  434. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +307 -0
  435. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  436. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  437. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  438. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  439. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  440. data/src/core/ext/xds/certificate_provider_store.h +112 -0
  441. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  442. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  443. data/src/core/ext/xds/xds_api.cc +687 -767
  444. data/src/core/ext/xds/xds_api.h +207 -98
  445. data/src/core/ext/xds/xds_bootstrap.cc +172 -25
  446. data/src/core/ext/xds/xds_bootstrap.h +23 -8
  447. data/src/core/ext/xds/xds_certificate_provider.cc +299 -0
  448. data/src/core/ext/xds/xds_certificate_provider.h +112 -0
  449. data/src/core/ext/xds/xds_channel_args.h +6 -3
  450. data/src/core/ext/xds/xds_client.cc +617 -494
  451. data/src/core/ext/xds/xds_client.h +118 -58
  452. data/src/core/ext/xds/xds_client_stats.cc +59 -16
  453. data/src/core/ext/xds/xds_client_stats.h +35 -7
  454. data/src/core/ext/xds/xds_server_config_fetcher.cc +131 -0
  455. data/src/core/lib/channel/channel_args.cc +9 -8
  456. data/src/core/lib/channel/channel_args.h +0 -1
  457. data/src/core/lib/channel/channel_trace.cc +4 -2
  458. data/src/core/lib/channel/channel_trace.h +1 -1
  459. data/src/core/lib/channel/channelz.cc +23 -59
  460. data/src/core/lib/channel/channelz.h +13 -22
  461. data/src/core/lib/channel/channelz_registry.cc +12 -11
  462. data/src/core/lib/channel/channelz_registry.h +3 -1
  463. data/src/core/lib/channel/handshaker.cc +2 -2
  464. data/src/core/lib/channel/handshaker.h +2 -2
  465. data/src/core/lib/compression/compression.cc +8 -4
  466. data/src/core/lib/compression/compression_args.cc +3 -2
  467. data/src/core/lib/compression/compression_internal.cc +10 -5
  468. data/src/core/lib/compression/compression_internal.h +2 -1
  469. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  470. data/src/core/lib/debug/stats.h +2 -2
  471. data/src/core/lib/debug/stats_data.cc +1 -0
  472. data/src/core/lib/debug/stats_data.h +13 -13
  473. data/src/core/lib/gpr/alloc.cc +3 -2
  474. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  475. data/src/core/lib/gpr/log.cc +53 -16
  476. data/src/core/lib/gpr/log_linux.cc +19 -3
  477. data/src/core/lib/gpr/log_posix.cc +15 -1
  478. data/src/core/lib/gpr/log_windows.cc +18 -4
  479. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  480. data/src/core/lib/gpr/spinlock.h +10 -2
  481. data/src/core/lib/gpr/string.cc +23 -22
  482. data/src/core/lib/gpr/string.h +5 -6
  483. data/src/core/lib/gpr/sync.cc +4 -4
  484. data/src/core/lib/gpr/time.cc +12 -12
  485. data/src/core/lib/gpr/time_precise.cc +5 -2
  486. data/src/core/lib/gpr/time_precise.h +6 -2
  487. data/src/core/lib/gpr/tls.h +4 -0
  488. data/src/core/lib/gpr/tls_msvc.h +2 -0
  489. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  490. data/src/core/lib/gpr/useful.h +5 -4
  491. data/src/core/lib/gprpp/arena.h +3 -2
  492. data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
  493. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  494. data/src/core/lib/gprpp/examine_stack.h +46 -0
  495. data/src/core/lib/gprpp/fork.cc +2 -2
  496. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  497. data/src/core/lib/gprpp/orphanable.h +4 -8
  498. data/src/core/lib/gprpp/ref_counted.h +91 -68
  499. data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
  500. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  501. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  502. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  503. data/src/core/lib/gprpp/thd.h +2 -2
  504. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  505. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  506. data/src/core/lib/http/httpcli.cc +1 -1
  507. data/src/core/lib/http/httpcli.h +2 -3
  508. data/src/core/lib/http/httpcli_security_connector.cc +1 -1
  509. data/src/core/lib/http/parser.cc +47 -27
  510. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  511. data/src/core/lib/iomgr/combiner.cc +2 -1
  512. data/src/core/lib/iomgr/endpoint.h +1 -1
  513. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -5
  514. data/src/core/lib/iomgr/error.cc +17 -12
  515. data/src/core/lib/iomgr/error_internal.h +1 -1
  516. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  517. data/src/core/lib/iomgr/ev_epollex_linux.cc +25 -17
  518. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  519. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  520. data/src/core/lib/iomgr/exec_ctx.h +16 -12
  521. data/src/core/lib/iomgr/executor.cc +2 -1
  522. data/src/core/lib/iomgr/executor.h +1 -1
  523. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  524. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  525. data/src/core/lib/iomgr/iomgr.cc +1 -1
  526. data/src/core/lib/iomgr/load_file.h +1 -1
  527. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  528. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  529. data/src/core/lib/iomgr/parse_address.cc +127 -43
  530. data/src/core/lib/iomgr/parse_address.h +32 -8
  531. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  532. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  533. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  534. data/src/core/lib/iomgr/python_util.h +4 -4
  535. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  536. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  537. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  538. data/src/core/lib/iomgr/sockaddr_utils.cc +10 -10
  539. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  540. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  541. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  542. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  543. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  544. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  545. data/src/core/lib/iomgr/tcp_posix.cc +12 -8
  546. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  547. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  548. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  549. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  550. data/src/core/lib/iomgr/udp_server.cc +1 -2
  551. data/src/core/lib/iomgr/udp_server.h +1 -2
  552. data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
  553. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  554. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  555. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  556. data/src/core/lib/json/json.h +12 -2
  557. data/src/core/lib/json/json_reader.cc +8 -4
  558. data/src/core/lib/json/json_util.cc +58 -0
  559. data/src/core/lib/json/json_util.h +204 -0
  560. data/src/core/lib/json/json_writer.cc +2 -1
  561. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  562. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  563. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  564. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  565. data/src/core/lib/security/authorization/mock_cel/cel_value.h +4 -0
  566. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  567. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  568. data/src/core/lib/security/context/security_context.cc +4 -3
  569. data/src/core/lib/security/context/security_context.h +3 -1
  570. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  571. data/src/core/lib/security/credentials/credentials.cc +7 -7
  572. data/src/core/lib/security/credentials/credentials.h +3 -3
  573. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  574. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  575. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  576. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  577. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  578. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  579. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  580. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  581. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  582. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  583. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -1
  584. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +18 -12
  585. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  586. data/src/core/lib/security/credentials/jwt/json_token.cc +6 -3
  587. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  588. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -4
  589. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
  590. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  591. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  592. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -5
  593. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  594. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
  595. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
  596. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  597. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  598. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
  599. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
  600. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -12
  601. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  602. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  603. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  604. data/src/core/lib/security/credentials/xds/xds_credentials.cc +175 -0
  605. data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
  606. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  607. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -13
  608. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  609. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  610. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  611. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  612. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
  613. data/src/core/lib/security/security_connector/security_connector.cc +4 -3
  614. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  615. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  616. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  617. data/src/core/lib/security/security_connector/ssl_utils.h +19 -19
  618. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +342 -279
  619. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
  620. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  621. data/src/core/lib/security/transport/security_handshaker.cc +3 -3
  622. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  623. data/src/core/lib/security/util/json_util.h +1 -0
  624. data/src/core/lib/slice/slice.cc +7 -4
  625. data/src/core/lib/slice/slice_buffer.cc +2 -1
  626. data/src/core/lib/slice/slice_intern.cc +6 -7
  627. data/src/core/lib/slice/slice_internal.h +2 -2
  628. data/src/core/lib/surface/call.cc +41 -32
  629. data/src/core/lib/surface/call_details.cc +8 -8
  630. data/src/core/lib/surface/channel.cc +25 -41
  631. data/src/core/lib/surface/channel.h +9 -3
  632. data/src/core/lib/surface/channel_init.cc +1 -1
  633. data/src/core/lib/surface/completion_queue.cc +30 -24
  634. data/src/core/lib/surface/completion_queue.h +16 -16
  635. data/src/core/lib/surface/init.cc +32 -14
  636. data/src/core/lib/surface/lame_client.cc +20 -46
  637. data/src/core/lib/surface/lame_client.h +4 -0
  638. data/src/core/lib/surface/server.cc +63 -17
  639. data/src/core/lib/surface/server.h +39 -7
  640. data/src/core/lib/surface/validate_metadata.h +3 -0
  641. data/src/core/lib/surface/version.cc +2 -2
  642. data/src/core/lib/transport/authority_override.cc +6 -4
  643. data/src/core/lib/transport/authority_override.h +7 -2
  644. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  645. data/src/core/lib/transport/bdp_estimator.h +2 -1
  646. data/src/core/lib/transport/byte_stream.h +3 -3
  647. data/src/core/lib/transport/connectivity_state.h +11 -9
  648. data/src/core/lib/transport/error_utils.h +1 -1
  649. data/src/core/lib/transport/metadata.cc +11 -1
  650. data/src/core/lib/transport/metadata.h +2 -2
  651. data/src/core/lib/transport/metadata_batch.h +4 -4
  652. data/src/core/lib/transport/static_metadata.cc +1 -1
  653. data/src/core/lib/transport/status_metadata.cc +4 -3
  654. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  655. data/src/core/lib/transport/transport.cc +5 -3
  656. data/src/core/lib/transport/transport.h +8 -8
  657. data/src/core/lib/uri/uri_parser.cc +131 -249
  658. data/src/core/lib/uri/uri_parser.h +57 -21
  659. data/src/core/plugin_registry/grpc_plugin_registry.cc +41 -20
  660. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  661. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  662. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  663. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +27 -26
  664. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  665. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  666. data/src/core/tsi/fake_transport_security.cc +6 -3
  667. data/src/core/tsi/local_transport_security.cc +5 -1
  668. data/src/core/tsi/local_transport_security.h +6 -7
  669. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -0
  670. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  671. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -1
  672. data/src/core/tsi/ssl_transport_security.cc +78 -58
  673. data/src/core/tsi/ssl_transport_security.h +9 -6
  674. data/src/core/tsi/transport_security.cc +10 -8
  675. data/src/core/tsi/transport_security_interface.h +1 -1
  676. data/src/ruby/ext/grpc/extconf.rb +1 -1
  677. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  678. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -16
  679. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -40
  680. data/src/ruby/lib/grpc/version.rb +1 -1
  681. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +28 -0
  682. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  683. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  684. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  685. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  686. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  687. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  688. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  689. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  690. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  691. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  692. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  693. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  694. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  695. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  696. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  697. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  698. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  699. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  700. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  701. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  702. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  703. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  704. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  705. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  706. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  707. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  708. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  709. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  710. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  711. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  712. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  713. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  714. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  715. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  716. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  717. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  718. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  719. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  720. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  721. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  722. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  723. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  724. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  725. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  726. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  727. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  728. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  729. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  730. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  731. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  732. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  733. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  734. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  735. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  736. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  737. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  738. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  739. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  740. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  741. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  742. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  743. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  744. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  745. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  746. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  747. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  748. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  749. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  750. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  751. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  752. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  753. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  754. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  755. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  756. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  757. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  758. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  759. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  760. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  761. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  762. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  763. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  764. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  765. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  766. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  767. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  768. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  769. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  770. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  771. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  772. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  773. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  774. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  775. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  776. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  777. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  778. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  779. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  780. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  781. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  782. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  783. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  784. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  785. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  786. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +3 -3
  787. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  788. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  789. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  790. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  791. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  792. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  793. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  794. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  795. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  796. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  797. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  798. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  799. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  800. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  801. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  802. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  803. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  804. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  805. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  806. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  807. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  808. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  809. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  810. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  811. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  812. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  813. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  814. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  815. data/third_party/boringssl-with-bazel/err_data.c +469 -463
  816. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +0 -6
  817. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  818. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
  819. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  820. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  821. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  822. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  823. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  824. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  825. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  826. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
  827. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +56 -22
  828. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +8 -2
  829. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +98 -11
  830. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +51 -6
  831. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
  832. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
  833. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
  834. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  835. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
  836. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
  837. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  838. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  839. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +7 -2
  840. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +21 -18
  841. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  842. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +24 -3
  843. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
  844. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  845. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +3 -3
  846. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
  847. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +13 -2
  848. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
  849. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  850. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +2 -2
  851. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  852. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  853. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  854. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  855. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +14 -14
  856. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +7 -3
  857. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +2 -2
  858. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  859. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  860. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
  861. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -1
  862. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  863. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +7 -5
  864. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +0 -1
  865. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -3
  866. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  867. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +6 -0
  868. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
  869. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  870. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +12 -0
  871. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +9 -0
  872. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +4 -1
  873. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  874. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  875. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +64 -3
  876. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  877. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
  878. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +188 -78
  879. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +482 -432
  880. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  881. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  882. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +18 -18
  883. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -3
  884. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  885. data/third_party/boringssl-with-bazel/src/ssl/internal.h +45 -10
  886. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +42 -1
  887. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  888. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +67 -0
  889. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +11 -14
  890. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +216 -11
  891. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
  892. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +57 -19
  893. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +135 -41
  894. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  895. data/third_party/upb/upb/decode.c +248 -167
  896. data/third_party/upb/upb/decode.h +20 -1
  897. data/third_party/upb/upb/decode.int.h +163 -0
  898. data/third_party/upb/upb/decode_fast.c +1040 -0
  899. data/third_party/upb/upb/decode_fast.h +126 -0
  900. data/third_party/upb/upb/def.c +2178 -0
  901. data/third_party/upb/upb/def.h +315 -0
  902. data/third_party/upb/upb/def.hpp +439 -0
  903. data/third_party/upb/upb/encode.c +227 -169
  904. data/third_party/upb/upb/encode.h +27 -2
  905. data/third_party/upb/upb/json_decode.c +1443 -0
  906. data/third_party/upb/upb/json_decode.h +23 -0
  907. data/third_party/upb/upb/json_encode.c +713 -0
  908. data/third_party/upb/upb/json_encode.h +36 -0
  909. data/third_party/upb/upb/msg.c +167 -88
  910. data/third_party/upb/upb/msg.h +174 -34
  911. data/third_party/upb/upb/port_def.inc +74 -61
  912. data/third_party/upb/upb/port_undef.inc +3 -7
  913. data/third_party/upb/upb/reflection.c +408 -0
  914. data/third_party/upb/upb/reflection.h +168 -0
  915. data/third_party/upb/upb/table.c +34 -197
  916. data/third_party/upb/upb/table.int.h +14 -5
  917. data/third_party/upb/upb/text_encode.c +421 -0
  918. data/third_party/upb/upb/text_encode.h +38 -0
  919. data/third_party/upb/upb/upb.c +18 -41
  920. data/third_party/upb/upb/upb.h +36 -7
  921. data/third_party/upb/upb/upb.hpp +4 -4
  922. data/third_party/upb/upb/upb.int.h +29 -0
  923. metadata +288 -54
  924. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -946
  925. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -537
  926. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1141
  927. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  928. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  929. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -354
  930. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -142
  931. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  932. data/src/core/ext/xds/xds_channel.h +0 -46
  933. data/src/core/ext/xds/xds_channel_secure.cc +0 -103
  934. data/src/core/lib/gprpp/map.h +0 -53
  935. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  936. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  937. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  938. data/third_party/upb/upb/port.c +0 -26
@@ -21,6 +21,8 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <ares.h>
25
+
24
26
  #include "src/core/ext/filters/client_channel/server_address.h"
25
27
  #include "src/core/lib/iomgr/iomgr.h"
26
28
  #include "src/core/lib/iomgr/polling_entity.h"
@@ -93,5 +95,8 @@ bool grpc_ares_query_ipv6();
93
95
  void grpc_cares_wrapper_address_sorting_sort(
94
96
  const grpc_ares_request* request, grpc_core::ServerAddressList* addresses);
95
97
 
98
+ /* Exposed in this header for C-core tests only */
99
+ extern void (*grpc_ares_test_only_inject_config)(ares_channel channel);
100
+
96
101
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H \
97
102
  */
@@ -63,7 +63,7 @@ class NativeDnsResolver : public Resolver {
63
63
  void ShutdownLocked() override;
64
64
 
65
65
  private:
66
- virtual ~NativeDnsResolver();
66
+ ~NativeDnsResolver() override;
67
67
 
68
68
  void MaybeStartResolvingLocked();
69
69
  void StartResolvingLocked();
@@ -74,7 +74,7 @@ class NativeDnsResolver : public Resolver {
74
74
  void OnResolvedLocked(grpc_error* error);
75
75
 
76
76
  /// name to resolve
77
- char* name_to_resolve_ = nullptr;
77
+ std::string name_to_resolve_;
78
78
  /// channel args
79
79
  grpc_channel_args* channel_args_ = nullptr;
80
80
  /// pollset_set to drive the name resolution process
@@ -107,9 +107,7 @@ NativeDnsResolver::NativeDnsResolver(ResolverArgs args)
107
107
  .set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER)
108
108
  .set_jitter(GRPC_DNS_RECONNECT_JITTER)
109
109
  .set_max_backoff(GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) {
110
- char* path = args.uri->path;
111
- if (path[0] == '/') ++path;
112
- name_to_resolve_ = gpr_strdup(path);
110
+ name_to_resolve_ = std::string(absl::StripPrefix(args.uri.path(), "/"));
113
111
  channel_args_ = grpc_channel_args_copy(args.args);
114
112
  const grpc_arg* arg = grpc_channel_args_find(
115
113
  args.args, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS);
@@ -124,7 +122,6 @@ NativeDnsResolver::NativeDnsResolver(ResolverArgs args)
124
122
  NativeDnsResolver::~NativeDnsResolver() {
125
123
  grpc_channel_args_destroy(channel_args_);
126
124
  grpc_pollset_set_destroy(interested_parties_);
127
- gpr_free(name_to_resolve_);
128
125
  }
129
126
 
130
127
  void NativeDnsResolver::StartLocked() { MaybeStartResolvingLocked(); }
@@ -269,8 +266,8 @@ void NativeDnsResolver::StartResolvingLocked() {
269
266
  addresses_ = nullptr;
270
267
  GRPC_CLOSURE_INIT(&on_resolved_, NativeDnsResolver::OnResolved, this,
271
268
  grpc_schedule_on_exec_ctx);
272
- grpc_resolve_address(name_to_resolve_, kDefaultPort, interested_parties_,
273
- &on_resolved_, &addresses_);
269
+ grpc_resolve_address(name_to_resolve_.c_str(), kDefaultPort,
270
+ interested_parties_, &on_resolved_, &addresses_);
274
271
  last_resolution_timestamp_ = grpc_core::ExecCtx::Get()->Now();
275
272
  }
276
273
 
@@ -280,8 +277,8 @@ void NativeDnsResolver::StartResolvingLocked() {
280
277
 
281
278
  class NativeDnsResolverFactory : public ResolverFactory {
282
279
  public:
283
- bool IsValidUri(const grpc_uri* uri) const override {
284
- if (GPR_UNLIKELY(0 != strcmp(uri->authority, ""))) {
280
+ bool IsValidUri(const URI& uri) const override {
281
+ if (GPR_UNLIKELY(!uri.authority().empty())) {
285
282
  gpr_log(GPR_ERROR, "authority based dns uri's not supported");
286
283
  return false;
287
284
  }
@@ -59,7 +59,7 @@ class FakeResolver : public Resolver {
59
59
  friend class FakeResolverResponseGenerator;
60
60
  friend class FakeResolverResponseSetter;
61
61
 
62
- virtual ~FakeResolver();
62
+ ~FakeResolver() override;
63
63
 
64
64
  void ShutdownLocked() override;
65
65
 
@@ -339,7 +339,7 @@ grpc_arg FakeResolverResponseGenerator::MakeChannelArg(
339
339
  FakeResolverResponseGenerator* generator) {
340
340
  grpc_arg arg;
341
341
  arg.type = GRPC_ARG_POINTER;
342
- arg.key = (char*)GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR;
342
+ arg.key = const_cast<char*>(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR);
343
343
  arg.value.pointer.p = generator;
344
344
  arg.value.pointer.vtable = &response_generator_arg_vtable;
345
345
  return arg;
@@ -362,7 +362,7 @@ namespace {
362
362
 
363
363
  class FakeResolverFactory : public ResolverFactory {
364
364
  public:
365
- bool IsValidUri(const grpc_uri* /*uri*/) const override { return true; }
365
+ bool IsValidUri(const URI& /*uri*/) const override { return true; }
366
366
 
367
367
  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
368
368
  return MakeOrphanable<FakeResolver>(std::move(args));
@@ -43,7 +43,7 @@ class FakeResolverResponseGenerator
43
43
  : public RefCounted<FakeResolverResponseGenerator> {
44
44
  public:
45
45
  FakeResolverResponseGenerator();
46
- ~FakeResolverResponseGenerator();
46
+ ~FakeResolverResponseGenerator() override;
47
47
 
48
48
  // Instructs the fake resolver associated with the response generator
49
49
  // instance to trigger a new resolution with the specified result. If the
@@ -23,6 +23,8 @@
23
23
  #include <stdlib.h>
24
24
  #include <string.h>
25
25
 
26
+ #include "absl/strings/str_split.h"
27
+
26
28
  #include <grpc/support/alloc.h>
27
29
  #include <grpc/support/string_util.h>
28
30
 
@@ -78,30 +80,20 @@ void SockaddrResolver::StartLocked() {
78
80
  // Factory
79
81
  //
80
82
 
81
- void DoNothing(void* /*ignored*/) {}
82
-
83
- bool ParseUri(const grpc_uri* uri,
84
- bool parse(const grpc_uri* uri, grpc_resolved_address* dst),
83
+ bool ParseUri(const URI& uri,
84
+ bool parse(const URI& uri, grpc_resolved_address* dst),
85
85
  ServerAddressList* addresses) {
86
- if (0 != strcmp(uri->authority, "")) {
86
+ if (!uri.authority().empty()) {
87
87
  gpr_log(GPR_ERROR, "authority-based URIs not supported by the %s scheme",
88
- uri->scheme);
88
+ uri.scheme().c_str());
89
89
  return false;
90
90
  }
91
91
  // Construct addresses.
92
- grpc_slice path_slice =
93
- grpc_slice_new(uri->path, strlen(uri->path), DoNothing);
94
- grpc_slice_buffer path_parts;
95
- grpc_slice_buffer_init(&path_parts);
96
- grpc_slice_split(path_slice, ",", &path_parts);
97
92
  bool errors_found = false;
98
- for (size_t i = 0; i < path_parts.count; i++) {
99
- grpc_uri ith_uri = *uri;
100
- grpc_core::UniquePtr<char> part_str(
101
- grpc_slice_to_c_string(path_parts.slices[i]));
102
- ith_uri.path = part_str.get();
93
+ for (absl::string_view ith_path : absl::StrSplit(uri.path(), ',')) {
94
+ URI ith_uri(uri.scheme(), "", std::string(ith_path), {}, "");
103
95
  grpc_resolved_address addr;
104
- if (!parse(&ith_uri, &addr)) {
96
+ if (!parse(ith_uri, &addr)) {
105
97
  errors_found = true;
106
98
  break;
107
99
  }
@@ -109,14 +101,11 @@ bool ParseUri(const grpc_uri* uri,
109
101
  addresses->emplace_back(addr, nullptr /* args */);
110
102
  }
111
103
  }
112
- grpc_slice_buffer_destroy_internal(&path_parts);
113
- grpc_slice_unref_internal(path_slice);
114
104
  return !errors_found;
115
105
  }
116
106
 
117
107
  OrphanablePtr<Resolver> CreateSockaddrResolver(
118
- ResolverArgs args,
119
- bool parse(const grpc_uri* uri, grpc_resolved_address* dst)) {
108
+ ResolverArgs args, bool parse(const URI& uri, grpc_resolved_address* dst)) {
120
109
  ServerAddressList addresses;
121
110
  if (!ParseUri(args.uri, parse, &addresses)) return nullptr;
122
111
  // Instantiate resolver.
@@ -126,7 +115,7 @@ OrphanablePtr<Resolver> CreateSockaddrResolver(
126
115
 
127
116
  class IPv4ResolverFactory : public ResolverFactory {
128
117
  public:
129
- bool IsValidUri(const grpc_uri* uri) const override {
118
+ bool IsValidUri(const URI& uri) const override {
130
119
  return ParseUri(uri, grpc_parse_ipv4, nullptr);
131
120
  }
132
121
 
@@ -139,7 +128,7 @@ class IPv4ResolverFactory : public ResolverFactory {
139
128
 
140
129
  class IPv6ResolverFactory : public ResolverFactory {
141
130
  public:
142
- bool IsValidUri(const grpc_uri* uri) const override {
131
+ bool IsValidUri(const URI& uri) const override {
143
132
  return ParseUri(uri, grpc_parse_ipv6, nullptr);
144
133
  }
145
134
 
@@ -153,7 +142,7 @@ class IPv6ResolverFactory : public ResolverFactory {
153
142
  #ifdef GRPC_HAVE_UNIX_SOCKET
154
143
  class UnixResolverFactory : public ResolverFactory {
155
144
  public:
156
- bool IsValidUri(const grpc_uri* uri) const override {
145
+ bool IsValidUri(const URI& uri) const override {
157
146
  return ParseUri(uri, grpc_parse_unix, nullptr);
158
147
  }
159
148
 
@@ -161,13 +150,29 @@ class UnixResolverFactory : public ResolverFactory {
161
150
  return CreateSockaddrResolver(std::move(args), grpc_parse_unix);
162
151
  }
163
152
 
164
- grpc_core::UniquePtr<char> GetDefaultAuthority(
165
- grpc_uri* /*uri*/) const override {
166
- return grpc_core::UniquePtr<char>(gpr_strdup("localhost"));
153
+ std::string GetDefaultAuthority(const URI& uri) const override {
154
+ return "localhost";
167
155
  }
168
156
 
169
157
  const char* scheme() const override { return "unix"; }
170
158
  };
159
+
160
+ class UnixAbstractResolverFactory : public ResolverFactory {
161
+ public:
162
+ bool IsValidUri(const URI& uri) const override {
163
+ return ParseUri(uri, grpc_parse_unix_abstract, nullptr);
164
+ }
165
+
166
+ OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
167
+ return CreateSockaddrResolver(std::move(args), grpc_parse_unix_abstract);
168
+ }
169
+
170
+ std::string GetDefaultAuthority(const URI& /*uri*/) const override {
171
+ return "localhost";
172
+ }
173
+
174
+ const char* scheme() const override { return "unix-abstract"; }
175
+ };
171
176
  #endif // GRPC_HAVE_UNIX_SOCKET
172
177
 
173
178
  } // namespace
@@ -182,6 +187,8 @@ void grpc_resolver_sockaddr_init() {
182
187
  #ifdef GRPC_HAVE_UNIX_SOCKET
183
188
  grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
184
189
  absl::make_unique<grpc_core::UnixResolverFactory>());
190
+ grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
191
+ absl::make_unique<grpc_core::UnixAbstractResolverFactory>());
185
192
  #endif
186
193
  }
187
194
 
@@ -18,18 +18,25 @@
18
18
 
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
+ #include "absl/strings/match.h"
21
22
  #include "absl/strings/str_join.h"
23
+ #include "absl/strings/str_split.h"
24
+ #include "re2/re2.h"
22
25
 
23
26
  #include "src/core/ext/filters/client_channel/config_selector.h"
24
27
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
25
28
  #include "src/core/ext/xds/xds_client.h"
26
29
  #include "src/core/lib/channel/channel_args.h"
30
+ #include "src/core/lib/iomgr/closure.h"
31
+ #include "src/core/lib/iomgr/exec_ctx.h"
27
32
  #include "src/core/lib/transport/timeout_encoding.h"
28
33
 
29
34
  namespace grpc_core {
30
35
 
31
36
  TraceFlag grpc_xds_resolver_trace(false, "xds_resolver");
32
37
 
38
+ const char* kXdsClusterAttribute = "xds_cluster_name";
39
+
33
40
  namespace {
34
41
 
35
42
  //
@@ -41,12 +48,9 @@ class XdsResolver : public Resolver {
41
48
  explicit XdsResolver(ResolverArgs args)
42
49
  : Resolver(std::move(args.work_serializer),
43
50
  std::move(args.result_handler)),
51
+ server_name_(absl::StripPrefix(args.uri.path(), "/")),
44
52
  args_(grpc_channel_args_copy(args.args)),
45
- interested_parties_(args.pollset_set),
46
- config_selector_(MakeRefCounted<XdsConfigSelector>()) {
47
- char* path = args.uri->path;
48
- if (path[0] == '/') ++path;
49
- server_name_ = path;
53
+ interested_parties_(args.pollset_set) {
50
54
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
51
55
  gpr_log(GPR_INFO, "[xds_resolver %p] created for server name %s", this,
52
56
  server_name_.c_str());
@@ -62,124 +66,496 @@ class XdsResolver : public Resolver {
62
66
 
63
67
  void StartLocked() override;
64
68
 
65
- void ShutdownLocked() override {
66
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
67
- gpr_log(GPR_INFO, "[xds_resolver %p] shutting down", this);
68
- }
69
- xds_client_.reset();
70
- }
69
+ void ShutdownLocked() override;
71
70
 
72
71
  private:
72
+ class Notifier {
73
+ public:
74
+ Notifier(RefCountedPtr<XdsResolver> resolver, XdsApi::LdsUpdate update);
75
+ Notifier(RefCountedPtr<XdsResolver> resolver, XdsApi::RdsUpdate update);
76
+ Notifier(RefCountedPtr<XdsResolver> resolver, grpc_error* error);
77
+ explicit Notifier(RefCountedPtr<XdsResolver> resolver);
78
+
79
+ private:
80
+ enum Type { kLdsUpdate, kRdsUpdate, kError, kDoesNotExist };
81
+
82
+ static void RunInExecCtx(void* arg, grpc_error* error);
83
+ void RunInWorkSerializer(grpc_error* error);
84
+
85
+ RefCountedPtr<XdsResolver> resolver_;
86
+ grpc_closure closure_;
87
+ XdsApi::LdsUpdate update_;
88
+ Type type_;
89
+ };
90
+
73
91
  class ListenerWatcher : public XdsClient::ListenerWatcherInterface {
74
92
  public:
75
93
  explicit ListenerWatcher(RefCountedPtr<XdsResolver> resolver)
76
94
  : resolver_(std::move(resolver)) {}
77
- void OnListenerChanged(std::vector<XdsApi::Route> routes) override;
78
- void OnError(grpc_error* error) override;
79
- void OnResourceDoesNotExist() override;
95
+ void OnListenerChanged(XdsApi::LdsUpdate listener) override {
96
+ new Notifier(resolver_, std::move(listener));
97
+ }
98
+ void OnError(grpc_error* error) override { new Notifier(resolver_, error); }
99
+ void OnResourceDoesNotExist() override { new Notifier(resolver_); }
80
100
 
81
101
  private:
82
102
  RefCountedPtr<XdsResolver> resolver_;
83
103
  };
84
104
 
85
- class XdsConfigSelector : public ConfigSelector {
105
+ class RouteConfigWatcher : public XdsClient::RouteConfigWatcherInterface {
86
106
  public:
87
- CallConfig GetCallConfig(GetCallConfigArgs args) override {
88
- return CallConfig();
107
+ explicit RouteConfigWatcher(RefCountedPtr<XdsResolver> resolver)
108
+ : resolver_(std::move(resolver)) {}
109
+ void OnRouteConfigChanged(XdsApi::RdsUpdate route_config) override {
110
+ new Notifier(resolver_, std::move(route_config));
89
111
  }
112
+ void OnError(grpc_error* error) override { new Notifier(resolver_, error); }
113
+ void OnResourceDoesNotExist() override { new Notifier(resolver_); }
114
+
115
+ private:
116
+ RefCountedPtr<XdsResolver> resolver_;
90
117
  };
91
118
 
92
- // Returns the weighted_clusters action name to use from
93
- // weighted_cluster_index_map_ for a WeightedClusters route action.
94
- std::string WeightedClustersActionName(
95
- const std::vector<XdsApi::Route::ClusterWeight>& weighted_clusters);
119
+ class ClusterState
120
+ : public RefCounted<ClusterState, PolymorphicRefCount, false> {
121
+ public:
122
+ using ClusterStateMap =
123
+ std::map<std::string, std::unique_ptr<ClusterState>>;
96
124
 
97
- // Updates weighted_cluster_index_map_ that will
98
- // determine the names of the WeightedCluster actions for the current update.
99
- void UpdateWeightedClusterIndexMap(const std::vector<XdsApi::Route>& routes);
125
+ ClusterState(const std::string& cluster_name,
126
+ ClusterStateMap* cluster_state_map)
127
+ : it_(cluster_state_map
128
+ ->emplace(cluster_name, std::unique_ptr<ClusterState>(this))
129
+ .first) {}
130
+ const std::string& cluster() const { return it_->first; }
100
131
 
101
- // Create the service config generated by the list of routes.
102
- grpc_error* CreateServiceConfig(const std::vector<XdsApi::Route>& routes,
103
- RefCountedPtr<ServiceConfig>* service_config);
132
+ private:
133
+ ClusterStateMap::iterator it_;
134
+ };
135
+
136
+ class XdsConfigSelector : public ConfigSelector {
137
+ public:
138
+ XdsConfigSelector(RefCountedPtr<XdsResolver> resolver,
139
+ const std::vector<XdsApi::Route>& routes,
140
+ grpc_error* error);
141
+ ~XdsConfigSelector() override;
142
+
143
+ const char* name() const override { return "XdsConfigSelector"; }
144
+
145
+ bool Equals(const ConfigSelector* other) const override {
146
+ const auto* other_xds = static_cast<const XdsConfigSelector*>(other);
147
+ // Don't need to compare resolver_, since that will always be the same.
148
+ return route_table_ == other_xds->route_table_ &&
149
+ clusters_ == other_xds->clusters_;
150
+ }
151
+
152
+ CallConfig GetCallConfig(GetCallConfigArgs args) override;
153
+
154
+ private:
155
+ struct Route {
156
+ XdsApi::Route route;
157
+ absl::InlinedVector<std::pair<uint32_t, absl::string_view>, 2>
158
+ weighted_cluster_state;
159
+ RefCountedPtr<ServiceConfig> method_config;
160
+ bool operator==(const Route& other) const {
161
+ return route == other.route &&
162
+ weighted_cluster_state == other.weighted_cluster_state;
163
+ }
164
+ };
165
+ using RouteTable = std::vector<Route>;
166
+
167
+ void MaybeAddCluster(const std::string& name);
168
+ grpc_error* CreateMethodConfig(RefCountedPtr<ServiceConfig>* method_config,
169
+ const XdsApi::Route& route);
170
+
171
+ RefCountedPtr<XdsResolver> resolver_;
172
+ RouteTable route_table_;
173
+ std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters_;
174
+ };
175
+
176
+ void OnListenerUpdate(XdsApi::LdsUpdate listener);
177
+ void OnRouteConfigUpdate(XdsApi::RdsUpdate rds_update);
178
+ void OnError(grpc_error* error);
179
+ void OnResourceDoesNotExist();
180
+
181
+ grpc_error* CreateServiceConfig(RefCountedPtr<ServiceConfig>* service_config);
182
+ void GenerateResult();
183
+ void MaybeRemoveUnusedClusters();
104
184
 
105
185
  std::string server_name_;
106
186
  const grpc_channel_args* args_;
107
187
  grpc_pollset_set* interested_parties_;
108
- OrphanablePtr<XdsClient> xds_client_;
109
- RefCountedPtr<XdsConfigSelector> config_selector_;
110
-
111
- // 2-level map to store WeightedCluster action names.
112
- // Top level map is keyed by cluster names without weight like a_b_c; bottom
113
- // level map is keyed by cluster names + weights like a10_b50_c40.
114
- struct ClusterNamesInfo {
115
- uint64_t next_index = 0;
116
- std::map<std::string /*cluster names + weights*/,
117
- uint64_t /*policy index number*/>
118
- cluster_weights_map;
119
- };
120
- using WeightedClusterIndexMap =
121
- std::map<std::string /*cluster names*/, ClusterNamesInfo>;
122
-
123
- // Cache of action names for WeightedCluster targets in the current
124
- // service config.
125
- WeightedClusterIndexMap weighted_cluster_index_map_;
188
+ RefCountedPtr<XdsClient> xds_client_;
189
+ XdsClient::ListenerWatcherInterface* listener_watcher_ = nullptr;
190
+ std::string route_config_name_;
191
+ XdsClient::RouteConfigWatcherInterface* route_config_watcher_ = nullptr;
192
+ ClusterState::ClusterStateMap cluster_state_map_;
193
+ std::vector<XdsApi::Route> current_update_;
194
+ XdsApi::Duration http_max_stream_duration_;
126
195
  };
127
196
 
128
197
  //
129
- // XdsResolver::ListenerWatcher
198
+ // XdsResolver::Notifier
130
199
  //
131
200
 
132
- void XdsResolver::ListenerWatcher::OnListenerChanged(
133
- std::vector<XdsApi::Route> routes) {
134
- if (resolver_->xds_client_ == nullptr) return;
201
+ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
202
+ XdsApi::LdsUpdate update)
203
+ : resolver_(std::move(resolver)),
204
+ update_(std::move(update)),
205
+ type_(kLdsUpdate) {
206
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
207
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
208
+ }
209
+
210
+ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
211
+ XdsApi::RdsUpdate update)
212
+ : resolver_(std::move(resolver)), type_(kRdsUpdate) {
213
+ update_.rds_update = std::move(update);
214
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
215
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
216
+ }
217
+
218
+ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
219
+ grpc_error* error)
220
+ : resolver_(std::move(resolver)), type_(kError) {
221
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
222
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
223
+ }
224
+
225
+ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver)
226
+ : resolver_(std::move(resolver)), type_(kDoesNotExist) {
227
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
228
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
229
+ }
230
+
231
+ void XdsResolver::Notifier::RunInExecCtx(void* arg, grpc_error* error) {
232
+ Notifier* self = static_cast<Notifier*>(arg);
233
+ GRPC_ERROR_REF(error);
234
+ self->resolver_->work_serializer()->Run(
235
+ [self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
236
+ }
237
+
238
+ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
239
+ if (resolver_->xds_client_ == nullptr) {
240
+ GRPC_ERROR_UNREF(error);
241
+ delete this;
242
+ return;
243
+ }
244
+ switch (type_) {
245
+ case kLdsUpdate:
246
+ resolver_->OnListenerUpdate(std::move(update_));
247
+ break;
248
+ case kRdsUpdate:
249
+ resolver_->OnRouteConfigUpdate(std::move(*update_.rds_update));
250
+ break;
251
+ case kError:
252
+ resolver_->OnError(error);
253
+ break;
254
+ case kDoesNotExist:
255
+ resolver_->OnResourceDoesNotExist();
256
+ break;
257
+ };
258
+ delete this;
259
+ }
260
+
261
+ //
262
+ // XdsResolver::XdsConfigSelector
263
+ //
264
+
265
+ XdsResolver::XdsConfigSelector::XdsConfigSelector(
266
+ RefCountedPtr<XdsResolver> resolver,
267
+ const std::vector<XdsApi::Route>& routes, grpc_error* error)
268
+ : resolver_(std::move(resolver)) {
135
269
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
136
- gpr_log(GPR_INFO, "[xds_resolver %p] received updated listener data",
137
- resolver_.get());
270
+ gpr_log(GPR_INFO, "[xds_resolver %p] creating XdsConfigSelector %p",
271
+ resolver_.get(), this);
138
272
  }
139
- Result result;
140
- grpc_error* error =
141
- resolver_->CreateServiceConfig(routes, &result.service_config);
142
- if (error != GRPC_ERROR_NONE) {
143
- OnError(error);
144
- return;
273
+ // 1. Construct the route table
274
+ // 2 Update resolver's cluster state map
275
+ // 3. Construct cluster list to hold on to entries in the cluster state
276
+ // map.
277
+ // Reserve the necessary entries up-front to avoid reallocation as we add
278
+ // elements. This is necessary because the string_view in the entry's
279
+ // weighted_cluster_state field points to the memory in the route field, so
280
+ // moving the entry in a reallocation will cause the string_view to point to
281
+ // invalid data.
282
+ route_table_.reserve(routes.size());
283
+ for (auto& route : routes) {
284
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
285
+ gpr_log(GPR_INFO, "[xds_resolver %p] XdsConfigSelector %p: route: %s",
286
+ resolver_.get(), this, route.ToString().c_str());
287
+ }
288
+ route_table_.emplace_back();
289
+ auto& route_entry = route_table_.back();
290
+ route_entry.route = route;
291
+ // If the route doesn't specify a timeout, set its timeout to the global
292
+ // one.
293
+ if (!route.max_stream_duration.has_value()) {
294
+ route_entry.route.max_stream_duration =
295
+ resolver_->http_max_stream_duration_;
296
+ }
297
+ error = CreateMethodConfig(&route_entry.method_config, route_entry.route);
298
+ if (route.weighted_clusters.empty()) {
299
+ MaybeAddCluster(route.cluster_name);
300
+ } else {
301
+ uint32_t end = 0;
302
+ for (const auto& weighted_cluster : route_entry.route.weighted_clusters) {
303
+ MaybeAddCluster(weighted_cluster.name);
304
+ end += weighted_cluster.weight;
305
+ route_entry.weighted_cluster_state.emplace_back(end,
306
+ weighted_cluster.name);
307
+ }
308
+ }
145
309
  }
310
+ }
311
+
312
+ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
313
+ RefCountedPtr<ServiceConfig>* method_config, const XdsApi::Route& route) {
314
+ grpc_error* error = GRPC_ERROR_NONE;
315
+ std::vector<std::string> fields;
316
+ if (route.max_stream_duration.has_value() &&
317
+ (route.max_stream_duration->seconds != 0 ||
318
+ route.max_stream_duration->nanos != 0)) {
319
+ fields.emplace_back(absl::StrFormat(" \"timeout\": \"%d.%09ds\"",
320
+ route.max_stream_duration->seconds,
321
+ route.max_stream_duration->nanos));
322
+ }
323
+ if (!fields.empty()) {
324
+ std::string json = absl::StrCat(
325
+ "{\n"
326
+ " \"methodConfig\": [ {\n"
327
+ " \"name\": [\n"
328
+ " {}\n"
329
+ " ],\n"
330
+ " ",
331
+ absl::StrJoin(fields, ",\n"),
332
+ "\n } ]\n"
333
+ "}");
334
+ *method_config =
335
+ ServiceConfig::Create(resolver_->args_, json.c_str(), &error);
336
+ }
337
+ return error;
338
+ }
339
+
340
+ XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
146
341
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
147
- gpr_log(GPR_INFO, "[xds_resolver %p] generated service config: %s",
148
- resolver_.get(), result.service_config->json_string().c_str());
342
+ gpr_log(GPR_INFO, "[xds_resolver %p] destroying XdsConfigSelector %p",
343
+ resolver_.get(), this);
149
344
  }
150
- grpc_arg new_args[] = {
151
- resolver_->xds_client_->MakeChannelArg(),
152
- resolver_->config_selector_->MakeChannelArg(),
153
- };
154
- result.args = grpc_channel_args_copy_and_add(resolver_->args_, new_args,
155
- GPR_ARRAY_SIZE(new_args));
156
- resolver_->result_handler()->ReturnResult(std::move(result));
345
+ clusters_.clear();
346
+ resolver_->MaybeRemoveUnusedClusters();
157
347
  }
158
348
 
159
- void XdsResolver::ListenerWatcher::OnError(grpc_error* error) {
160
- if (resolver_->xds_client_ == nullptr) return;
161
- gpr_log(GPR_ERROR, "[xds_resolver %p] received error: %s", resolver_.get(),
162
- grpc_error_string(error));
163
- grpc_arg xds_client_arg = resolver_->xds_client_->MakeChannelArg();
164
- Result result;
165
- result.args =
166
- grpc_channel_args_copy_and_add(resolver_->args_, &xds_client_arg, 1);
167
- result.service_config_error = error;
168
- resolver_->result_handler()->ReturnResult(std::move(result));
349
+ void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
350
+ if (clusters_.find(name) == clusters_.end()) {
351
+ auto it = resolver_->cluster_state_map_.find(name);
352
+ if (it == resolver_->cluster_state_map_.end()) {
353
+ auto new_cluster_state =
354
+ MakeRefCounted<ClusterState>(name, &resolver_->cluster_state_map_);
355
+ clusters_[new_cluster_state->cluster()] = std::move(new_cluster_state);
356
+ } else {
357
+ clusters_[it->second->cluster()] = it->second->Ref();
358
+ }
359
+ }
169
360
  }
170
361
 
171
- void XdsResolver::ListenerWatcher::OnResourceDoesNotExist() {
172
- if (resolver_->xds_client_ == nullptr) return;
173
- gpr_log(GPR_ERROR,
174
- "[xds_resolver %p] LDS/RDS resource does not exist -- returning "
175
- "empty service config",
176
- resolver_.get());
177
- Result result;
178
- result.service_config =
179
- ServiceConfig::Create("{}", &result.service_config_error);
180
- GPR_ASSERT(result.service_config != nullptr);
181
- result.args = grpc_channel_args_copy(resolver_->args_);
182
- resolver_->result_handler()->ReturnResult(std::move(result));
362
+ bool PathMatch(const absl::string_view& path,
363
+ const XdsApi::Route::Matchers::PathMatcher& path_matcher) {
364
+ switch (path_matcher.type) {
365
+ case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX:
366
+ return path_matcher.case_sensitive
367
+ ? absl::StartsWith(path, path_matcher.string_matcher)
368
+ : absl::StartsWithIgnoreCase(path,
369
+ path_matcher.string_matcher);
370
+ case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH:
371
+ return path_matcher.case_sensitive
372
+ ? path == path_matcher.string_matcher
373
+ : absl::EqualsIgnoreCase(path, path_matcher.string_matcher);
374
+ case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX:
375
+ // Note: Case-sensitive option will already have been set appropriately
376
+ // in path_matcher.regex_matcher when it was constructed, so no
377
+ // need to check it here.
378
+ return RE2::FullMatch(path.data(), *path_matcher.regex_matcher);
379
+ default:
380
+ return false;
381
+ }
382
+ }
383
+
384
+ absl::optional<absl::string_view> GetMetadataValue(
385
+ const std::string& target_key, grpc_metadata_batch* initial_metadata,
386
+ std::string* concatenated_value) {
387
+ // Find all values for the specified key.
388
+ GPR_DEBUG_ASSERT(initial_metadata != nullptr);
389
+ absl::InlinedVector<absl::string_view, 1> values;
390
+ for (grpc_linked_mdelem* md = initial_metadata->list.head; md != nullptr;
391
+ md = md->next) {
392
+ absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md->md));
393
+ absl::string_view value = StringViewFromSlice(GRPC_MDVALUE(md->md));
394
+ if (target_key == key) values.push_back(value);
395
+ }
396
+ // If none found, no match.
397
+ if (values.empty()) return absl::nullopt;
398
+ // If exactly one found, return it as-is.
399
+ if (values.size() == 1) return values.front();
400
+ // If more than one found, concatenate the values, using
401
+ // *concatenated_values as a temporary holding place for the
402
+ // concatenated string.
403
+ *concatenated_value = absl::StrJoin(values, ",");
404
+ return *concatenated_value;
405
+ }
406
+
407
+ bool HeaderMatchHelper(
408
+ const XdsApi::Route::Matchers::HeaderMatcher& header_matcher,
409
+ grpc_metadata_batch* initial_metadata) {
410
+ std::string concatenated_value;
411
+ absl::optional<absl::string_view> value;
412
+ // Note: If we ever allow binary headers here, we still need to
413
+ // special-case ignore "grpc-tags-bin" and "grpc-trace-bin", since
414
+ // they are not visible to the LB policy in grpc-go.
415
+ if (absl::EndsWith(header_matcher.name, "-bin") ||
416
+ header_matcher.name == "grpc-previous-rpc-attempts") {
417
+ value = absl::nullopt;
418
+ } else if (header_matcher.name == "content-type") {
419
+ value = "application/grpc";
420
+ } else {
421
+ value = GetMetadataValue(header_matcher.name, initial_metadata,
422
+ &concatenated_value);
423
+ }
424
+ if (!value.has_value()) {
425
+ if (header_matcher.type ==
426
+ XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PRESENT) {
427
+ return !header_matcher.present_match;
428
+ } else {
429
+ // For all other header matcher types, we need the header value to
430
+ // exist to consider matches.
431
+ return false;
432
+ }
433
+ }
434
+ switch (header_matcher.type) {
435
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::EXACT:
436
+ return value.value() == header_matcher.string_matcher;
437
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX:
438
+ return RE2::FullMatch(value.value().data(), *header_matcher.regex_match);
439
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE:
440
+ int64_t int_value;
441
+ if (!absl::SimpleAtoi(value.value(), &int_value)) {
442
+ return false;
443
+ }
444
+ return int_value >= header_matcher.range_start &&
445
+ int_value < header_matcher.range_end;
446
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PREFIX:
447
+ return absl::StartsWith(value.value(), header_matcher.string_matcher);
448
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::SUFFIX:
449
+ return absl::EndsWith(value.value(), header_matcher.string_matcher);
450
+ default:
451
+ return false;
452
+ }
453
+ }
454
+
455
+ bool HeadersMatch(
456
+ const std::vector<XdsApi::Route::Matchers::HeaderMatcher>& header_matchers,
457
+ grpc_metadata_batch* initial_metadata) {
458
+ for (const auto& header_matcher : header_matchers) {
459
+ bool match = HeaderMatchHelper(header_matcher, initial_metadata);
460
+ if (header_matcher.invert_match) match = !match;
461
+ if (!match) return false;
462
+ }
463
+ return true;
464
+ }
465
+
466
+ bool UnderFraction(const uint32_t fraction_per_million) {
467
+ // Generate a random number in [0, 1000000).
468
+ const uint32_t random_number = rand() % 1000000;
469
+ return random_number < fraction_per_million;
470
+ }
471
+
472
+ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
473
+ GetCallConfigArgs args) {
474
+ for (const auto& entry : route_table_) {
475
+ // Path matching.
476
+ if (!PathMatch(StringViewFromSlice(*args.path),
477
+ entry.route.matchers.path_matcher)) {
478
+ continue;
479
+ }
480
+ // Header Matching.
481
+ if (!HeadersMatch(entry.route.matchers.header_matchers,
482
+ args.initial_metadata)) {
483
+ continue;
484
+ }
485
+ // Match fraction check
486
+ if (entry.route.matchers.fraction_per_million.has_value() &&
487
+ !UnderFraction(entry.route.matchers.fraction_per_million.value())) {
488
+ continue;
489
+ }
490
+ // Found a route match
491
+ absl::string_view cluster_name;
492
+ if (entry.route.weighted_clusters.empty()) {
493
+ cluster_name = entry.route.cluster_name;
494
+ } else {
495
+ const uint32_t key =
496
+ rand() %
497
+ entry.weighted_cluster_state[entry.weighted_cluster_state.size() - 1]
498
+ .first;
499
+ // Find the index in weighted clusters corresponding to key.
500
+ size_t mid = 0;
501
+ size_t start_index = 0;
502
+ size_t end_index = entry.weighted_cluster_state.size() - 1;
503
+ size_t index = 0;
504
+ while (end_index > start_index) {
505
+ mid = (start_index + end_index) / 2;
506
+ if (entry.weighted_cluster_state[mid].first > key) {
507
+ end_index = mid;
508
+ } else if (entry.weighted_cluster_state[mid].first < key) {
509
+ start_index = mid + 1;
510
+ } else {
511
+ index = mid + 1;
512
+ break;
513
+ }
514
+ }
515
+ if (index == 0) index = start_index;
516
+ GPR_ASSERT(entry.weighted_cluster_state[index].first > key);
517
+ cluster_name = entry.weighted_cluster_state[index].second;
518
+ }
519
+ auto it = clusters_.find(cluster_name);
520
+ GPR_ASSERT(it != clusters_.end());
521
+ XdsResolver* resolver =
522
+ static_cast<XdsResolver*>(resolver_->Ref().release());
523
+ ClusterState* cluster_state = it->second->Ref().release();
524
+ CallConfig call_config;
525
+ if (entry.method_config != nullptr) {
526
+ call_config.service_config = entry.method_config;
527
+ call_config.method_configs =
528
+ entry.method_config->GetMethodParsedConfigVector(grpc_empty_slice());
529
+ }
530
+ call_config.call_attributes[kXdsClusterAttribute] = it->first;
531
+ call_config.on_call_committed = [resolver, cluster_state]() {
532
+ cluster_state->Unref();
533
+ ExecCtx::Run(
534
+ // TODO(roth): This hop into the ExecCtx is being done to avoid
535
+ // entering the WorkSerializer while holding the client channel data
536
+ // plane mutex, since that can lead to deadlocks. However, we should
537
+ // not have to solve this problem in each individual ConfigSelector
538
+ // implementation. When we have time, we should fix the client channel
539
+ // code to avoid this by not invoking the
540
+ // CallConfig::on_call_committed callback until after it has released
541
+ // the data plane mutex.
542
+ DEBUG_LOCATION,
543
+ GRPC_CLOSURE_CREATE(
544
+ [](void* arg, grpc_error* /*error*/) {
545
+ auto* resolver = static_cast<XdsResolver*>(arg);
546
+ resolver->work_serializer()->Run(
547
+ [resolver]() {
548
+ resolver->MaybeRemoveUnusedClusters();
549
+ resolver->Unref();
550
+ },
551
+ DEBUG_LOCATION);
552
+ },
553
+ resolver, nullptr),
554
+ GRPC_ERROR_NONE);
555
+ };
556
+ return call_config;
557
+ }
558
+ return CallConfig();
183
559
  }
184
560
 
185
561
  //
@@ -188,328 +564,204 @@ void XdsResolver::ListenerWatcher::OnResourceDoesNotExist() {
188
564
 
189
565
  void XdsResolver::StartLocked() {
190
566
  grpc_error* error = GRPC_ERROR_NONE;
191
- xds_client_ = MakeOrphanable<XdsClient>(
192
- work_serializer(), interested_parties_, server_name_,
193
- absl::make_unique<ListenerWatcher>(Ref()), *args_, &error);
567
+ xds_client_ = XdsClient::GetOrCreate(&error);
194
568
  if (error != GRPC_ERROR_NONE) {
195
569
  gpr_log(GPR_ERROR,
196
570
  "Failed to create xds client -- channel will remain in "
197
571
  "TRANSIENT_FAILURE: %s",
198
572
  grpc_error_string(error));
199
573
  result_handler()->ReturnError(error);
574
+ return;
200
575
  }
576
+ grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
577
+ interested_parties_);
578
+ channelz::ChannelNode* parent_channelz_node =
579
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
580
+ args_, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
581
+ if (parent_channelz_node != nullptr) {
582
+ xds_client_->AddChannelzLinkage(parent_channelz_node);
583
+ }
584
+ auto watcher = absl::make_unique<ListenerWatcher>(Ref());
585
+ listener_watcher_ = watcher.get();
586
+ xds_client_->WatchListenerData(server_name_, std::move(watcher));
201
587
  }
202
588
 
203
- std::string CreateServiceConfigActionCluster(const std::string& cluster_name) {
204
- return absl::StrFormat(
205
- " \"cds:%s\":{\n"
206
- " \"childPolicy\":[ {\n"
207
- " \"cds_experimental\":{\n"
208
- " \"cluster\": \"%s\"\n"
209
- " }\n"
210
- " } ]\n"
211
- " }",
212
- cluster_name, cluster_name);
213
- }
214
-
215
- std::string CreateServiceConfigRoute(const std::string& action_name,
216
- const XdsApi::Route& route) {
217
- std::vector<std::string> headers;
218
- for (const auto& header : route.matchers.header_matchers) {
219
- std::string header_matcher;
220
- switch (header.type) {
221
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::EXACT:
222
- header_matcher = absl::StrFormat(" \"exact_match\": \"%s\"",
223
- header.string_matcher);
224
- break;
225
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX:
226
- header_matcher = absl::StrFormat(" \"regex_match\": \"%s\"",
227
- header.regex_match->pattern());
228
- break;
229
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE:
230
- header_matcher = absl::StrFormat(
231
- " \"range_match\":{\n"
232
- " \"start\":%d,\n"
233
- " \"end\":%d\n"
234
- " }",
235
- header.range_start, header.range_end);
236
- break;
237
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PRESENT:
238
- header_matcher =
239
- absl::StrFormat(" \"present_match\": %s",
240
- header.present_match ? "true" : "false");
241
- break;
242
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PREFIX:
243
- header_matcher = absl::StrFormat(
244
- " \"prefix_match\": \"%s\"", header.string_matcher);
245
- break;
246
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::SUFFIX:
247
- header_matcher = absl::StrFormat(
248
- " \"suffix_match\": \"%s\"", header.string_matcher);
249
- break;
250
- default:
251
- break;
589
+ void XdsResolver::ShutdownLocked() {
590
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
591
+ gpr_log(GPR_INFO, "[xds_resolver %p] shutting down", this);
592
+ }
593
+ if (xds_client_ != nullptr) {
594
+ if (listener_watcher_ != nullptr) {
595
+ xds_client_->CancelListenerDataWatch(server_name_, listener_watcher_,
596
+ /*delay_unsubscription=*/false);
252
597
  }
253
- std::vector<std::string> header_parts;
254
- header_parts.push_back(
255
- absl::StrFormat(" { \n"
256
- " \"name\": \"%s\",\n",
257
- header.name));
258
- header_parts.push_back(header_matcher);
259
- if (header.invert_match) {
260
- header_parts.push_back(
261
- absl::StrFormat(",\n"
262
- " \"invert_match\": true"));
598
+ if (route_config_watcher_ != nullptr) {
599
+ xds_client_->CancelRouteConfigDataWatch(
600
+ server_name_, route_config_watcher_, /*delay_unsubscription=*/false);
263
601
  }
264
- header_parts.push_back(
265
- absl::StrFormat("\n"
266
- " }"));
267
- headers.push_back(absl::StrJoin(header_parts, ""));
268
- }
269
- std::vector<std::string> headers_service_config;
270
- if (!headers.empty()) {
271
- headers_service_config.push_back("\"headers\":[\n");
272
- headers_service_config.push_back(absl::StrJoin(headers, ","));
273
- headers_service_config.push_back(" ],\n");
274
- }
275
- std::string path_match_str;
276
- switch (route.matchers.path_matcher.type) {
277
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX:
278
- path_match_str = absl::StrFormat(
279
- "\"prefix\": \"%s\",\n", route.matchers.path_matcher.string_matcher);
280
- break;
281
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH:
282
- path_match_str = absl::StrFormat(
283
- "\"path\": \"%s\",\n", route.matchers.path_matcher.string_matcher);
284
- break;
285
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX:
286
- path_match_str =
287
- absl::StrFormat("\"regex\": \"%s\",\n",
288
- route.matchers.path_matcher.regex_matcher->pattern());
289
- break;
602
+ channelz::ChannelNode* parent_channelz_node =
603
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
604
+ args_, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
605
+ if (parent_channelz_node != nullptr) {
606
+ xds_client_->RemoveChannelzLinkage(parent_channelz_node);
607
+ }
608
+ grpc_pollset_set_del_pollset_set(xds_client_->interested_parties(),
609
+ interested_parties_);
610
+ xds_client_.reset();
290
611
  }
291
- return absl::StrFormat(
292
- " { \n"
293
- " %s"
294
- " %s"
295
- " %s"
296
- " \"action\": \"%s\"\n"
297
- " }",
298
- path_match_str, absl::StrJoin(headers_service_config, ""),
299
- route.matchers.fraction_per_million.has_value()
300
- ? absl::StrFormat("\"match_fraction\":%d,\n",
301
- route.matchers.fraction_per_million.value())
302
- : "",
303
- action_name);
304
612
  }
305
613
 
306
- // Create the service config for one weighted cluster.
307
- std::string CreateServiceConfigActionWeightedCluster(
308
- const std::string& name,
309
- const std::vector<XdsApi::Route::ClusterWeight>& clusters) {
310
- std::vector<std::string> config_parts;
311
- config_parts.push_back(
312
- absl::StrFormat(" \"weighted:%s\":{\n"
313
- " \"childPolicy\":[ {\n"
314
- " \"weighted_target_experimental\":{\n"
315
- " \"targets\":{\n",
316
- name));
317
- std::vector<std::string> weighted_targets;
318
- weighted_targets.reserve(clusters.size());
319
- for (const auto& cluster_weight : clusters) {
320
- weighted_targets.push_back(absl::StrFormat(
321
- " \"%s\":{\n"
322
- " \"weight\":%d,\n"
323
- " \"childPolicy\":[ {\n"
324
- " \"cds_experimental\":{\n"
325
- " \"cluster\": \"%s\"\n"
326
- " }\n"
327
- " } ]\n"
328
- " }",
329
- cluster_weight.name, cluster_weight.weight, cluster_weight.name));
330
- }
331
- config_parts.push_back(absl::StrJoin(weighted_targets, ",\n"));
332
- config_parts.push_back(
333
- " }\n"
334
- " }\n"
335
- " } ]\n"
336
- " }");
337
- return absl::StrJoin(config_parts, "");
614
+ void XdsResolver::OnListenerUpdate(XdsApi::LdsUpdate listener) {
615
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
616
+ gpr_log(GPR_INFO, "[xds_resolver %p] received updated listener data", this);
617
+ }
618
+ if (listener.route_config_name != route_config_name_) {
619
+ if (route_config_watcher_ != nullptr) {
620
+ xds_client_->CancelRouteConfigDataWatch(
621
+ route_config_name_, route_config_watcher_,
622
+ /*delay_unsubscription=*/!listener.route_config_name.empty());
623
+ route_config_watcher_ = nullptr;
624
+ }
625
+ route_config_name_ = std::move(listener.route_config_name);
626
+ if (!route_config_name_.empty()) {
627
+ auto watcher = absl::make_unique<RouteConfigWatcher>(Ref());
628
+ route_config_watcher_ = watcher.get();
629
+ xds_client_->WatchRouteConfigData(route_config_name_, std::move(watcher));
630
+ }
631
+ }
632
+ http_max_stream_duration_ = listener.http_max_stream_duration;
633
+ if (route_config_name_.empty()) {
634
+ GPR_ASSERT(listener.rds_update.has_value());
635
+ OnRouteConfigUpdate(std::move(*listener.rds_update));
636
+ }
338
637
  }
339
638
 
340
- struct WeightedClustersKeys {
341
- std::string cluster_names_key;
342
- std::string cluster_weights_key;
343
- };
344
-
345
- // Returns the cluster names and weights key or the cluster names only key.
346
- WeightedClustersKeys GetWeightedClustersKey(
347
- const std::vector<XdsApi::Route::ClusterWeight>& weighted_clusters) {
348
- std::set<std::string> cluster_names;
349
- std::set<std::string> cluster_weights;
350
- for (const auto& cluster_weight : weighted_clusters) {
351
- cluster_names.emplace(absl::StrFormat("%s", cluster_weight.name));
352
- cluster_weights.emplace(
353
- absl::StrFormat("%s_%d", cluster_weight.name, cluster_weight.weight));
354
- }
355
- return {absl::StrJoin(cluster_names, "_"),
356
- absl::StrJoin(cluster_weights, "_")};
639
+ void XdsResolver::OnRouteConfigUpdate(XdsApi::RdsUpdate rds_update) {
640
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
641
+ gpr_log(GPR_INFO, "[xds_resolver %p] received updated route config", this);
642
+ }
643
+ // Find the relevant VirtualHost from the RouteConfiguration.
644
+ XdsApi::RdsUpdate::VirtualHost* vhost =
645
+ rds_update.FindVirtualHostForDomain(server_name_);
646
+ if (vhost == nullptr) {
647
+ OnError(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
648
+ absl::StrCat("could not find VirtualHost for ", server_name_,
649
+ " in RouteConfiguration")
650
+ .c_str()));
651
+ return;
652
+ }
653
+ // Save the list of routes in the resolver.
654
+ current_update_ = std::move(vhost->routes);
655
+ // Send a new result to the channel.
656
+ GenerateResult();
357
657
  }
358
658
 
359
- std::string XdsResolver::WeightedClustersActionName(
360
- const std::vector<XdsApi::Route::ClusterWeight>& weighted_clusters) {
361
- WeightedClustersKeys keys = GetWeightedClustersKey(weighted_clusters);
362
- auto cluster_names_map_it =
363
- weighted_cluster_index_map_.find(keys.cluster_names_key);
364
- GPR_ASSERT(cluster_names_map_it != weighted_cluster_index_map_.end());
365
- const auto& cluster_weights_map =
366
- cluster_names_map_it->second.cluster_weights_map;
367
- auto cluster_weights_map_it =
368
- cluster_weights_map.find(keys.cluster_weights_key);
369
- GPR_ASSERT(cluster_weights_map_it != cluster_weights_map.end());
370
- return absl::StrFormat("%s_%d", keys.cluster_names_key,
371
- cluster_weights_map_it->second);
659
+ void XdsResolver::OnError(grpc_error* error) {
660
+ gpr_log(GPR_ERROR, "[xds_resolver %p] received error from XdsClient: %s",
661
+ this, grpc_error_string(error));
662
+ Result result;
663
+ result.args = grpc_channel_args_copy(args_);
664
+ result.service_config_error = error;
665
+ result_handler()->ReturnResult(std::move(result));
372
666
  }
373
667
 
374
- void XdsResolver::UpdateWeightedClusterIndexMap(
375
- const std::vector<XdsApi::Route>& routes) {
376
- // Construct a list of unique WeightedCluster
377
- // actions which we need to process: to find action names
378
- std::map<std::string /* cluster_weights_key */,
379
- std::string /* cluster_names_key */>
380
- actions_to_process;
381
- for (const auto& route : routes) {
382
- if (!route.weighted_clusters.empty()) {
383
- WeightedClustersKeys keys =
384
- GetWeightedClustersKey(route.weighted_clusters);
385
- auto action_it = actions_to_process.find(keys.cluster_weights_key);
386
- if (action_it == actions_to_process.end()) {
387
- actions_to_process[std::move(keys.cluster_weights_key)] =
388
- std::move(keys.cluster_names_key);
389
- }
390
- }
391
- }
392
- // First pass of all unique WeightedCluster actions: if the exact same
393
- // weighted target policy (same clusters and weights) appears in the old map,
394
- // then that old action name is taken again and should be moved to the new
395
- // map; any other action names from the old set of actions are candidates for
396
- // reuse.
397
- XdsResolver::WeightedClusterIndexMap new_weighted_cluster_index_map;
398
- for (auto action_it = actions_to_process.begin();
399
- action_it != actions_to_process.end();) {
400
- const std::string& cluster_names_key = action_it->second;
401
- const std::string& cluster_weights_key = action_it->first;
402
- auto old_cluster_names_map_it =
403
- weighted_cluster_index_map_.find(cluster_names_key);
404
- if (old_cluster_names_map_it != weighted_cluster_index_map_.end()) {
405
- // Add cluster_names_key to the new map and copy next_index.
406
- auto& new_cluster_names_info =
407
- new_weighted_cluster_index_map[cluster_names_key];
408
- new_cluster_names_info.next_index =
409
- old_cluster_names_map_it->second.next_index;
410
- // Lookup cluster_weights_key in old map.
411
- auto& old_cluster_weights_map =
412
- old_cluster_names_map_it->second.cluster_weights_map;
413
- auto old_cluster_weights_map_it =
414
- old_cluster_weights_map.find(cluster_weights_key);
415
- if (old_cluster_weights_map_it != old_cluster_weights_map.end()) {
416
- // same policy found, move from old map to new map.
417
- new_cluster_names_info.cluster_weights_map[cluster_weights_key] =
418
- old_cluster_weights_map_it->second;
419
- old_cluster_weights_map.erase(old_cluster_weights_map_it);
420
- // This action has been added to new map, so no need to process it
421
- // again.
422
- action_it = actions_to_process.erase(action_it);
423
- continue;
424
- }
425
- }
426
- ++action_it;
427
- }
428
- // Second pass of all remaining unique WeightedCluster actions: if clusters
429
- // for a new action are the same as an old unused action, reuse the name. If
430
- // clusters differ, use a brand new name.
431
- for (const auto& action : actions_to_process) {
432
- const std::string& cluster_names_key = action.second;
433
- const std::string& cluster_weights_key = action.first;
434
- auto& new_cluster_names_info =
435
- new_weighted_cluster_index_map[cluster_names_key];
436
- auto& old_cluster_weights_map =
437
- weighted_cluster_index_map_[cluster_names_key].cluster_weights_map;
438
- auto old_cluster_weights_it = old_cluster_weights_map.begin();
439
- if (old_cluster_weights_it != old_cluster_weights_map.end()) {
440
- // There is something to reuse: this action uses the same set
441
- // of clusters as a previous action and that action name is not
442
- // already taken.
443
- new_cluster_names_info.cluster_weights_map[cluster_weights_key] =
444
- old_cluster_weights_it->second;
445
- // Remove the name from being able to reuse again.
446
- old_cluster_weights_map.erase(old_cluster_weights_it);
447
- } else {
448
- // There is nothing to reuse, take the next index to use and
449
- // increment.
450
- new_cluster_names_info.cluster_weights_map[cluster_weights_key] =
451
- new_cluster_names_info.next_index++;
452
- }
453
- }
454
- weighted_cluster_index_map_ = std::move(new_weighted_cluster_index_map);
668
+ void XdsResolver::OnResourceDoesNotExist() {
669
+ gpr_log(GPR_ERROR,
670
+ "[xds_resolver %p] LDS/RDS resource does not exist -- clearing "
671
+ "update and returning empty service config",
672
+ this);
673
+ current_update_.clear();
674
+ Result result;
675
+ result.service_config =
676
+ ServiceConfig::Create(args_, "{}", &result.service_config_error);
677
+ GPR_ASSERT(result.service_config != nullptr);
678
+ result.args = grpc_channel_args_copy(args_);
679
+ result_handler()->ReturnResult(std::move(result));
455
680
  }
456
681
 
457
682
  grpc_error* XdsResolver::CreateServiceConfig(
458
- const std::vector<XdsApi::Route>& routes,
459
683
  RefCountedPtr<ServiceConfig>* service_config) {
460
- UpdateWeightedClusterIndexMap(routes);
461
- std::vector<std::string> actions_vector;
462
- std::vector<std::string> route_table;
463
- std::set<std::string> actions_set;
464
- for (const auto& route : routes) {
465
- const std::string action_name =
466
- route.weighted_clusters.empty()
467
- ? route.cluster_name
468
- : WeightedClustersActionName(route.weighted_clusters);
469
- if (actions_set.find(action_name) == actions_set.end()) {
470
- actions_set.emplace(action_name);
471
- actions_vector.push_back(
472
- route.weighted_clusters.empty()
473
- ? CreateServiceConfigActionCluster(action_name)
474
- : CreateServiceConfigActionWeightedCluster(
475
- action_name, route.weighted_clusters));
476
- }
477
- route_table.push_back(CreateServiceConfigRoute(
478
- absl::StrFormat("%s:%s",
479
- route.weighted_clusters.empty() ? "cds" : "weighted",
480
- action_name),
481
- route));
684
+ std::vector<std::string> clusters;
685
+ for (const auto& cluster : cluster_state_map_) {
686
+ clusters.push_back(
687
+ absl::StrFormat(" \"%s\":{\n"
688
+ " \"childPolicy\":[ {\n"
689
+ " \"cds_experimental\":{\n"
690
+ " \"cluster\": \"%s\"\n"
691
+ " }\n"
692
+ " } ]\n"
693
+ " }",
694
+ cluster.first, cluster.first));
482
695
  }
483
696
  std::vector<std::string> config_parts;
484
697
  config_parts.push_back(
485
698
  "{\n"
486
699
  " \"loadBalancingConfig\":[\n"
487
- " { \"xds_routing_experimental\":{\n"
488
- " \"actions\":{\n");
489
- config_parts.push_back(absl::StrJoin(actions_vector, ",\n"));
490
- config_parts.push_back(
491
- " },\n"
492
- " \"routes\":[\n");
493
- config_parts.push_back(absl::StrJoin(route_table, ",\n"));
700
+ " { \"xds_cluster_manager_experimental\":{\n"
701
+ " \"children\":{\n");
702
+ config_parts.push_back(absl::StrJoin(clusters, ",\n"));
494
703
  config_parts.push_back(
495
- " ]\n"
704
+ " }\n"
496
705
  " } }\n"
497
706
  " ]\n"
498
707
  "}");
499
708
  std::string json = absl::StrJoin(config_parts, "");
500
709
  grpc_error* error = GRPC_ERROR_NONE;
501
- *service_config = ServiceConfig::Create(json.c_str(), &error);
710
+ *service_config = ServiceConfig::Create(args_, json.c_str(), &error);
502
711
  return error;
503
712
  }
504
713
 
714
+ void XdsResolver::GenerateResult() {
715
+ if (current_update_.empty()) return;
716
+ // First create XdsConfigSelector, which may add new entries to the cluster
717
+ // state map, and then CreateServiceConfig for LB policies.
718
+ grpc_error* error = GRPC_ERROR_NONE;
719
+ auto config_selector =
720
+ MakeRefCounted<XdsConfigSelector>(Ref(), current_update_, error);
721
+ if (error != GRPC_ERROR_NONE) {
722
+ OnError(error);
723
+ return;
724
+ }
725
+ Result result;
726
+ error = CreateServiceConfig(&result.service_config);
727
+ if (error != GRPC_ERROR_NONE) {
728
+ OnError(error);
729
+ return;
730
+ }
731
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
732
+ gpr_log(GPR_INFO, "[xds_resolver %p] generated service config: %s", this,
733
+ result.service_config->json_string().c_str());
734
+ }
735
+ grpc_arg new_arg = config_selector->MakeChannelArg();
736
+ result.args = grpc_channel_args_copy_and_add(args_, &new_arg, 1);
737
+ result_handler()->ReturnResult(std::move(result));
738
+ }
739
+
740
+ void XdsResolver::MaybeRemoveUnusedClusters() {
741
+ bool update_needed = false;
742
+ for (auto it = cluster_state_map_.begin(); it != cluster_state_map_.end();) {
743
+ RefCountedPtr<ClusterState> cluster_state = it->second->RefIfNonZero();
744
+ if (cluster_state != nullptr) {
745
+ ++it;
746
+ } else {
747
+ update_needed = true;
748
+ it = cluster_state_map_.erase(it);
749
+ }
750
+ }
751
+ if (update_needed && xds_client_ != nullptr) {
752
+ // Send a new result to the channel.
753
+ GenerateResult();
754
+ }
755
+ }
756
+
505
757
  //
506
758
  // Factory
507
759
  //
508
760
 
509
761
  class XdsResolverFactory : public ResolverFactory {
510
762
  public:
511
- bool IsValidUri(const grpc_uri* uri) const override {
512
- if (GPR_UNLIKELY(0 != strcmp(uri->authority, ""))) {
763
+ bool IsValidUri(const URI& uri) const override {
764
+ if (GPR_UNLIKELY(!uri.authority().empty())) {
513
765
  gpr_log(GPR_ERROR, "URI authority not supported");
514
766
  return false;
515
767
  }