grpc 1.37.1 → 1.40.0.pre1

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

Potentially problematic release.


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

Files changed (738) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +112 -59
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/endpoint_config.h +48 -0
  5. data/include/grpc/event_engine/event_engine.h +330 -0
  6. data/include/grpc/event_engine/port.h +41 -0
  7. data/include/grpc/event_engine/slice_allocator.h +66 -0
  8. data/include/grpc/grpc.h +11 -4
  9. data/include/grpc/grpc_security.h +32 -0
  10. data/include/grpc/grpc_security_constants.h +15 -0
  11. data/include/grpc/impl/codegen/grpc_types.h +44 -19
  12. data/include/grpc/impl/codegen/port_platform.h +46 -0
  13. data/include/grpc/module.modulemap +14 -14
  14. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  15. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  16. data/src/core/ext/filters/client_channel/client_channel.cc +975 -3282
  17. data/src/core/ext/filters/client_channel/client_channel.h +513 -55
  18. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +20 -7
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +28 -27
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +30 -29
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +16 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +53 -51
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +14 -23
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +16 -16
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +734 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +10 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +10 -17
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +17 -20
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +53 -65
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +36 -44
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +33 -55
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +151 -163
  43. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -16
  44. data/src/core/ext/filters/client_channel/lb_policy.h +70 -46
  45. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  46. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +24 -18
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +31 -0
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc +28 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +18 -12
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  61. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  62. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +20 -13
  63. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  64. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +158 -102
  65. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  67. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  68. data/src/core/ext/filters/client_channel/retry_filter.cc +2598 -0
  69. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  70. data/src/core/ext/filters/client_channel/retry_service_config.cc +316 -0
  71. data/src/core/ext/filters/client_channel/retry_service_config.h +96 -0
  72. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  73. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  74. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  75. data/src/core/ext/filters/client_channel/service_config_call_data.h +45 -5
  76. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  77. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  78. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  79. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  80. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  81. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  82. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  83. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  84. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  85. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  86. data/src/core/ext/filters/http/client/http_client_filter.cc +33 -23
  87. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  88. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  89. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  90. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  92. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  93. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  94. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  95. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  96. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  97. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  98. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +3 -2
  99. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  100. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +49 -46
  101. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  102. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  103. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +5 -4
  104. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +1 -1
  106. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +66 -0
  107. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +74 -0
  108. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +141 -126
  109. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  110. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  111. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  112. data/src/core/ext/transport/chttp2/transport/flow_control.h +9 -9
  113. data/src/core/ext/transport/chttp2/transport/frame_data.cc +12 -12
  114. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +15 -16
  116. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  120. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +11 -10
  122. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  124. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +652 -736
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +195 -74
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  131. data/src/core/ext/transport/chttp2/transport/internal.h +33 -28
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +129 -106
  133. data/src/core/ext/transport/chttp2/transport/varint.cc +6 -4
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +72 -60
  136. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +56 -35
  137. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +180 -76
  138. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +35 -27
  139. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +97 -48
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +45 -9
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +67 -7
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +66 -9
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +227 -0
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +46 -0
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +121 -0
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +35 -0
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +90 -0
  149. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +32 -24
  150. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +120 -73
  151. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +4 -2
  152. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +15 -0
  153. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +48 -0
  154. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +171 -0
  155. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +8 -6
  156. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +27 -19
  157. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +1 -0
  158. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +24 -7
  159. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +57 -0
  160. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +29 -17
  161. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +72 -0
  162. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +3 -2
  163. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +4 -0
  164. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +6 -5
  165. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +15 -11
  166. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +85 -43
  167. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +274 -91
  168. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +11 -8
  169. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +30 -13
  170. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +33 -5
  171. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +115 -0
  172. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +60 -0
  173. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +181 -0
  174. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +1 -0
  175. data/src/core/ext/upb-generated/validate/validate.upb.c +82 -66
  176. data/src/core/ext/upb-generated/validate/validate.upb.h +220 -124
  177. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +15 -7
  178. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +53 -52
  179. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +318 -277
  180. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +5 -0
  181. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +437 -410
  182. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +198 -170
  183. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  184. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +9 -8
  185. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +219 -163
  186. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +15 -0
  187. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +59 -0
  188. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +40 -0
  189. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +29 -25
  190. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +52 -0
  191. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +35 -0
  192. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +135 -125
  193. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  194. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +131 -123
  195. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +90 -0
  196. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +35 -0
  197. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +32 -24
  198. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +69 -55
  199. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +5 -0
  200. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +684 -664
  201. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  202. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +13 -10
  203. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +13 -10
  204. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +441 -375
  205. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +10 -0
  206. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +122 -114
  207. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +1 -1
  208. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +112 -79
  209. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +5 -0
  210. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +64 -0
  211. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +50 -0
  212. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +35 -32
  213. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +4 -4
  214. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +182 -160
  215. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  216. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  217. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  218. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  219. data/src/core/ext/xds/xds_api.cc +665 -317
  220. data/src/core/ext/xds/xds_api.h +52 -14
  221. data/src/core/ext/xds/xds_bootstrap.cc +101 -160
  222. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  223. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  224. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  225. data/src/core/ext/xds/xds_channel_args.h +5 -2
  226. data/src/core/ext/xds/xds_client.cc +370 -215
  227. data/src/core/ext/xds/xds_client.h +38 -28
  228. data/src/core/ext/xds/xds_client_stats.h +3 -2
  229. data/src/core/ext/xds/xds_http_filters.cc +3 -2
  230. data/src/core/ext/xds/xds_http_filters.h +3 -0
  231. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  232. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  233. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  234. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +16 -20
  235. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +16 -11
  236. data/src/core/lib/channel/call_tracer.h +85 -0
  237. data/src/core/lib/channel/channel_stack.cc +10 -9
  238. data/src/core/lib/channel/channel_stack.h +11 -10
  239. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  240. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  241. data/src/core/lib/channel/channelz.cc +21 -13
  242. data/src/core/lib/channel/channelz.h +3 -0
  243. data/src/core/lib/channel/connected_channel.cc +4 -4
  244. data/src/core/lib/channel/context.h +3 -0
  245. data/src/core/lib/channel/handshaker.cc +7 -6
  246. data/src/core/lib/channel/handshaker.h +5 -5
  247. data/src/core/lib/channel/status_util.h +4 -0
  248. data/src/core/lib/compression/stream_compression.h +1 -1
  249. data/src/core/lib/compression/stream_compression_gzip.h +1 -1
  250. data/src/core/lib/compression/stream_compression_identity.h +1 -1
  251. data/src/core/lib/debug/stats.h +1 -1
  252. data/src/core/lib/event_engine/endpoint_config.cc +46 -0
  253. data/src/core/lib/event_engine/endpoint_config_internal.h +42 -0
  254. data/src/core/lib/event_engine/event_engine.cc +50 -0
  255. data/src/core/lib/event_engine/sockaddr.cc +40 -0
  256. data/src/core/lib/event_engine/sockaddr.h +44 -0
  257. data/src/core/lib/gpr/murmur_hash.cc +4 -2
  258. data/src/core/lib/gpr/wrap_memcpy.cc +2 -1
  259. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  260. data/src/core/lib/gprpp/orphanable.h +3 -3
  261. data/src/core/lib/gprpp/ref_counted.h +28 -14
  262. data/src/core/lib/gprpp/status_helper.cc +407 -0
  263. data/src/core/lib/gprpp/status_helper.h +183 -0
  264. data/src/core/lib/gprpp/sync.h +2 -30
  265. data/src/core/lib/http/httpcli.cc +11 -11
  266. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  267. data/src/core/lib/http/parser.cc +16 -16
  268. data/src/core/lib/http/parser.h +4 -4
  269. data/src/core/lib/iomgr/buffer_list.cc +8 -10
  270. data/src/core/lib/iomgr/buffer_list.h +4 -5
  271. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  272. data/src/core/lib/iomgr/call_combiner.h +12 -14
  273. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  274. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  275. data/src/core/lib/iomgr/closure.h +7 -6
  276. data/src/core/lib/iomgr/combiner.cc +14 -12
  277. data/src/core/lib/iomgr/combiner.h +2 -2
  278. data/src/core/lib/iomgr/endpoint.cc +1 -1
  279. data/src/core/lib/iomgr/endpoint.h +2 -2
  280. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  281. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +33 -0
  282. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  283. data/src/core/lib/iomgr/error.cc +168 -61
  284. data/src/core/lib/iomgr/error.h +217 -106
  285. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  286. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  287. data/src/core/lib/iomgr/error_internal.h +5 -1
  288. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  289. data/src/core/lib/iomgr/ev_apple.h +1 -1
  290. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  291. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  292. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  293. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  294. data/src/core/lib/iomgr/ev_posix.h +9 -9
  295. data/src/core/lib/iomgr/event_engine/closure.cc +54 -0
  296. data/src/core/lib/iomgr/event_engine/closure.h +33 -0
  297. data/src/core/lib/iomgr/event_engine/endpoint.cc +192 -0
  298. data/src/core/lib/iomgr/event_engine/endpoint.h +53 -0
  299. data/src/core/lib/iomgr/event_engine/iomgr.cc +105 -0
  300. data/src/core/lib/iomgr/event_engine/iomgr.h +24 -0
  301. data/src/core/lib/iomgr/event_engine/pollset.cc +87 -0
  302. data/src/core/lib/iomgr/event_engine/pollset.h +25 -0
  303. data/src/core/lib/iomgr/event_engine/promise.h +51 -0
  304. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +41 -0
  305. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +35 -0
  306. data/src/core/lib/iomgr/event_engine/resolver.cc +110 -0
  307. data/src/core/lib/iomgr/event_engine/tcp.cc +263 -0
  308. data/src/core/lib/iomgr/event_engine/timer.cc +57 -0
  309. data/src/core/lib/iomgr/exec_ctx.cc +12 -4
  310. data/src/core/lib/iomgr/exec_ctx.h +4 -5
  311. data/src/core/lib/iomgr/executor/threadpool.cc +2 -3
  312. data/src/core/lib/iomgr/executor/threadpool.h +2 -2
  313. data/src/core/lib/iomgr/executor.cc +8 -8
  314. data/src/core/lib/iomgr/executor.h +2 -2
  315. data/src/core/lib/iomgr/iomgr.cc +2 -2
  316. data/src/core/lib/iomgr/iomgr.h +1 -1
  317. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  318. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  319. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  320. data/src/core/lib/iomgr/iomgr_posix.cc +3 -1
  321. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +42 -12
  322. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  323. data/src/core/lib/iomgr/load_file.cc +4 -4
  324. data/src/core/lib/iomgr/load_file.h +2 -2
  325. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  326. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  327. data/src/core/lib/iomgr/pollset.cc +5 -5
  328. data/src/core/lib/iomgr/pollset.h +9 -9
  329. data/src/core/lib/iomgr/pollset_custom.cc +7 -7
  330. data/src/core/lib/iomgr/pollset_custom.h +3 -1
  331. data/src/core/lib/iomgr/pollset_uv.cc +3 -1
  332. data/src/core/lib/iomgr/pollset_uv.h +5 -1
  333. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  334. data/src/core/lib/iomgr/port.h +7 -5
  335. data/src/core/lib/iomgr/python_util.h +2 -2
  336. data/src/core/lib/iomgr/resolve_address.cc +8 -4
  337. data/src/core/lib/iomgr/resolve_address.h +12 -6
  338. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  339. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  340. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  341. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  342. data/src/core/lib/iomgr/resource_quota.cc +13 -10
  343. data/src/core/lib/iomgr/sockaddr.h +1 -0
  344. data/src/core/lib/iomgr/socket_mutator.cc +15 -2
  345. data/src/core/lib/iomgr/socket_mutator.h +26 -2
  346. data/src/core/lib/iomgr/socket_utils_common_posix.cc +24 -22
  347. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  348. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  349. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  350. data/src/core/lib/iomgr/tcp_client_posix.cc +22 -19
  351. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  352. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  353. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  354. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  355. data/src/core/lib/iomgr/tcp_posix.cc +78 -73
  356. data/src/core/lib/iomgr/tcp_posix.h +8 -0
  357. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  358. data/src/core/lib/iomgr/tcp_server.h +12 -11
  359. data/src/core/lib/iomgr/tcp_server_custom.cc +26 -25
  360. data/src/core/lib/iomgr/tcp_server_posix.cc +29 -21
  361. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  362. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +21 -18
  363. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  364. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  365. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  366. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  367. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  368. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  369. data/src/core/lib/iomgr/timer.h +6 -1
  370. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  371. data/src/core/lib/iomgr/timer_custom.h +1 -1
  372. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  373. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  374. data/src/core/lib/iomgr/udp_server.cc +21 -20
  375. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  376. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  377. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  378. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  379. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  380. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  381. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  382. data/src/core/lib/iomgr/work_serializer.h +17 -1
  383. data/src/core/lib/json/json.h +1 -1
  384. data/src/core/lib/json/json_reader.cc +5 -6
  385. data/src/core/lib/matchers/matchers.cc +46 -58
  386. data/src/core/lib/matchers/matchers.h +30 -29
  387. data/src/core/lib/security/authorization/authorization_engine.h +44 -0
  388. data/src/core/lib/security/authorization/authorization_policy_provider.h +32 -0
  389. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +46 -0
  390. data/src/core/lib/security/authorization/evaluate_args.cc +209 -0
  391. data/src/core/lib/security/authorization/evaluate_args.h +91 -0
  392. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  393. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  394. data/src/core/lib/security/credentials/credentials.h +2 -2
  395. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  396. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  397. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  398. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  399. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  400. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  401. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  402. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  403. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  404. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  405. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  406. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  407. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -10
  408. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  409. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  410. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  411. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  412. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  413. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  414. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  415. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  416. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  417. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  418. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  419. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  420. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +68 -13
  421. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -0
  422. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  423. data/src/core/lib/security/credentials/tls/tls_utils.cc +32 -0
  424. data/src/core/lib/security/credentials/tls/tls_utils.h +13 -0
  425. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  426. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  427. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  428. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  429. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  430. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  431. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -9
  432. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  433. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  434. data/src/core/lib/security/security_connector/ssl_utils.cc +27 -4
  435. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  436. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +60 -76
  437. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  438. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  439. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  440. data/src/core/lib/security/transport/security_handshaker.cc +45 -36
  441. data/src/core/lib/security/transport/server_auth_filter.cc +17 -18
  442. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  443. data/src/core/lib/security/transport/tsi_error.h +2 -1
  444. data/src/core/lib/security/util/json_util.cc +2 -2
  445. data/src/core/lib/security/util/json_util.h +1 -1
  446. data/src/core/lib/slice/slice_internal.h +1 -0
  447. data/src/core/lib/surface/call.cc +72 -52
  448. data/src/core/lib/surface/call.h +13 -2
  449. data/src/core/lib/surface/channel.cc +6 -6
  450. data/src/core/lib/surface/channel.h +3 -2
  451. data/src/core/lib/surface/channel_ping.cc +1 -1
  452. data/src/core/lib/surface/completion_queue.cc +68 -69
  453. data/src/core/lib/surface/completion_queue.h +3 -2
  454. data/src/core/lib/surface/completion_queue_factory.cc +1 -2
  455. data/src/core/lib/surface/init.cc +1 -3
  456. data/src/core/lib/surface/init.h +10 -1
  457. data/src/core/lib/surface/lame_client.cc +11 -11
  458. data/src/core/lib/surface/lame_client.h +1 -1
  459. data/src/core/lib/surface/server.cc +31 -23
  460. data/src/core/lib/surface/server.h +19 -18
  461. data/src/core/lib/surface/validate_metadata.cc +7 -7
  462. data/src/core/lib/surface/validate_metadata.h +3 -2
  463. data/src/core/lib/surface/version.cc +2 -2
  464. data/src/core/lib/transport/byte_stream.cc +5 -5
  465. data/src/core/lib/transport/byte_stream.h +8 -8
  466. data/src/core/lib/transport/connectivity_state.cc +1 -1
  467. data/src/core/lib/transport/error_utils.cc +21 -10
  468. data/src/core/lib/transport/error_utils.h +11 -5
  469. data/src/core/lib/transport/metadata_batch.cc +37 -37
  470. data/src/core/lib/transport/metadata_batch.h +19 -18
  471. data/src/core/lib/transport/transport.cc +4 -3
  472. data/src/core/lib/transport/transport.h +6 -4
  473. data/src/core/lib/transport/transport_op_string.cc +6 -6
  474. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  475. data/src/core/tsi/alts/crypt/gsec.h +6 -0
  476. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  477. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  478. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  479. data/src/core/tsi/ssl_transport_security.cc +32 -14
  480. data/src/core/tsi/ssl_transport_security.h +3 -4
  481. data/src/ruby/bin/math_services_pb.rb +1 -1
  482. data/src/ruby/ext/grpc/extconf.rb +2 -0
  483. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -0
  484. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +11 -2
  485. data/src/ruby/lib/grpc/version.rb +1 -1
  486. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  487. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  488. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  489. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  490. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  491. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  492. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  493. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  494. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  495. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  496. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  497. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  498. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  499. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  500. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  501. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  502. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  503. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  504. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  505. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  506. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  507. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  508. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  509. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  510. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  511. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  512. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  513. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  514. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  515. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  516. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  517. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  518. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  519. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  520. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  521. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  522. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  523. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  524. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  525. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  526. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  527. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  528. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  529. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  530. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  531. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  532. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  533. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  534. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  535. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  536. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  537. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  538. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  539. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  540. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  541. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  542. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  543. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  544. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  545. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  546. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  547. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  548. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  549. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  550. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  551. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  552. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  553. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  554. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  555. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  556. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  557. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  558. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  559. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  560. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  561. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  562. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  563. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  564. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  565. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  566. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  567. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  568. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  569. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  570. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  571. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  572. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  573. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  574. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  575. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  576. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  577. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  578. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  579. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  580. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  581. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  582. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  583. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  584. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  585. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  586. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  587. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  588. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  589. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  590. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  591. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  592. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  593. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  594. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  595. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  596. data/third_party/boringssl-with-bazel/err_data.c +483 -461
  597. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  598. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +9 -7
  599. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  600. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  601. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  602. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  603. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  604. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +4 -0
  605. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  606. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  607. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  608. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +1 -1
  609. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -1
  610. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  611. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +9 -0
  612. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  613. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  614. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +0 -4
  615. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  616. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  617. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +7 -0
  618. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  619. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +87 -160
  620. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  621. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  622. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  623. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  624. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  625. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +52 -65
  626. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +52 -66
  627. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  628. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  629. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  630. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  631. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  632. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  633. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +1 -4
  634. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +0 -13
  635. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  636. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +26 -24
  637. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +10 -7
  638. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  639. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  640. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +61 -75
  641. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +80 -103
  642. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +40 -49
  643. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +367 -315
  644. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  645. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  646. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  647. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +5 -3
  648. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  649. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +2 -2
  650. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  651. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c +1 -2
  652. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  653. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +120 -11
  654. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  655. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +3 -0
  656. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  657. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  658. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +42 -89
  659. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  660. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +2 -0
  661. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +14 -15
  662. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +53 -73
  663. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +31 -0
  664. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +3 -0
  665. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  666. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +3 -0
  667. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  668. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  669. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  670. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +5 -8
  671. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +5 -0
  672. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  673. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +3 -0
  674. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +7 -0
  675. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  676. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  677. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  678. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +5 -8
  679. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +1 -4
  680. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +66 -1
  681. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  682. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +47 -7
  683. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +1 -0
  684. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  685. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  686. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  687. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +6 -2
  688. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  689. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +33 -0
  690. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  691. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +20 -49
  692. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  693. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +325 -0
  694. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  695. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +25 -7
  696. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  697. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  698. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +99 -63
  699. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +283 -85
  700. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +13 -19
  701. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +445 -152
  702. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +451 -435
  703. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -1
  704. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +7 -2
  705. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +1 -1
  706. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +1133 -0
  707. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +298 -22
  708. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +66 -30
  709. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +189 -86
  710. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +154 -24
  711. data/third_party/boringssl-with-bazel/src/ssl/internal.h +414 -135
  712. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +9 -3
  713. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  714. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +14 -19
  715. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  716. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +51 -60
  718. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +2 -0
  719. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +8 -31
  720. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +3 -0
  721. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +4 -3
  722. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +7 -3
  723. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +664 -702
  724. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +65 -7
  725. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -39
  726. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +141 -94
  727. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +213 -118
  728. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  729. data/third_party/xxhash/xxhash.h +77 -195
  730. metadata +116 -51
  731. data/src/core/lib/gpr/arena.h +0 -47
  732. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  733. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  734. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  735. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  736. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  737. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +0 -246
  738. data/third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h +0 -71
