grpc 1.46.2-x86_64-linux → 1.48.0.pre1-x86_64-linux

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 (816) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +138 -128
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +62 -18
  5. data/include/grpc/event_engine/memory_allocator.h +0 -15
  6. data/include/grpc/event_engine/port.h +1 -1
  7. data/include/grpc/event_engine/slice.h +286 -0
  8. data/include/grpc/event_engine/slice_buffer.h +118 -0
  9. data/include/grpc/grpc.h +3 -3
  10. data/include/grpc/grpc_security.h +11 -0
  11. data/include/grpc/impl/codegen/compression_types.h +2 -1
  12. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  13. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  14. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  15. data/include/grpc/impl/codegen/port_platform.h +106 -39
  16. data/include/grpc/impl/codegen/slice.h +1 -1
  17. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  18. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +35 -35
  19. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +20 -1
  20. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  21. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  22. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  23. data/src/core/ext/filters/client_channel/backup_poller.cc +8 -6
  24. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  25. data/src/core/ext/filters/client_channel/channel_connectivity.cc +43 -21
  26. data/src/core/ext/filters/client_channel/client_channel.cc +111 -82
  27. data/src/core/ext/filters/client_channel/client_channel.h +43 -8
  28. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  29. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  30. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  31. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  32. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  33. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  34. data/src/core/ext/filters/client_channel/config_selector.h +8 -6
  35. data/src/core/ext/filters/client_channel/connector.h +9 -3
  36. data/src/core/ext/filters/client_channel/dynamic_filters.cc +19 -6
  37. data/src/core/ext/filters/client_channel/dynamic_filters.h +12 -2
  38. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  39. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  40. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  41. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  42. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  43. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  45. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  46. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  47. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -5
  50. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +132 -62
  52. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  53. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  54. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  56. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +407 -0
  57. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  58. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1036 -0
  59. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  60. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +149 -147
  61. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +176 -85
  62. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +303 -203
  63. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +6 -1
  64. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +92 -54
  65. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +240 -214
  66. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +119 -111
  67. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +86 -71
  68. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +101 -25
  69. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  70. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +35 -11
  71. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +36 -20
  72. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +78 -14
  73. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  74. data/src/core/ext/filters/client_channel/lb_policy.h +18 -31
  75. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  76. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +11 -6
  77. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  78. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  79. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  80. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  81. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +1 -0
  82. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  83. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +26 -6
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +139 -48
  85. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  86. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  87. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +6 -6
  88. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +36 -14
  89. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  90. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  91. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  92. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  93. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +39 -7
  94. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -19
  95. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  96. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +61 -16
  97. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +14 -2
  98. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  99. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +17 -12
  100. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +111 -46
  101. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  102. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +12 -18
  103. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  104. data/src/core/ext/filters/client_channel/retry_filter.cc +75 -36
  105. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  106. data/src/core/ext/filters/client_channel/retry_service_config.cc +12 -13
  107. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  108. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  109. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  110. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +24 -6
  111. data/src/core/ext/filters/client_channel/subchannel.cc +186 -187
  112. data/src/core/ext/filters/client_channel/subchannel.h +80 -36
  113. data/src/core/ext/filters/client_channel/subchannel_interface.h +51 -41
  114. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  115. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  116. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  117. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +24 -95
  118. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +17 -9
  119. data/src/core/ext/filters/deadline/deadline_filter.cc +18 -9
  120. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  121. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +22 -6
  122. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  123. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  124. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  125. data/src/core/ext/filters/http/client/http_client_filter.cc +30 -10
  126. data/src/core/ext/filters/http/client/http_client_filter.h +15 -2
  127. data/src/core/ext/filters/http/client_authority_filter.cc +16 -20
  128. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  129. data/src/core/ext/filters/http/http_filters_plugin.cc +16 -9
  130. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +65 -187
  131. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  132. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +45 -107
  133. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  134. data/src/core/ext/filters/http/server/http_server_filter.cc +95 -255
  135. data/src/core/ext/filters/http/server/http_server_filter.h +37 -3
  136. data/src/core/ext/filters/message_size/message_size_filter.cc +45 -41
  137. data/src/core/ext/filters/message_size/message_size_filter.h +15 -2
  138. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -3
  139. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  140. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  141. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  142. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  143. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  144. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  145. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  146. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +104 -138
  147. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  148. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +58 -29
  149. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  150. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  151. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  152. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  153. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +260 -491
  154. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +6 -1
  155. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  156. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  157. data/src/core/ext/transport/chttp2/transport/flow_control.cc +145 -261
  158. data/src/core/ext/transport/chttp2/transport/flow_control.h +179 -288
  159. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  160. data/src/core/ext/transport/chttp2/transport/frame_data.cc +59 -211
  161. data/src/core/ext/transport/chttp2/transport/frame_data.h +13 -36
  162. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  163. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  164. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  165. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  166. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  167. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  168. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +10 -42
  169. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  170. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +10 -12
  171. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  172. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  173. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  174. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  175. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  176. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +32 -13
  177. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  178. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +53 -37
  179. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  180. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  181. data/src/core/ext/transport/chttp2/transport/internal.h +31 -112
  182. data/src/core/ext/transport/chttp2/transport/parsing.cc +77 -43
  183. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +11 -11
  184. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  185. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  186. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  187. data/src/core/ext/transport/chttp2/transport/writing.cc +54 -21
  188. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  189. data/src/core/ext/transport/inproc/inproc_transport.cc +93 -86
  190. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  191. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  192. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  193. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  194. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  195. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  196. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  197. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  198. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  199. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  200. data/src/core/ext/xds/certificate_provider_store.cc +6 -2
  201. data/src/core/ext/xds/certificate_provider_store.h +10 -1
  202. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  203. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  204. data/src/core/ext/xds/upb_utils.h +1 -2
  205. data/src/core/ext/xds/xds_api.cc +16 -18
  206. data/src/core/ext/xds/xds_api.h +12 -5
  207. data/src/core/ext/xds/xds_bootstrap.cc +39 -26
  208. data/src/core/ext/xds/xds_bootstrap.h +11 -11
  209. data/src/core/ext/xds/xds_certificate_provider.cc +16 -4
  210. data/src/core/ext/xds/xds_certificate_provider.h +17 -2
  211. data/src/core/ext/xds/xds_channel_stack_modifier.cc +14 -5
  212. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  213. data/src/core/ext/xds/xds_client.cc +121 -46
  214. data/src/core/ext/xds/xds_client.h +19 -4
  215. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  216. data/src/core/ext/xds/xds_client_stats.h +4 -3
  217. data/src/core/ext/xds/xds_cluster.cc +126 -25
  218. data/src/core/ext/xds/xds_cluster.h +12 -1
  219. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  220. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  221. data/src/core/ext/xds/xds_common_types.cc +36 -22
  222. data/src/core/ext/xds/xds_common_types.h +12 -4
  223. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  224. data/src/core/ext/xds/xds_endpoint.h +13 -5
  225. data/src/core/ext/xds/xds_http_fault_filter.cc +10 -8
  226. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  227. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  228. data/src/core/ext/xds/xds_http_filters.h +3 -3
  229. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  230. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  231. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  232. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  233. data/src/core/ext/xds/xds_listener.cc +70 -42
  234. data/src/core/ext/xds/xds_listener.h +10 -1
  235. data/src/core/ext/xds/xds_resource_type.h +3 -3
  236. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  237. data/src/core/ext/xds/xds_route_config.cc +56 -28
  238. data/src/core/ext/xds/xds_route_config.h +11 -2
  239. data/src/core/ext/xds/xds_routing.cc +16 -0
  240. data/src/core/ext/xds/xds_routing.h +7 -2
  241. data/src/core/ext/xds/xds_server_config_fetcher.cc +56 -7
  242. data/src/core/lib/address_utils/parse_address.cc +5 -8
  243. data/src/core/lib/address_utils/parse_address.h +3 -2
  244. data/src/core/lib/address_utils/sockaddr_utils.cc +60 -26
  245. data/src/core/lib/address_utils/sockaddr_utils.h +9 -4
  246. data/src/core/lib/avl/avl.h +6 -4
  247. data/src/core/lib/backoff/backoff.cc +1 -1
  248. data/src/core/lib/backoff/backoff.h +1 -1
  249. data/src/core/lib/channel/call_finalization.h +4 -0
  250. data/src/core/lib/channel/call_tracer.h +11 -5
  251. data/src/core/lib/channel/channel_args.cc +41 -22
  252. data/src/core/lib/channel/channel_args.h +34 -3
  253. data/src/core/lib/channel/channel_args_preconditioning.cc +4 -3
  254. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  255. data/src/core/lib/channel/channel_fwd.h +26 -0
  256. data/src/core/lib/channel/channel_stack.cc +45 -7
  257. data/src/core/lib/channel/channel_stack.h +45 -9
  258. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  259. data/src/core/lib/channel/channel_stack_builder.h +17 -32
  260. data/src/core/lib/channel/channel_stack_builder_impl.cc +38 -43
  261. data/src/core/lib/channel/channel_stack_builder_impl.h +4 -6
  262. data/src/core/lib/channel/channel_trace.cc +8 -13
  263. data/src/core/lib/channel/channel_trace.h +6 -3
  264. data/src/core/lib/channel/channelz.cc +10 -14
  265. data/src/core/lib/channel/channelz.h +15 -7
  266. data/src/core/lib/channel/channelz_registry.cc +11 -19
  267. data/src/core/lib/channel/channelz_registry.h +10 -9
  268. data/src/core/lib/channel/connected_channel.cc +22 -31
  269. data/src/core/lib/channel/connected_channel.h +2 -0
  270. data/src/core/lib/channel/promise_based_filter.cc +451 -190
  271. data/src/core/lib/channel/promise_based_filter.h +162 -27
  272. data/src/core/lib/channel/status_util.cc +2 -0
  273. data/src/core/lib/channel/status_util.h +0 -3
  274. data/src/core/lib/compression/compression.cc +6 -1
  275. data/src/core/lib/compression/compression_internal.cc +48 -16
  276. data/src/core/lib/compression/compression_internal.h +4 -3
  277. data/src/core/lib/compression/message_compress.cc +3 -1
  278. data/src/core/lib/compression/message_compress.h +2 -3
  279. data/src/core/lib/config/core_configuration.cc +3 -0
  280. data/src/core/lib/config/core_configuration.h +2 -1
  281. data/src/core/lib/debug/stats.cc +9 -9
  282. data/src/core/lib/debug/stats.h +2 -1
  283. data/src/core/lib/debug/stats_data.cc +2 -1
  284. data/src/core/lib/debug/stats_data.h +0 -4
  285. data/src/core/lib/debug/trace.h +13 -12
  286. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  287. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  288. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  289. data/src/core/lib/event_engine/event_engine.cc +29 -14
  290. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  291. data/src/core/lib/event_engine/handle_containers.h +67 -0
  292. data/src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc +159 -0
  293. data/src/core/lib/event_engine/iomgr_engine/iomgr_engine.h +122 -0
  294. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  295. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  296. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  297. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  298. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  299. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  300. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  301. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  302. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  303. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  304. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  305. data/src/core/lib/{iomgr/event_engine → event_engine}/promise.h +27 -9
  306. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  307. data/src/core/lib/event_engine/slice.cc +102 -0
  308. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  309. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  310. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  311. data/src/core/lib/gpr/log.cc +5 -0
  312. data/src/core/lib/gpr/time_posix.cc +6 -9
  313. data/src/core/lib/gpr/time_windows.cc +10 -7
  314. data/src/core/lib/gpr/tls.h +3 -5
  315. data/src/core/lib/gprpp/bitset.h +5 -1
  316. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  317. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  318. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  319. data/src/core/lib/gprpp/examine_stack.h +0 -1
  320. data/src/core/lib/gprpp/fork.cc +3 -6
  321. data/src/core/lib/gprpp/global_config.h +2 -4
  322. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  323. data/src/core/lib/gprpp/global_config_env.h +3 -1
  324. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  325. data/src/core/lib/gprpp/host_port.cc +2 -0
  326. data/src/core/lib/gprpp/manual_constructor.h +0 -68
  327. data/src/core/lib/gprpp/match.h +2 -0
  328. data/src/core/lib/gprpp/memory.h +1 -5
  329. data/src/core/lib/gprpp/orphanable.h +1 -4
  330. data/src/core/lib/gprpp/ref_counted.h +1 -3
  331. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  332. data/src/core/lib/gprpp/stat.h +0 -2
  333. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  334. data/src/core/lib/gprpp/status_helper.cc +50 -32
  335. data/src/core/lib/gprpp/status_helper.h +4 -0
  336. data/src/core/lib/gprpp/sync.h +3 -1
  337. data/src/core/lib/gprpp/table.h +10 -0
  338. data/src/core/lib/gprpp/thd.h +2 -5
  339. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  340. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  341. data/src/core/lib/gprpp/time.cc +16 -0
  342. data/src/core/lib/gprpp/time.h +10 -1
  343. data/src/core/lib/gprpp/time_util.cc +4 -0
  344. data/src/core/lib/gprpp/time_util.h +1 -1
  345. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  346. data/src/core/lib/http/format_request.cc +34 -4
  347. data/src/core/lib/http/format_request.h +3 -1
  348. data/src/core/lib/http/httpcli.cc +106 -93
  349. data/src/core/lib/http/httpcli.h +58 -10
  350. data/src/core/lib/http/httpcli_security_connector.cc +19 -8
  351. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  352. data/src/core/lib/http/parser.cc +6 -7
  353. data/src/core/lib/http/parser.h +3 -0
  354. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  355. data/src/core/lib/iomgr/endpoint.cc +4 -4
  356. data/src/core/lib/iomgr/endpoint.h +7 -5
  357. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -6
  358. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  359. data/src/core/lib/iomgr/error.cc +11 -9
  360. data/src/core/lib/iomgr/error.h +9 -5
  361. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  362. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  363. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  364. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  365. data/src/core/lib/iomgr/ev_posix.cc +55 -96
  366. data/src/core/lib/iomgr/ev_posix.h +5 -3
  367. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  368. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  369. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  370. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  371. data/src/core/lib/iomgr/iomgr.cc +7 -1
  372. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  373. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  374. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  375. data/src/core/lib/iomgr/load_file.cc +1 -1
  376. data/src/core/lib/iomgr/pollset_set.h +1 -2
  377. data/src/core/lib/iomgr/port.h +25 -6
  378. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  379. data/src/core/lib/iomgr/resolve_address.h +21 -14
  380. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  381. data/src/core/lib/iomgr/resolve_address_posix.cc +9 -15
  382. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  383. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -15
  384. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  385. data/src/core/lib/iomgr/sockaddr.h +2 -3
  386. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  387. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  388. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  389. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  390. data/src/core/lib/iomgr/tcp_client.h +24 -13
  391. data/src/core/lib/iomgr/tcp_client_cfstream.cc +24 -10
  392. data/src/core/lib/iomgr/tcp_client_posix.cc +154 -29
  393. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  394. data/src/core/lib/iomgr/tcp_client_windows.cc +27 -16
  395. data/src/core/lib/iomgr/tcp_posix.cc +96 -52
  396. data/src/core/lib/iomgr/tcp_server_posix.cc +33 -19
  397. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +41 -38
  398. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -6
  399. data/src/core/lib/iomgr/tcp_server_windows.cc +20 -12
  400. data/src/core/lib/iomgr/tcp_windows.cc +12 -9
  401. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  402. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  403. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  404. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  405. data/src/core/lib/iomgr/work_serializer.h +2 -3
  406. data/src/core/lib/json/json.h +1 -2
  407. data/src/core/lib/json/json_reader.cc +9 -1
  408. data/src/core/lib/json/json_util.cc +7 -0
  409. data/src/core/lib/json/json_util.h +10 -1
  410. data/src/core/lib/json/json_writer.cc +6 -1
  411. data/src/core/lib/matchers/matchers.cc +6 -3
  412. data/src/core/lib/matchers/matchers.h +2 -0
  413. data/src/core/lib/promise/activity.cc +1 -2
  414. data/src/core/lib/promise/activity.h +13 -19
  415. data/src/core/lib/promise/arena_promise.h +11 -1
  416. data/src/core/lib/promise/call_push_pull.h +4 -0
  417. data/src/core/lib/promise/context.h +1 -1
  418. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  419. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  420. data/src/core/lib/promise/latch.h +0 -1
  421. data/src/core/lib/promise/loop.h +2 -0
  422. data/src/core/lib/promise/promise.h +1 -0
  423. data/src/core/lib/promise/race.h +0 -1
  424. data/src/core/lib/promise/seq.h +0 -2
  425. data/src/core/lib/promise/sleep.cc +38 -31
  426. data/src/core/lib/promise/sleep.h +32 -22
  427. data/src/core/lib/promise/try_seq.h +2 -2
  428. data/src/core/lib/resolver/resolver.cc +5 -0
  429. data/src/core/lib/resolver/resolver.h +3 -0
  430. data/src/core/lib/resolver/resolver_factory.h +6 -4
  431. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  432. data/src/core/lib/resolver/resolver_registry.h +12 -1
  433. data/src/core/lib/resolver/server_address.cc +17 -3
  434. data/src/core/lib/resolver/server_address.h +13 -6
  435. data/src/core/lib/resource_quota/api.cc +14 -1
  436. data/src/core/lib/resource_quota/api.h +4 -1
  437. data/src/core/lib/resource_quota/arena.cc +0 -6
  438. data/src/core/lib/resource_quota/arena.h +1 -2
  439. data/src/core/lib/resource_quota/memory_quota.cc +62 -62
  440. data/src/core/lib/resource_quota/memory_quota.h +35 -30
  441. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  442. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  443. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  444. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  445. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  446. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  447. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  448. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  449. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  450. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +15 -0
  451. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  452. data/src/core/lib/security/authorization/matchers.cc +9 -1
  453. data/src/core/lib/security/authorization/matchers.h +7 -0
  454. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  455. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  456. data/src/core/lib/security/context/security_context.cc +5 -2
  457. data/src/core/lib/security/context/security_context.h +14 -2
  458. data/src/core/lib/security/credentials/alts/alts_credentials.cc +12 -4
  459. data/src/core/lib/security/credentials/alts/alts_credentials.h +8 -3
  460. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  461. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  462. data/src/core/lib/security/credentials/call_creds_util.cc +10 -0
  463. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  464. data/src/core/lib/security/credentials/channel_creds_registry.h +7 -1
  465. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  466. data/src/core/lib/security/credentials/composite/composite_credentials.cc +11 -7
  467. data/src/core/lib/security/credentials/composite/composite_credentials.h +21 -6
  468. data/src/core/lib/security/credentials/credentials.cc +4 -8
  469. data/src/core/lib/security/credentials/credentials.h +27 -18
  470. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +108 -9
  471. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +18 -0
  472. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  473. data/src/core/lib/security/credentials/external/external_account_credentials.cc +27 -9
  474. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  475. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  476. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  477. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +22 -4
  478. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  479. data/src/core/lib/security/credentials/fake/fake_credentials.cc +21 -9
  480. data/src/core/lib/security/credentials/fake/fake_credentials.h +15 -3
  481. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  482. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +51 -24
  483. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +12 -3
  484. data/src/core/lib/security/credentials/iam/iam_credentials.cc +13 -4
  485. data/src/core/lib/security/credentials/iam/iam_credentials.h +12 -2
  486. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +12 -2
  487. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +9 -4
  488. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  489. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  490. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +14 -7
  491. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +16 -2
  492. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  494. data/src/core/lib/security/credentials/local/local_credentials.cc +12 -5
  495. data/src/core/lib/security/credentials/local/local_credentials.h +9 -2
  496. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +36 -19
  497. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +24 -4
  498. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +12 -8
  499. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +25 -1
  500. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +13 -2
  501. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +17 -4
  502. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  503. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  504. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +39 -10
  505. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +14 -11
  506. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +35 -3
  507. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +34 -11
  508. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  509. data/src/core/lib/security/credentials/tls/tls_credentials.cc +17 -2
  510. data/src/core/lib/security/credentials/tls/tls_credentials.h +7 -3
  511. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  512. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  513. data/src/core/lib/security/credentials/xds/xds_credentials.cc +20 -4
  514. data/src/core/lib/security/credentials/xds/xds_credentials.h +19 -5
  515. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  516. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  517. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +18 -2
  518. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  519. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  520. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  521. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  522. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  523. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  524. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  525. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  526. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  527. data/src/core/lib/security/security_connector/security_connector.h +19 -7
  528. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +19 -7
  529. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  530. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  531. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  532. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  533. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  534. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  535. data/src/core/lib/security/transport/auth_filters.h +7 -0
  536. data/src/core/lib/security/transport/client_auth_filter.cc +24 -17
  537. data/src/core/lib/security/transport/secure_endpoint.cc +81 -20
  538. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  539. data/src/core/lib/security/transport/security_handshaker.cc +49 -16
  540. data/src/core/lib/security/transport/security_handshaker.h +5 -1
  541. data/src/core/lib/security/transport/server_auth_filter.cc +29 -6
  542. data/src/core/lib/security/util/json_util.cc +3 -2
  543. data/src/core/lib/security/util/json_util.h +0 -2
  544. data/src/core/lib/service_config/service_config.h +4 -8
  545. data/src/core/lib/service_config/service_config_call_data.h +6 -2
  546. data/src/core/lib/service_config/service_config_impl.cc +13 -6
  547. data/src/core/lib/service_config/service_config_impl.h +9 -4
  548. data/src/core/lib/service_config/service_config_parser.cc +8 -2
  549. data/src/core/lib/service_config/service_config_parser.h +7 -0
  550. data/src/core/lib/slice/b64.cc +1 -1
  551. data/src/core/lib/slice/b64.h +2 -0
  552. data/src/core/lib/slice/percent_encoding.cc +4 -1
  553. data/src/core/lib/slice/percent_encoding.h +0 -6
  554. data/src/core/lib/slice/slice.cc +2 -1
  555. data/src/core/lib/slice/slice.h +10 -5
  556. data/src/core/lib/slice/slice_api.cc +1 -1
  557. data/src/core/lib/slice/slice_buffer.cc +79 -23
  558. data/src/core/lib/slice/slice_buffer.h +137 -0
  559. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  560. data/src/core/lib/slice/slice_internal.h +4 -3
  561. data/src/core/lib/slice/slice_refcount.h +2 -3
  562. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  563. data/src/core/lib/slice/slice_string_helpers.cc +0 -16
  564. data/src/core/lib/slice/slice_string_helpers.h +1 -8
  565. data/src/core/lib/surface/builtins.cc +7 -2
  566. data/src/core/lib/surface/byte_buffer.cc +7 -1
  567. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  568. data/src/core/lib/surface/call.cc +90 -137
  569. data/src/core/lib/surface/call.h +21 -3
  570. data/src/core/lib/surface/call_details.cc +4 -4
  571. data/src/core/lib/surface/call_log_batch.cc +7 -1
  572. data/src/core/lib/surface/call_test_only.h +4 -1
  573. data/src/core/lib/surface/channel.cc +179 -242
  574. data/src/core/lib/surface/channel.h +97 -58
  575. data/src/core/lib/surface/channel_init.h +2 -0
  576. data/src/core/lib/surface/channel_ping.cc +8 -2
  577. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  578. data/src/core/lib/surface/channel_stack_type.h +0 -2
  579. data/src/core/lib/surface/completion_queue.cc +29 -20
  580. data/src/core/lib/surface/completion_queue.h +7 -2
  581. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  582. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  583. data/src/core/lib/surface/event_string.cc +1 -7
  584. data/src/core/lib/surface/event_string.h +1 -1
  585. data/src/core/lib/surface/init.cc +17 -46
  586. data/src/core/lib/surface/init.h +0 -8
  587. data/src/core/lib/surface/lame_client.cc +63 -109
  588. data/src/core/lib/surface/lame_client.h +41 -3
  589. data/src/core/lib/surface/metadata_array.cc +2 -0
  590. data/src/core/lib/surface/server.cc +83 -64
  591. data/src/core/lib/surface/server.h +42 -9
  592. data/src/core/lib/surface/validate_metadata.cc +3 -6
  593. data/src/core/lib/surface/validate_metadata.h +3 -0
  594. data/src/core/lib/surface/version.cc +2 -2
  595. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  596. data/src/core/lib/transport/bdp_estimator.h +2 -3
  597. data/src/core/lib/transport/connectivity_state.cc +6 -4
  598. data/src/core/lib/transport/connectivity_state.h +2 -3
  599. data/src/core/lib/transport/error_utils.cc +16 -8
  600. data/src/core/lib/transport/error_utils.h +5 -1
  601. data/src/core/lib/{channel → transport}/handshaker.cc +12 -7
  602. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  603. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  604. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  605. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  606. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +28 -14
  607. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  608. data/src/core/lib/transport/metadata_batch.cc +287 -0
  609. data/src/core/lib/transport/metadata_batch.h +133 -264
  610. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  611. data/src/core/lib/transport/parsed_metadata.h +10 -3
  612. data/src/core/lib/transport/status_conversion.cc +2 -0
  613. data/src/core/lib/transport/status_conversion.h +2 -2
  614. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  615. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  616. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  617. data/src/core/lib/transport/timeout_encoding.h +5 -1
  618. data/src/core/lib/transport/transport.cc +18 -20
  619. data/src/core/lib/transport/transport.h +48 -16
  620. data/src/core/lib/transport/transport_fwd.h +20 -0
  621. data/src/core/lib/transport/transport_impl.h +11 -0
  622. data/src/core/lib/transport/transport_op_string.cc +17 -18
  623. data/src/core/lib/uri/uri_parser.cc +11 -3
  624. data/src/core/lib/uri/uri_parser.h +0 -2
  625. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  626. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  627. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  628. data/src/core/tsi/fake_transport_security.cc +13 -1
  629. data/src/core/tsi/fake_transport_security.h +6 -0
  630. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  631. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  632. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  633. data/src/core/tsi/ssl_transport_security.cc +1 -1
  634. data/src/core/tsi/transport_security_grpc.cc +3 -2
  635. data/src/core/tsi/transport_security_grpc.h +5 -2
  636. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  637. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  638. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  639. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  640. data/src/ruby/ext/grpc/extconf.rb +50 -19
  641. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  642. data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
  643. data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
  644. data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
  645. data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
  646. data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
  647. data/src/ruby/lib/grpc/errors.rb +1 -1
  648. data/src/ruby/lib/grpc/grpc_c.so +0 -0
  649. data/src/ruby/lib/grpc/version.rb +1 -1
  650. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  651. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  652. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  653. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  654. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  655. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  656. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  657. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  658. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  659. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  660. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  661. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  662. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  663. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  664. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  665. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  666. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  667. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  668. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  669. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  670. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  671. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  672. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  673. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  674. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  675. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  676. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  677. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  678. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  679. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  680. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +510 -0
  681. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  682. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  683. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  684. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  685. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  686. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  687. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  688. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  689. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  690. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  691. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  692. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  693. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  694. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  695. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  696. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  697. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  698. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  699. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  700. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  701. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  702. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  703. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  704. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  705. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  706. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  707. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  708. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  709. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  710. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  711. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  712. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  713. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  714. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  715. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  716. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  717. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  718. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  719. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  720. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  721. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  722. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  723. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  724. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  725. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  726. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  727. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  728. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  729. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  730. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  731. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  732. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  733. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  734. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  735. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  736. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  737. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  738. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  739. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  740. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  741. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  742. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  743. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  744. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  745. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  746. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  747. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  748. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  749. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  750. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  751. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  752. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  753. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  754. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  755. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  756. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  757. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  758. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  759. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  760. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  761. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  762. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  763. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  764. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  765. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  766. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  767. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  768. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  769. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  770. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  771. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  772. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  773. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  774. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  775. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  776. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  777. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  778. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  779. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  780. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  781. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  782. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  783. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  784. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  785. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  786. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  787. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  788. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  789. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  790. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  791. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  792. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  793. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  794. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  795. metadata +69 -38
  796. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  797. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  798. data/src/core/lib/event_engine/sockaddr.h +0 -44
  799. data/src/core/lib/gprpp/capture.h +0 -76
  800. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  801. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  802. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  803. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  804. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  805. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  806. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  807. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  808. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  809. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  810. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  811. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  812. data/src/core/lib/slice/slice_split.cc +0 -100
  813. data/src/core/lib/slice/slice_split.h +0 -40
  814. data/src/core/lib/transport/byte_stream.cc +0 -164
  815. data/src/core/lib/transport/byte_stream.h +0 -166
  816. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -16,33 +16,69 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <inttypes.h>
