grpc 1.37.1 → 1.39.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 (636) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +96 -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 +334 -0
  6. data/include/grpc/event_engine/port.h +41 -0
  7. data/include/grpc/event_engine/slice_allocator.h +91 -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 +28 -13
  12. data/include/grpc/impl/codegen/port_platform.h +22 -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 +630 -3103
  17. data/src/core/ext/filters/client_channel/client_channel.h +489 -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 +1 -1
  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 +46 -43
  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 +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +755 -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 +4 -4
  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 +15 -15
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +46 -54
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +146 -155
  43. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  44. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  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 +60 -32
  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 +2449 -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 +306 -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_channel_arg_filter.cc +5 -4
  76. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  77. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  78. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  79. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  80. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  81. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  82. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +25 -18
  83. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  84. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  85. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  86. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  87. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  88. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  89. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  90. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  91. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  92. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  93. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  95. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  96. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  97. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +3 -2
  98. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  99. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  100. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  101. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  102. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +5 -4
  103. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  104. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +139 -120
  105. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  106. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  107. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  108. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  109. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  110. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  111. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  112. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  114. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  115. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  116. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  117. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  118. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  120. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  121. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  122. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  123. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  124. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  125. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  127. data/src/core/ext/transport/chttp2/transport/internal.h +32 -27
  128. data/src/core/ext/transport/chttp2/transport/parsing.cc +65 -58
  129. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  130. data/src/core/ext/transport/inproc/inproc_transport.cc +72 -60
  131. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  132. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  133. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  134. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  135. data/src/core/ext/xds/xds_api.cc +348 -199
  136. data/src/core/ext/xds/xds_api.h +21 -12
  137. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  138. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  139. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  140. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  141. data/src/core/ext/xds/xds_channel_args.h +5 -2
  142. data/src/core/ext/xds/xds_client.cc +310 -178
  143. data/src/core/ext/xds/xds_client.h +41 -27
  144. data/src/core/ext/xds/xds_client_stats.h +3 -2
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  146. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  147. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  148. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +16 -20
  149. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +16 -11
  150. data/src/core/lib/channel/channel_stack.cc +10 -9
  151. data/src/core/lib/channel/channel_stack.h +10 -9
  152. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  153. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  154. data/src/core/lib/channel/channelz.cc +21 -13
  155. data/src/core/lib/channel/channelz.h +3 -0
  156. data/src/core/lib/channel/connected_channel.cc +4 -4
  157. data/src/core/lib/channel/handshaker.cc +7 -6
  158. data/src/core/lib/channel/handshaker.h +5 -5
  159. data/src/core/lib/event_engine/endpoint_config.cc +46 -0
  160. data/src/core/lib/event_engine/endpoint_config_internal.h +42 -0
  161. data/src/core/lib/event_engine/event_engine.cc +50 -0
  162. data/src/core/lib/event_engine/slice_allocator.cc +89 -0
  163. data/src/core/lib/event_engine/sockaddr.cc +40 -0
  164. data/src/core/lib/event_engine/sockaddr.h +44 -0
  165. data/src/core/lib/gpr/wrap_memcpy.cc +2 -1
  166. data/src/core/lib/gprpp/ref_counted.h +28 -14
  167. data/src/core/lib/gprpp/status_helper.cc +407 -0
  168. data/src/core/lib/gprpp/status_helper.h +183 -0
  169. data/src/core/lib/http/httpcli.cc +11 -11
  170. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  171. data/src/core/lib/http/parser.cc +16 -16
  172. data/src/core/lib/http/parser.h +4 -4
  173. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  174. data/src/core/lib/iomgr/buffer_list.h +4 -5
  175. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  176. data/src/core/lib/iomgr/call_combiner.h +12 -14
  177. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  178. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  179. data/src/core/lib/iomgr/closure.h +7 -6
  180. data/src/core/lib/iomgr/combiner.cc +14 -12
  181. data/src/core/lib/iomgr/combiner.h +2 -2
  182. data/src/core/lib/iomgr/endpoint.cc +1 -1
  183. data/src/core/lib/iomgr/endpoint.h +2 -2
  184. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  185. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +33 -0
  186. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  187. data/src/core/lib/iomgr/error.cc +168 -61
  188. data/src/core/lib/iomgr/error.h +217 -106
  189. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  190. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  191. data/src/core/lib/iomgr/error_internal.h +5 -1
  192. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  193. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  194. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  195. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  196. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  197. data/src/core/lib/iomgr/ev_posix.h +9 -9
  198. data/src/core/lib/iomgr/event_engine/closure.cc +54 -0
  199. data/src/core/lib/iomgr/event_engine/closure.h +33 -0
  200. data/src/core/lib/iomgr/event_engine/endpoint.cc +194 -0
  201. data/src/core/lib/iomgr/event_engine/endpoint.h +53 -0
  202. data/src/core/lib/iomgr/event_engine/iomgr.cc +105 -0
  203. data/src/core/lib/iomgr/event_engine/iomgr.h +24 -0
  204. data/src/core/lib/iomgr/event_engine/pollset.cc +87 -0
  205. data/src/core/lib/iomgr/event_engine/pollset.h +25 -0
  206. data/src/core/lib/iomgr/event_engine/promise.h +51 -0
  207. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +41 -0
  208. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +35 -0
  209. data/src/core/lib/iomgr/event_engine/resolver.cc +110 -0
  210. data/src/core/lib/iomgr/event_engine/tcp.cc +243 -0
  211. data/src/core/lib/iomgr/event_engine/timer.cc +57 -0
  212. data/src/core/lib/iomgr/exec_ctx.cc +12 -4
  213. data/src/core/lib/iomgr/exec_ctx.h +4 -5
  214. data/src/core/lib/iomgr/executor/threadpool.cc +2 -3
  215. data/src/core/lib/iomgr/executor/threadpool.h +2 -2
  216. data/src/core/lib/iomgr/executor.cc +8 -8
  217. data/src/core/lib/iomgr/executor.h +2 -2
  218. data/src/core/lib/iomgr/iomgr.cc +2 -2
  219. data/src/core/lib/iomgr/iomgr.h +1 -1
  220. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  221. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  222. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  223. data/src/core/lib/iomgr/iomgr_posix.cc +3 -1
  224. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +42 -12
  225. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  226. data/src/core/lib/iomgr/load_file.cc +4 -4
  227. data/src/core/lib/iomgr/load_file.h +2 -2
  228. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  229. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  230. data/src/core/lib/iomgr/pollset.cc +5 -5
  231. data/src/core/lib/iomgr/pollset.h +9 -9
  232. data/src/core/lib/iomgr/pollset_custom.cc +7 -7
  233. data/src/core/lib/iomgr/pollset_custom.h +3 -1
  234. data/src/core/lib/iomgr/pollset_uv.cc +3 -1
  235. data/src/core/lib/iomgr/pollset_uv.h +5 -1
  236. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  237. data/src/core/lib/iomgr/port.h +7 -5
  238. data/src/core/lib/iomgr/python_util.h +1 -1
  239. data/src/core/lib/iomgr/resolve_address.cc +8 -4
  240. data/src/core/lib/iomgr/resolve_address.h +12 -6
  241. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  242. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  243. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  244. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  245. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  246. data/src/core/lib/iomgr/sockaddr.h +1 -0
  247. data/src/core/lib/iomgr/socket_mutator.cc +15 -2
  248. data/src/core/lib/iomgr/socket_mutator.h +26 -2
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +24 -22
  250. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  251. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  252. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  253. data/src/core/lib/iomgr/tcp_client_posix.cc +22 -19
  254. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  257. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  258. data/src/core/lib/iomgr/tcp_posix.cc +78 -73
  259. data/src/core/lib/iomgr/tcp_posix.h +8 -0
  260. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  261. data/src/core/lib/iomgr/tcp_server.h +12 -11
  262. data/src/core/lib/iomgr/tcp_server_custom.cc +26 -25
  263. data/src/core/lib/iomgr/tcp_server_posix.cc +28 -21
  264. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  265. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +21 -18
  266. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  267. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  268. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  269. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  270. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  271. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  272. data/src/core/lib/iomgr/timer.h +6 -1
  273. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  274. data/src/core/lib/iomgr/timer_custom.h +1 -1
  275. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  276. data/src/core/lib/iomgr/udp_server.cc +21 -20
  277. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  278. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  279. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  280. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  281. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  282. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  283. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  284. data/src/core/lib/iomgr/work_serializer.h +17 -1
  285. data/src/core/lib/json/json.h +1 -1
  286. data/src/core/lib/json/json_reader.cc +4 -4
  287. data/src/core/lib/matchers/matchers.cc +39 -39
  288. data/src/core/lib/matchers/matchers.h +28 -28
  289. data/src/core/lib/security/authorization/authorization_engine.h +44 -0
  290. data/src/core/lib/security/authorization/authorization_policy_provider.h +32 -0
  291. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +46 -0
  292. data/src/core/lib/security/authorization/evaluate_args.cc +209 -0
  293. data/src/core/lib/security/authorization/evaluate_args.h +91 -0
  294. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  295. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  296. data/src/core/lib/security/credentials/credentials.h +2 -2
  297. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  298. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  299. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  300. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  301. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  302. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  303. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  304. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  305. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  306. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  307. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  308. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  309. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -10
  310. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  311. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  312. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  313. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  314. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  315. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  316. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  317. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  318. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  319. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  320. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  321. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  322. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  323. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  324. data/src/core/lib/security/credentials/tls/tls_utils.cc +32 -0
  325. data/src/core/lib/security/credentials/tls/tls_utils.h +13 -0
  326. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  327. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  328. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  329. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  330. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  331. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  332. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -9
  333. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  334. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  335. data/src/core/lib/security/security_connector/ssl_utils.cc +27 -4
  336. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  337. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  338. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  339. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  340. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  341. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  342. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  343. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  344. data/src/core/lib/security/transport/tsi_error.h +2 -1
  345. data/src/core/lib/security/util/json_util.cc +2 -2
  346. data/src/core/lib/security/util/json_util.h +1 -1
  347. data/src/core/lib/surface/call.cc +67 -46
  348. data/src/core/lib/surface/call.h +13 -2
  349. data/src/core/lib/surface/channel.cc +6 -6
  350. data/src/core/lib/surface/channel.h +3 -2
  351. data/src/core/lib/surface/channel_ping.cc +1 -1
  352. data/src/core/lib/surface/completion_queue.cc +68 -69
  353. data/src/core/lib/surface/completion_queue.h +3 -2
  354. data/src/core/lib/surface/completion_queue_factory.cc +1 -2
  355. data/src/core/lib/surface/init.cc +1 -3
  356. data/src/core/lib/surface/init.h +10 -1
  357. data/src/core/lib/surface/lame_client.cc +11 -11
  358. data/src/core/lib/surface/lame_client.h +1 -1
  359. data/src/core/lib/surface/server.cc +28 -22
  360. data/src/core/lib/surface/server.h +16 -15
  361. data/src/core/lib/surface/validate_metadata.cc +7 -7
  362. data/src/core/lib/surface/validate_metadata.h +3 -2
  363. data/src/core/lib/surface/version.cc +4 -2
  364. data/src/core/lib/transport/byte_stream.cc +5 -5
  365. data/src/core/lib/transport/byte_stream.h +8 -8
  366. data/src/core/lib/transport/connectivity_state.cc +1 -1
  367. data/src/core/lib/transport/error_utils.cc +21 -10
  368. data/src/core/lib/transport/error_utils.h +11 -5
  369. data/src/core/lib/transport/metadata_batch.cc +37 -37
  370. data/src/core/lib/transport/metadata_batch.h +19 -18
  371. data/src/core/lib/transport/transport.cc +4 -3
  372. data/src/core/lib/transport/transport.h +6 -4
  373. data/src/core/lib/transport/transport_op_string.cc +6 -6
  374. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  375. data/src/core/tsi/alts/crypt/gsec.h +6 -0
  376. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  377. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  378. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  379. data/src/core/tsi/ssl_transport_security.cc +32 -14
  380. data/src/core/tsi/ssl_transport_security.h +3 -4
  381. data/src/ruby/bin/math_services_pb.rb +1 -1
  382. data/src/ruby/ext/grpc/extconf.rb +2 -0
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -0
  384. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +11 -2
  385. data/src/ruby/lib/grpc/version.rb +1 -1
  386. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  388. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  389. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  390. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  391. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  392. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  393. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  394. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  395. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  396. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  397. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  398. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  399. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  400. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  401. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  402. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  403. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  404. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  405. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  406. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  407. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  408. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  409. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  410. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  411. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  412. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  413. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  414. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  415. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  416. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  417. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  418. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  419. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  420. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  421. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  422. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  423. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  424. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  425. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  426. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  427. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  428. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  429. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  430. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  431. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  432. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  433. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  434. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  435. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  436. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  437. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  438. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  439. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  440. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  441. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  442. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  443. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  444. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  445. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  446. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  447. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  448. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  449. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  450. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  451. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  452. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  453. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  454. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  455. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  456. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  457. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  458. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  459. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  460. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  461. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  462. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  463. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  464. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  465. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  466. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  467. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  468. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  469. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  470. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  471. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  472. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  473. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  474. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  475. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  476. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  477. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  478. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  479. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  480. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  481. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  482. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  483. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  484. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  485. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  486. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  487. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  488. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  489. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  490. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  491. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  492. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  493. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  494. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  495. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  496. data/third_party/boringssl-with-bazel/err_data.c +483 -461
  497. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  498. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +9 -7
  499. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  500. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  501. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  503. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  504. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +4 -0
  505. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  506. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  507. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  508. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +1 -1
  509. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -1
  510. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  511. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +9 -0
  512. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  513. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  514. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +0 -4
  515. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  516. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  517. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +7 -0
  518. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  519. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +87 -160
  520. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  521. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  522. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  523. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  524. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  525. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +52 -65
  526. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +52 -66
  527. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  528. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  529. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  530. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  531. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  532. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  533. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +1 -4
  534. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +0 -13
  535. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  536. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +26 -24
  537. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +10 -7
  538. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  539. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  540. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +61 -75
  541. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +80 -103
  542. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +40 -49
  543. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +367 -315
  544. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  545. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  546. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  547. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +5 -3
  548. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  549. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +2 -2
  550. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  551. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c +1 -2
  552. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  553. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +120 -11
  554. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  555. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +3 -0
  556. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  557. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  558. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +42 -89
  559. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  560. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +2 -0
  561. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +14 -15
  562. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +53 -73
  563. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +31 -0
  564. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +3 -0
  565. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  566. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +3 -0
  567. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  568. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  569. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  570. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +5 -8
  571. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +5 -0
  572. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  573. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +3 -0
  574. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +7 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  576. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  577. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +5 -8
  579. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +1 -4
  580. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +66 -1
  581. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  582. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +47 -7
  583. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +1 -0
  584. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  585. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  586. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  587. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +6 -2
  588. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  589. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +33 -0
  590. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  591. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +20 -49
  592. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  593. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +325 -0
  594. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  595. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +25 -7
  596. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  597. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  598. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +99 -63
  599. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +283 -85
  600. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +13 -19
  601. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +445 -152
  602. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +451 -435
  603. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -1
  604. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +7 -2
  605. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +1 -1
  606. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +1133 -0
  607. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +298 -22
  608. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +66 -30
  609. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +189 -86
  610. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +154 -24
  611. data/third_party/boringssl-with-bazel/src/ssl/internal.h +414 -135
  612. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +9 -3
  613. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  614. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +14 -19
  615. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  616. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  617. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +51 -60
  618. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +2 -0
  619. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +8 -31
  620. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +3 -0
  621. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +4 -3
  622. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +7 -3
  623. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +664 -702
  624. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +65 -7
  625. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -39
  626. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +141 -94
  627. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +213 -118
  628. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  629. metadata +94 -46
  630. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  631. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  632. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  633. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  634. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  635. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +0 -246
  636. data/third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h +0 -71