@@ -30,11 +30,11 @@
30
30
 
31
31
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
32
32
  #include "src/core/ext/filters/client_channel/server_address.h"
33
+ #include "src/core/lib/address_utils/parse_address.h"
33
34
  #include "src/core/lib/channel/channel_args.h"
34
35
  #include "src/core/lib/gpr/string.h"
35
36
  #include "src/core/lib/gpr/useful.h"
36
37
  #include "src/core/lib/iomgr/closure.h"
37
- #include "src/core/lib/iomgr/parse_address.h"
38
38
  #include "src/core/lib/iomgr/resolve_address.h"
39
39
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
40
40
  #include "src/core/lib/iomgr/work_serializer.h"
@@ -313,48 +313,40 @@ void FakeResolverResponseGenerator::SetFakeResolver(
313
313
 
314
314
  namespace {
315
315
 
316
- static void* response_generator_arg_copy(void* p) {
317
- FakeResolverResponseGenerator* generator =
318
- static_cast<FakeResolverResponseGenerator*>(p);
319
- // TODO(roth): We currently deal with this ref manually. Once the
320
- // new channel args code is converted to C++, find a way to track this ref
321
- // in a cleaner way.
322
- RefCountedPtr<FakeResolverResponseGenerator> copy = generator->Ref();
323
- copy.release();
316
+ void* ResponseGeneratorChannelArgCopy(void* p) {
317
+ auto* generator = static_cast<FakeResolverResponseGenerator*>(p);
318
+ generator->Ref().release();
324
319
  return p;
325
320
  }
326
321
 
327
- static void response_generator_arg_destroy(void* p) {
328
- FakeResolverResponseGenerator* generator =
329
- static_cast<FakeResolverResponseGenerator*>(p);
322
+ void ResponseGeneratorChannelArgDestroy(void* p) {
323
+ auto* generator = static_cast<FakeResolverResponseGenerator*>(p);
330
324
  generator->Unref();
331
325
  }
332
326
 
333
- static int response_generator_cmp(void* a, void* b) { return GPR_ICMP(a, b); }
334
-
335
- static const grpc_arg_pointer_vtable response_generator_arg_vtable = {
336
- response_generator_arg_copy, response_generator_arg_destroy,
337
- response_generator_cmp};
327
+ int ResponseGeneratorChannelArgCmp(void* a, void* b) { return GPR_ICMP(a, b); }
338
328
 
339
329
  } // namespace
340
330
 
331
+ const grpc_arg_pointer_vtable
332
+ FakeResolverResponseGenerator::kChannelArgPointerVtable = {
333
+ ResponseGeneratorChannelArgCopy, ResponseGeneratorChannelArgDestroy,
334
+ ResponseGeneratorChannelArgCmp};
335
+
341
336
  grpc_arg FakeResolverResponseGenerator::MakeChannelArg(
342
337
  FakeResolverResponseGenerator* generator) {
343
- grpc_arg arg;
344
- arg.type = GRPC_ARG_POINTER;
345
- arg.key = const_cast<char*>(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR);
346
- arg.value.pointer.p = generator;
347
- arg.value.pointer.vtable = &response_generator_arg_vtable;
348
- return arg;
338
+ return grpc_channel_arg_pointer_create(
339
+ const_cast<char*>(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR), generator,
340
+ &kChannelArgPointerVtable);
349
341
  }
350
342
 
351
343
  RefCountedPtr<FakeResolverResponseGenerator>
352
344
  FakeResolverResponseGenerator::GetFromArgs(const grpc_channel_args* args) {
353
- const grpc_arg* arg =
354
- grpc_channel_args_find(args, GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR);
355
- if (arg == nullptr || arg->type != GRPC_ARG_POINTER) return nullptr;
356
- return static_cast<FakeResolverResponseGenerator*>(arg->value.pointer.p)
357
- ->Ref();
345
+ auto* response_generator =
346
+ grpc_channel_args_find_pointer<FakeResolverResponseGenerator>(
347
+ args, GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR);
348
+ if (response_generator == nullptr) return nullptr;
349
+ return response_generator->Ref();
358
350
  }
359
351
 
360
352
  //
@@ -42,6 +42,8 @@ class FakeResolver;
42
42
  class FakeResolverResponseGenerator
43
43
  : public RefCounted<FakeResolverResponseGenerator> {
44
44
  public:
45
+ static const grpc_arg_pointer_vtable kChannelArgPointerVtable;
46
+
45
47
  FakeResolverResponseGenerator();
46
48
  ~FakeResolverResponseGenerator() override;
47
49
 
@@ -69,6 +71,7 @@ class FakeResolverResponseGenerator
69
71
  void SetFailureOnReresolution();
70
72
 
71
73
  // Returns a channel arg containing \a generator.
74
+ // TODO(roth): When we have time, make this a non-static method.
72
75
  static grpc_arg MakeChannelArg(FakeResolverResponseGenerator* generator);
73
76
 
74
77
  // Returns the response generator in \a args, or null if not found.
@@ -82,12 +85,11 @@ class FakeResolverResponseGenerator
82
85
 
83
86
  // Mutex protecting the members below.
84
87
  Mutex mu_;
85
- RefCountedPtr<FakeResolver> resolver_;
86
- Resolver::Result result_;
87
- bool has_result_ = false;
88
+ RefCountedPtr<FakeResolver> resolver_ ABSL_GUARDED_BY(mu_);
89
+ Resolver::Result result_ ABSL_GUARDED_BY(mu_);
90
+ bool has_result_ ABSL_GUARDED_BY(mu_) = false;
88
91
  };
89
92
 
90
93
  } // namespace grpc_core
91
94
 
92
- #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_FAKE_FAKE_RESOLVER_H \
93
- */
95
+ #endif // GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_FAKE_FAKE_RESOLVER_H
@@ -16,6 +16,8 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <random>
20
+
19
21
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
20
22
  #include "src/core/ext/xds/xds_client.h"
21
23
  #include "src/core/lib/gpr/env.h"
@@ -48,15 +50,15 @@ class GoogleCloud2ProdResolver : public Resolver {
48
50
  void Orphan() override;
49
51
 
50
52
  private:
51
- static void OnHttpRequestDone(void* arg, grpc_error* error);
53
+ static void OnHttpRequestDone(void* arg, grpc_error_handle error);
52
54
 
53
55
  // Calls OnDone() if not already called. Releases a ref.
54
- void MaybeCallOnDone(grpc_error* error);
56
+ void MaybeCallOnDone(grpc_error_handle error);
55
57
 
56
58
  // If error is not GRPC_ERROR_NONE, then it's not safe to look at response.
57
59
  virtual void OnDone(GoogleCloud2ProdResolver* resolver,
58
60
  const grpc_http_response* response,
59
- grpc_error* error) = 0;
61
+ grpc_error_handle error) = 0;
60
62
 
61
63
  RefCountedPtr<GoogleCloud2ProdResolver> resolver_;
62
64
  grpc_httpcli_context context_;
@@ -73,7 +75,8 @@ class GoogleCloud2ProdResolver : public Resolver {
73
75
 
74
76
  private:
75
77
  void OnDone(GoogleCloud2ProdResolver* resolver,
76
- const grpc_http_response* response, grpc_error* error) override;
78
+ const grpc_http_response* response,
79
+ grpc_error_handle error) override;
77
80
  };
78
81
 
79
82
  // A metadata server query to get the IPv6 address.
@@ -84,7 +87,8 @@ class GoogleCloud2ProdResolver : public Resolver {
84
87
 
85
88
  private:
86
89
  void OnDone(GoogleCloud2ProdResolver* resolver,
87
- const grpc_http_response* response, grpc_error* error) override;
90
+ const grpc_http_response* response,
91
+ grpc_error_handle error) override;
88
92
  };