19
20
  #include <stdlib.h>
20
- #include <string.h>
21
21
 
22
+ #include <algorithm>
23
+ #include <atomic>
24
+ #include <cmath>
25
+ #include <map>
26
+ #include <memory>
27
+ #include <string>
28
+ #include <type_traits>
29
+ #include <utility>
30
+ #include <vector>
31
+
32
+ #include "absl/base/attributes.h"
33
+ #include "absl/base/thread_annotations.h"
34
+ #include "absl/container/inlined_vector.h"
35
+ #include "absl/memory/memory.h"
36
+ #include "absl/status/status.h"
37
+ #include "absl/status/statusor.h"
22
38
  #include "absl/strings/numbers.h"
23
39
  #include "absl/strings/str_cat.h"
40
+ #include "absl/strings/string_view.h"
41
+ #include "absl/types/optional.h"
42
+
24
43
  #define XXH_INLINE_ALL
25
44
  #include "xxhash.h"
26
45
 
27
- #include <grpc/support/alloc.h>
46
+ #include <grpc/impl/codegen/connectivity_state.h>
47
+ #include <grpc/impl/codegen/grpc_types.h>
48
+ #include <grpc/support/log.h>
28
49
 
50
+ #include "src/core/ext/filters/client_channel/client_channel.h"
51
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
29
52
  #include "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h"
