grpc 1.36.0 → 1.38.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 (680) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +126 -92
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +15 -1
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +7 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +715 -3166
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -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 +9 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +18 -14
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  24. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  26. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  27. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  28. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  29. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -1
  30. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  36. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  40. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  41. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +29 -44
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +32 -47
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +86 -63
  46. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  48. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  49. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  50. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  51. data/src/core/ext/filters/client_channel/resolver.cc +3 -0
  52. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +17 -15
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +38 -33
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  62. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  63. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  64. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  65. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +31 -14
  66. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  67. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +334 -114
  68. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  70. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  71. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  72. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  73. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  74. data/src/core/ext/filters/client_channel/server_address.cc +4 -1
  75. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  76. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  77. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  78. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  79. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  80. data/src/core/ext/filters/client_channel/subchannel.cc +86 -162
  81. data/src/core/ext/filters/client_channel/subchannel.h +68 -99
  82. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  83. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  84. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  85. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  86. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +501 -0
  87. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  88. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  89. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  90. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  91. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  92. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  93. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  94. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  95. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  96. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  97. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  98. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +5 -4
  99. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -8
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -4
  102. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +2 -2
  103. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -5
  104. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +485 -199
  105. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  106. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -3
  108. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +167 -122
  110. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  111. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  112. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  113. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  114. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  115. data/src/core/ext/transport/chttp2/transport/frame_data.cc +13 -9
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  128. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  130. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  132. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/internal.h +32 -27
  135. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  138. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  139. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  140. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  141. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  144. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  145. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  146. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  147. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  148. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
  149. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  154. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  155. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
  157. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
  158. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  159. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  160. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  164. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  165. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  166. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  167. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  168. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  169. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  170. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  171. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  172. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  173. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  174. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  175. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  176. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
  177. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  178. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  179. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  180. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  181. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  182. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  183. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  184. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
  185. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  186. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  187. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  188. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  189. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  190. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  191. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  192. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  193. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  194. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  195. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  196. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  197. data/src/core/ext/xds/xds_api.cc +1649 -329
  198. data/src/core/ext/xds/xds_api.h +284 -44
  199. data/src/core/ext/xds/xds_bootstrap.cc +110 -156
  200. data/src/core/ext/xds/xds_bootstrap.h +24 -25
  201. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  202. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  203. data/src/core/ext/xds/xds_channel_args.h +5 -2
  204. data/src/core/ext/xds/xds_client.cc +454 -177
  205. data/src/core/ext/xds/xds_client.h +62 -22
  206. data/src/core/ext/xds/xds_client_stats.h +5 -4
  207. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  208. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  209. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  210. data/src/core/ext/xds/xds_http_filters.h +130 -0
  211. data/src/core/ext/xds/xds_server_config_fetcher.cc +410 -131
  212. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  213. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  214. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +107 -4
  215. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +26 -6
  216. data/src/core/lib/channel/channel_stack.cc +22 -9
  217. data/src/core/lib/channel/channel_stack.h +17 -9
  218. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  219. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  220. data/src/core/lib/channel/channelz.cc +108 -12
  221. data/src/core/lib/channel/channelz.h +30 -1
  222. data/src/core/lib/channel/channelz_registry.cc +14 -0
  223. data/src/core/lib/channel/connected_channel.cc +4 -4
  224. data/src/core/lib/channel/handshaker.cc +7 -45
  225. data/src/core/lib/channel/handshaker.h +5 -22
  226. data/src/core/lib/channel/status_util.cc +12 -2
  227. data/src/core/lib/channel/status_util.h +5 -0
  228. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  229. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  230. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  231. data/src/core/lib/gpr/sync_windows.cc +2 -2
  232. data/src/core/lib/gprpp/atomic.h +3 -3
  233. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  234. data/src/core/lib/gprpp/ref_counted.h +28 -14
  235. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  236. data/src/core/lib/gprpp/status_helper.cc +407 -0
  237. data/src/core/lib/gprpp/status_helper.h +180 -0
  238. data/src/core/lib/gprpp/thd.h +1 -1
  239. data/src/core/lib/http/httpcli.cc +11 -11
  240. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  241. data/src/core/lib/http/parser.cc +16 -16
  242. data/src/core/lib/http/parser.h +4 -4
  243. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  244. data/src/core/lib/iomgr/buffer_list.h +5 -6
  245. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  246. data/src/core/lib/iomgr/call_combiner.h +12 -14
  247. data/src/core/lib/iomgr/cfstream_handle.cc +5 -5
  248. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  249. data/src/core/lib/iomgr/closure.h +7 -6
  250. data/src/core/lib/iomgr/combiner.cc +14 -12
  251. data/src/core/lib/iomgr/combiner.h +2 -2
  252. data/src/core/lib/iomgr/endpoint.cc +1 -1
  253. data/src/core/lib/iomgr/endpoint.h +2 -2
  254. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  255. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  256. data/src/core/lib/iomgr/error.cc +167 -61
  257. data/src/core/lib/iomgr/error.h +218 -107
  258. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  259. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  260. data/src/core/lib/iomgr/error_internal.h +5 -1
  261. data/src/core/lib/iomgr/ev_apple.cc +6 -6
  262. data/src/core/lib/iomgr/ev_epoll1_linux.cc +22 -22
  263. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  264. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  265. data/src/core/lib/iomgr/ev_posix.cc +12 -11
  266. data/src/core/lib/iomgr/ev_posix.h +9 -9
  267. data/src/core/lib/iomgr/exec_ctx.cc +10 -6
  268. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  269. data/src/core/lib/iomgr/executor.cc +8 -8
  270. data/src/core/lib/iomgr/executor.h +2 -2
  271. data/src/core/lib/iomgr/iomgr.cc +1 -1
  272. data/src/core/lib/iomgr/iomgr.h +1 -1
  273. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  274. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  275. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  276. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  277. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  278. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  279. data/src/core/lib/iomgr/load_file.cc +4 -4
  280. data/src/core/lib/iomgr/load_file.h +2 -2
  281. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  282. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  283. data/src/core/lib/iomgr/pollset.cc +5 -5
  284. data/src/core/lib/iomgr/pollset.h +9 -9
  285. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  286. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  287. data/src/core/lib/iomgr/port.h +1 -1
  288. data/src/core/lib/iomgr/python_util.h +1 -1
  289. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  290. data/src/core/lib/iomgr/resolve_address.h +6 -6
  291. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  292. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  293. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  294. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  295. data/src/core/lib/iomgr/resource_quota.cc +12 -11
  296. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  297. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  298. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  299. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  300. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  301. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  302. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  303. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  304. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  305. data/src/core/lib/iomgr/tcp_posix.cc +37 -38
  306. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  307. data/src/core/lib/iomgr/tcp_server.h +12 -11
  308. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  309. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  310. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  311. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  312. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  313. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  315. data/src/core/lib/iomgr/tcp_uv.cc +27 -25
  316. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  317. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  318. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  319. data/src/core/lib/iomgr/timer_custom.h +1 -1
  320. data/src/core/lib/iomgr/timer_generic.cc +8 -8
  321. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  322. data/src/core/lib/iomgr/udp_server.cc +21 -20
  323. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  324. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  325. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  326. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  327. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  328. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  329. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  330. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  331. data/src/core/lib/iomgr/work_serializer.h +17 -1
  332. data/src/core/lib/json/json.h +1 -1
  333. data/src/core/lib/json/json_reader.cc +4 -4
  334. data/src/core/lib/{security/authorization → matchers}/matchers.cc +47 -47
  335. data/src/core/lib/{security/authorization → matchers}/matchers.h +42 -40
  336. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  337. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  338. data/src/core/lib/security/credentials/credentials.h +2 -2
  339. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  340. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  341. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  342. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  343. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  344. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  345. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  346. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  347. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  348. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  349. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  350. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  351. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  352. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  353. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  354. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  355. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  356. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  357. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  358. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  359. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  360. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  361. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  362. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  363. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  364. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  365. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  366. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  367. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  368. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  369. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  370. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  371. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  372. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  373. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  374. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  375. data/src/core/lib/security/security_connector/ssl_utils.cc +28 -8
  376. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  377. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -60
  378. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  379. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  380. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  381. data/src/core/lib/security/transport/security_handshaker.cc +65 -34
  382. data/src/core/lib/security/transport/server_auth_filter.cc +24 -11
  383. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  384. data/src/core/lib/security/transport/tsi_error.h +2 -1
  385. data/src/core/lib/security/util/json_util.cc +2 -2
  386. data/src/core/lib/security/util/json_util.h +1 -1
  387. data/src/core/lib/slice/slice_intern.cc +6 -7
  388. data/src/core/lib/surface/call.cc +46 -45
  389. data/src/core/lib/surface/call.h +2 -2
  390. data/src/core/lib/surface/channel.cc +6 -6
  391. data/src/core/lib/surface/channel.h +6 -5
  392. data/src/core/lib/surface/channel_ping.cc +1 -1
  393. data/src/core/lib/surface/completion_queue.cc +46 -47
  394. data/src/core/lib/surface/completion_queue.h +2 -1
  395. data/src/core/lib/surface/lame_client.cc +43 -24
  396. data/src/core/lib/surface/lame_client.h +4 -3
  397. data/src/core/lib/surface/server.cc +68 -55
  398. data/src/core/lib/surface/server.h +89 -29
  399. data/src/core/lib/surface/validate_metadata.cc +7 -7
  400. data/src/core/lib/surface/validate_metadata.h +3 -2
  401. data/src/core/lib/surface/version.cc +4 -2
  402. data/src/core/lib/transport/byte_stream.cc +5 -5
  403. data/src/core/lib/transport/byte_stream.h +8 -8
  404. data/src/core/lib/transport/connectivity_state.cc +1 -1
  405. data/src/core/lib/transport/error_utils.cc +19 -8
  406. data/src/core/lib/transport/error_utils.h +11 -5
  407. data/src/core/lib/transport/metadata_batch.cc +64 -37
  408. data/src/core/lib/transport/metadata_batch.h +33 -18
  409. data/src/core/lib/transport/transport.cc +4 -3
  410. data/src/core/lib/transport/transport.h +4 -4
  411. data/src/core/lib/transport/transport_op_string.cc +5 -5
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  413. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +6 -8
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  416. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  417. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  418. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  419. data/src/core/tsi/fake_transport_security.cc +10 -1
  420. data/src/core/tsi/ssl_transport_security.cc +32 -14
  421. data/src/core/tsi/ssl_transport_security.h +3 -4
  422. data/src/ruby/bin/math_services_pb.rb +1 -1
  423. data/src/ruby/ext/grpc/extconf.rb +9 -1
  424. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  425. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  426. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  427. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  428. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  429. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  430. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  431. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  432. data/src/ruby/ext/grpc/rb_server.c +13 -1
  433. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  434. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  435. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  436. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  437. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  438. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  439. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  440. data/src/ruby/lib/grpc/version.rb +1 -1
  441. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  442. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  443. data/src/ruby/spec/call_spec.rb +1 -1
  444. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  445. data/src/ruby/spec/channel_spec.rb +17 -6
  446. data/src/ruby/spec/client_auth_spec.rb +27 -1
  447. data/src/ruby/spec/errors_spec.rb +1 -1
  448. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  449. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  450. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  451. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  452. data/src/ruby/spec/server_spec.rb +22 -0
  453. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  454. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  455. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  456. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  457. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  458. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  459. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  460. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  461. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  462. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  463. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  464. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  465. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  466. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  467. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  468. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  469. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  470. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  471. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  472. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  473. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  474. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  475. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  476. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  477. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  478. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  479. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  480. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  481. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  482. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  483. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  484. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  485. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  486. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  487. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  488. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  489. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  490. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  491. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  492. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  493. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  494. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  495. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  496. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  497. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  498. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  499. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  500. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  501. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  502. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  503. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  504. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  505. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  506. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  507. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  508. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  509. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  510. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  511. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  512. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  513. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  514. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  515. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  516. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  517. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  518. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  519. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  526. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  527. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  529. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  530. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  535. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  536. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  537. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  538. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  539. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  540. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  541. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  542. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  543. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  544. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  545. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  546. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  547. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  548. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  549. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  550. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  551. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  552. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  553. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  554. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  555. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  556. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  557. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  558. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  559. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  560. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  561. data/third_party/boringssl-with-bazel/err_data.c +478 -462
  562. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  563. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  564. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  565. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  566. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  567. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  568. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  569. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  570. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  571. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  572. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  573. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  574. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  575. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  577. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +32 -16
  578. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  579. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  580. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  581. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  582. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  583. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  584. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  585. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  586. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  587. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  588. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  589. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  590. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  591. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  592. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  593. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  594. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
  595. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  596. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  597. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  598. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  599. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  600. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  601. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  602. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  603. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  604. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  605. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  606. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  607. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  608. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  609. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  610. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  611. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  612. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  613. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -30
  614. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  615. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  616. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  617. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  618. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +21 -34
  619. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  620. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  621. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  622. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  623. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  624. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  625. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  626. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  627. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  628. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  629. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -4
  630. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  631. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  632. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  633. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  634. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  635. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  636. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  637. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  638. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  639. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  640. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  641. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +210 -26
  642. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  643. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -122
  644. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  645. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  646. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  647. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  648. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  649. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  650. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  651. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  652. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  653. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  654. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  655. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +131 -83
  656. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  657. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  658. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  659. data/third_party/xxhash/xxhash.h +5443 -0
  660. metadata +128 -61
  661. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  662. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  663. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  664. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  665. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  666. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  667. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  668. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  669. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  670. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
  671. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  672. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  673. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  674. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  675. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  676. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  677. data/third_party/upb/upb/json_decode.c +0 -1443
  678. data/third_party/upb/upb/json_decode.h +0 -23
  679. data/third_party/upb/upb/json_encode.c +0 -713
  680. data/third_party/upb/upb/json_encode.h +0 -36