@@ -66,7 +66,8 @@ class GrpcLbClientStats : public RefCounted<GrpcLbClientStats> {
66
66
  gpr_atm num_calls_finished_with_client_failed_to_send_ = 0;
67
67
  gpr_atm num_calls_finished_known_received_ = 0;
68
68
  Mutex drop_count_mu_; // Guards drop_token_counts_.
69
- std::unique_ptr<DroppedCallCounts> drop_token_counts_;
69
+ std::unique_ptr<DroppedCallCounts> drop_token_counts_
70
+ ABSL_GUARDED_BY(drop_count_mu_);
70
71
  };
71
72
 
72
73
  } // namespace grpc_core
@@ -26,9 +26,9 @@
26
26
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
27
27
  #include "src/core/ext/filters/client_channel/server_address.h"
28
28
  #include "src/core/ext/filters/client_channel/subchannel.h"
29
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
29
30
  #include "src/core/lib/channel/channel_args.h"
30
31
  #include "src/core/lib/gprpp/sync.h"
31
- #include "src/core/lib/iomgr/sockaddr_utils.h"
32
32
  #include "src/core/lib/transport/connectivity_state.h"
33
33
  #include "src/core/lib/transport/error_utils.h"
34
34
 
@@ -197,7 +197,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
197
197
  // (If we are idle, then this will happen in ExitIdleLocked() if we