53
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
30
54
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
31
- #include "src/core/ext/filters/client_channel/subchannel.h"
55
+ #include "src/core/ext/filters/client_channel/subchannel_interface.h"
32
56
  #include "src/core/lib/address_utils/sockaddr_utils.h"
33
- #include "src/core/lib/channel/channel_args.h"
34
57
  #include "src/core/lib/debug/trace.h"
35
58
  #include "src/core/lib/gpr/string.h"
59
+ #include "src/core/lib/gprpp/debug_location.h"
60
+ #include "src/core/lib/gprpp/orphanable.h"
61
+ #include "src/core/lib/gprpp/ref_counted.h"
36
62
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
37
63
  #include "src/core/lib/gprpp/sync.h"
64
+ #include "src/core/lib/gprpp/unique_type_name.h"
65
+ #include "src/core/lib/iomgr/closure.h"
66
+ #include "src/core/lib/iomgr/error.h"
67
+ #include "src/core/lib/iomgr/exec_ctx.h"
68
+ #include "src/core/lib/iomgr/work_serializer.h"
69
+ #include "src/core/lib/json/json.h"
70
+ #include "src/core/lib/resolver/server_address.h"
38
71
  #include "src/core/lib/transport/connectivity_state.h"
39
- #include "src/core/lib/transport/error_utils.h"
40
72
 
