grpc 1.47.0 → 1.48.0.pre1

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

Potentially problematic release.


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

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