@@ -19,6 +19,7 @@
19
19
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
20
20
  #include "src/core/ext/xds/xds_client.h"
21
21
  #include "src/core/lib/gpr/env.h"
22
+ #include "src/core/lib/gpr/string.h"
22
23
  #include "src/core/lib/http/httpcli.h"
23
24
  #include "src/core/lib/iomgr/polling_entity.h"
24
25
  #include "src/core/lib/security/credentials/alts/check_gcp_environment.h"
@@ -47,15 +48,15 @@ class GoogleCloud2ProdResolver : public Resolver {
47
48
  void Orphan() override;
48
49
 
49
50
  private:
50
- static void OnHttpRequestDone(void* arg, grpc_error* error);
51
+ static void OnHttpRequestDone(void* arg, grpc_error_handle error);
51
52
 
52
53
  // Calls OnDone() if not already called. Releases a ref.
53
- void MaybeCallOnDone(grpc_error* error);
54
+ void MaybeCallOnDone(grpc_error_handle error);
54
55
 
55
56
  // If error is not GRPC_ERROR_NONE, then it's not safe to look at response.
56
57
  virtual void OnDone(GoogleCloud2ProdResolver* resolver,
57
58
  const grpc_http_response* response,
58
- grpc_error* error) = 0;
59
+ grpc_error_handle error) = 0;
59
60
 