41
73
  namespace grpc_core {
42
74
 
43
- const char* kRequestRingHashAttribute = "request_ring_hash";
44
75
  TraceFlag grpc_lb_ring_hash_trace(false, "ring_hash_lb");
45
76
 
77
+ UniqueTypeName RequestHashAttributeName() {
78
+ static UniqueTypeName::Factory kFactory("request_hash");
79
+ return kFactory.Create();
80
+ }
81
+
46
82
  // Helper Parser method
47
83
  void ParseRingHashLbConfig(const Json& json, size_t* min_ring_size,
48
84
  size_t* max_ring_size,
@@ -137,41 +173,52 @@ class RingHash : public LoadBalancingPolicy {
137
173
  : SubchannelData(subchannel_list, address, std::move(subchannel)),
138
174
  address_(address) {}
139
175
 
140
- grpc_connectivity_state GetConnectivityState() const {
141
- return connectivity_state_for_picker_.load(std::memory_order_relaxed);
142
- }
143
-
144
176
  const ServerAddress& address() const { return address_; }
145
177
 
146
- bool seen_failure_since_ready() const { return seen_failure_since_ready_; }
178
+ grpc_connectivity_state GetConnectivityState() const {
179
+ return connectivity_state_.load(std::memory_order_relaxed);
180
+ }
147
181
 
148
- // Performs connectivity state updates that need to be done both when we
149
- // first start watching and when a watcher notification is received.
150
- void UpdateConnectivityStateLocked(
151
- grpc_connectivity_state connectivity_state);
182
+ absl::Status GetConnectivityStatus() const {
183
+ MutexLock lock(&mu_);
184
+ return connectivity_status_;
185
+ }
152
186
 
153
187
  private:
154
188
  // Performs connectivity state updates that need to be done only
155
189
  // after we have started watching.
156
190
  void ProcessConnectivityChangeLocked(
157
- grpc_connectivity_state connectivity_state) override;
191
+ absl::optional<grpc_connectivity_state> old_state,
192
+ grpc_connectivity_state new_state) override;
158
193
 
159
194
  ServerAddress address_;
160
- grpc_connectivity_state last_connectivity_state_ = GRPC_CHANNEL_SHUTDOWN;
161
- std::atomic<grpc_connectivity_state> connectivity_state_for_picker_{
162
- GRPC_CHANNEL_IDLE};
163
- bool seen_failure_since_ready_ = false;
195
+
196
+ // Last logical connectivity state seen.
197
+ // Note that this may differ from the state actually reported by the
198
+ // subchannel in some cases; for example, once this is set to
199
+ // TRANSIENT_FAILURE, we do not change it again until we get READY,
200
+ // so we skip any interim stops in CONNECTING.
201
+ // Uses an atomic so that it can be accessed outside of the WorkSerializer.
202
+ std::atomic<grpc_connectivity_state> connectivity_state_{GRPC_CHANNEL_IDLE};
203
+
204
+ mutable Mutex mu_;
205
+ absl::Status connectivity_status_ ABSL_GUARDED_BY(&mu_);
164
206
  };
165
207
 
166
208
  // A list of subchannels.
167
209
  class RingHashSubchannelList
168
210
  : public SubchannelList<RingHashSubchannelList, RingHashSubchannelData> {
169
211
  public:
170
- RingHashSubchannelList(RingHash* policy, TraceFlag* tracer,
171
- ServerAddressList addresses,
212
+ RingHashSubchannelList(RingHash* policy, ServerAddressList addresses,
172
213
  const grpc_channel_args& args)
173
- : SubchannelList(policy, tracer, std::move(addresses),
174
- policy->channel_control_helper(), args) {
214
+ : SubchannelList(policy,
215
+ (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)
216
+ ? "RingHashSubchannelList"
217
+ : nullptr),
218
+ std::move(addresses), policy->channel_control_helper(),
219
+ args),
220
+ num_idle_(num_subchannels()),
221
+ ring_(MakeRefCounted<Ring>(policy, Ref(DEBUG_LOCATION, "Ring"))) {
175
222
  // Need to maintain a ref to the LB policy as long as we maintain
176
223
  // any references to subchannels, since the subchannels'
177
224
  // pollset_sets will include the LB policy's pollset_set.
@@ -179,13 +226,11 @@ class RingHash : public LoadBalancingPolicy {
179
226
  }
180
227
 
181
228
  ~RingHashSubchannelList() override {
229
+ ring_.reset(DEBUG_LOCATION, "~RingHashSubchannelList");
182
230
  RingHash* p = static_cast<RingHash*>(policy());
183
231
  p->Unref(DEBUG_LOCATION, "subchannel_list");
184
232
  }
185
233
 
186
- // Starts watching the subchannels in this list.
187
- void StartWatchingLocked();
188
-
189
234
  // Updates the counters of subchannels in each state when a
190
235
  // subchannel transitions from old_state to new_state.
191
236
  void UpdateStateCountersLocked(grpc_connectivity_state old_state,
@@ -193,18 +238,44 @@ class RingHash : public LoadBalancingPolicy {
193
238
 
194
239
  // Updates the RH policy's connectivity state based on the
195
240
  // subchannel list's state counters, creating new picker and new ring.
196
- // Furthermore, return a bool indicating whether the aggregated state is
197
- // Transient Failure.
198
- bool UpdateRingHashConnectivityStateLocked();
199
-
200
- // Create a new ring from this subchannel list.
201
- RefCountedPtr<Ring> MakeRing();
241
+ // The index parameter indicates the index into the list of the subchannel
242
+ // whose status report triggered the call to
243
+ // UpdateRingHashConnectivityStateLocked().
244
+ // connection_attempt_complete is true if the subchannel just
245
+ // finished a connection attempt.
246
+ void UpdateRingHashConnectivityStateLocked(size_t index,
247
+ bool connection_attempt_complete,
248
+ absl::Status status);
202
249
 
203
250
  private:
204
- size_t num_idle_ = 0;
251
+ bool AllSubchannelsSeenInitialState() {
252
+ for (size_t i = 0; i < num_subchannels(); ++i) {
253
+ if (!subchannel(i)->connectivity_state().has_value()) return false;
254
+ }
255
+ return true;
256
+ }
257
+
258
+ void ShutdownLocked() override {
259
+ ring_.reset(DEBUG_LOCATION, "RingHashSubchannelList::ShutdownLocked()");
260
+ SubchannelList::ShutdownLocked();
261
+ }
262
+
263
+ size_t num_idle_;
205
264
  size_t num_ready_ = 0;
206
265
  size_t num_connecting_ = 0;
207
266
  size_t num_transient_failure_ = 0;
267
+
268
+ RefCountedPtr<Ring> ring_;
269
+
270
+ // The index of the subchannel currently doing an internally
271
+ // triggered connection attempt, if any.
272
+ absl::optional<size_t> internally_triggered_connection_index_;
273
+
274
+ // TODO(roth): If we ever change the helper UpdateState() API to not
275
+ // need the status reported for TRANSIENT_FAILURE state (because
276
+ // it's not currently actually used for anything outside of the picker),
277
+ // then we will no longer need this data member.
278
+ absl::Status last_failure_;
208
279
  };
209
280
 
210
281
  class Ring : public RefCounted<Ring> {
@@ -259,7 +330,7 @@ class RingHash : public LoadBalancingPolicy {
259
330
  [self]() {
260
331
  if (!self->ring_hash_lb_->shutdown_) {
261
332
  for (auto& subchannel : self->subchannels_) {
262
- subchannel->AttemptToConnect();
333
+ subchannel->RequestConnection();
263
334
  }
264
335
  }
265
336
  delete self;
@@ -269,7 +340,7 @@ class RingHash : public LoadBalancingPolicy {
269
340
 
270
341
  RefCountedPtr<RingHash> ring_hash_lb_;
271
342
  grpc_closure closure_;
272
- absl::InlinedVector<RefCountedPtr<SubchannelInterface>, 10> subchannels_;
343
+ std::vector<RefCountedPtr<SubchannelInterface>> subchannels_;
273
344
  };
274
345
 
275
346
  RefCountedPtr<RingHash> parent_;
@@ -283,11 +354,9 @@ class RingHash : public LoadBalancingPolicy {
283
354
 
284
355
  // list of subchannels.
285
356
  OrphanablePtr<RingHashSubchannelList> subchannel_list_;
357
+ OrphanablePtr<RingHashSubchannelList> latest_pending_subchannel_list_;
286
358
  // indicating if we are shutting down.
287
359
  bool shutdown_ = false;
288
-
289
- // Current ring.
290
- RefCountedPtr<Ring> ring_;
291
360
  };
292
361
 
293
362
  //
@@ -316,9 +385,10 @@ RingHash::Ring::Ring(RingHash* parent,
316
385
  ServerAddressWeightAttribute::kServerAddressWeightAttributeKey));
317
386
  AddressWeight address_weight;
318
387
  address_weight.address =
319
- grpc_sockaddr_to_string(&sd->address().address(), false);
320
- if (weight_attribute != nullptr) {
321
- GPR_ASSERT(weight_attribute->weight() != 0);
388
+ grpc_sockaddr_to_string(&sd->address().address(), false).value();
389
+ // Weight should never be zero, but ignore it just in case, since
390
+ // that value would screw up the ring-building algorithm.
391
+ if (weight_attribute != nullptr && weight_attribute->weight() > 0) {
322
392
  address_weight.weight = weight_attribute->weight();
323
393
  }
324
394
  sum += address_weight.weight;
@@ -347,7 +417,7 @@ RingHash::Ring::Ring(RingHash* parent,
347
417
  std::ceil(min_normalized_weight * min_ring_size) / min_normalized_weight,
348
418
  static_cast<double>(max_ring_size));
349
419
  // Reserve memory for the entire ring up front.
350
- const uint64_t ring_size = std::ceil(scale);
420
+ const size_t ring_size = std::ceil(scale);
351
421
  ring_.reserve(ring_size);
352
422
  // Populate the hash ring by walking through the (host, weight) pairs in
353
423
  // normalized_host_weights, and generating (scale * weight) hashes for each
@@ -399,23 +469,24 @@ RingHash::Ring::Ring(RingHash* parent,
399
469
  //
400
470
 
401
471
  RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
402
- auto hash =
403
- args.call_state->ExperimentalGetCallAttribute(kRequestRingHashAttribute);
472
+ auto* call_state = static_cast<ClientChannel::LoadBalancedCall::LbCallState*>(
473
+ args.call_state);
474
+ auto hash = call_state->GetCallAttribute(RequestHashAttributeName());
404
475
  uint64_t h;
405
476
  if (!absl::SimpleAtoi(hash, &h)) {
406
477
  return PickResult::Fail(
407
- absl::InternalError("xds ring hash value is not a number"));
478
+ absl::InternalError("ring hash value is not a number"));
408
479
  }
409
480
  const std::vector<Ring::Entry>& ring = ring_->ring();
410
481
  // Ported from https://github.com/RJ/ketama/blob/master/libketama/ketama.c
411
482
  // (ketama_get_server) NOTE: The algorithm depends on using signed integers
412
483
  // for lowp, highp, and first_index. Do not change them!
413
- int64_t lowp = 0;
414
- int64_t highp = ring.size();
415
- int64_t first_index = 0;
484
+ size_t lowp = 0;
485
+ size_t highp = ring.size();
486
+ size_t first_index = 0;
416
487
  while (true) {
417
488
  first_index = (lowp + highp) / 2;
418
- if (first_index == static_cast<int64_t>(ring.size())) {
489
+ if (first_index == ring.size()) {
419
490
  first_index = 0;
420
491
  break;
421
492
  }
@@ -499,35 +570,17 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
499
570
  }
500
571
  }
501
572
  }
502
- return PickResult::Fail(absl::UnavailableError(
503
- "xds ring hash found a subchannel that is in TRANSIENT_FAILURE state"));
573
+ return PickResult::Fail(absl::UnavailableError(absl::StrCat(
574
+ "ring hash cannot find a connected subchannel; first failure: ",
575
+ ring[first_index].subchannel->GetConnectivityStatus().ToString())));
504
576
  }
505
577
 
506
578
  //
507
579
  // RingHash::RingHashSubchannelList
508
580
  //
509
581
 
510
- void RingHash::RingHashSubchannelList::StartWatchingLocked() {
511
- if (num_subchannels() == 0) return;
512
- // Check current state of each subchannel synchronously.
513
- for (size_t i = 0; i < num_subchannels(); ++i) {
514
- grpc_connectivity_state state =
515
- subchannel(i)->CheckConnectivityStateLocked();
516
- subchannel(i)->UpdateConnectivityStateLocked(state);
517
- }
518
- // Start connectivity watch for each subchannel.
519
- for (size_t i = 0; i < num_subchannels(); i++) {
520
- if (subchannel(i)->subchannel() != nullptr) {
521
- subchannel(i)->StartConnectivityWatchLocked();
522
- }
523
- }
524
- // Send updated state to parent based on reported subchannel states.
525
- UpdateRingHashConnectivityStateLocked();
526
- }
527
-
528
582
  void RingHash::RingHashSubchannelList::UpdateStateCountersLocked(
529
583
  grpc_connectivity_state old_state, grpc_connectivity_state new_state) {
530
- GPR_ASSERT(new_state != GRPC_CHANNEL_SHUTDOWN);
531
584
  if (old_state == GRPC_CHANNEL_IDLE) {
532
585
  GPR_ASSERT(num_idle_ > 0);
533
586
  --num_idle_;
@@ -541,6 +594,7 @@ void RingHash::RingHashSubchannelList::UpdateStateCountersLocked(
541
594
  GPR_ASSERT(num_transient_failure_ > 0);
542
595
  --num_transient_failure_;
543
596
  }
597
+ GPR_ASSERT(new_state != GRPC_CHANNEL_SHUTDOWN);
544
598
  if (new_state == GRPC_CHANNEL_IDLE) {
545
599
  ++num_idle_;
546
600
  } else if (new_state == GRPC_CHANNEL_READY) {
@@ -552,61 +606,116 @@ void RingHash::RingHashSubchannelList::UpdateStateCountersLocked(
552
606
  }
553
607
  }
554
608
 
555
- // Sets the RH policy's connectivity state and generates a new picker based
556
- // on the current subchannel list or requests an re-attempt by returning true..
557
- bool RingHash::RingHashSubchannelList::UpdateRingHashConnectivityStateLocked() {
609
+ void RingHash::RingHashSubchannelList::UpdateRingHashConnectivityStateLocked(
610
+ size_t index, bool connection_attempt_complete, absl::Status status) {
558
611
  RingHash* p = static_cast<RingHash*>(policy());
612
+ // If this is latest_pending_subchannel_list_, then swap it into
613
+ // subchannel_list_ as soon as we get the initial connectivity state
614
+ // report for every subchannel in the list.
615
+ if (p->latest_pending_subchannel_list_.get() == this &&
616
+ AllSubchannelsSeenInitialState()) {
617
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
618
+ gpr_log(GPR_INFO, "[RH %p] replacing subchannel list %p with %p", p,
619
+ p->subchannel_list_.get(), this);
620
+ }
621
+ p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_);
622
+ }
559
623
  // Only set connectivity state if this is the current subchannel list.
560
- if (p->subchannel_list_.get() != this) return false;
624
+ if (p->subchannel_list_.get() != this) return;
561
625
  // The overall aggregation rules here are:
562
626
  // 1. If there is at least one subchannel in READY state, report READY.
563
627
  // 2. If there are 2 or more subchannels in TRANSIENT_FAILURE state, report
564
- // TRANSIENT_FAILURE.
628
+ // TRANSIENT_FAILURE.
565
629
  // 3. If there is at least one subchannel in CONNECTING state, report
566
- // CONNECTING.
567
- // 4. If there is at least one subchannel in IDLE state, report IDLE.
568
- // 5. Otherwise, report TRANSIENT_FAILURE.
630
+ // CONNECTING.
631
+ // 4. If there is one subchannel in TRANSIENT_FAILURE state and there is
632
+ // more than one subchannel, report CONNECTING.
633
+ // 5. If there is at least one subchannel in IDLE state, report IDLE.
634
+ // 6. Otherwise, report TRANSIENT_FAILURE.
635
+ //
636
+ // We set start_connection_attempt to true if we match rules 2, 3, or 6.
637
+ grpc_connectivity_state state;
638
+ bool start_connection_attempt = false;
569
639
  if (num_ready_ > 0) {
570
- /* READY */
571
- p->channel_control_helper()->UpdateState(
572
- GRPC_CHANNEL_READY, absl::Status(),
573
- absl::make_unique<Picker>(p->Ref(DEBUG_LOCATION, "RingHashPicker"),
574
- p->ring_));
575
- return false;
576
- }
577
- if (num_connecting_ > 0 && num_transient_failure_ < 2) {
578
- p->channel_control_helper()->UpdateState(
579
- GRPC_CHANNEL_CONNECTING, absl::Status(),
580
- absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
581
- return false;
582
- }
583
- if (num_idle_ > 0 && num_transient_failure_ < 2) {
584
- p->channel_control_helper()->UpdateState(
585
- GRPC_CHANNEL_IDLE, absl::Status(),
586
- absl::make_unique<Picker>(p->Ref(DEBUG_LOCATION, "RingHashPicker"),
587
- p->ring_));
588
- return false;
589
- }
590
- absl::Status status =
591
- absl::UnavailableError("connections to backend failing or idle");
640
+ state = GRPC_CHANNEL_READY;
641
+ } else if (num_transient_failure_ >= 2) {
642
+ state = GRPC_CHANNEL_TRANSIENT_FAILURE;
643
+ start_connection_attempt = true;
644
+ } else if (num_connecting_ > 0) {
645
+ state = GRPC_CHANNEL_CONNECTING;
646
+ } else if (num_transient_failure_ == 1 && num_subchannels() > 1) {
647
+ state = GRPC_CHANNEL_CONNECTING;
648
+ start_connection_attempt = true;
649
+ } else if (num_idle_ > 0) {
650
+ state = GRPC_CHANNEL_IDLE;
651
+ } else {
652
+ state = GRPC_CHANNEL_TRANSIENT_FAILURE;
653
+ start_connection_attempt = true;
654
+ }
655
+ // In TRANSIENT_FAILURE, report the last reported failure.
656
+ // Otherwise, report OK.
657
+ if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
658
+ if (!status.ok()) {
659
+ last_failure_ = absl::UnavailableError(absl::StrCat(
660
+ "no reachable subchannels; last error: ", status.ToString()));
661
+ }
662
+ status = last_failure_;
663
+ } else {
664
+ status = absl::OkStatus();
665
+ }
666
+ // Generate new picker and return it to the channel.
667
+ // Note that we use our own picker regardless of connectivity state.
592
668
  p->channel_control_helper()->UpdateState(
593
- GRPC_CHANNEL_TRANSIENT_FAILURE, status,
594
- absl::make_unique<TransientFailurePicker>(status));
595
- return true;
596
- }
597
-
598
- RefCountedPtr<RingHash::Ring> RingHash::RingHashSubchannelList::MakeRing() {
599
- RingHash* p = static_cast<RingHash*>(policy());
600
- return MakeRefCounted<Ring>(p, Ref(DEBUG_LOCATION, "Ring"));
669
+ state, status,
670
+ absl::make_unique<Picker>(p->Ref(DEBUG_LOCATION, "RingHashPicker"),
671
+ ring_));
672
+ // While the ring_hash policy is reporting TRANSIENT_FAILURE, it will
673
+ // not be getting any pick requests from the priority policy.
674
+ // However, because the ring_hash policy does not attempt to
675
+ // reconnect to subchannels unless it is getting pick requests,
676
+ // it will need special handling to ensure that it will eventually
677
+ // recover from TRANSIENT_FAILURE state once the problem is resolved.
678
+ // Specifically, it will make sure that it is attempting to connect to
679
+ // at least one subchannel at any given time. After a given subchannel
680
+ // fails a connection attempt, it will move on to the next subchannel
681
+ // in the ring. It will keep doing this until one of the subchannels
682
+ // successfully connects, at which point it will report READY and stop
683
+ // proactively trying to connect. The policy will remain in
684
+ // TRANSIENT_FAILURE until at least one subchannel becomes connected,
685
+ // even if subchannels are in state CONNECTING during that time.
686
+ //
687
+ // Note that we do the same thing when the policy is in state
688
+ // CONNECTING, just to ensure that we don't remain in CONNECTING state
689
+ // indefinitely if there are no new picks coming in.
690
+ if (internally_triggered_connection_index_.has_value() &&
691
+ *internally_triggered_connection_index_ == index &&
692
+ connection_attempt_complete) {
693
+ internally_triggered_connection_index_.reset();
694
+ }
695
+ if (start_connection_attempt &&
696
+ !internally_triggered_connection_index_.has_value()) {
697
+ size_t next_index = (index + 1) % num_subchannels();
698
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
699
+ gpr_log(GPR_INFO,
700
+ "[RH %p] triggering internal connection attempt for subchannel "
701
+ "%p, subchannel_list %p (index %" PRIuPTR " of %" PRIuPTR ")",
702
+ p, subchannel(next_index)->subchannel(), this, next_index,
703
+ num_subchannels());
704
+ }
705
+ internally_triggered_connection_index_ = next_index;
706
+ subchannel(next_index)->subchannel()->RequestConnection();
707
+ }
601
708
  }
602
709
 
603
710
  //
604
711
  // RingHash::RingHashSubchannelData
605
712
  //
606
713
 
607
- void RingHash::RingHashSubchannelData::UpdateConnectivityStateLocked(
608
- grpc_connectivity_state connectivity_state) {
714
+ void RingHash::RingHashSubchannelData::ProcessConnectivityChangeLocked(
715
+ absl::optional<grpc_connectivity_state> old_state,
716
+ grpc_connectivity_state new_state) {
609
717
  RingHash* p = static_cast<RingHash*>(subchannel_list()->policy());
718
+ grpc_connectivity_state last_connectivity_state = GetConnectivityState();
610
719
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
611
720
  gpr_log(
612
721
  GPR_INFO,
@@ -614,79 +723,54 @@ void RingHash::RingHashSubchannelData::UpdateConnectivityStateLocked(
614
723
  "(index %" PRIuPTR " of %" PRIuPTR "): prev_state=%s new_state=%s",
615
724
  p, subchannel(), subchannel_list(), Index(),
616
725
  subchannel_list()->num_subchannels(),
617
- ConnectivityStateName(last_connectivity_state_),
618
- ConnectivityStateName(connectivity_state));
619
- }
620
- // Decide what state to report for aggregation purposes.
621
- // If we haven't seen a failure since the last time we were in state
622
- // READY, then we report the state change as-is. However, once we do see
623
- // a failure, we report TRANSIENT_FAILURE and do not report any subsequent
624
- // state changes until we go back into state READY.
625
- if (!seen_failure_since_ready_) {
626
- if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
627
- seen_failure_since_ready_ = true;
628
- }
629
- subchannel_list()->UpdateStateCountersLocked(last_connectivity_state_,
630
- connectivity_state);
631
- } else {
632
- if (connectivity_state == GRPC_CHANNEL_READY) {
633
- seen_failure_since_ready_ = false;
634
- subchannel_list()->UpdateStateCountersLocked(
635
- GRPC_CHANNEL_TRANSIENT_FAILURE, connectivity_state);
636
- }
726
+ ConnectivityStateName(last_connectivity_state),
727
+ ConnectivityStateName(new_state));
637
728
  }
638
- // Record last seen connectivity state.
639
- last_connectivity_state_ = connectivity_state;
640
- }
641
-
642
- void RingHash::RingHashSubchannelData::ProcessConnectivityChangeLocked(
643
- grpc_connectivity_state connectivity_state) {
644
- RingHash* p = static_cast<RingHash*>(subchannel_list()->policy());
645
729
  GPR_ASSERT(subchannel() != nullptr);
646
- // Update connectivity state used by picker.
647
- connectivity_state_for_picker_.store(connectivity_state,
648
- std::memory_order_relaxed);
649
- // If the new state is TRANSIENT_FAILURE, re-resolve.
650
- // Only do this if we've started watching, not at startup time.
651
- // Otherwise, if the subchannel was already in state TRANSIENT_FAILURE
652
- // when the subchannel list was created, we'd wind up in a constant
653
- // loop of re-resolution.
654
- // Also attempt to reconnect.
655
- if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
730
+ // If this is not the initial state notification and the new state is
731
+ // TRANSIENT_FAILURE or IDLE, re-resolve.
732
+ // Note that we don't want to do this on the initial state notification,
733
+ // because that would result in an endless loop of re-resolution.
734
+ if (old_state.has_value() && (new_state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
735
+ new_state == GRPC_CHANNEL_IDLE)) {
656
736
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
657
737
  gpr_log(GPR_INFO,
658
- "[RH %p] Subchannel %p has gone into TRANSIENT_FAILURE. "
659
- "Requesting re-resolution",
660
- p, subchannel());
738
+ "[RH %p] Subchannel %p reported %s; requesting re-resolution", p,
739
+ subchannel(), ConnectivityStateName(new_state));
661
740
  }
662
741
  p->channel_control_helper()->RequestReresolution();
663
742
  }
664
- // Update state counters.
665
- UpdateConnectivityStateLocked(connectivity_state);
743
+ const bool connection_attempt_complete = new_state != GRPC_CHANNEL_CONNECTING;
744
+ // Decide what state to report for the purposes of aggregation and
745
+ // picker behavior.
746
+ // If the last recorded state was TRANSIENT_FAILURE, ignore the update
747
+ // unless the new state is READY.
748
+ bool update_status = true;
749
+ absl::Status status = connectivity_status();
750
+ if (last_connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE &&
751
+ new_state != GRPC_CHANNEL_READY &&
752
+ new_state != GRPC_CHANNEL_TRANSIENT_FAILURE) {
753
+ new_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
754
+ {
755
+ MutexLock lock(&mu_);
756
+ status = connectivity_status_;
757
+ }
758
+ update_status = false;
759
+ }
760
+ // Update state counters used for aggregation.
761
+ subchannel_list()->UpdateStateCountersLocked(last_connectivity_state,
762
+ new_state);
763
+ // Update status seen by picker if needed.
764
+ if (update_status) {
765
+ MutexLock lock(&mu_);
766
+ connectivity_status_ = connectivity_status();
767
+ }
768
+ // Update last seen state, also used by picker.
769
+ connectivity_state_.store(new_state, std::memory_order_relaxed);
666
770
  // Update the RH policy's connectivity state, creating new picker and new
667
771
  // ring.
668
- bool transient_failure =
669
- subchannel_list()->UpdateRingHashConnectivityStateLocked();
670
- // While the ring_hash policy is reporting TRANSIENT_FAILURE, it will
671
- // not be getting any pick requests from the priority policy.
672
- // However, because the ring_hash policy does not attempt to
673
- // reconnect to subchannels unless it is getting pick requests,
674
- // it will need special handling to ensure that it will eventually
675
- // recover from TRANSIENT_FAILURE state once the problem is resolved.
676
- // Specifically, it will make sure that it is attempting to connect to
677
- // at least one subchannel at any given time. After a given subchannel
678
- // fails a connection attempt, it will move on to the next subchannel
679
- // in the ring. It will keep doing this until one of the subchannels
680
- // successfully connects, at which point it will report READY and stop
681
- // proactively trying to connect. The policy will remain in
682
- // TRANSIENT_FAILURE until at least one subchannel becomes connected,
683
- // even if subchannels are in state CONNECTING during that time.
684
- if (transient_failure &&
685
- connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
686
- size_t next_index = (Index() + 1) % subchannel_list()->num_subchannels();
687
- RingHashSubchannelData* next_sd = subchannel_list()->subchannel(next_index);
688
- next_sd->subchannel()->AttemptToConnect();
689
- }
772
+ subchannel_list()->UpdateRingHashConnectivityStateLocked(
773
+ Index(), connection_attempt_complete, status);
690
774
  }
691
775
 
692
776
  //
@@ -704,6 +788,7 @@ RingHash::~RingHash() {
704
788
  gpr_log(GPR_INFO, "[RH %p] Destroying Ring Hash policy", this);
705
789
  }
706
790
  GPR_ASSERT(subchannel_list_ == nullptr);
791
+ GPR_ASSERT(latest_pending_subchannel_list_ == nullptr);
707
792
  }