89
93
 
90
94
  void ZoneQueryDone(std::string zone);
@@ -143,13 +147,13 @@ void GoogleCloud2ProdResolver::MetadataQuery::Orphan() {
143
147
  }
144
148
 
145
149
  void GoogleCloud2ProdResolver::MetadataQuery::OnHttpRequestDone(
146
- void* arg, grpc_error* error) {
150
+ void* arg, grpc_error_handle error) {
147
151
  auto* self = static_cast<MetadataQuery*>(arg);
148
152
  self->MaybeCallOnDone(GRPC_ERROR_REF(error));
149
153
  }
150
154
 
151
155
  void GoogleCloud2ProdResolver::MetadataQuery::MaybeCallOnDone(
152
- grpc_error* error) {
156
+ grpc_error_handle error) {
153
157
  bool expected = false;
154
158
  if (!on_done_called_.CompareExchangeStrong(
155
159
  &expected, true, MemoryOrder::RELAXED, MemoryOrder::RELAXED)) {
@@ -180,10 +184,10 @@ GoogleCloud2ProdResolver::ZoneQuery::ZoneQuery(
180
184
 
181
185
  void GoogleCloud2ProdResolver::ZoneQuery::OnDone(
182
186
  GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
183
- grpc_error* error) {
187
+ grpc_error_handle error) {
184
188
  if (error != GRPC_ERROR_NONE) {
185
189
  gpr_log(GPR_ERROR, "error fetching zone from metadata server: %s",
186
- grpc_error_string(error));
190
+ grpc_error_std_string(error).c_str());
187
191
  }
188
192
  std::string zone;
189
193
  if (error == GRPC_ERROR_NONE && response->status == 200) {
@@ -193,7 +197,7 @@ void GoogleCloud2ProdResolver::ZoneQuery::OnDone(
193
197
  gpr_log(GPR_ERROR, "could not parse zone from metadata server: %s",
194
198
  std::string(body).c_str());
195
199
  } else {
196
- zone = std::string(body.substr(i));
200
+ zone = std::string(body.substr(i + 1));
197
201
  }
198
202
  }
199
203
  resolver->ZoneQueryDone(std::move(zone));
@@ -213,10 +217,10 @@ GoogleCloud2ProdResolver::IPv6Query::IPv6Query(
213
217
 
214
218
  void GoogleCloud2ProdResolver::IPv6Query::OnDone(
215
219
  GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
216
- grpc_error* error) {
220
+ grpc_error_handle error) {
217
221
  if (error != GRPC_ERROR_NONE) {
218
222
  gpr_log(GPR_ERROR, "error fetching IPv6 address from metadata server: %s",
219
- grpc_error_string(error));
223
+ grpc_error_std_string(error).c_str());
220
224
  }
221
225
  resolver->IPv6QueryDone(error == GRPC_ERROR_NONE && response->status == 200);
222
226
  GRPC_ERROR_UNREF(error);
@@ -295,8 +299,11 @@ void GoogleCloud2ProdResolver::IPv6QueryDone(bool ipv6_supported) {
295
299
 
296
300
  void GoogleCloud2ProdResolver::StartXdsResolver() {
297
301
  // Construct bootstrap JSON.
302
+ std::random_device rd;
303
+ std::mt19937 mt(rd());
304
+ std::uniform_int_distribution<uint64_t> dist(1, UINT64_MAX);
298
305
  Json::Object node = {
299
- {"id", "C2P"},
306
+ {"id", absl::StrCat("C2P-", dist(mt))},
300
307
  };
301
308
  if (!zone_->empty()) {
302
309
  node["locality"] = Json::Object{
@@ -30,9 +30,9 @@
30
30
 
31
31
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
32
32
  #include "src/core/ext/filters/client_channel/server_address.h"
33
+ #include "src/core/lib/address_utils/parse_address.h"
33
34
  #include "src/core/lib/channel/channel_args.h"
34
35
  #include "src/core/lib/gpr/string.h"
35
- #include "src/core/lib/iomgr/parse_address.h"
36
36
  #include "src/core/lib/iomgr/resolve_address.h"
37
37
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
38
38
  #include "src/core/lib/slice/slice_internal.h"
@@ -28,12 +28,12 @@
28
28
  #include "src/core/ext/filters/client_channel/config_selector.h"
29
29
  #include "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h"
30
30
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
31
+ #include "src/core/ext/xds/xds_channel_args.h"
31
32
  #include "src/core/ext/xds/xds_client.h"
32
33
  #include "src/core/ext/xds/xds_http_filters.h"
33
34
  #include "src/core/lib/channel/channel_args.h"
34
35
  #include "src/core/lib/iomgr/closure.h"
35
36
  #include "src/core/lib/iomgr/exec_ctx.h"
36
- #include "src/core/lib/surface/lame_client.h"
37
37
  #include "src/core/lib/transport/timeout_encoding.h"
38
38
 
39
39
  namespace grpc_core {
@@ -73,19 +73,23 @@ class XdsResolver : public Resolver {
73
73
 
74
74
  void ShutdownLocked() override;
75
75
 
76
+ void ResetBackoffLocked() override {
77
+ if (xds_client_ != nullptr) xds_client_->ResetBackoff();
78
+ }
79
+
76
80
  private:
77
81
  class Notifier {
78
82
  public:
79
83
  Notifier(RefCountedPtr<XdsResolver> resolver, XdsApi::LdsUpdate update);
80
84
  Notifier(RefCountedPtr<XdsResolver> resolver, XdsApi::RdsUpdate update);
81
- Notifier(RefCountedPtr<XdsResolver> resolver, grpc_error* error);
85
+ Notifier(RefCountedPtr<XdsResolver> resolver, grpc_error_handle error);
82
86
  explicit Notifier(RefCountedPtr<XdsResolver> resolver);
83
87
 
84
88
  private:
85
89
  enum Type { kLdsUpdate, kRdsUpdate, kError, kDoesNotExist };
86
90
 
87
- static void RunInExecCtx(void* arg, grpc_error* error);
88
- void RunInWorkSerializer(grpc_error* error);
91
+ static void RunInExecCtx(void* arg, grpc_error_handle error);
92
+ void RunInWorkSerializer(grpc_error_handle error);
89
93
 
90
94
  RefCountedPtr<XdsResolver> resolver_;
91
95
  grpc_closure closure_;
@@ -100,7 +104,9 @@ class XdsResolver : public Resolver {
100
104
  void OnListenerChanged(XdsApi::LdsUpdate listener) override {
101
105
  new Notifier(resolver_, std::move(listener));
102
106
  }
103
- void OnError(grpc_error* error) override { new Notifier(resolver_, error); }
107
+ void OnError(grpc_error_handle error) override {
108
+ new Notifier(resolver_, error);
109
+ }
104
110
  void OnResourceDoesNotExist() override { new Notifier(resolver_); }
105
111
 
106
112
  private:
@@ -114,33 +120,81 @@ class XdsResolver : public Resolver {
114
120
  void OnRouteConfigChanged(XdsApi::RdsUpdate route_config) override {
115
121
  new Notifier(resolver_, std::move(route_config));
116
122
  }
117
- void OnError(grpc_error* error) override { new Notifier(resolver_, error); }
123
+ void OnError(grpc_error_handle error) override {
124
+ new Notifier(resolver_, error);
125
+ }
118
126
  void OnResourceDoesNotExist() override { new Notifier(resolver_); }
119
127
 
120
128
  private:
121
129
  RefCountedPtr<XdsResolver> resolver_;
122
130
  };
123
131
 
124
- class ClusterState
125
- : public RefCounted<ClusterState, PolymorphicRefCount, false> {
132
+ // An entry in the map of clusters that need to be present in the LB
133
+ // policy config. The map holds a weak ref. One strong ref is held by
134
+ // the ConfigSelector, and another is held by each call assigned to
135
+ // the cluster by the ConfigSelector. The ref for each call is held
136
+ // until the call is committed. When the strong refs go away, we hop
137
+ // back into the WorkSerializer to remove the entry from the map.
138
+ class ClusterState : public DualRefCounted<ClusterState> {
126
139
  public:
127
140
  using ClusterStateMap =
128
- std::map<std::string, std::unique_ptr<ClusterState>>;
141
+ std::map<std::string, WeakRefCountedPtr<ClusterState>>;
129
142
 
130
- ClusterState(const std::string& cluster_name,
131
- ClusterStateMap* cluster_state_map)
132
- : it_(cluster_state_map
133
- ->emplace(cluster_name, std::unique_ptr<ClusterState>(this))
143
+ ClusterState(RefCountedPtr<XdsResolver> resolver,
144
+ const std::string& cluster_name)
145
+ : resolver_(std::move(resolver)),
146
+ it_(resolver_->cluster_state_map_.emplace(cluster_name, WeakRef())
134
147
  .first) {}
148
+
149
+ void Orphan() override {
150
+ auto* resolver = resolver_.release();
151
+ resolver->work_serializer_->Run(
152
+ [resolver]() {
153
+ resolver->MaybeRemoveUnusedClusters();
154
+ resolver->Unref();
155
+ },
156
+ DEBUG_LOCATION);
157
+ }
158
+
135
159
  const std::string& cluster() const { return it_->first; }
136
160
 
137
161
  private:
162
+ RefCountedPtr<XdsResolver> resolver_;
138
163
  ClusterStateMap::iterator it_;
139
164
  };
140
165
 
166
+ // Call dispatch controller, created for each call handled by the
167
+ // ConfigSelector. Holds a ref to the ClusterState object until the
168
+ // call is committed.
169
+ class XdsCallDispatchController
170
+ : public ConfigSelector::CallDispatchController {
171
+ public:
172
+ explicit XdsCallDispatchController(
173
+ RefCountedPtr<ClusterState> cluster_state)
174
+ : cluster_state_(std::move(cluster_state)) {}
175
+
176
+ bool ShouldRetry() override {
177
+ // TODO(donnadionne): Implement the retry circuit breaker here.
178
+ return true;
179
+ }
180
+
181
+ void Commit() override {
182
+ // TODO(donnadionne): If ShouldRetry() was called previously,
183
+ // decrement the retry circuit breaker counter.
184
+ cluster_state_.reset();
185
+ }
186
+
187
+ private:
188
+ // Note: The XdsCallDispatchController object is never actually destroyed,
189
+ // so do not add any data members that require destruction unless you have
190
+ // some other way to clean them up.
191
+ RefCountedPtr<ClusterState> cluster_state_;
192
+ };
193
+
141
194
  class XdsConfigSelector : public ConfigSelector {
142
195
  public:
143
- XdsConfigSelector(RefCountedPtr<XdsResolver> resolver, grpc_error** error);
196
+ XdsConfigSelector(RefCountedPtr<XdsResolver> resolver,
197
+ grpc_error_handle* error);
144
198
  ~XdsConfigSelector() override;
145
199
 
146
200
  const char* name() const override { return "XdsConfigSelector"; }
@@ -179,7 +233,7 @@ class XdsResolver : public Resolver {
179
233
  using RouteTable = std::vector<Route>;
180
234
 
181
235
  void MaybeAddCluster(const std::string& name);
182
- grpc_error* CreateMethodConfig(
236
+ grpc_error_handle CreateMethodConfig(
183
237
  const XdsApi::Route& route,
184
238
  const XdsApi::Route::ClusterWeight* cluster_weight,
185
239
  RefCountedPtr<ServiceConfig>* method_config);
@@ -188,15 +242,15 @@ class XdsResolver : public Resolver {
188
242
  RouteTable route_table_;
189
243
  std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters_;
190
244
  std::vector<const grpc_channel_filter*> filters_;
191
- grpc_error* filter_error_ = GRPC_ERROR_NONE;
192
245
  };
193
246
 
194
247
  void OnListenerUpdate(XdsApi::LdsUpdate listener);
195
248
  void OnRouteConfigUpdate(XdsApi::RdsUpdate rds_update);
196
- void OnError(grpc_error* error);
249
+ void OnError(grpc_error_handle error);
197
250
  void OnResourceDoesNotExist();
198
251
 
199
- grpc_error* CreateServiceConfig(RefCountedPtr<ServiceConfig>* service_config);
252
+ grpc_error_handle CreateServiceConfig(
253
+ RefCountedPtr<ServiceConfig>* service_config);
200
254
  void GenerateResult();
201
255
  void MaybeRemoveUnusedClusters();
202
256
 
@@ -243,7 +297,7 @@ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
243
297
  }
244
298
 
245
299
  XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
246
- grpc_error* error)
300
+ grpc_error_handle error)
247
301
  : resolver_(std::move(resolver)), type_(kError) {
248
302
  GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
249
303
  ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
@@ -255,14 +309,14 @@ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver)
255
309
  ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
256
310
  }
257
311
 
258
- void XdsResolver::Notifier::RunInExecCtx(void* arg, grpc_error* error) {
312
+ void XdsResolver::Notifier::RunInExecCtx(void* arg, grpc_error_handle error) {
259
313
  Notifier* self = static_cast<Notifier*>(arg);
260
314
  GRPC_ERROR_REF(error);
261
315
  self->resolver_->work_serializer_->Run(
262
316
  [self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
263
317
  }
264
318
 
265
- void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
319
+ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error_handle error) {
266
320
  if (resolver_->xds_client_ == nullptr) {
267
321
  GRPC_ERROR_UNREF(error);
268
322
  delete this;
@@ -314,7 +368,7 @@ bool XdsResolver::XdsConfigSelector::Route::operator==(
314
368
  //
315
369
 
316
370
  XdsResolver::XdsConfigSelector::XdsConfigSelector(
317
- RefCountedPtr<XdsResolver> resolver, grpc_error** error)
371
+ RefCountedPtr<XdsResolver> resolver, grpc_error_handle* error)
318
372
  : resolver_(std::move(resolver)) {
319
373
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
320
374
  gpr_log(GPR_INFO, "[xds_resolver %p] creating XdsConfigSelector %p",
@@ -366,16 +420,8 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
366
420
  }
367
421
  }
368
422
  // Populate filter list.
369
- bool found_router = false;
370
423
  for (const auto& http_filter :
371
424
  resolver_->current_listener_.http_connection_manager.http_filters) {
372
- // Stop at the router filter. It's a no-op for us, and we ignore
373
- // anything that may come after it, for compatibility with Envoy.
374
- if (http_filter.config.config_proto_type_name ==
375
- kXdsHttpRouterFilterConfigName) {
376
- found_router = true;
377
- break;
378
- }
379
425
  // Find filter. This is guaranteed to succeed, because it's checked
380
426
  // at config validation time in the XdsApi code.
381
427
  const XdsHttpFilterImpl* filter_impl =
@@ -383,16 +429,9 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
383
429
  http_filter.config.config_proto_type_name);
384
430
  GPR_ASSERT(filter_impl != nullptr);
385
431
  // Add C-core filter to list.
386
- filters_.push_back(filter_impl->channel_filter());
387
- }
388
- // For compatibility with Envoy, if the router filter is not
389
- // configured, we fail all RPCs.
390
- if (!found_router) {
391
- filter_error_ =
392
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
393
- "no xDS HTTP router filter configured"),
394
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
395
- filters_.push_back(&grpc_lame_filter);
432
+ if (filter_impl->channel_filter() != nullptr) {
433
+ filters_.push_back(filter_impl->channel_filter());
434
+ }
396
435
  }
397
436
  }
398
437
 
@@ -403,7 +442,6 @@ XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
403
442
  }
404
443
  clusters_.clear();
405
444
  resolver_->MaybeRemoveUnusedClusters();
406
- GRPC_ERROR_UNREF(filter_error_);
407
445
  }
408
446
 
409
447
  const XdsHttpFilterImpl::FilterConfig* FindFilterConfigOverride(
@@ -425,11 +463,47 @@ const XdsHttpFilterImpl::FilterConfig* FindFilterConfigOverride(
425
463
  return nullptr;
426
464
  }
427
465
 
428
- grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
466
+ grpc_error_handle XdsResolver::XdsConfigSelector::CreateMethodConfig(
429
467
  const XdsApi::Route& route,
430
468
  const XdsApi::Route::ClusterWeight* cluster_weight,
431
469
  RefCountedPtr<ServiceConfig>* method_config) {
432
470
  std::vector<std::string> fields;
471
+ // Set retry policy if any.
472
+ if (route.retry_policy.has_value()) {
473
+ std::vector<std::string> retry_parts;
474
+ retry_parts.push_back(absl::StrFormat(
475
+ "\"retryPolicy\": {\n"
476
+ " \"maxAttempts\": %d,\n"
477
+ " \"initialBackoff\": \"%d.%09ds\",\n"
478
+ " \"maxBackoff\": \"%d.%09ds\",\n"
479
+ " \"backoffMultiplier\": 2,\n",
480
+ route.retry_policy->num_retries + 1,
481
+ route.retry_policy->retry_back_off.base_interval.seconds,
482
+ route.retry_policy->retry_back_off.base_interval.nanos,
483
+ route.retry_policy->retry_back_off.max_interval.seconds,
484
+ route.retry_policy->retry_back_off.max_interval.nanos));
485
+ std::vector<std::string> code_parts;
486
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_CANCELLED)) {
487
+ code_parts.push_back(" \"CANCELLED\"");
488
+ }
489
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_DEADLINE_EXCEEDED)) {
490
+ code_parts.push_back(" \"DEADLINE_EXCEEDED\"");
491
+ }
492
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_INTERNAL)) {
493
+ code_parts.push_back(" \"INTERNAL\"");
494
+ }
495
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_RESOURCE_EXHAUSTED)) {
496
+ code_parts.push_back(" \"RESOURCE_EXHAUSTED\"");
497
+ }
498
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_UNAVAILABLE)) {
499
+ code_parts.push_back(" \"UNAVAILABLE\"");
500
+ }
501
+ retry_parts.push_back(
502
+ absl::StrFormat(" \"retryableStatusCodes\": [\n %s ]\n",
503
+ absl::StrJoin(code_parts, ",\n")));
504
+ retry_parts.push_back(absl::StrFormat(" }"));
505
+ fields.emplace_back(absl::StrJoin(retry_parts, ""));
506
+ }
433
507
  // Set timeout.
434
508
  if (route.max_stream_duration.has_value() &&
435
509
  (route.max_stream_duration->seconds != 0 ||
@@ -443,18 +517,15 @@ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
443
517
  grpc_channel_args* args = grpc_channel_args_copy(resolver_->args_);
444
518
  for (const auto& http_filter :
445
519
  resolver_->current_listener_.http_connection_manager.http_filters) {
446
- // Stop at the router filter. It's a no-op for us, and we ignore
447
- // anything that may come after it, for compatibility with Envoy.
448
- if (http_filter.config.config_proto_type_name ==
449
- kXdsHttpRouterFilterConfigName) {
450
- break;
451
- }
452
520
  // Find filter. This is guaranteed to succeed, because it's checked
453
521
  // at config validation time in the XdsApi code.
454
522
  const XdsHttpFilterImpl* filter_impl =
455
523
  XdsHttpFilterRegistry::GetFilterForType(
456
524
  http_filter.config.config_proto_type_name);
457
525
  GPR_ASSERT(filter_impl != nullptr);
526
+ // If there is not actually any C-core filter associated with this
527
+ // xDS filter, then it won't need any config, so skip it.
528
+ if (filter_impl->channel_filter() == nullptr) continue;
458
529
  // Allow filter to add channel args that may affect service config
459
530
  // parsing.
460
531
  args = filter_impl->ModifyChannelArgs(args);
@@ -482,7 +553,7 @@ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
482
553
  "\n ]"));
483
554
  }
484
555
  // Construct service config.
485
- grpc_error* error = GRPC_ERROR_NONE;
556
+ grpc_error_handle error = GRPC_ERROR_NONE;
486
557
  if (!fields.empty()) {
487
558
  std::string json = absl::StrCat(
488
559
  "{\n"
@@ -502,20 +573,14 @@ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
502
573
 
503
574
  grpc_channel_args* XdsResolver::XdsConfigSelector::ModifyChannelArgs(
504
575
  grpc_channel_args* args) {
505
- if (filter_error_ == GRPC_ERROR_NONE) return args;
506
- grpc_arg error_arg = MakeLameClientErrorArg(filter_error_);
507
- grpc_channel_args* new_args =
508
- grpc_channel_args_copy_and_add(args, &error_arg, 1);
509
- grpc_channel_args_destroy(args);
510
- return new_args;
576
+ return args;
511
577
  }
512
578
 
513
579
  void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
514
580
  if (clusters_.find(name) == clusters_.end()) {
515
581
  auto it = resolver_->cluster_state_map_.find(name);
516
582
  if (it == resolver_->cluster_state_map_.end()) {
517
- auto new_cluster_state =
518
- MakeRefCounted<ClusterState>(name, &resolver_->cluster_state_map_);
583
+ auto new_cluster_state = MakeRefCounted<ClusterState>(resolver_, name);
519
584
  clusters_[new_cluster_state->cluster()] = std::move(new_cluster_state);
520
585
  } else {
521
586
  clusters_[it->second->cluster()] = it->second->Ref();
@@ -557,6 +622,9 @@ absl::optional<uint64_t> HeaderHashHelper(
557
622
  std::string value_buffer;
558
623
  absl::optional<absl::string_view> header_value =
559
624
  GetHeaderValue(initial_metadata, policy.header_name, &value_buffer);
625
+ if (!header_value.has_value()) {
626
+ return absl::nullopt;
627
+ }
560
628
  if (policy.regex != nullptr) {
561
629
  // If GetHeaderValue() did not already store the value in
562
630
  // value_buffer, copy it there now, so we can modify it.
@@ -627,10 +695,7 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
627
695
  }
628
696
  auto it = clusters_.find(cluster_name);
629
697
  GPR_ASSERT(it != clusters_.end());
630
- XdsResolver* resolver =
631
- static_cast<XdsResolver*>(resolver_->Ref().release());
632
- ClusterState* cluster_state = it->second->Ref().release();
633
- // Generate a hash
698
+ // Generate a hash.
634
699
  absl::optional<uint64_t> hash;
635
700
  for (const auto& hash_policy : entry.route.hash_policies) {
636
701
  absl::optional<uint64_t> new_hash;
@@ -639,8 +704,8 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
639
704
  new_hash = HeaderHashHelper(hash_policy, args.initial_metadata);
640
705
  break;
641
706
  case XdsApi::Route::HashPolicy::CHANNEL_ID:
642
- new_hash =
643
- static_cast<uint64_t>(reinterpret_cast<uintptr_t>(resolver));
707
+ new_hash = static_cast<uint64_t>(
708
+ reinterpret_cast<uintptr_t>(resolver_.get()));
644
709
  break;
645
710
  default:
646
711
  GPR_ASSERT(0);
@@ -660,7 +725,12 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
660
725
  }
661
726
  if (!hash.has_value()) {
662
727
  // If there is no hash, we just choose a random value as a default.
663
- hash = rand();
728
+ // We cannot directly use the result of rand() as the hash value,
729
+ // since it is a 32-bit number and not a 64-bit number and will
730
+ // therefore not be evenly distributed.
731
+ uint32_t upper = rand();
732
+ uint32_t lower = rand();
733
+ hash = (static_cast<uint64_t>(upper) << 32) | lower;
664
734
  }
665
735
  CallConfig call_config;
666
736
  if (method_config != nullptr) {
@@ -669,33 +739,14 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
669
739
  call_config.service_config = std::move(method_config);
670
740
  }
671
741
  call_config.call_attributes[kXdsClusterAttribute] = it->first;
672
- call_config.call_attributes[kRequestRingHashAttribute] =
673
- absl::StrFormat("%" PRIu64, hash.value());
674
- call_config.on_call_committed = [resolver, cluster_state]() {
675
- cluster_state->Unref();
676
- ExecCtx::Run(
677
- // TODO(roth): This hop into the ExecCtx is being done to avoid
678
- // entering the WorkSerializer while holding the client channel data
679
- // plane mutex, since that can lead to deadlocks. However, we should
680
- // not have to solve this problem in each individual ConfigSelector
681
- // implementation. When we have time, we should fix the client channel
682
- // code to avoid this by not invoking the
683
- // CallConfig::on_call_committed callback until after it has released
684
- // the data plane mutex.
685
- DEBUG_LOCATION,
686
- GRPC_CLOSURE_CREATE(
687
- [](void* arg, grpc_error* /*error*/) {
688
- auto* resolver = static_cast<XdsResolver*>(arg);
689
- resolver->work_serializer_->Run(
690
- [resolver]() {
691
- resolver->MaybeRemoveUnusedClusters();
692
- resolver->Unref();
693
- },
694
- DEBUG_LOCATION);
695
- },
696
- resolver, nullptr),
697
- GRPC_ERROR_NONE);
698
- };
742
+ std::string hash_string = absl::StrCat(hash.value());
743
+ char* hash_value =
744
+ static_cast<char*>(args.arena->Alloc(hash_string.size() + 1));
745
+ memcpy(hash_value, hash_string.c_str(), hash_string.size());
746
+ hash_value[hash_string.size()] = '\0';
747
+ call_config.call_attributes[kRequestRingHashAttribute] = hash_value;
748
+ call_config.call_dispatch_controller =
749
+ args.arena->New<XdsCallDispatchController>(it->second->Ref());
699
750
  return call_config;
700
751
  }
701
752
  return CallConfig();
@@ -706,13 +757,13 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
706
757
  //
707
758
 
708
759
  void XdsResolver::StartLocked() {
709
- grpc_error* error = GRPC_ERROR_NONE;
710
- xds_client_ = XdsClient::GetOrCreate(&error);
760
+ grpc_error_handle error = GRPC_ERROR_NONE;
761
+ xds_client_ = XdsClient::GetOrCreate(args_, &error);
711
762
  if (error != GRPC_ERROR_NONE) {
712
763
  gpr_log(GPR_ERROR,
713
764
  "Failed to create xds client -- channel will remain in "
714
765
  "TRANSIENT_FAILURE: %s",
715
- grpc_error_string(error));
766
+ grpc_error_std_string(error).c_str());
716
767
  result_handler_->ReturnError(error);
717
768
  return;
718
769
  }
@@ -809,11 +860,12 @@ void XdsResolver::OnRouteConfigUpdate(XdsApi::RdsUpdate rds_update) {
809
860
  GenerateResult();
810
861
  }
811
862
 
812
- void XdsResolver::OnError(grpc_error* error) {
863
+ void XdsResolver::OnError(grpc_error_handle error) {
813
864
  gpr_log(GPR_ERROR, "[xds_resolver %p] received error from XdsClient: %s",
814
- this, grpc_error_string(error));
865
+ this, grpc_error_std_string(error).c_str());
815
866
  Result result;
816
- result.args = grpc_channel_args_copy(args_);
867
+ grpc_arg new_arg = xds_client_->MakeChannelArg();
868
+ result.args = grpc_channel_args_copy_and_add(args_, &new_arg, 1);
817
869
  result.service_config_error = error;
818
870
  result_handler_->ReturnResult(std::move(result));
819
871
  }
@@ -832,7 +884,7 @@ void XdsResolver::OnResourceDoesNotExist() {
832
884
  result_handler_->ReturnResult(std::move(result));
833
885
  }
834
886
 
835
- grpc_error* XdsResolver::CreateServiceConfig(
887
+ grpc_error_handle XdsResolver::CreateServiceConfig(
836
888
  RefCountedPtr<ServiceConfig>* service_config) {
837
889
  std::vector<std::string> clusters;
838
890
  for (const auto& cluster : cluster_state_map_) {
@@ -859,7 +911,7 @@ grpc_error* XdsResolver::CreateServiceConfig(
859
911
  " ]\n"
860
912
  "}");
861
913
  std::string json = absl::StrJoin(config_parts, "");
862
- grpc_error* error = GRPC_ERROR_NONE;
914
+ grpc_error_handle error = GRPC_ERROR_NONE;
863
915
  *service_config = ServiceConfig::Create(args_, json.c_str(), &error);
864
916
  return error;
865
917
  }
@@ -868,7 +920,7 @@ void XdsResolver::GenerateResult() {
868
920
  if (current_virtual_host_.routes.empty()) return;
869
921
  // First create XdsConfigSelector, which may add new entries to the cluster
870
922
  // state map, and then CreateServiceConfig for LB policies.
871
- grpc_error* error = GRPC_ERROR_NONE;
923
+ grpc_error_handle error = GRPC_ERROR_NONE;
872
924
  auto config_selector = MakeRefCounted<XdsConfigSelector>(Ref(), &error);
873
925
  if (error != GRPC_ERROR_NONE) {
874
926
  OnError(error);
@@ -884,8 +936,12 @@ void XdsResolver::GenerateResult() {
884
936
  gpr_log(GPR_INFO, "[xds_resolver %p] generated service config: %s", this,
885
937
  result.service_config->json_string().c_str());
886
938
  }
887
- grpc_arg new_arg = config_selector->MakeChannelArg();
888
- result.args = grpc_channel_args_copy_and_add(args_, &new_arg, 1);
939
+ grpc_arg new_args[] = {
940
+ xds_client_->MakeChannelArg(),
941
+ config_selector->MakeChannelArg(),
942
+ };
943
+ result.args =
944
+ grpc_channel_args_copy_and_add(args_, new_args, GPR_ARRAY_SIZE(new_args));
889
945
  result_handler_->ReturnResult(std::move(result));
890
946
  }
891
947