60
61
  RefCountedPtr<GoogleCloud2ProdResolver> resolver_;
61
62
  grpc_httpcli_context context_;
@@ -72,7 +73,8 @@ class GoogleCloud2ProdResolver : public Resolver {
72
73
 
73
74
  private:
74
75
  void OnDone(GoogleCloud2ProdResolver* resolver,
75
- const grpc_http_response* response, grpc_error* error) override;
76
+ const grpc_http_response* response,
77
+ grpc_error_handle error) override;
76
78
  };
77
79
 
78
80
  // A metadata server query to get the IPv6 address.
@@ -83,7 +85,8 @@ class GoogleCloud2ProdResolver : public Resolver {
83
85
 
84
86
  private:
85
87
  void OnDone(GoogleCloud2ProdResolver* resolver,
86
- const grpc_http_response* response, grpc_error* error) override;
88
+ const grpc_http_response* response,
89
+ grpc_error_handle error) override;
87
90
  };
88
91
 
89
92
  void ZoneQueryDone(std::string zone);
@@ -142,13 +145,13 @@ void GoogleCloud2ProdResolver::MetadataQuery::Orphan() {
142
145
  }
143
146
 
144
147
  void GoogleCloud2ProdResolver::MetadataQuery::OnHttpRequestDone(
145
- void* arg, grpc_error* error) {
148
+ void* arg, grpc_error_handle error) {
146
149
  auto* self = static_cast<MetadataQuery*>(arg);
147
150
  self->MaybeCallOnDone(GRPC_ERROR_REF(error));
148
151
  }
149
152
 