708
793
 
709
794
  void RingHash::ShutdownLocked() {
@@ -712,10 +797,15 @@ void RingHash::ShutdownLocked() {
712
797
  }
713
798
  shutdown_ = true;
714
799
  subchannel_list_.reset();
715
- ring_.reset(DEBUG_LOCATION, "RingHash");
800
+ latest_pending_subchannel_list_.reset();
716
801
  }
717
802
 
718
- void RingHash::ResetBackoffLocked() { subchannel_list_->ResetBackoffLocked(); }
803
+ void RingHash::ResetBackoffLocked() {
804
+ subchannel_list_->ResetBackoffLocked();
805
+ if (latest_pending_subchannel_list_ != nullptr) {
806
+ latest_pending_subchannel_list_->ResetBackoffLocked();
807
+ }
808
+ }
719
809
 
720
810
  void RingHash::UpdateLocked(UpdateArgs args) {
721
811
  config_ = std::move(args.config);
@@ -725,16 +815,7 @@ void RingHash::UpdateLocked(UpdateArgs args) {
725
815
  gpr_log(GPR_INFO, "[RH %p] received update with %" PRIuPTR " addresses",
726
816
  this, args.addresses->size());
727
817
  }
728
- // Filter out any address with weight 0.
729
- addresses.reserve(args.addresses->size());
730
- for (ServerAddress& address : *args.addresses) {
731
- const ServerAddressWeightAttribute* weight_attribute =
732
- static_cast<const ServerAddressWeightAttribute*>(address.GetAttribute(
733
- ServerAddressWeightAttribute::kServerAddressWeightAttributeKey));
734
- if (weight_attribute == nullptr || weight_attribute->weight() > 0) {
735
- addresses.emplace_back(std::move(address));
736
- }
737
- }
818
+ addresses = *std::move(args.addresses);
738
819
  } else {
739
820
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace)) {
740
821
  gpr_log(GPR_INFO, "[RH %p] received update with addresses error: %s",
@@ -744,22 +825,41 @@ void RingHash::UpdateLocked(UpdateArgs args) {
744
825
  // failure and keep using the existing list.
745
826
  if (subchannel_list_ != nullptr) return;
746
827
  }
747
- subchannel_list_ = MakeOrphanable<RingHashSubchannelList>(
748
- this, &grpc_lb_ring_hash_trace, std::move(addresses), *args.args);
749
- if (subchannel_list_->num_subchannels() == 0) {
750
- // If the new list is empty, immediately transition to TRANSIENT_FAILURE.
751
- absl::Status status =
752
- args.addresses.ok() ? absl::UnavailableError(absl::StrCat(
753
- "empty address list: ", args.resolution_note))
754
- : args.addresses.status();
755
- channel_control_helper()->UpdateState(
756
- GRPC_CHANNEL_TRANSIENT_FAILURE, status,
757
- absl::make_unique<TransientFailurePicker>(status));
758
- } else {
759
- // Build the ring.
760
- ring_ = subchannel_list_->MakeRing();
761
- // Start watching the new list.
762
- subchannel_list_->StartWatchingLocked();
828
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace) &&
829
+ latest_pending_subchannel_list_ != nullptr) {
830
+ gpr_log(GPR_INFO, "[RH %p] replacing latest pending subchannel list %p",
831
+ this, latest_pending_subchannel_list_.get());
832
+ }
833
+ latest_pending_subchannel_list_ = MakeOrphanable<RingHashSubchannelList>(
834
+ this, std::move(addresses), *args.args);
835
+ // If we have no existing list or the new list is empty, immediately
836
+ // promote the new list.
837
+ // Otherwise, do nothing; the new list will be promoted when the
838
+ // initial subchannel states are reported.
839
+ if (subchannel_list_ == nullptr ||
840
+ latest_pending_subchannel_list_->num_subchannels() == 0) {
841
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_ring_hash_trace) &&
842
+ subchannel_list_ != nullptr) {
843
+ gpr_log(GPR_INFO,
844
+ "[RH %p] empty address list, replacing subchannel list %p", this,
845
+ subchannel_list_.get());
846
+ }
847
+ subchannel_list_ = std::move(latest_pending_subchannel_list_);
848
+ // If the new list is empty, report TRANSIENT_FAILURE.
849
+ if (subchannel_list_->num_subchannels() == 0) {
850
+ absl::Status status =
851
+ args.addresses.ok()
852
+ ? absl::UnavailableError(
853
+ absl::StrCat("empty address list: ", args.resolution_note))
854
+ : args.addresses.status();
855
+ channel_control_helper()->UpdateState(
856
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
857
+ absl::make_unique<TransientFailurePicker>(status));
858
+ } else {
859
+ // Otherwise, report IDLE.
860
+ subchannel_list_->UpdateRingHashConnectivityStateLocked(
861
+ /*index=*/0, /*connection_attempt_complete=*/false, absl::OkStatus());
862
+ }
763
863
  }
764
864
  }
765
865