198
198
  // haven't gotten a non-empty update by the time the application tries
199
199
  // to start a new call.)
200
- grpc_error* error =
200
+ grpc_error_handle error =
201
201
  grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
202
202
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
203
203
  channel_control_helper()->UpdateState(
@@ -314,7 +314,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
314
314
  p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_);
315
315
  // Set our state to that of the pending subchannel list.
316
316
  if (p->subchannel_list_->in_transient_failure()) {
317
- grpc_error* error = grpc_error_set_int(
317
+ grpc_error_handle error = grpc_error_set_int(
318
318
  GRPC_ERROR_CREATE_FROM_STATIC_STRING(
319
319
  "selected subchannel failed; switching to pending update"),
320
320
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
@@ -393,7 +393,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
393
393
  subchannel_list()->set_in_transient_failure(true);
394
394
  // Only report new state in case 1.
395
395
  if (subchannel_list() == p->subchannel_list_.get()) {
396
- grpc_error* error = grpc_error_set_int(
396
+ grpc_error_handle error = grpc_error_set_int(
397
397
  GRPC_ERROR_CREATE_FROM_STATIC_STRING(
398
398
  "failed to connect to all addresses"),
399
399
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
@@ -497,7 +497,7 @@ class PickFirstFactory : public LoadBalancingPolicyFactory {
497
497
  const char* name() const override { return kPickFirst; }
498
498
 
499
499
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
500
- const Json& /*json*/, grpc_error** /*error*/) const override {
500
+ const Json& /*json*/, grpc_error_handle* /*error*/) const override {
501
501
  return MakeRefCounted<PickFirstConfig>();
502
502
  }
503
503
  };
@@ -179,10 +179,10 @@ class PriorityLb : public LoadBalancingPolicy {
179
179
 
180
180
  void StartFailoverTimerLocked();
181
181
 
182
- static void OnFailoverTimer(void* arg, grpc_error* error);
183
- void OnFailoverTimerLocked(grpc_error* error);
184
- static void OnDeactivationTimer(void* arg, grpc_error* error);
185
- void OnDeactivationTimerLocked(grpc_error* error);
182
+ static void OnFailoverTimer(void* arg, grpc_error_handle error);
183
+ void OnFailoverTimerLocked(grpc_error_handle error);
184
+ static void OnDeactivationTimer(void* arg, grpc_error_handle error);
185
+ void OnDeactivationTimerLocked(grpc_error_handle error);
186
186
 
187
187
  RefCountedPtr<PriorityLb> priority_policy_;
188
188
  const std::string name_;
@@ -472,7 +472,7 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
472
472
  this);
473
473
  }
474
474
  current_child_from_before_update_ = nullptr;
475
- grpc_error* error = grpc_error_set_int(
475
+ grpc_error_handle error = grpc_error_set_int(
476
476
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready priority"),
477
477
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
478
478
  channel_control_helper()->UpdateState(
@@ -655,14 +655,15 @@ void PriorityLb::ChildPriority::MaybeCancelFailoverTimerLocked() {
655
655
  }
656
656
  }
657
657
 
658
- void PriorityLb::ChildPriority::OnFailoverTimer(void* arg, grpc_error* error) {
658
+ void PriorityLb::ChildPriority::OnFailoverTimer(void* arg,
659
+ grpc_error_handle error) {
659
660
  ChildPriority* self = static_cast<ChildPriority*>(arg);
660
661
  GRPC_ERROR_REF(error); // ref owned by lambda
661
662
  self->priority_policy_->work_serializer()->Run(
662
663
  [self, error]() { self->OnFailoverTimerLocked(error); }, DEBUG_LOCATION);
663
664
  }
664
665
 
665
- void PriorityLb::ChildPriority::OnFailoverTimerLocked(grpc_error* error) {
666
+ void PriorityLb::ChildPriority::OnFailoverTimerLocked(grpc_error_handle error) {
666
667
  if (error == GRPC_ERROR_NONE && failover_timer_callback_pending_ &&
667
668
  !priority_policy_->shutting_down_) {
668
669
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
@@ -712,7 +713,7 @@ void PriorityLb::ChildPriority::MaybeReactivateLocked() {
712
713
  }
713
714
 
714
715
  void PriorityLb::ChildPriority::OnDeactivationTimer(void* arg,
715
- grpc_error* error) {
716
+ grpc_error_handle error) {
716
717
  ChildPriority* self = static_cast<ChildPriority*>(arg);
717
718
  GRPC_ERROR_REF(error); // ref owned by lambda
718
719
  self->priority_policy_->work_serializer()->Run(
@@ -720,7 +721,8 @@ void PriorityLb::ChildPriority::OnDeactivationTimer(void* arg,
720
721
  DEBUG_LOCATION);
721
722
  }
722
723
 
723
- void PriorityLb::ChildPriority::OnDeactivationTimerLocked(grpc_error* error) {
724
+ void PriorityLb::ChildPriority::OnDeactivationTimerLocked(
725
+ grpc_error_handle error) {
724
726
  if (error == GRPC_ERROR_NONE && deactivation_timer_callback_pending_ &&
725
727
  !priority_policy_->shutting_down_) {
726
728
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
@@ -785,7 +787,7 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
785
787
  const char* name() const override { return kPriority; }
786
788
 
787
789
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
788
- const Json& json, grpc_error** error) const override {
790
+ const Json& json, grpc_error_handle* error) const override {
789
791
  GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
790
792
  if (json.type() == Json::Type::JSON_NULL) {
791
793
  // priority was mentioned as a policy in the deprecated
@@ -796,7 +798,7 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
796
798
  "config instead.");
797
799
  return nullptr;
798
800
  }
799
- std::vector<grpc_error*> error_list;
801
+ std::vector<grpc_error_handle> error_list;
800
802
  // Children.
801
803
  std::map<std::string, PriorityLbConfig::PriorityLbChild> children;
802
804
  auto it = json.object_value().find("children");
@@ -824,7 +826,7 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
824
826
  " error:missing 'config' field")
825
827
  .c_str()));
826
828
  } else {
827
- grpc_error* parse_error = GRPC_ERROR_NONE;
829
+ grpc_error_handle parse_error = GRPC_ERROR_NONE;
828
830
  auto config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
829
831
  it2->second, &parse_error);
830
832
  bool ignore_resolution_requests = false;
@@ -16,8 +16,763 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <stdlib.h>
20
+ #include <string.h>
21
+
22
+ #include "absl/strings/numbers.h"
23
+ #include "absl/strings/str_cat.h"
24
+ #define XXH_INLINE_ALL
25
+ #include "xxhash.h"
26
+
27
+ #include <grpc/support/alloc.h>
28
+ #include "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h"
29
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
30
+ #include "src/core/ext/filters/client_channel/subchannel.h"
31
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
32
+ #include "src/core/lib/channel/channel_args.h"
33
+ #include "src/core/lib/debug/trace.h"
34
+ #include "src/core/lib/gpr/string.h"
35
+ #include "src/core/lib/gpr/useful.h"
36
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
37
+ #include "src/core/lib/gprpp/sync.h"
38
+ #include "src/core/lib/transport/connectivity_state.h"
39
+ #include "src/core/lib/transport/error_utils.h"
40
+ #include "src/core/lib/transport/static_metadata.h"
41
+
19
42
  namespace grpc_core {
20
43
 
21
44
  const char* kRequestRingHashAttribute = "request_ring_hash";
45
+ TraceFlag grpc_lb_ring_hash_trace(false, "ring_hash_lb");
46
+
47
+ // Helper Parser method
48
+ void ParseRingHashLbConfig(const Json& json, size_t* min_ring_size,
49
+ size_t* max_ring_size,
50
+ std::vector<grpc_error_handle>* error_list) {
51
+ *min_ring_size = 1024;
52
+ *max_ring_size = 8388608;
53
+ if (json.type() != Json::Type::OBJECT) {
54
+ error_list->push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
55
+ "ring_hash_experimental should be of type object"));
56
+ return;
57
+ }
58
+ const Json::Object& ring_hash = json.object_value();
59
+ auto ring_hash_it = ring_hash.find("min_ring_size");
60
+ if (ring_hash_it != ring_hash.end()) {
61
+ if (ring_hash_it->second.type() != Json::Type::NUMBER) {
62
+ error_list->push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
63
+ "field:min_ring_size error: should be of type number"));
64
+ } else {
65
+ *min_ring_size = gpr_parse_nonnegative_int(
66
+ ring_hash_it->second.string_value().c_str());
67
+ }
68
+ }
69
+ ring_hash_it = ring_hash.find("max_ring_size");
70
+ if (ring_hash_it != ring_hash.end()) {
71
+ if (ring_hash_it->second.type() != Json::Type::NUMBER) {
72
+ error_list->push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
73
+ "field:max_ring_size error: should be of type number"));
74
+ } else {
75
+ *max_ring_size = gpr_parse_nonnegative_int(
76
+ ring_hash_it->second.string_value().c_str());
77
+ }
78
+ }
79
+ if (*min_ring_size == 0 || *min_ring_size > 8388608 || *max_ring_size == 0 ||
80
+ *max_ring_size > 8388608 || *min_ring_size > *max_ring_size) {
81
+ error_list->push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
82
+ "field:max_ring_size and or min_ring_size error: "
83
+ "values need to be in the range of 1 to 8388608 "
84
+ "and max_ring_size cannot be smaller than "
85
+ "min_ring_size"));
86
+ }
87
+ }
88
+
89
+ namespace {
90
+
91
+ constexpr char kRingHash[] = "ring_hash_experimental";
92
+
93
+ class RingHashLbConfig : public LoadBalancingPolicy::Config {
94
+ public:
95
+ RingHashLbConfig(size_t min_ring_size, size_t max_ring_size)
96
+ : min_ring_size_(min_ring_size), max_ring_size_(max_ring_size) {}
97
+ const char* name() const override { return kRingHash; }
98
+ size_t min_ring_size() const { return min_ring_size_; }
99
+ size_t max_ring_size() const { return max_ring_size_; }
100
+
101
+ private:
102
+ size_t min_ring_size_;
103
+ size_t max_ring_size_;
104
+ };
105
+
106
+ //
107
+ // ring_hash LB policy
108
+ //
109
+ class RingHash : public LoadBalancingPolicy {
110
+ public:
111
+ explicit RingHash(Args args);
112
+
113
+ const char* name() const override { return kRingHash; }
114
+
115
+ void UpdateLocked(UpdateArgs args) override;
116
+ void ResetBackoffLocked() override;
117
+
118
+ private:
119
+ ~RingHash() override;
120
+
121
+ // Forward declaration.
122
+ class RingHashSubchannelList;
123
+
124
+ // Data for a particular subchannel in a subchannel list.
125
+ // This subclass adds the following functionality:
126
+ // - Tracks the previous connectivity state of the subchannel, so that
127
+ // we know how many subchannels are in each state.
128
+ class RingHashSubchannelData
129
+ : public SubchannelData<RingHashSubchannelList, RingHashSubchannelData> {
130
+ public:
131
+ RingHashSubchannelData(
132
+ SubchannelList<RingHashSubchannelList, RingHashSubchannelData>*
133
+ subchannel_list,
134
+ const ServerAddress& address,
135
+ RefCountedPtr<SubchannelInterface> subchannel)
136
+ : SubchannelData(subchannel_list, address, std::move(subchannel)),
137
+ address_(address) {}
138
+
139
+ grpc_connectivity_state connectivity_state() const {
140
+ return last_connectivity_state_;
141
+ }
142
+ const ServerAddress& address() const { return address_; }
143
+
144
+ bool seen_failure_since_ready() const { return seen_failure_since_ready_; }
145
+
146
+ // Performs connectivity state updates that need to be done both when we
147
+ // first start watching and when a watcher notification is received.
148
+ void UpdateConnectivityStateLocked(
149
+ grpc_connectivity_state connectivity_state);
150
+
151
+ private:
152
+ // Performs connectivity state updates that need to be done only
153
+ // after we have started watching.
154
+ void ProcessConnectivityChangeLocked(
155
+ grpc_connectivity_state connectivity_state) override;
156
+
157
+ ServerAddress address_;
158
+ grpc_connectivity_state last_connectivity_state_ = GRPC_CHANNEL_SHUTDOWN;
159
+ bool seen_failure_since_ready_ = false;
160
+ };
161
+
162
+ // A list of subchannels.
163
+ class RingHashSubchannelList
164
+ : public SubchannelList<RingHashSubchannelList, RingHashSubchannelData> {
165
+ public:
166
+ RingHashSubchannelList(RingHash* policy, TraceFlag* tracer,
167
+ ServerAddressList addresses,
168
+ const grpc_channel_args& args)
169
+ : SubchannelList(policy, tracer, std::move(addresses),
170
+ policy->channel_control_helper(), args) {
171
+ // Need to maintain a ref to the LB policy as long as we maintain
172
+ // any references to subchannels, since the subchannels'
173
+ // pollset_sets will include the LB policy's pollset_set.
174
+ policy->Ref(DEBUG_LOCATION, "subchannel_list").release();
175
+ }
176
+
177
+ ~RingHashSubchannelList() override {
178
+ RingHash* p = static_cast<RingHash*>(policy());
179
+ p->Unref(DEBUG_LOCATION, "subchannel_list");
180
+ }
181
+
182
+ // Starts watching the subchannels in this list.
183
+ void StartWatchingLocked();
184
+
185
+ // Updates the counters of subchannels in each state when a
186
+ // subchannel transitions from old_state to new_state.
187
+ void UpdateStateCountersLocked(grpc_connectivity_state old_state,
188
+ grpc_connectivity_state new_state);
189
+
190
+ // Updates the RH policy's connectivity state based on the
191
+ // subchannel list's state counters, creating new picker and new ring.
192
+ // Furthermore, return a bool indicating whether the aggregated state is
193
+ // Transient Failure.
194
+ bool UpdateRingHashConnectivityStateLocked();
195
+
196
+ private:
197
+ size_t num_idle_ = 0;
198
+ size_t num_ready_ = 0;
199
+ size_t num_connecting_ = 0;
200
+ size_t num_transient_failure_ = 0;
201
+ };
202
+
203
+ class Picker : public SubchannelPicker {
204
+ public:
205
+ Picker(RefCountedPtr<RingHash> parent,
206
+ RingHashSubchannelList* subchannel_list);
207
+
208
+ PickResult Pick(PickArgs args) override;
209
+
210
+ private:
211
+ struct RingEntry {
212
+ uint64_t hash;
213
+ RefCountedPtr<SubchannelInterface> subchannel;
214
+ grpc_connectivity_state connectivity_state;
215
+ };
216
+
217
+ // A fire-and-forget class that schedules subchannel connection attempts
218
+ // on the control plane WorkSerializer.
219
+ class SubchannelConnectionAttempter : public Orphanable {
220
+ public:
221
+ explicit SubchannelConnectionAttempter(
222
+ RefCountedPtr<RingHash> ring_hash_lb)
223
+ : ring_hash_lb_(std::move(ring_hash_lb)) {
224
+ GRPC_CLOSURE_INIT(&closure_, RunInExecCtx, this, nullptr);
225
+ }
226
+
227
+ void AddSubchannel(RefCountedPtr<SubchannelInterface> subchannel) {
228
+ subchannels_.push_back(std::move(subchannel));
229
+ }
230
+
231
+ void Orphan() override {
232
+ // Hop into ExecCtx, so that we're not holding the data plane mutex
233
+ // while we run control-plane code.
234
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
235
+ }
236
+
237
+ private:
238
+ static void RunInExecCtx(void* arg, grpc_error* /*error*/) {
239
+ auto* self = static_cast<SubchannelConnectionAttempter*>(arg);
240
+ self->ring_hash_lb_->work_serializer()->Run(
241
+ [self]() {
242
+ if (!self->ring_hash_lb_->shutdown_) {
243
+ for (auto& subchannel : self->subchannels_) {
244
+ subchannel->AttemptToConnect();
245
+ }
246
+ }
247
+ delete self;
248
+ },
249
+ DEBUG_LOCATION);
250
+ }
251
+
252
+ RefCountedPtr<RingHash> ring_hash_lb_;
253
+ grpc_closure closure_;
254
+ absl::InlinedVector<RefCountedPtr<SubchannelInterface>, 10> subchannels_;
255
+ };
256
+
257
+ RefCountedPtr<RingHash> parent_;
258
+
259
+ // A ring of subchannels.
260
+ std::vector<RingEntry> ring_;
261
+ };
262
+
263
+ void ShutdownLocked() override;
264
+
265
+ // Current config from resolver.
266
+ RefCountedPtr<RingHashLbConfig> config_;
267
+
268
+ // list of subchannels.
269
+ OrphanablePtr<RingHashSubchannelList> subchannel_list_;
270
+ // indicating if we are shutting down.
271
+ bool shutdown_ = false;
272
+ };
273
+
274
+ //
275
+ // RingHash::Picker
276
+ //
277
+
278
+ RingHash::Picker::Picker(RefCountedPtr<RingHash> parent,
279
+ RingHashSubchannelList* subchannel_list)
280
+ : parent_(std::move(parent)) {
281
+ size_t num_subchannels = subchannel_list->num_subchannels();
282
+ // Store the weights while finding the sum.
283
+ struct AddressWeight {
284
+ std::string address;
285
+ // Default weight is 1 for the cases where a weight is not provided,
286
+ // each occurrence of the address will be counted a weight value of 1.
287
+ uint32_t weight = 1;
288
+ double normalized_weight;
289
+ };
290
+ std::vector<AddressWeight> address_weights;
291
+ size_t sum = 0;
292
+ address_weights.reserve(num_subchannels);
293
+ for (size_t i = 0; i < num_subchannels; ++i) {
294
+ RingHashSubchannelData* sd = subchannel_list->subchannel(i);
295
+ const ServerAddressWeightAttribute* weight_attribute = static_cast<
296
+ const ServerAddressWeightAttribute*>(sd->address().GetAttribute(
297
+ ServerAddressWeightAttribute::kServerAddressWeightAttributeKey));
298
+ AddressWeight address_weight;
299
+ address_weight.address =
300
+ grpc_sockaddr_to_string(&sd->address().address(), false);
301
+ if (weight_attribute != nullptr) {
302
+ GPR_ASSERT(weight_attribute->weight() != 0);
303
+ address_weight.weight = weight_attribute->weight();
304
+ }
305
+ sum += address_weight.weight;
306
+ address_weights.push_back(std::move(address_weight));
307
+ }
308
+ // Calculating normalized weights and find min and max.
309
+ double min_normalized_weight = 1.0;
310
+ double max_normalized_weight = 0.0;
311
+ for (auto& address : address_weights) {
312
+ address.normalized_weight = static_cast<double>(address.weight) / sum;
313
+ min_normalized_weight =
314
+ std::min(address.normalized_weight, min_normalized_weight);
315
+ max_normalized_weight =
316
+ std::max(address.normalized_weight, max_normalized_weight);
317
+ }
318
+ // Scale up the number of hashes per host such that the least-weighted host
319
+ // gets a whole number of hashes on the ring. Other hosts might not end up
320
+ // with whole numbers, and that's fine (the ring-building algorithm below can
321
+ // handle this). This preserves the original implementation's behavior: when
322
+ // weights aren't provided, all hosts should get an equal number of hashes. In
323
+ // the case where this number exceeds the max_ring_size, it's scaled back down
324
+ // to fit.
325
+ const size_t min_ring_size = parent_->config_->min_ring_size();
326
+ const size_t max_ring_size = parent_->config_->max_ring_size();
327
+ const double scale = std::min(
328
+ std::ceil(min_normalized_weight * min_ring_size) / min_normalized_weight,
329
+ static_cast<double>(max_ring_size));
330
+ // Reserve memory for the entire ring up front.
331
+ const uint64_t ring_size = std::ceil(scale);
332
+ ring_.reserve(ring_size);
333
+ // Populate the hash ring by walking through the (host, weight) pairs in
334
+ // normalized_host_weights, and generating (scale * weight) hashes for each
335
+ // host. Since these aren't necessarily whole numbers, we maintain running
336
+ // sums -- current_hashes and target_hashes -- which allows us to populate the
337
+ // ring in a mostly stable way.
338
+ absl::InlinedVector<char, 196> hash_key_buffer;
339
+ double current_hashes = 0.0;
340
+ double target_hashes = 0.0;
341
+ uint64_t min_hashes_per_host = ring_size;
342
+ uint64_t max_hashes_per_host = 0;
343
+ for (size_t i = 0; i < num_subchannels; ++i) {
344
+ const std::string& address_string = address_weights[i].address;
345
+ hash_key_buffer.assign(address_string.begin(), address_string.end());
346
+ hash_key_buffer.emplace_back('_');
347
+ auto offset_start = hash_key_buffer.end();
348
+ target_hashes += scale * address_weights[i].normalized_weight;
349
+ size_t count = 0;
350
+ auto current_state =
351
+ subchannel_list->subchannel(i)->subchannel()->CheckConnectivityState();
352
+ while (current_hashes < target_hashes) {
353
+ const std::string count_str = absl::StrCat(count);
354
+ hash_key_buffer.insert(offset_start, count_str.begin(), count_str.end());
355
+ absl::string_view hash_key(hash_key_buffer.data(),
356
+ hash_key_buffer.size());
357
+ const uint64_t hash = XXH64(hash_key.data(), hash_key.size(), 0);
358
+ ring_.push_back({hash,
359
+ subchannel_list->subchannel(i)->subchannel()->Ref(),
360
+ current_state});
361
+ ++count;
362
+ ++current_hashes;
363
+ hash_key_buffer.erase(offset_start, hash_key_buffer.end());
364
+ }
365
+ min_hashes_per_host =
366
+ std::min(static_cast<uint64_t>(i), min_hashes_per_host);
367
+ max_hashes_per_host =
368
+ std::max(static_cast<uint64_t>(i), max_hashes_per_host);
369
+ }
370
+ std::sort(ring_.begin(), ring_.end(),
371
+ [](const RingEntry& lhs, const RingEntry& rhs) -> bool {
372
+ return lhs.hash < rhs.hash;
373
+ });
374
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
375
+ gpr_log(GPR_INFO,
376
+ "[RH %p picker %p] created picker from subchannel_list=%p "
377
+ "with %" PRIuPTR " ring entries",
378
+ parent_.get(), this, subchannel_list, ring_.size());
379
+ }
380
+ }
381
+
382
+ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
383
+ PickResult result;
384
+ // Initialize to PICK_FAILED.
385
+ result.type = PickResult::PICK_FAILED;
386
+ auto hash =
387
+ args.call_state->ExperimentalGetCallAttribute(kRequestRingHashAttribute);
388
+ uint64_t h;
389
+ if (!absl::SimpleAtoi(hash, &h)) {
390
+ result.error = grpc_error_set_int(
391
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
392
+ absl::StrCat("xds ring hash value is not a number").c_str()),
393
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
394
+ return result;
395
+ }
396
+ // Ported from https://github.com/RJ/ketama/blob/master/libketama/ketama.c
397
+ // (ketama_get_server) NOTE: The algorithm depends on using signed integers
398
+ // for lowp, highp, and first_index. Do not change them!
399
+ int64_t lowp = 0;
400
+ int64_t highp = ring_.size();
401
+ int64_t first_index = 0;
402
+ while (true) {
403
+ first_index = (lowp + highp) / 2;
404
+ if (first_index == static_cast<int64_t>(ring_.size())) {
405
+ first_index = 0;
406
+ break;
407
+ }
408
+ uint64_t midval = ring_[first_index].hash;
409
+ uint64_t midval1 = first_index == 0 ? 0 : ring_[first_index - 1].hash;
410
+ if (h <= midval && h > midval1) {
411
+ break;
412
+ }
413
+ if (midval < h) {
414
+ lowp = first_index + 1;
415
+ } else {
416
+ highp = first_index - 1;
417
+ }
418
+ if (lowp > highp) {
419
+ first_index = 0;
420
+ break;
421
+ }
422
+ }
423
+ OrphanablePtr<SubchannelConnectionAttempter> subchannel_connection_attempter;
424
+ auto ScheduleSubchannelConnectionAttempt =
425
+ [&](RefCountedPtr<SubchannelInterface> subchannel) {
426
+ if (subchannel_connection_attempter == nullptr) {
427
+ subchannel_connection_attempter =
428
+ MakeOrphanable<SubchannelConnectionAttempter>(parent_);
429
+ }
430
+ subchannel_connection_attempter->AddSubchannel(std::move(subchannel));
431
+ };
432
+ switch (ring_[first_index].connectivity_state) {
433
+ case GRPC_CHANNEL_READY:
434
+ result.type = PickResult::PICK_COMPLETE;
435
+ result.subchannel = ring_[first_index].subchannel;
436
+ return result;
437
+ case GRPC_CHANNEL_IDLE:
438
+ ScheduleSubchannelConnectionAttempt(ring_[first_index].subchannel);
439
+ // fallthrough
440
+ case GRPC_CHANNEL_CONNECTING:
441
+ result.type = PickResult::PICK_QUEUE;
442
+ return result;
443
+ default: // GRPC_CHANNEL_TRANSIENT_FAILURE
444
+ break;
445
+ }
446
+ ScheduleSubchannelConnectionAttempt(ring_[first_index].subchannel);
447
+ // Loop through remaining subchannels to find one in READY.
448
+ // On the way, we make sure the right set of connection attempts
449
+ // will happen.
450
+ bool found_second_subchannel = false;
451
+ bool found_first_non_failed = false;
452
+ for (size_t i = 1; i < ring_.size(); ++i) {
453
+ const RingEntry& entry = ring_[(first_index + i) % ring_.size()];
454
+ if (entry.subchannel == ring_[first_index].subchannel) {
455
+ continue;
456
+ }
457
+ if (entry.connectivity_state == GRPC_CHANNEL_READY) {
458
+ result.type = PickResult::PICK_COMPLETE;
459
+ result.subchannel = entry.subchannel;
460
+ return result;
461
+ }
462
+ if (!found_second_subchannel) {
463
+ switch (entry.connectivity_state) {
464
+ case GRPC_CHANNEL_IDLE:
465
+ ScheduleSubchannelConnectionAttempt(entry.subchannel);
466
+ // fallthrough
467
+ case GRPC_CHANNEL_CONNECTING:
468
+ result.type = PickResult::PICK_QUEUE;
469
+ return result;
470
+ default:
471
+ break;
472
+ }
473
+ found_second_subchannel = true;
474
+ }
475
+ if (!found_first_non_failed) {
476
+ if (entry.connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
477
+ ScheduleSubchannelConnectionAttempt(entry.subchannel);
478
+ } else {
479
+ if (entry.connectivity_state == GRPC_CHANNEL_IDLE) {
480
+ ScheduleSubchannelConnectionAttempt(entry.subchannel);
481
+ }
482
+ found_first_non_failed = true;
483
+ }
484
+ }
485
+ }
486
+ result.error =
487
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
488
+ absl::StrCat("xds ring hash found a subchannel "
489
+ "that is in TRANSIENT_FAILURE state")
490
+ .c_str()),
491
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
492
+ return result;
493
+ }
494
+
495
+ //
496
+ // RingHash::RingHashSubchannelList
497
+ //
498
+
499
+ void RingHash::RingHashSubchannelList::StartWatchingLocked() {
500
+ if (num_subchannels() == 0) return;
501
+ // Check current state of each subchannel synchronously.
502
+ for (size_t i = 0; i < num_subchannels(); ++i) {
503
+ grpc_connectivity_state state =
504
+ subchannel(i)->CheckConnectivityStateLocked();
505
+ subchannel(i)->UpdateConnectivityStateLocked(state);
506
+ }
507
+ // Start connectivity watch for each subchannel.
508
+ for (size_t i = 0; i < num_subchannels(); i++) {
509
+ if (subchannel(i)->subchannel() != nullptr) {
510
+ subchannel(i)->StartConnectivityWatchLocked();
511
+ }
512
+ }
513
+ RingHash* p = static_cast<RingHash*>(policy());
514
+ // Sending up the initial picker while all subchannels are in IDLE state.
515
+ p->channel_control_helper()->UpdateState(
516
+ GRPC_CHANNEL_READY, absl::Status(),
517
+ absl::make_unique<Picker>(p->Ref(DEBUG_LOCATION, "RingHashPicker"),
518
+ this));
519
+ }
520
+
521
+ void RingHash::RingHashSubchannelList::UpdateStateCountersLocked(
522
+ grpc_connectivity_state old_state, grpc_connectivity_state new_state) {
523
+ GPR_ASSERT(new_state != GRPC_CHANNEL_SHUTDOWN);
524
+ if (old_state == GRPC_CHANNEL_IDLE) {
525
+ GPR_ASSERT(num_idle_ > 0);
526
+ --num_idle_;
527
+ } else if (old_state == GRPC_CHANNEL_READY) {
528
+ GPR_ASSERT(num_ready_ > 0);
529
+ --num_ready_;
530
+ } else if (old_state == GRPC_CHANNEL_CONNECTING) {
531
+ GPR_ASSERT(num_connecting_ > 0);
532
+ --num_connecting_;
533
+ } else if (old_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
534
+ GPR_ASSERT(num_transient_failure_ > 0);
535
+ --num_transient_failure_;
536
+ }
537
+ if (new_state == GRPC_CHANNEL_IDLE) {
538
+ ++num_idle_;
539
+ } else if (new_state == GRPC_CHANNEL_READY) {
540
+ ++num_ready_;
541
+ } else if (new_state == GRPC_CHANNEL_CONNECTING) {
542
+ ++num_connecting_;
543
+ } else if (new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
544
+ ++num_transient_failure_;
545
+ }
546
+ }
547
+
548
+ // Sets the RH policy's connectivity state and generates a new picker based
549
+ // on the current subchannel list or requests an re-attempt by returning true..
550
+ bool RingHash::RingHashSubchannelList::UpdateRingHashConnectivityStateLocked() {
551
+ RingHash* p = static_cast<RingHash*>(policy());
552
+ // Only set connectivity state if this is the current subchannel list.
553
+ if (p->subchannel_list_.get() != this) return false;
554
+ // The overall aggregation rules here are:
555
+ // 1. If there is at least one subchannel in READY state, report READY.
556
+ // 2. If there are 2 or more subchannels in TRANSIENT_FAILURE state, report
557
+ // TRANSIENT_FAILURE.
558
+ // 3. If there is at least one subchannel in CONNECTING state, report
559
+ // CONNECTING.
560
+ // 4. If there is at least one subchannel in IDLE state, report IDLE.
561
+ // 5. Otherwise, report TRANSIENT_FAILURE.
562
+ if (num_ready_ > 0) {
563
+ /* READY */
564
+ p->channel_control_helper()->UpdateState(
565
+ GRPC_CHANNEL_READY, absl::Status(),
566
+ absl::make_unique<Picker>(p->Ref(DEBUG_LOCATION, "RingHashPicker"),
567
+ this));
568
+ return false;
569
+ }
570
+ if (num_connecting_ > 0 && num_transient_failure_ < 2) {
571
+ p->channel_control_helper()->UpdateState(
572
+ GRPC_CHANNEL_CONNECTING, absl::Status(),
573
+ absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
574
+ return false;
575
+ }
576
+ if (num_idle_ > 0 && num_transient_failure_ < 2) {
577
+ p->channel_control_helper()->UpdateState(
578
+ GRPC_CHANNEL_IDLE, absl::Status(),
579
+ absl::make_unique<Picker>(p->Ref(DEBUG_LOCATION, "RingHashPicker"),
580
+ this));
581
+ return false;
582
+ }
583
+ grpc_error* error =
584
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
585
+ "connections to backend failing or idle"),
586
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
587
+ p->channel_control_helper()->UpdateState(
588
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
589
+ absl::make_unique<TransientFailurePicker>(error));
590
+ return true;
591
+ }
592
+
593
+ //
594
+ // RingHash::RingHashSubchannelData
595
+ //
596
+
597
+ void RingHash::RingHashSubchannelData::UpdateConnectivityStateLocked(
598
+ grpc_connectivity_state connectivity_state) {
599
+ RingHash* p = static_cast<RingHash*>(subchannel_list()->policy());
600
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
601
+ gpr_log(
602
+ GPR_INFO,
603
+ "[RR %p] connectivity changed for subchannel %p, subchannel_list %p "
604
+ "(index %" PRIuPTR " of %" PRIuPTR "): prev_state=%s new_state=%s",
605
+ p, subchannel(), subchannel_list(), Index(),
606
+ subchannel_list()->num_subchannels(),
607
+ ConnectivityStateName(last_connectivity_state_),
608
+ ConnectivityStateName(connectivity_state));
609
+ }
610
+ // Decide what state to report for aggregation purposes.
611
+ // If we haven't seen a failure since the last time we were in state
612
+ // READY, then we report the state change as-is. However, once we do see
613
+ // a failure, we report TRANSIENT_FAILURE and do not report any subsequent
614
+ // state changes until we go back into state READY.
615
+ if (!seen_failure_since_ready_) {
616
+ if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
617
+ seen_failure_since_ready_ = true;
618
+ }
619
+ subchannel_list()->UpdateStateCountersLocked(last_connectivity_state_,
620
+ connectivity_state);
621
+ } else {
622
+ if (connectivity_state == GRPC_CHANNEL_READY) {
623
+ seen_failure_since_ready_ = false;
624
+ subchannel_list()->UpdateStateCountersLocked(
625
+ GRPC_CHANNEL_TRANSIENT_FAILURE, connectivity_state);
626
+ }
627
+ }
628
+ // Record last seen connectivity state.
629
+ last_connectivity_state_ = connectivity_state;
630
+ }
631
+
632
+ void RingHash::RingHashSubchannelData::ProcessConnectivityChangeLocked(
633
+ grpc_connectivity_state connectivity_state) {
634
+ RingHash* p = static_cast<RingHash*>(subchannel_list()->policy());
635
+ GPR_ASSERT(subchannel() != nullptr);
636
+ // If the new state is TRANSIENT_FAILURE, re-resolve.
637
+ // Only do this if we've started watching, not at startup time.
638
+ // Otherwise, if the subchannel was already in state TRANSIENT_FAILURE
639
+ // when the subchannel list was created, we'd wind up in a constant
640
+ // loop of re-resolution.
641
+ // Also attempt to reconnect.
642
+ if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
643
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
644
+ gpr_log(GPR_INFO,
645
+ "[RR %p] Subchannel %p has gone into TRANSIENT_FAILURE. "
646
+ "Requesting re-resolution",
647
+ p, subchannel());
648
+ }
649
+ p->channel_control_helper()->RequestReresolution();
650
+ }
651
+ // Update state counters.
652
+ UpdateConnectivityStateLocked(connectivity_state);
653
+ // Update the RH policy's connectivity state, creating new picker and new
654
+ // ring.
655
+ bool transient_failure =
656
+ subchannel_list()->UpdateRingHashConnectivityStateLocked();
657
+ // While the ring_hash policy is reporting TRANSIENT_FAILURE, it will
658
+ // not be getting any pick requests from the priority policy.
659
+ // However, because the ring_hash policy does not attempt to
660
+ // reconnect to subchannels unless it is getting pick requests,
661
+ // it will need special handling to ensure that it will eventually
662
+ // recover from TRANSIENT_FAILURE state once the problem is resolved.
663
+ // Specifically, it will make sure that it is attempting to connect to
664
+ // at least one subchannel at any given time. After a given subchannel
665
+ // fails a connection attempt, it will move on to the next subchannel
666
+ // in the ring. It will keep doing this until one of the subchannels
667
+ // successfully connects, at which point it will report READY and stop
668
+ // proactively trying to connect. The policy will remain in
669
+ // TRANSIENT_FAILURE until at least one subchannel becomes connected,
670
+ // even if subchannels are in state CONNECTING during that time.
671
+ if (transient_failure &&
672
+ connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
673
+ size_t next_index = (Index() + 1) % subchannel_list()->num_subchannels();
674
+ RingHashSubchannelData* next_sd = subchannel_list()->subchannel(next_index);
675
+ next_sd->subchannel()->AttemptToConnect();
676
+ }
677
+ }
678
+
679
+ //
680
+ // RingHash
681
+ //
682
+
683
+ RingHash::RingHash(Args args) : LoadBalancingPolicy(std::move(args)) {
684
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
685
+ gpr_log(GPR_INFO, "[RH %p] Created", this);
686
+ }
687
+ }
688
+
689
+ RingHash::~RingHash() {
690
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
691
+ gpr_log(GPR_INFO, "[RH %p] Destroying Ring Hash policy", this);
692
+ }
693
+ GPR_ASSERT(subchannel_list_ == nullptr);
694
+ }
695
+
696
+ void RingHash::ShutdownLocked() {
697
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
698
+ gpr_log(GPR_INFO, "[RH %p] Shutting down", this);
699
+ }
700
+ shutdown_ = true;
701
+ subchannel_list_.reset();
702
+ }
703
+
704
+ void RingHash::ResetBackoffLocked() { subchannel_list_->ResetBackoffLocked(); }
705
+
706
+ void RingHash::UpdateLocked(UpdateArgs args) {
707
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
708
+ gpr_log(GPR_INFO, "[RR %p] received update with %" PRIuPTR " addresses",
709
+ this, args.addresses.size());
710
+ }
711
+ config_ = std::move(args.config);
712
+ // Filter out any address with weight 0.
713
+ ServerAddressList addresses;
714
+ addresses.reserve(args.addresses.size());
715
+ for (ServerAddress& address : args.addresses) {
716
+ const ServerAddressWeightAttribute* weight_attribute =
717
+ static_cast<const ServerAddressWeightAttribute*>(address.GetAttribute(
718
+ ServerAddressWeightAttribute::kServerAddressWeightAttributeKey));
719
+ if (weight_attribute == nullptr || weight_attribute->weight() > 0) {
720
+ addresses.push_back(std::move(address));
721
+ }
722
+ }
723
+ subchannel_list_ = MakeOrphanable<RingHashSubchannelList>(
724
+ this, &grpc_lb_ring_hash_trace, std::move(addresses), *args.args);
725
+ if (subchannel_list_->num_subchannels() == 0) {
726
+ // If the new list is empty, immediately transition to TRANSIENT_FAILURE.
727
+ grpc_error* error =
728
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
729
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
730
+ channel_control_helper()->UpdateState(
731
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
732
+ absl::make_unique<TransientFailurePicker>(error));
733
+ } else {
734
+ // Start watching the new list.
735
+ subchannel_list_->StartWatchingLocked();
736
+ }
737
+ }
738
+
739
+ //
740
+ // factory
741
+ //
742
+
743
+ class RingHashFactory : public LoadBalancingPolicyFactory {
744
+ public:
745
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
746
+ LoadBalancingPolicy::Args args) const override {
747
+ return MakeOrphanable<RingHash>(std::move(args));
748
+ }
749
+
750
+ const char* name() const override { return kRingHash; }
751
+
752
+ RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
753
+ const Json& json, grpc_error** error) const override {
754
+ size_t min_ring_size;
755
+ size_t max_ring_size;
756
+ std::vector<grpc_error_handle> error_list;
757
+ ParseRingHashLbConfig(json, &min_ring_size, &max_ring_size, &error_list);
758
+ if (error_list.empty()) {
759
+ return MakeRefCounted<RingHashLbConfig>(min_ring_size, max_ring_size);
760
+ } else {
761
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR(
762
+ "ring_hash_experimental LB policy config", &error_list);
763
+ return nullptr;
764
+ }
765
+ }
766
+ };
767
+
768
+ } // namespace
769
+
770
+ void GrpcLbPolicyRingHashInit() {
771
+ grpc_core::LoadBalancingPolicyRegistry::Builder::
772
+ RegisterLoadBalancingPolicyFactory(
773
+ absl::make_unique<grpc_core::RingHashFactory>());
774
+ }
775
+
776
+ void GrpcLbPolicyRingHashShutdown() {}
22
777
 
23
778
  } // namespace grpc_core