150
153
  void GoogleCloud2ProdResolver::MetadataQuery::MaybeCallOnDone(
151
- grpc_error* error) {
154
+ grpc_error_handle error) {
152
155
  bool expected = false;
153
156
  if (!on_done_called_.CompareExchangeStrong(
154
157
  &expected, true, MemoryOrder::RELAXED, MemoryOrder::RELAXED)) {
@@ -179,10 +182,10 @@ GoogleCloud2ProdResolver::ZoneQuery::ZoneQuery(
179
182
 
180
183
  void GoogleCloud2ProdResolver::ZoneQuery::OnDone(
181
184
  GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
182
- grpc_error* error) {
185
+ grpc_error_handle error) {
183
186
  if (error != GRPC_ERROR_NONE) {
184
187
  gpr_log(GPR_ERROR, "error fetching zone from metadata server: %s",
185
- grpc_error_string(error));
188
+ grpc_error_std_string(error).c_str());
186
189
  }
187
190
  std::string zone;
188
191
  if (error == GRPC_ERROR_NONE && response->status == 200) {
@@ -212,10 +215,10 @@ GoogleCloud2ProdResolver::IPv6Query::IPv6Query(
212
215
 
213
216
  void GoogleCloud2ProdResolver::IPv6Query::OnDone(
214
217
  GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
215
- grpc_error* error) {
218
+ grpc_error_handle error) {
216
219
  if (error != GRPC_ERROR_NONE) {
217
220
  gpr_log(GPR_ERROR, "error fetching IPv6 address from metadata server: %s",
218
- grpc_error_string(error));
221
+ grpc_error_std_string(error).c_str());
219
222
  }
220
223
  resolver->IPv6QueryDone(error == GRPC_ERROR_NONE && response->status == 200);
221
224
  GRPC_ERROR_UNREF(error);
@@ -307,17 +310,25 @@ void GoogleCloud2ProdResolver::StartXdsResolver() {
307
310
  {"TRAFFICDIRECTOR_DIRECTPATH_C2P_IPV6_CAPABLE", true},
308
311
  };
309
312
  }
313
+ // Allow the TD server uri to be overridden for testing purposes.
314
+ UniquePtr<char> override_server(
315
+ gpr_getenv("GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI"));
316
+ const char* server_uri =
317
+ override_server != nullptr && strlen(override_server.get()) > 0
318
+ ? override_server.get()
319
+ : "directpath-trafficdirector.googleapis.com";
310
320
  Json bootstrap = Json::Object{
311
321
  {"xds_servers",
312
322
  Json::Array{
313
323
  Json::Object{
314
- {"server_uri", "directpath-trafficdirector.googleapis.com"},
324
+ {"server_uri", server_uri},
315
325
  {"channel_creds",
316
326
  Json::Array{
317
327
  Json::Object{
318
328
  {"type", "google_default"},
319
329
  },
320
330
  }},
331
+ {"server_features", Json::Array{"xds_v3"}},
321
332
  },
322
333
  }},
323
334
  {"node", std::move(node)},
@@ -353,8 +364,14 @@ class GoogleCloud2ProdResolverFactory : public ResolverFactory {
353
364
  } // namespace
354
365
 
355
366
  void GoogleCloud2ProdResolverInit() {
356
- ResolverRegistry::Builder::RegisterResolverFactory(
357
- absl::make_unique<GoogleCloud2ProdResolverFactory>());
367
+ // TODO(roth): Remove env var protection once this code is proven stable.
368
+ UniquePtr<char> value(gpr_getenv("GRPC_EXPERIMENTAL_GOOGLE_C2P_RESOLVER"));
369
+ bool parsed_value;
370
+ bool parse_succeeded = gpr_parse_bool_value(value.get(), &parsed_value);
371
+ if (parse_succeeded && parsed_value) {
372
+ ResolverRegistry::Builder::RegisterResolverFactory(
373
+ absl::make_unique<GoogleCloud2ProdResolverFactory>());
374
+ }
358
375
  }
359
376
 
360
377
  void GoogleCloud2ProdResolverShutdown() {}
@@ -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"
@@ -22,13 +22,19 @@
22
22
  #include "absl/strings/str_join.h"
23
23
  #include "absl/strings/str_split.h"
24
24
  #include "re2/re2.h"
25
+ #define XXH_INLINE_ALL
26
+ #include "xxhash.h"
25
27
 
26
28
  #include "src/core/ext/filters/client_channel/config_selector.h"
29
+ #include "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h"
27
30
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
31
+ #include "src/core/ext/xds/xds_channel_args.h"
28
32
  #include "src/core/ext/xds/xds_client.h"
33
+ #include "src/core/ext/xds/xds_http_filters.h"
29
34
  #include "src/core/lib/channel/channel_args.h"
30
35
  #include "src/core/lib/iomgr/closure.h"
31
36
  #include "src/core/lib/iomgr/exec_ctx.h"
37
+ #include "src/core/lib/surface/lame_client.h"
32
38
  #include "src/core/lib/transport/timeout_encoding.h"
33
39
 
34
40
  namespace grpc_core {
@@ -68,19 +74,23 @@ class XdsResolver : public Resolver {
68
74
 
69
75
  void ShutdownLocked() override;
70
76
 
77
+ void ResetBackoffLocked() override {
78
+ if (xds_client_ != nullptr) xds_client_->ResetBackoff();
79
+ }
80
+
71
81
  private:
72
82
  class Notifier {
73
83
  public:
74
84
  Notifier(RefCountedPtr<XdsResolver> resolver, XdsApi::LdsUpdate update);
75
85
  Notifier(RefCountedPtr<XdsResolver> resolver, XdsApi::RdsUpdate update);
76
- Notifier(RefCountedPtr<XdsResolver> resolver, grpc_error* error);
86
+ Notifier(RefCountedPtr<XdsResolver> resolver, grpc_error_handle error);
77
87
  explicit Notifier(RefCountedPtr<XdsResolver> resolver);
78
88
 
79
89
  private:
80
90
  enum Type { kLdsUpdate, kRdsUpdate, kError, kDoesNotExist };
81
91
 
82
- static void RunInExecCtx(void* arg, grpc_error* error);
83
- void RunInWorkSerializer(grpc_error* error);
92
+ static void RunInExecCtx(void* arg, grpc_error_handle error);
93
+ void RunInWorkSerializer(grpc_error_handle error);
84
94
 
85
95
  RefCountedPtr<XdsResolver> resolver_;
86
96
  grpc_closure closure_;
@@ -95,7 +105,9 @@ class XdsResolver : public Resolver {
95
105
  void OnListenerChanged(XdsApi::LdsUpdate listener) override {
96
106
  new Notifier(resolver_, std::move(listener));
97
107
  }
98
- void OnError(grpc_error* error) override { new Notifier(resolver_, error); }
108
+ void OnError(grpc_error_handle error) override {
109
+ new Notifier(resolver_, error);
110
+ }
99
111
  void OnResourceDoesNotExist() override { new Notifier(resolver_); }
100
112
 
101
113
  private:
@@ -109,7 +121,9 @@ class XdsResolver : public Resolver {
109
121
  void OnRouteConfigChanged(XdsApi::RdsUpdate route_config) override {
110
122
  new Notifier(resolver_, std::move(route_config));
111
123
  }
112
- void OnError(grpc_error* error) override { new Notifier(resolver_, error); }
124
+ void OnError(grpc_error_handle error) override {
125
+ new Notifier(resolver_, error);
126
+ }
113
127
  void OnResourceDoesNotExist() override { new Notifier(resolver_); }
114
128
 
115
129
  private:
@@ -117,7 +131,7 @@ class XdsResolver : public Resolver {
117
131
  };
118
132
 
119
133
  class ClusterState
120
- : public RefCounted<ClusterState, PolymorphicRefCount, false> {
134
+ : public RefCounted<ClusterState, PolymorphicRefCount, kUnrefNoDelete> {
121
135
  public:
122
136
  using ClusterStateMap =
123
137
  std::map<std::string, std::unique_ptr<ClusterState>>;
@@ -136,8 +150,7 @@ class XdsResolver : public Resolver {
136
150
  class XdsConfigSelector : public ConfigSelector {
137
151
  public:
138
152
  XdsConfigSelector(RefCountedPtr<XdsResolver> resolver,
139
- const std::vector<XdsApi::Route>& routes,
140
- grpc_error* error);
153
+ grpc_error_handle* error);
141
154
  ~XdsConfigSelector() override;
142
155
 
143
156
  const char* name() const override { return "XdsConfigSelector"; }
@@ -151,34 +164,50 @@ class XdsResolver : public Resolver {
151
164
 
152
165
  CallConfig GetCallConfig(GetCallConfigArgs args) override;
153
166
 
167
+ std::vector<const grpc_channel_filter*> GetFilters() override {
168
+ return filters_;
169
+ }
170
+
171
+ grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) override;
172
+
154
173
  private:
155
174
  struct Route {
175
+ struct ClusterWeightState {
176
+ uint32_t range_end;
177
+ absl::string_view cluster;
178
+ RefCountedPtr<ServiceConfig> method_config;
179
+
180
+ bool operator==(const ClusterWeightState& other) const;
181
+ };
182
+
156
183
  XdsApi::Route route;
157
- absl::InlinedVector<std::pair<uint32_t, absl::string_view>, 2>
158
- weighted_cluster_state;
159
184
  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
- }
185
+ absl::InlinedVector<ClusterWeightState, 2> weighted_cluster_state;
186
+
187
+ bool operator==(const Route& other) const;
164
188
  };
165
189
  using RouteTable = std::vector<Route>;
166
190
 
167
191
  void MaybeAddCluster(const std::string& name);
168
- grpc_error* CreateMethodConfig(RefCountedPtr<ServiceConfig>* method_config,
169
- const XdsApi::Route& route);
192
+ grpc_error_handle CreateMethodConfig(
193
+ const XdsApi::Route& route,
194
+ const XdsApi::Route::ClusterWeight* cluster_weight,
195
+ RefCountedPtr<ServiceConfig>* method_config);
170
196
 
171
197
  RefCountedPtr<XdsResolver> resolver_;
172
198
  RouteTable route_table_;
173
199
  std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters_;
200
+ std::vector<const grpc_channel_filter*> filters_;
201
+ grpc_error_handle filter_error_ = GRPC_ERROR_NONE;
174
202
  };
175
203
 
176
204
  void OnListenerUpdate(XdsApi::LdsUpdate listener);
177
205
  void OnRouteConfigUpdate(XdsApi::RdsUpdate rds_update);
178
- void OnError(grpc_error* error);
206
+ void OnError(grpc_error_handle error);
179
207
  void OnResourceDoesNotExist();
180
208
 
181
- grpc_error* CreateServiceConfig(RefCountedPtr<ServiceConfig>* service_config);
209
+ grpc_error_handle CreateServiceConfig(
210
+ RefCountedPtr<ServiceConfig>* service_config);
182
211
  void GenerateResult();
183
212
  void MaybeRemoveUnusedClusters();
184
213
 
@@ -187,13 +216,20 @@ class XdsResolver : public Resolver {
187
216
  std::string server_name_;
188
217
  const grpc_channel_args* args_;
189
218
  grpc_pollset_set* interested_parties_;
219
+
190
220
  RefCountedPtr<XdsClient> xds_client_;
221
+
191
222
  XdsClient::ListenerWatcherInterface* listener_watcher_ = nullptr;
223
+ // This will not contain the RouteConfiguration, even if it comes with the
224
+ // LDS response; instead, the relevant VirtualHost from the
225
+ // RouteConfiguration will be saved in current_virtual_host_.
226
+ XdsApi::LdsUpdate current_listener_;
227
+
192
228
  std::string route_config_name_;
193
229
  XdsClient::RouteConfigWatcherInterface* route_config_watcher_ = nullptr;
230
+ XdsApi::RdsUpdate::VirtualHost current_virtual_host_;
231
+
194
232
  ClusterState::ClusterStateMap cluster_state_map_;
195
- std::vector<XdsApi::Route> current_update_;
196
- XdsApi::Duration http_max_stream_duration_;
197
233
  };
198
234
 
199
235
  //
@@ -212,13 +248,13 @@ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
212
248
  XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
213
249
  XdsApi::RdsUpdate update)
214
250
  : resolver_(std::move(resolver)), type_(kRdsUpdate) {
215
- update_.rds_update = std::move(update);
251
+ update_.http_connection_manager.rds_update = std::move(update);
216
252
  GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
217
253
  ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
218
254
  }
219
255
 
220
256
  XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
221
- grpc_error* error)
257
+ grpc_error_handle error)
222
258
  : resolver_(std::move(resolver)), type_(kError) {
223
259
  GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
224
260
  ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
@@ -230,14 +266,14 @@ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver)
230
266
  ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
231
267
  }
232
268
 
233
- void XdsResolver::Notifier::RunInExecCtx(void* arg, grpc_error* error) {
269
+ void XdsResolver::Notifier::RunInExecCtx(void* arg, grpc_error_handle error) {
234
270
  Notifier* self = static_cast<Notifier*>(arg);
235
271
  GRPC_ERROR_REF(error);
236
272
  self->resolver_->work_serializer_->Run(
237
273
  [self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
238
274
  }
239
275
 
240
- void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
276
+ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error_handle error) {
241
277
  if (resolver_->xds_client_ == nullptr) {
242
278
  GRPC_ERROR_UNREF(error);
243
279
  delete this;
@@ -248,7 +284,8 @@ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
248
284
  resolver_->OnListenerUpdate(std::move(update_));
249
285
  break;
250
286
  case kRdsUpdate:
251
- resolver_->OnRouteConfigUpdate(std::move(*update_.rds_update));
287
+ resolver_->OnRouteConfigUpdate(
288
+ std::move(*update_.http_connection_manager.rds_update));
252
289
  break;
253
290
  case kError:
254
291
  resolver_->OnError(error);
@@ -260,13 +297,35 @@ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
260
297
  delete this;
261
298
  }
262
299
 
300
+ //
301
+ // XdsResolver::XdsConfigSelector::Route
302
+ //
303
+
304
+ bool MethodConfigsEqual(const ServiceConfig* sc1, const ServiceConfig* sc2) {
305
+ if (sc1 == nullptr) return sc2 == nullptr;
306
+ if (sc2 == nullptr) return false;
307
+ return sc1->json_string() == sc2->json_string();
308
+ }
309
+
310
+ bool XdsResolver::XdsConfigSelector::Route::ClusterWeightState::operator==(
311
+ const ClusterWeightState& other) const {
312
+ return range_end == other.range_end && cluster == other.cluster &&
313
+ MethodConfigsEqual(method_config.get(), other.method_config.get());
314
+ }
315
+
316
+ bool XdsResolver::XdsConfigSelector::Route::operator==(
317
+ const Route& other) const {
318
+ return route == other.route &&
319
+ weighted_cluster_state == other.weighted_cluster_state &&
320
+ MethodConfigsEqual(method_config.get(), other.method_config.get());
321
+ }
322
+
263
323
  //
264
324
  // XdsResolver::XdsConfigSelector
265
325
  //
266
326
 
267
327
  XdsResolver::XdsConfigSelector::XdsConfigSelector(
268
- RefCountedPtr<XdsResolver> resolver,
269
- const std::vector<XdsApi::Route>& routes, grpc_error* error)
328
+ RefCountedPtr<XdsResolver> resolver, grpc_error_handle* error)
270
329
  : resolver_(std::move(resolver)) {
271
330
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
272
331
  gpr_log(GPR_INFO, "[xds_resolver %p] creating XdsConfigSelector %p",
@@ -281,8 +340,8 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
281
340
  // weighted_cluster_state field points to the memory in the route field, so
282
341
  // moving the entry in a reallocation will cause the string_view to point to
283
342
  // invalid data.
284
- route_table_.reserve(routes.size());
285
- for (auto& route : routes) {
343
+ route_table_.reserve(resolver_->current_virtual_host_.routes.size());
344
+ for (auto& route : resolver_->current_virtual_host_.routes) {
286
345
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
287
346
  gpr_log(GPR_INFO, "[xds_resolver %p] XdsConfigSelector %p: route: %s",
288
347
  resolver_.get(), this, route.ToString().c_str());
@@ -294,27 +353,95 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
294
353
  // one.
295
354
  if (!route.max_stream_duration.has_value()) {
296
355
  route_entry.route.max_stream_duration =
297
- resolver_->http_max_stream_duration_;
356
+ resolver_->current_listener_.http_connection_manager
357
+ .http_max_stream_duration;
298
358
  }
299
- error = CreateMethodConfig(&route_entry.method_config, route_entry.route);
300
359
  if (route.weighted_clusters.empty()) {
360
+ *error = CreateMethodConfig(route_entry.route, nullptr,
361
+ &route_entry.method_config);
301
362
  MaybeAddCluster(route.cluster_name);
302
363
  } else {
303
364
  uint32_t end = 0;
304
365
  for (const auto& weighted_cluster : route_entry.route.weighted_clusters) {
305
- MaybeAddCluster(weighted_cluster.name);
366
+ Route::ClusterWeightState cluster_weight_state;
367
+ *error = CreateMethodConfig(route_entry.route, &weighted_cluster,
368
+ &cluster_weight_state.method_config);
369
+ if (*error != GRPC_ERROR_NONE) return;
306
370
  end += weighted_cluster.weight;
307
- route_entry.weighted_cluster_state.emplace_back(end,
308
- weighted_cluster.name);
371
+ cluster_weight_state.range_end = end;
372
+ cluster_weight_state.cluster = weighted_cluster.name;
373
+ route_entry.weighted_cluster_state.push_back(
374
+ std::move(cluster_weight_state));
375
+ MaybeAddCluster(weighted_cluster.name);
309
376
  }
310
377
  }
311
378
  }
379
+ // Populate filter list.
380
+ bool found_router = false;
381
+ for (const auto& http_filter :
382
+ resolver_->current_listener_.http_connection_manager.http_filters) {
383
+ // Stop at the router filter. It's a no-op for us, and we ignore
384
+ // anything that may come after it, for compatibility with Envoy.
385
+ if (http_filter.config.config_proto_type_name ==
386
+ kXdsHttpRouterFilterConfigName) {
387
+ found_router = true;
388
+ break;
389
+ }
390
+ // Find filter. This is guaranteed to succeed, because it's checked
391
+ // at config validation time in the XdsApi code.
392
+ const XdsHttpFilterImpl* filter_impl =
393
+ XdsHttpFilterRegistry::GetFilterForType(
394
+ http_filter.config.config_proto_type_name);
395
+ GPR_ASSERT(filter_impl != nullptr);
396
+ // Add C-core filter to list.
397
+ filters_.push_back(filter_impl->channel_filter());
398
+ }
399
+ // For compatibility with Envoy, if the router filter is not
400
+ // configured, we fail all RPCs.
401
+ if (!found_router) {
402
+ filter_error_ =
403
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
404
+ "no xDS HTTP router filter configured"),
405
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
406
+ filters_.push_back(&grpc_lame_filter);
407
+ }
408
+ }
409
+
410
+ XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
411
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
412
+ gpr_log(GPR_INFO, "[xds_resolver %p] destroying XdsConfigSelector %p",
413
+ resolver_.get(), this);
414
+ }
415
+ clusters_.clear();
416
+ resolver_->MaybeRemoveUnusedClusters();
417
+ GRPC_ERROR_UNREF(filter_error_);
418
+ }
419
+
420
+ const XdsHttpFilterImpl::FilterConfig* FindFilterConfigOverride(
421
+ const std::string& instance_name,
422
+ const XdsApi::RdsUpdate::VirtualHost& vhost, const XdsApi::Route& route,
423
+ const XdsApi::Route::ClusterWeight* cluster_weight) {
424
+ // Check ClusterWeight, if any.
425
+ if (cluster_weight != nullptr) {
426
+ auto it = cluster_weight->typed_per_filter_config.find(instance_name);
427
+ if (it != cluster_weight->typed_per_filter_config.end()) return &it->second;
428
+ }
429
+ // Check Route.
430
+ auto it = route.typed_per_filter_config.find(instance_name);
431
+ if (it != route.typed_per_filter_config.end()) return &it->second;
432
+ // Check VirtualHost.
433
+ it = vhost.typed_per_filter_config.find(instance_name);
434
+ if (it != vhost.typed_per_filter_config.end()) return &it->second;
435
+ // Not found.
436
+ return nullptr;
312
437
  }
313
438
 
314
- grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
315
- RefCountedPtr<ServiceConfig>* method_config, const XdsApi::Route& route) {
316
- grpc_error* error = GRPC_ERROR_NONE;
439
+ grpc_error_handle XdsResolver::XdsConfigSelector::CreateMethodConfig(
440
+ const XdsApi::Route& route,
441
+ const XdsApi::Route::ClusterWeight* cluster_weight,
442
+ RefCountedPtr<ServiceConfig>* method_config) {
317
443
  std::vector<std::string> fields;
444
+ // Set timeout.
318
445
  if (route.max_stream_duration.has_value() &&
319
446
  (route.max_stream_duration->seconds != 0 ||
320
447
  route.max_stream_duration->nanos != 0)) {
@@ -322,6 +449,51 @@ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
322
449
  route.max_stream_duration->seconds,
323
450
  route.max_stream_duration->nanos));
324
451
  }
452
+ // Handle xDS HTTP filters.
453
+ std::map<std::string, std::vector<std::string>> per_filter_configs;
454
+ grpc_channel_args* args = grpc_channel_args_copy(resolver_->args_);
455
+ for (const auto& http_filter :
456
+ resolver_->current_listener_.http_connection_manager.http_filters) {
457
+ // Stop at the router filter. It's a no-op for us, and we ignore
458
+ // anything that may come after it, for compatibility with Envoy.
459
+ if (http_filter.config.config_proto_type_name ==
460
+ kXdsHttpRouterFilterConfigName) {
461
+ break;
462
+ }
463
+ // Find filter. This is guaranteed to succeed, because it's checked
464
+ // at config validation time in the XdsApi code.
465
+ const XdsHttpFilterImpl* filter_impl =
466
+ XdsHttpFilterRegistry::GetFilterForType(
467
+ http_filter.config.config_proto_type_name);
468
+ GPR_ASSERT(filter_impl != nullptr);
469
+ // Allow filter to add channel args that may affect service config
470
+ // parsing.
471
+ args = filter_impl->ModifyChannelArgs(args);
472
+ // Find config override, if any.
473
+ const XdsHttpFilterImpl::FilterConfig* config_override =
474
+ FindFilterConfigOverride(http_filter.name,
475
+ resolver_->current_virtual_host_, route,
476
+ cluster_weight);
477
+ // Generate service config for filter.
478
+ auto method_config_field =
479
+ filter_impl->GenerateServiceConfig(http_filter.config, config_override);
480
+ if (!method_config_field.ok()) {
481
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
482
+ absl::StrCat("failed to generate method config for HTTP filter ",
483
+ http_filter.name, ": ",
484
+ method_config_field.status().ToString())
485
+ .c_str());
486
+ }
487
+ per_filter_configs[method_config_field->service_config_field_name]
488
+ .push_back(method_config_field->element);
489
+ }
490
+ for (const auto& p : per_filter_configs) {
491
+ fields.emplace_back(absl::StrCat(" \"", p.first, "\": [\n",
492
+ absl::StrJoin(p.second, ",\n"),
493
+ "\n ]"));
494
+ }
495
+ // Construct service config.
496
+ grpc_error_handle error = GRPC_ERROR_NONE;
325
497
  if (!fields.empty()) {
326
498
  std::string json = absl::StrCat(
327
499
  "{\n"
@@ -333,19 +505,20 @@ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
333
505
  absl::StrJoin(fields, ",\n"),
334
506
  "\n } ]\n"
335
507
  "}");
336
- *method_config =
337
- ServiceConfig::Create(resolver_->args_, json.c_str(), &error);
508
+ *method_config = ServiceConfig::Create(args, json.c_str(), &error);
338
509
  }
510
+ grpc_channel_args_destroy(args);
339
511
  return error;
340
512
  }
341
513
 
342
- XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
343
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
344
- gpr_log(GPR_INFO, "[xds_resolver %p] destroying XdsConfigSelector %p",
345
- resolver_.get(), this);
346
- }
347
- clusters_.clear();
348
- resolver_->MaybeRemoveUnusedClusters();
514
+ grpc_channel_args* XdsResolver::XdsConfigSelector::ModifyChannelArgs(
515
+ grpc_channel_args* args) {
516
+ if (filter_error_ == GRPC_ERROR_NONE) return args;
517
+ grpc_arg error_arg = MakeLameClientErrorArg(filter_error_);
518
+ grpc_channel_args* new_args =
519
+ grpc_channel_args_copy_and_add(args, &error_arg, 1);
520
+ grpc_channel_args_destroy(args);
521
+ return new_args;
349
522
  }
350
523
 
351
524
  void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
@@ -361,56 +534,52 @@ void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
361
534
  }
362
535
  }
363
536
 
364
- absl::optional<absl::string_view> GetMetadataValue(
365
- const std::string& target_key, grpc_metadata_batch* initial_metadata,
537
+ absl::optional<absl::string_view> GetHeaderValue(
538
+ grpc_metadata_batch* initial_metadata, absl::string_view header_name,
366
539
  std::string* concatenated_value) {
367
- // Find all values for the specified key.
368
- GPR_DEBUG_ASSERT(initial_metadata != nullptr);
369
- absl::InlinedVector<absl::string_view, 1> values;
370
- for (grpc_linked_mdelem* md = initial_metadata->list.head; md != nullptr;
371
- md = md->next) {
372
- absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md->md));
373
- absl::string_view value = StringViewFromSlice(GRPC_MDVALUE(md->md));
374
- if (target_key == key) values.push_back(value);
375
- }
376
- // If none found, no match.
377
- if (values.empty()) return absl::nullopt;
378
- // If exactly one found, return it as-is.
379
- if (values.size() == 1) return values.front();
380
- // If more than one found, concatenate the values, using
381
- // *concatenated_values as a temporary holding place for the
382
- // concatenated string.
383
- *concatenated_value = absl::StrJoin(values, ",");
384
- return *concatenated_value;
385
- }
386
-
387
- bool HeaderMatchHelper(const HeaderMatcher& header_matcher,
388
- grpc_metadata_batch* initial_metadata) {
389
- std::string concatenated_value;
390
- absl::optional<absl::string_view> value;
391
540
  // Note: If we ever allow binary headers here, we still need to
392
541
  // special-case ignore "grpc-tags-bin" and "grpc-trace-bin", since
393
542
  // they are not visible to the LB policy in grpc-go.
394
- if (absl::EndsWith(header_matcher.name(), "-bin") ||
395
- header_matcher.name() == "grpc-previous-rpc-attempts") {
396
- value = absl::nullopt;
397
- } else if (header_matcher.name() == "content-type") {
398
- value = "application/grpc";
399
- } else {
400
- value = GetMetadataValue(header_matcher.name(), initial_metadata,
401
- &concatenated_value);
543
+ if (absl::EndsWith(header_name, "-bin")) {
544
+ return absl::nullopt;
545
+ } else if (header_name == "content-type") {
546
+ return "application/grpc";
402
547
  }
403
- return header_matcher.Match(value);
548
+ return grpc_metadata_batch_get_value(initial_metadata, header_name,
549
+ concatenated_value);
404
550
  }
405
551
 
406
552
  bool HeadersMatch(const std::vector<HeaderMatcher>& header_matchers,
407
553
  grpc_metadata_batch* initial_metadata) {
408
554
  for (const auto& header_matcher : header_matchers) {
409
- if (!HeaderMatchHelper(header_matcher, initial_metadata)) return false;
555
+ std::string concatenated_value;
556
+ if (!header_matcher.Match(GetHeaderValue(
557
+ initial_metadata, header_matcher.name(), &concatenated_value))) {
558
+ return false;
559
+ }
410
560
  }
411
561
  return true;
412
562
  }
413
563
 
564
+ absl::optional<uint64_t> HeaderHashHelper(
565
+ const XdsApi::Route::HashPolicy& policy,
566
+ grpc_metadata_batch* initial_metadata) {
567
+ GPR_ASSERT(policy.type == XdsApi::Route::HashPolicy::HEADER);
568
+ std::string value_buffer;
569
+ absl::optional<absl::string_view> header_value =
570
+ GetHeaderValue(initial_metadata, policy.header_name, &value_buffer);
571
+ if (policy.regex != nullptr) {
572
+ // If GetHeaderValue() did not already store the value in
573
+ // value_buffer, copy it there now, so we can modify it.
574
+ if (header_value->data() != value_buffer.data()) {
575
+ value_buffer = std::string(*header_value);
576
+ }
577
+ RE2::GlobalReplace(&value_buffer, *policy.regex, policy.regex_substitution);
578
+ header_value = value_buffer;
579
+ }
580
+ return XXH64(header_value->data(), header_value->size(), 0);
581
+ }
582
+
414
583
  bool UnderFraction(const uint32_t fraction_per_million) {
415
584
  // Generate a random number in [0, 1000000).
416
585
  const uint32_t random_number = rand() % 1000000;
@@ -437,13 +606,15 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
437
606
  }
438
607
  // Found a route match
439
608
  absl::string_view cluster_name;
609
+ RefCountedPtr<ServiceConfig> method_config;
440
610
  if (entry.route.weighted_clusters.empty()) {
441
611
  cluster_name = entry.route.cluster_name;
612
+ method_config = entry.method_config;
442
613
  } else {
443
614
  const uint32_t key =
444
615
  rand() %
445
616
  entry.weighted_cluster_state[entry.weighted_cluster_state.size() - 1]
446
- .first;
617
+ .range_end;
447
618
  // Find the index in weighted clusters corresponding to key.
448
619
  size_t mid = 0;
449
620
  size_t start_index = 0;
@@ -451,9 +622,9 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
451
622
  size_t index = 0;
452
623
  while (end_index > start_index) {
453
624
  mid = (start_index + end_index) / 2;
454
- if (entry.weighted_cluster_state[mid].first > key) {
625
+ if (entry.weighted_cluster_state[mid].range_end > key) {
455
626
  end_index = mid;
456
- } else if (entry.weighted_cluster_state[mid].first < key) {
627
+ } else if (entry.weighted_cluster_state[mid].range_end < key) {
457
628
  start_index = mid + 1;
458
629
  } else {
459
630
  index = mid + 1;
@@ -461,21 +632,56 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
461
632
  }
462
633
  }
463
634
  if (index == 0) index = start_index;
464
- GPR_ASSERT(entry.weighted_cluster_state[index].first > key);
465
- cluster_name = entry.weighted_cluster_state[index].second;
635
+ GPR_ASSERT(entry.weighted_cluster_state[index].range_end > key);
636
+ cluster_name = entry.weighted_cluster_state[index].cluster;
637
+ method_config = entry.weighted_cluster_state[index].method_config;
466
638
  }
467
639
  auto it = clusters_.find(cluster_name);
468
640
  GPR_ASSERT(it != clusters_.end());
469
641
  XdsResolver* resolver =
470
642
  static_cast<XdsResolver*>(resolver_->Ref().release());
471
643
  ClusterState* cluster_state = it->second->Ref().release();
644
+ // Generate a hash
645
+ absl::optional<uint64_t> hash;
646
+ for (const auto& hash_policy : entry.route.hash_policies) {
647
+ absl::optional<uint64_t> new_hash;
648
+ switch (hash_policy.type) {
649
+ case XdsApi::Route::HashPolicy::HEADER:
650
+ new_hash = HeaderHashHelper(hash_policy, args.initial_metadata);
651
+ break;
652
+ case XdsApi::Route::HashPolicy::CHANNEL_ID:
653
+ new_hash =
654
+ static_cast<uint64_t>(reinterpret_cast<uintptr_t>(resolver));
655
+ break;
656
+ default:
657
+ GPR_ASSERT(0);
658
+ }
659
+ if (new_hash.has_value()) {
660
+ // Rotating the old value prevents duplicate hash rules from cancelling
661
+ // each other out and preserves all of the entropy
662
+ const uint64_t old_value =
663
+ hash.has_value() ? ((hash.value() << 1) | (hash.value() >> 63)) : 0;
664
+ hash = old_value ^ new_hash.value();
665
+ }
666
+ // If the policy is a terminal policy and a hash has been generated,
667
+ // ignore the rest of the hash policies.
668
+ if (hash_policy.terminal && hash.has_value()) {
669
+ break;
670
+ }
671
+ }
672
+ if (!hash.has_value()) {
673
+ // If there is no hash, we just choose a random value as a default.
674
+ hash = rand();
675
+ }
472
676
  CallConfig call_config;
473
- if (entry.method_config != nullptr) {
474
- call_config.service_config = entry.method_config;
677
+ if (method_config != nullptr) {
475
678
  call_config.method_configs =
476
- entry.method_config->GetMethodParsedConfigVector(grpc_empty_slice());
679
+ method_config->GetMethodParsedConfigVector(grpc_empty_slice());
680
+ call_config.service_config = std::move(method_config);
477
681
  }
478
682
  call_config.call_attributes[kXdsClusterAttribute] = it->first;
683
+ call_config.call_attributes[kRequestRingHashAttribute] =
684
+ absl::StrFormat("%" PRIu64, hash.value());
479
685
  call_config.on_call_committed = [resolver, cluster_state]() {
480
686
  cluster_state->Unref();
481
687
  ExecCtx::Run(
@@ -489,7 +695,7 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
489
695
  // the data plane mutex.
490
696
  DEBUG_LOCATION,
491
697
  GRPC_CLOSURE_CREATE(
492
- [](void* arg, grpc_error* /*error*/) {
698
+ [](void* arg, grpc_error_handle /*error*/) {
493
699
  auto* resolver = static_cast<XdsResolver*>(arg);
494
700
  resolver->work_serializer_->Run(
495
701
  [resolver]() {
@@ -511,13 +717,13 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
511
717
  //
512
718
 
513
719
  void XdsResolver::StartLocked() {
514
- grpc_error* error = GRPC_ERROR_NONE;
515
- xds_client_ = XdsClient::GetOrCreate(&error);
720
+ grpc_error_handle error = GRPC_ERROR_NONE;
721
+ xds_client_ = XdsClient::GetOrCreate(args_, &error);
516
722
  if (error != GRPC_ERROR_NONE) {
517
723
  gpr_log(GPR_ERROR,
518
724
  "Failed to create xds client -- channel will remain in "
519
725
  "TRANSIENT_FAILURE: %s",
520
- grpc_error_string(error));
726
+ grpc_error_std_string(error).c_str());
521
727
  result_handler_->ReturnError(error);
522
728
  return;
523
729
  }
@@ -563,24 +769,34 @@ void XdsResolver::OnListenerUpdate(XdsApi::LdsUpdate listener) {
563
769
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
564
770
  gpr_log(GPR_INFO, "[xds_resolver %p] received updated listener data", this);
565
771
  }
566
- if (listener.route_config_name != route_config_name_) {
772
+ if (listener.http_connection_manager.route_config_name !=
773
+ route_config_name_) {
567
774
  if (route_config_watcher_ != nullptr) {
568
775
  xds_client_->CancelRouteConfigDataWatch(
569
776
  route_config_name_, route_config_watcher_,
570
- /*delay_unsubscription=*/!listener.route_config_name.empty());
777
+ /*delay_unsubscription=*/
778
+ !listener.http_connection_manager.route_config_name.empty());
571
779
  route_config_watcher_ = nullptr;
572
780
  }
573
- route_config_name_ = std::move(listener.route_config_name);
781
+ route_config_name_ =
782
+ std::move(listener.http_connection_manager.route_config_name);
574
783
  if (!route_config_name_.empty()) {
784
+ current_virtual_host_.routes.clear();
575
785
  auto watcher = absl::make_unique<RouteConfigWatcher>(Ref());
576
786
  route_config_watcher_ = watcher.get();
577
787
  xds_client_->WatchRouteConfigData(route_config_name_, std::move(watcher));
578
788
  }
579
789
  }
580
- http_max_stream_duration_ = listener.http_max_stream_duration;
790
+ current_listener_ = std::move(listener);
581
791
  if (route_config_name_.empty()) {
582
- GPR_ASSERT(listener.rds_update.has_value());
583
- OnRouteConfigUpdate(std::move(*listener.rds_update));
792
+ GPR_ASSERT(
793
+ current_listener_.http_connection_manager.rds_update.has_value());
794
+ OnRouteConfigUpdate(
795
+ std::move(*current_listener_.http_connection_manager.rds_update));
796
+ } else {
797
+ // HCM may contain newer filter config. We need to propagate the update as
798
+ // config selector to the channel
799
+ GenerateResult();
584
800
  }
585
801
  }
586
802
 
@@ -598,17 +814,18 @@ void XdsResolver::OnRouteConfigUpdate(XdsApi::RdsUpdate rds_update) {
598
814
  .c_str()));
599
815
  return;
600
816
  }
601
- // Save the list of routes in the resolver.
602
- current_update_ = std::move(vhost->routes);
817
+ // Save the virtual host in the resolver.
818
+ current_virtual_host_ = std::move(*vhost);
603
819
  // Send a new result to the channel.
604
820
  GenerateResult();
605
821
  }
606
822
 
607
- void XdsResolver::OnError(grpc_error* error) {
823
+ void XdsResolver::OnError(grpc_error_handle error) {
608
824
  gpr_log(GPR_ERROR, "[xds_resolver %p] received error from XdsClient: %s",
609
- this, grpc_error_string(error));
825
+ this, grpc_error_std_string(error).c_str());
610
826
  Result result;
611
- result.args = grpc_channel_args_copy(args_);
827
+ grpc_arg new_arg = xds_client_->MakeChannelArg();
828
+ result.args = grpc_channel_args_copy_and_add(args_, &new_arg, 1);
612
829
  result.service_config_error = error;
613
830
  result_handler_->ReturnResult(std::move(result));
614
831
  }
@@ -618,7 +835,7 @@ void XdsResolver::OnResourceDoesNotExist() {
618
835
  "[xds_resolver %p] LDS/RDS resource does not exist -- clearing "
619
836
  "update and returning empty service config",
620
837
  this);
621
- current_update_.clear();
838
+ current_virtual_host_.routes.clear();
622
839
  Result result;
623
840
  result.service_config =
624
841
  ServiceConfig::Create(args_, "{}", &result.service_config_error);
@@ -627,7 +844,7 @@ void XdsResolver::OnResourceDoesNotExist() {
627
844
  result_handler_->ReturnResult(std::move(result));
628
845
  }
629
846
 
630
- grpc_error* XdsResolver::CreateServiceConfig(
847
+ grpc_error_handle XdsResolver::CreateServiceConfig(
631
848
  RefCountedPtr<ServiceConfig>* service_config) {
632
849
  std::vector<std::string> clusters;
633
850
  for (const auto& cluster : cluster_state_map_) {
@@ -654,18 +871,17 @@ grpc_error* XdsResolver::CreateServiceConfig(
654
871
  " ]\n"
655
872
  "}");
656
873
  std::string json = absl::StrJoin(config_parts, "");
657
- grpc_error* error = GRPC_ERROR_NONE;
874
+ grpc_error_handle error = GRPC_ERROR_NONE;
658
875
  *service_config = ServiceConfig::Create(args_, json.c_str(), &error);
659
876
  return error;
660
877
  }
661
878
 
662
879
  void XdsResolver::GenerateResult() {
663
- if (current_update_.empty()) return;
880
+ if (current_virtual_host_.routes.empty()) return;
664
881
  // First create XdsConfigSelector, which may add new entries to the cluster
665
882
  // state map, and then CreateServiceConfig for LB policies.
666
- grpc_error* error = GRPC_ERROR_NONE;
667
- auto config_selector =
668
- MakeRefCounted<XdsConfigSelector>(Ref(), current_update_, error);
883
+ grpc_error_handle error = GRPC_ERROR_NONE;
884
+ auto config_selector = MakeRefCounted<XdsConfigSelector>(Ref(), &error);
669
885
  if (error != GRPC_ERROR_NONE) {
670
886
  OnError(error);
671
887
  return;
@@ -680,8 +896,12 @@ void XdsResolver::GenerateResult() {
680
896
  gpr_log(GPR_INFO, "[xds_resolver %p] generated service config: %s", this,
681
897
  result.service_config->json_string().c_str());
682
898
  }
683
- grpc_arg new_arg = config_selector->MakeChannelArg();
684
- result.args = grpc_channel_args_copy_and_add(args_, &new_arg, 1);
899
+ grpc_arg new_args[] = {
900
+ xds_client_->MakeChannelArg(),
901
+ config_selector->MakeChannelArg(),
902
+ };
903
+ result.args =
904
+ grpc_channel_args_copy_and_add(args_, new_args, GPR_ARRAY_SIZE(new_args));
685
905
  result_handler_->ReturnResult(std::move(result));
686
906
  }
687
907