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
@@ -19,15 +19,17 @@
19
19
  #include <inttypes.h>
20
20
  #include <string.h>
21
21
 
22
+ #include <algorithm>
22
23
  #include <memory>
23
24
  #include <string>
24
25
  #include <utility>
26
+ #include <vector>
25
27
 
26
- #include "absl/container/inlined_vector.h"
27
28
  #include "absl/memory/memory.h"
28
29
  #include "absl/status/status.h"
29
30
  #include "absl/status/statusor.h"
30
31
  #include "absl/strings/str_cat.h"
32
+ #include "absl/types/optional.h"
31
33
 
32
34
  #include <grpc/impl/codegen/connectivity_state.h>
33
35
  #include <grpc/impl/codegen/grpc_types.h>
@@ -87,12 +89,11 @@ class PickFirst : public LoadBalancingPolicy {
87
89
  : SubchannelData(subchannel_list, address, std::move(subchannel)) {}
88
90
 
89
91
  void ProcessConnectivityChangeLocked(
90
- grpc_connectivity_state connectivity_state) override;
92
+ absl::optional<grpc_connectivity_state> old_state,
93
+ grpc_connectivity_state new_state) override;
91
94
 
92
95
  // Processes the connectivity change to READY for an unselected subchannel.
93
96
  void ProcessUnselectedReadyLocked();
94
-
95
- void CheckConnectivityStateAndStartWatchingLocked();
96
97
  };
97
98
 
98
99
  class PickFirstSubchannelList
@@ -111,6 +112,9 @@ class PickFirst : public LoadBalancingPolicy {
111
112
  // any references to subchannels, since the subchannels'
112
113
  // pollset_sets will include the LB policy's pollset_set.
113
114
  policy->Ref(DEBUG_LOCATION, "subchannel_list").release();
115
+ // Note that we do not start trying to connect to any subchannel here,
116
+ // since we will wait until we see the initial connectivity state for all
117
+ // subchannels before doing that.
114
118
  }
115
119
 
116
120
  ~PickFirstSubchannelList() override {
@@ -123,8 +127,19 @@ class PickFirst : public LoadBalancingPolicy {
123
127
  in_transient_failure_ = in_transient_failure;
124
128
  }
125
129
 
130
+ size_t attempting_index() const { return attempting_index_; }
131
+ void set_attempting_index(size_t index) { attempting_index_ = index; }
132
+
133
+ bool AllSubchannelsSeenInitialState() {
134
+ for (size_t i = 0; i < num_subchannels(); ++i) {
135
+ if (!subchannel(i)->connectivity_state().has_value()) return false;
136
+ }
137
+ return true;
138
+ }
139
+
126
140
  private:
127
141
  bool in_transient_failure_ = false;
142
+ size_t attempting_index_ = 0;
128
143
  };
129
144
 
130
145
  class Picker : public SubchannelPicker {
@@ -205,14 +220,18 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
205
220
  if (latest_update_args_.addresses.ok()) {
206
221
  addresses = *latest_update_args_.addresses;
207
222
  }
208
- auto subchannel_list = MakeOrphanable<PickFirstSubchannelList>(
223
+ // Replace latest_pending_subchannel_list_.
224
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace) &&
225
+ latest_pending_subchannel_list_ != nullptr) {
226
+ gpr_log(GPR_INFO,
227
+ "[PF %p] Shutting down previous pending subchannel list %p", this,
228
+ latest_pending_subchannel_list_.get());
229
+ }
230
+ latest_pending_subchannel_list_ = MakeOrphanable<PickFirstSubchannelList>(
209
231
  this, std::move(addresses), *latest_update_args_.args);
210
- // Empty update or no valid subchannels.
211
- if (subchannel_list->num_subchannels() == 0) {
212
- // Unsubscribe from all current subchannels.
213
- subchannel_list_ = std::move(subchannel_list); // Empty list.
214
- selected_ = nullptr;
215
- // Put the channel in TRANSIENT_FAILURE.
232
+ // Empty update or no valid subchannels. Put the channel in
233
+ // TRANSIENT_FAILURE.
234
+ if (latest_pending_subchannel_list_->num_subchannels() == 0) {
216
235
  absl::Status status =
217
236
  latest_update_args_.addresses.ok()
218
237
  ? absl::UnavailableError(absl::StrCat(
@@ -221,65 +240,24 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
221
240
  channel_control_helper()->UpdateState(
222
241
  GRPC_CHANNEL_TRANSIENT_FAILURE, status,
223
242
  absl::make_unique<TransientFailurePicker>(status));
224
- // If there was a previously pending update (which may or may
225
- // not have contained the currently selected subchannel), drop
226
- // it, so that it doesn't override what we've done here.
227
- latest_pending_subchannel_list_.reset();
228
- return;
229
243
  }
230
- // If one of the subchannels in the new list is already in state
231
- // READY, then select it immediately. This can happen when the
232
- // currently selected subchannel is also present in the update. It
233
- // can also happen if one of the subchannels in the update is already
234
- // in the global subchannel pool because it's in use by another channel.
235
- for (size_t i = 0; i < subchannel_list->num_subchannels(); ++i) {
236
- PickFirstSubchannelData* sd = subchannel_list->subchannel(i);
237
- grpc_connectivity_state state = sd->CheckConnectivityStateLocked();
238
- if (state == GRPC_CHANNEL_READY) {
239
- subchannel_list_ = std::move(subchannel_list);
240
- sd->StartConnectivityWatchLocked();
241
- sd->ProcessUnselectedReadyLocked();
242
- // If there was a previously pending update (which may or may
243
- // not have contained the currently selected subchannel), drop
244
- // it, so that it doesn't override what we've done here.
245
- latest_pending_subchannel_list_.reset();
246
- return;
247
- }
244
+ // Otherwise, if this is the initial update, report CONNECTING.
245
+ else if (subchannel_list_.get() == nullptr) {
246
+ channel_control_helper()->UpdateState(
247
+ GRPC_CHANNEL_CONNECTING, absl::Status(),
248
+ absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
248
249
  }
249
- if (selected_ == nullptr) {
250
- // We don't yet have a selected subchannel, so replace the current
251
- // subchannel list immediately.
252
- subchannel_list_ = std::move(subchannel_list);
253
- // If we're not in IDLE state, start trying to connect to the first
254
- // subchannel in the new list.
255
- // Note: No need to use CheckConnectivityStateAndStartWatchingLocked()
256
- // here, since we've already checked the initial connectivity
257
- // state of all subchannels above.
258
- subchannel_list_->subchannel(0)->StartConnectivityWatchLocked();
259
- subchannel_list_->subchannel(0)->subchannel()->RequestConnection();
260
- } else {
261
- // We do have a selected subchannel (which means it's READY), so keep
262
- // using it until one of the subchannels in the new list reports READY.
263
- if (latest_pending_subchannel_list_ != nullptr) {
264
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
265
- gpr_log(GPR_INFO,
266
- "Pick First %p Shutting down latest pending subchannel list "
267
- "%p, about to be replaced by newer latest %p",
268
- this, latest_pending_subchannel_list_.get(),
269
- subchannel_list.get());
270
- }
250
+ // If the new update is empty or we don't yet have a selected subchannel in
251
+ // the current list, replace the current subchannel list immediately.
252
+ if (latest_pending_subchannel_list_->num_subchannels() == 0 ||
253
+ selected_ == nullptr) {
254
+ selected_ = nullptr;
255
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace) &&
256
+ subchannel_list_ != nullptr) {
257
+ gpr_log(GPR_INFO, "[PF %p] Shutting down previous subchannel list %p",
258
+ this, subchannel_list_.get());
271
259
  }
272
- latest_pending_subchannel_list_ = std::move(subchannel_list);
273
- // If we're not in IDLE state, start trying to connect to the first
274
- // subchannel in the new list.
275
- // Note: No need to use CheckConnectivityStateAndStartWatchingLocked()
276
- // here, since we've already checked the initial connectivity
277
- // state of all subchannels above.
278
- latest_pending_subchannel_list_->subchannel(0)
279
- ->StartConnectivityWatchLocked();
280
- latest_pending_subchannel_list_->subchannel(0)
281
- ->subchannel()
282
- ->RequestConnection();
260
+ subchannel_list_ = std::move(latest_pending_subchannel_list_);
283
261
  }
284
262
  }
285
263
 
@@ -316,26 +294,24 @@ void PickFirst::UpdateLocked(UpdateArgs args) {
316
294
  }
317
295
 
318
296
  void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
319
- grpc_connectivity_state connectivity_state) {
297
+ absl::optional<grpc_connectivity_state> old_state,
298
+ grpc_connectivity_state new_state) {
320
299
  PickFirst* p = static_cast<PickFirst*>(subchannel_list()->policy());
321
300
  // The notification must be for a subchannel in either the current or
322
301
  // latest pending subchannel lists.
323
302
  GPR_ASSERT(subchannel_list() == p->subchannel_list_.get() ||
324
303
  subchannel_list() == p->latest_pending_subchannel_list_.get());
325
- GPR_ASSERT(connectivity_state != GRPC_CHANNEL_SHUTDOWN);
304
+ GPR_ASSERT(new_state != GRPC_CHANNEL_SHUTDOWN);
326
305
  // Handle updates for the currently selected subchannel.
327
306
  if (p->selected_ == this) {
328
307
  GPR_ASSERT(subchannel_list() == p->subchannel_list_.get());
329
308
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
330
309
  gpr_log(GPR_INFO,
331
310
  "Pick First %p selected subchannel connectivity changed to %s", p,
332
- ConnectivityStateName(connectivity_state));
311
+ ConnectivityStateName(new_state));
333
312
  }
334
- // We might miss a connectivity state update between calling
335
- // CheckConnectivityStateLocked() and StartConnectivityWatchLocked().
336
- // If the new state is READY, just ignore it; otherwise, regardless of
337
- // what state it is, we treat it as a failure of the existing connection.
338
- if (connectivity_state == GRPC_CHANNEL_READY) return;
313
+ // Any state change is considered to be a failure of the existing
314
+ // connection.
339
315
  // If there is a pending update, switch to the pending update.
340
316
  if (p->latest_pending_subchannel_list_ != nullptr) {
341
317
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
@@ -346,13 +322,16 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
346
322
  p->subchannel_list_.get());
347
323
  }
348
324
  p->selected_ = nullptr;
349
- CancelConnectivityWatchLocked(
350
- "selected subchannel failed; switching to pending update");
351
325
  p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_);
352
326
  // Set our state to that of the pending subchannel list.
353
327
  if (p->subchannel_list_->in_transient_failure()) {
354
- absl::Status status = absl::UnavailableError(
355
- "selected subchannel failed; switching to pending update");
328
+ absl::Status status = absl::UnavailableError(absl::StrCat(
329
+ "selected subchannel failed; switching to pending update; "
330
+ "last failure: ",
331
+ p->subchannel_list_
332
+ ->subchannel(p->subchannel_list_->num_subchannels())
333
+ ->connectivity_status()
334
+ .ToString()));
356
335
  p->channel_control_helper()->UpdateState(
357
336
  GRPC_CHANNEL_TRANSIENT_FAILURE, status,
358
337
  absl::make_unique<TransientFailurePicker>(status));
@@ -368,6 +347,9 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
368
347
  // TODO(qianchengz): We may want to request re-resolution in
369
348
  // ExitIdleLocked().
370
349
  p->channel_control_helper()->RequestReresolution();
350
+ // TODO(roth): We chould check the connectivity states of all the
351
+ // subchannels here, just in case one of them happens to be READY,
352
+ // and we could switch to that rather than going IDLE.
371
353
  // Enter idle.
372
354
  p->idle_ = true;
373
355
  p->selected_ = nullptr;
@@ -386,19 +368,35 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
386
368
  // for a subchannel in p->latest_pending_subchannel_list_. The
387
369
  // goal here is to find a subchannel from the update that we can
388
370
  // select in place of the current one.
389
- switch (connectivity_state) {
390
- case GRPC_CHANNEL_READY: {
391
- subchannel_list()->set_in_transient_failure(false);
392
- ProcessUnselectedReadyLocked();
393
- break;
371
+ // If the subchannel is READY, use it.
372
+ if (new_state == GRPC_CHANNEL_READY) {
373
+ subchannel_list()->set_in_transient_failure(false);
374
+ ProcessUnselectedReadyLocked();
375
+ return;
376
+ }
377
+ // If this is the initial connectivity state notification for this
378
+ // subchannel, check to see if it's the last one we were waiting for,
379
+ // in which case we start trying to connect to the first subchannel.
380
+ // Otherwise, do nothing, since we'll continue to wait until all of
381
+ // the subchannels report their state.
382
+ if (!old_state.has_value()) {
383
+ if (subchannel_list()->AllSubchannelsSeenInitialState()) {
384
+ subchannel_list()->subchannel(0)->subchannel()->RequestConnection();
394
385
  }
395
- case GRPC_CHANNEL_TRANSIENT_FAILURE:
396
- case GRPC_CHANNEL_IDLE: {
397
- CancelConnectivityWatchLocked("connection attempt failed");
398
- PickFirstSubchannelData* sd = this;
399
- size_t next_index =
400
- (sd->Index() + 1) % subchannel_list()->num_subchannels();
401
- sd = subchannel_list()->subchannel(next_index);
386
+ return;
387
+ }
388
+ // Ignore any other updates for subchannels we're not currently trying to
389
+ // connect to.
390
+ if (Index() != subchannel_list()->attempting_index()) return;
391
+ // Otherwise, process connectivity state.
392
+ switch (new_state) {
393
+ case GRPC_CHANNEL_READY:
394
+ // Already handled this case above, so this should not happen.
395
+ GPR_UNREACHABLE_CODE(break);
396
+ case GRPC_CHANNEL_TRANSIENT_FAILURE: {
397
+ size_t next_index = (Index() + 1) % subchannel_list()->num_subchannels();
398
+ subchannel_list()->set_attempting_index(next_index);
399
+ PickFirstSubchannelData* sd = subchannel_list()->subchannel(next_index);
402
400
  // If we're tried all subchannels, set state to TRANSIENT_FAILURE.
403
401
  if (sd->Index() == 0) {
404
402
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
@@ -427,14 +425,28 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
427
425
  // be the current list), re-resolve and report new state.
428
426
  if (subchannel_list() == p->subchannel_list_.get()) {
429
427
  p->channel_control_helper()->RequestReresolution();
430
- absl::Status status =
431
- absl::UnavailableError("failed to connect to all addresses");
428
+ absl::Status status = absl::UnavailableError(
429
+ absl::StrCat("failed to connect to all addresses; last error: ",
430
+ connectivity_status().ToString()));
432
431
  p->channel_control_helper()->UpdateState(
433
432
  GRPC_CHANNEL_TRANSIENT_FAILURE, status,
434
433
  absl::make_unique<TransientFailurePicker>(status));
435
434
  }
436
435
  }
437
- sd->CheckConnectivityStateAndStartWatchingLocked();
436
+ // If the next subchannel is in IDLE, trigger a connection attempt.
437
+ // If it's in READY, we can't get here, because we would already
438
+ // have selected the subchannel above.
439
+ // If it's already in CONNECTING, we don't need to do this.
440
+ // If it's in TRANSIENT_FAILURE, then we will trigger the
441
+ // connection attempt later when it reports IDLE.
442
+ auto sd_state = sd->connectivity_state();
443
+ if (sd_state.has_value() && *sd_state == GRPC_CHANNEL_IDLE) {
444
+ sd->subchannel()->RequestConnection();
445
+ }
446
+ break;
447
+ }
448
+ case GRPC_CHANNEL_IDLE: {
449
+ subchannel()->RequestConnection();
438
450
  break;
439
451
  }
440
452
  case GRPC_CHANNEL_CONNECTING: {
@@ -493,24 +505,6 @@ void PickFirst::PickFirstSubchannelData::ProcessUnselectedReadyLocked() {
493
505
  }
494
506
  }
495
507
 
496
- void PickFirst::PickFirstSubchannelData::
497
- CheckConnectivityStateAndStartWatchingLocked() {
498
- PickFirst* p = static_cast<PickFirst*>(subchannel_list()->policy());
499
- // Check current state.
500
- grpc_connectivity_state current_state = CheckConnectivityStateLocked();
501
- // Start watch.
502
- StartConnectivityWatchLocked();
503
- // If current state is READY, select the subchannel now, since we started
504
- // watching from this state and will not get a notification of it
505
- // transitioning into this state.
506
- // If the current state is not READY, attempt to connect.
507
- if (current_state == GRPC_CHANNEL_READY) {
508
- if (p->selected_ != this) ProcessUnselectedReadyLocked();
509
- } else {
510
- subchannel()->RequestConnection();
511
- }
512
- }
513
-
514
508
  class PickFirstConfig : public LoadBalancingPolicy::Config {
515
509
  public:
516
510
  const char* name() const override { return kPickFirst; }
@@ -14,8 +14,6 @@
14
14
  // limitations under the License.
15
15
  //
16
16
 
17
- // IWYU pragma: no_include <ext/alloc_traits.h>
18
-
19
17
  #include <grpc/support/port_platform.h>
20
18
 
21
19
  #include <inttypes.h>
@@ -135,9 +133,7 @@ class PriorityLb : public LoadBalancingPolicy {
135
133
 
136
134
  void Orphan() override;
137
135
 
138
- std::unique_ptr<SubchannelPicker> GetPicker() {
139
- return absl::make_unique<RefCountedPickerWrapper>(picker_wrapper_);
140
- }
136
+ std::unique_ptr<SubchannelPicker> GetPicker();
141
137
 
142
138
  grpc_connectivity_state connectivity_state() const {
143
139
  return connectivity_state_;
@@ -267,18 +263,16 @@ class PriorityLb : public LoadBalancingPolicy {
267
263
 
268
264
  // Iterates through the list of priorities to choose one:
269
265
  // - If the child for a priority doesn't exist, creates it.
270
- // - If a child's failover timer is pending, returns without selecting
271
- // a priority while we wait for the child to attempt to connect. In
272
- // this case, if report_connecting is true, reports CONNECTING state to
273
- // the channel.
274
- // - If the child is connected, it will be used as the current priority.
266
+ // - If a child's failover timer is pending, selects that priority
267
+ // while we wait for the child to attempt to connect.
268
+ // - If the child is connected, selects that priority.
275
269
  // - Otherwise, continues on to the next child.
276
- // Reports TRANSIENT_FAILURE to the channel if all children are not
277
- // connected.
270
+ // Delegates to the last child if none of the children are connecting.
271
+ // Reports TRANSIENT_FAILURE if the priority list is empty.
278
272
  //
279
273
  // This method is idempotent; it should yield the same result every
280
274
  // time as a function of the state of the children.
281
- void ChoosePriorityLocked(bool report_connecting);
275
+ void ChoosePriorityLocked();
282
276
 
283
277
  // Sets the specified priority as the current priority.
284
278
  // Deactivates any children at lower priorities.
@@ -362,12 +356,11 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
362
356
  // Save current child.
363
357
  if (current_priority_ != UINT32_MAX) {
364
358
  const std::string& child_name = config_->priorities()[current_priority_];
365
- current_child_from_before_update_ = children_[child_name].get();
366
- // Unset current_priority_, since it was an index into the old
367
- // config's priority list and may no longer be valid. It will be
368
- // reset later by ChoosePriorityLocked(), but we unset it here in
369
- // case updating any of our children triggers a state update.
370
- current_priority_ = UINT32_MAX;
359
+ auto* child = children_[child_name].get();
360
+ GPR_ASSERT(child != nullptr);
361
+ if (child->connectivity_state() == GRPC_CHANNEL_READY) {
362
+ current_child_from_before_update_ = children_[child_name].get();
363
+ }
371
364
  }
372
365
  // Update config.
373
366
  config_ = std::move(args.config);
@@ -394,7 +387,7 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
394
387
  }
395
388
  update_in_progress_ = false;
396
389
  // Try to get connected.
397
- ChoosePriorityLocked(/*report_connecting=*/children_.empty());
390
+ ChoosePriorityLocked();
398
391
  }
399
392
 
400
393
  uint32_t PriorityLb::GetChildPriorityLocked(
@@ -437,7 +430,7 @@ void PriorityLb::HandleChildConnectivityStateChangeLocked(
437
430
  // properly select between CONNECTING and TRANSIENT_FAILURE as the
438
431
  // new state to report to our parent.
439
432
  current_child_from_before_update_ = nullptr;
440
- ChoosePriorityLocked(/*report_connecting=*/true);
433
+ ChoosePriorityLocked();
441
434
  }
442
435
  return;
443
436
  }
@@ -451,8 +444,7 @@ void PriorityLb::HandleChildConnectivityStateChangeLocked(
451
444
  }
452
445
  // Unconditionally call ChoosePriorityLocked(). It should do the
453
446
  // right thing based on the state of all children.
454
- ChoosePriorityLocked(
455
- /*report_connecting=*/child_priority == current_priority_);
447
+ ChoosePriorityLocked();
456
448
  }
457
449
 
458
450
  void PriorityLb::DeleteChild(ChildPriority* child) {
@@ -463,12 +455,24 @@ void PriorityLb::DeleteChild(ChildPriority* child) {
463
455
  // new state to report to our parent.
464
456
  if (current_child_from_before_update_ == child) {
465
457
  current_child_from_before_update_ = nullptr;
466
- ChoosePriorityLocked(/*report_connecting=*/true);
458
+ ChoosePriorityLocked();
467
459
  }
468
460
  children_.erase(child->name());
469
461
  }
470
462
 
471
- void PriorityLb::ChoosePriorityLocked(bool report_connecting) {
463
+ void PriorityLb::ChoosePriorityLocked() {
464
+ // If priority list is empty, report TF.
465
+ if (config_->priorities().empty()) {
466
+ current_child_from_before_update_ = nullptr;
467
+ absl::Status status =
468
+ absl::UnavailableError("priority policy has empty priority list");
469
+ channel_control_helper()->UpdateState(
470
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
471
+ absl::make_unique<TransientFailurePicker>(status));
472
+ return;
473
+ }
474
+ // Iterate through priorities, searching for one in READY or IDLE,
475
+ // creating new children as needed.
472
476
  current_priority_ = UINT32_MAX;
473
477
  for (uint32_t priority = 0; priority < config_->priorities().size();
474
478
  ++priority) {
@@ -480,11 +484,18 @@ void PriorityLb::ChoosePriorityLocked(bool report_connecting) {
480
484
  }
481
485
  auto& child = children_[child_name];
482
486
  if (child == nullptr) {
483
- if (report_connecting) {
487
+ // If we're not still using an old child from before the last
488
+ // update, report CONNECTING here.
489
+ // This is probably not strictly necessary, since the child should
490
+ // immediately report CONNECTING and cause us to report that state
491
+ // anyway, but we do this just in case the child fails to report
492
+ // state before UpdateLocked() returns.
493
+ if (current_child_from_before_update_ != nullptr) {
484
494
  channel_control_helper()->UpdateState(
485
495
  GRPC_CHANNEL_CONNECTING, absl::Status(),
486
496
  absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
487
497
  }
498
+ current_priority_ = priority;
488
499
  child = MakeOrphanable<ChildPriority>(
489
500
  Ref(DEBUG_LOCATION, "ChildPriority"), child_name);
490
501
  auto child_config = config_->children().find(child_name);
@@ -510,10 +521,13 @@ void PriorityLb::ChoosePriorityLocked(bool report_connecting) {
510
521
  "attempting to connect, will wait",
511
522
  this, priority, child_name.c_str());
512
523
  }
513
- if (report_connecting) {
514
- channel_control_helper()->UpdateState(
515
- GRPC_CHANNEL_CONNECTING, absl::Status(),
516
- absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
524
+ current_priority_ = priority;
525
+ // If we're not still using an old child from before the last
526
+ // update, report CONNECTING here.
527
+ if (current_child_from_before_update_ != nullptr) {
528
+ channel_control_helper()->UpdateState(child->connectivity_state(),
529
+ child->connectivity_status(),
530
+ child->GetPicker());
517
531
  }
518
532
  return;
519
533
  }
@@ -526,18 +540,44 @@ void PriorityLb::ChoosePriorityLocked(bool report_connecting) {
526
540
  ConnectivityStateName(child->connectivity_state()));
527
541
  }
528
542
  }
529
- // If there are no more priorities to try, report TRANSIENT_FAILURE.
543
+ // If we didn't find any priority to try, pick the first one in state
544
+ // CONNECTING.
530
545
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
531
546
  gpr_log(GPR_INFO,
532
- "[priority_lb %p] no priority reachable, putting channel in "
533
- "TRANSIENT_FAILURE",
547
+ "[priority_lb %p] no priority reachable, checking for CONNECTING "
548
+ "priority to delegate to",
534
549
  this);
535
550
  }
536
- current_child_from_before_update_ = nullptr;
537
- absl::Status status = absl::UnavailableError("no ready priority");
538
- channel_control_helper()->UpdateState(
539
- GRPC_CHANNEL_TRANSIENT_FAILURE, status,
540
- absl::make_unique<TransientFailurePicker>(status));
551
+ for (uint32_t priority = 0; priority < config_->priorities().size();
552
+ ++priority) {
553
+ // If the child for the priority does not exist yet, create it.
554
+ const std::string& child_name = config_->priorities()[priority];
555
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
556
+ gpr_log(GPR_INFO, "[priority_lb %p] trying priority %u, child %s", this,
557
+ priority, child_name.c_str());
558
+ }
559
+ auto& child = children_[child_name];
560
+ GPR_ASSERT(child != nullptr);
561
+ if (child->connectivity_state() == GRPC_CHANNEL_CONNECTING) {
562
+ channel_control_helper()->UpdateState(child->connectivity_state(),
563
+ child->connectivity_status(),
564
+ child->GetPicker());
565
+ return;
566
+ }
567
+ }
568
+ // Did not find any child in CONNECTING, delegate to last child.
569
+ const std::string& child_name = config_->priorities().back();
570
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
571
+ gpr_log(GPR_INFO,
572
+ "[priority_lb %p] no priority in CONNECTING, delegating to "
573
+ "lowest priority child %s",
574
+ this, child_name.c_str());
575
+ }
576
+ auto& child = children_[child_name];
577
+ GPR_ASSERT(child != nullptr);
578
+ channel_control_helper()->UpdateState(child->connectivity_state(),
579
+ child->connectivity_status(),
580
+ child->GetPicker());
541
581
  }
542
582
 
543
583
  void PriorityLb::SetCurrentPriorityLocked(uint32_t priority) {
@@ -604,7 +644,7 @@ void PriorityLb::ChildPriority::DeactivationTimer::OnTimer(
604
644
 
605
645
  void PriorityLb::ChildPriority::DeactivationTimer::OnTimerLocked(
606
646
  grpc_error_handle error) {
607
- if (error == GRPC_ERROR_NONE && timer_pending_) {
647
+ if (GRPC_ERROR_IS_NONE(error) && timer_pending_) {
608
648
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
609
649
  gpr_log(GPR_INFO,
610
650
  "[priority_lb %p] child %s (%p): deactivation timer fired, "
@@ -668,7 +708,7 @@ void PriorityLb::ChildPriority::FailoverTimer::OnTimer(
668
708
 
669
709
  void PriorityLb::ChildPriority::FailoverTimer::OnTimerLocked(
670
710
  grpc_error_handle error) {
671
- if (error == GRPC_ERROR_NONE && timer_pending_) {
711
+ if (GRPC_ERROR_IS_NONE(error) && timer_pending_) {
672
712
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
673
713
  gpr_log(GPR_INFO,
674
714
  "[priority_lb %p] child %s (%p): failover timer fired, "
@@ -719,6 +759,15 @@ void PriorityLb::ChildPriority::Orphan() {
719
759
  Unref(DEBUG_LOCATION, "ChildPriority+Orphan");
720
760
  }
721
761
 
762
+ std::unique_ptr<LoadBalancingPolicy::SubchannelPicker>
763
+ PriorityLb::ChildPriority::GetPicker() {
764
+ if (picker_wrapper_ == nullptr) {
765
+ return absl::make_unique<QueuePicker>(
766
+ priority_policy_->Ref(DEBUG_LOCATION, "QueuePicker"));
767
+ }
768
+ return absl::make_unique<RefCountedPickerWrapper>(picker_wrapper_);
769
+ }
770
+
722
771
  void PriorityLb::ChildPriority::UpdateLocked(
723
772
  RefCountedPtr<LoadBalancingPolicy::Config> config,
724
773
  bool ignore_reresolution_requests) {
@@ -882,7 +931,7 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
882
931
 
883
932
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
884
933
  const Json& json, grpc_error_handle* error) const override {
885
- GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
934
+ GPR_DEBUG_ASSERT(error != nullptr && GRPC_ERROR_IS_NONE(*error));
886
935
  if (json.type() == Json::Type::JSON_NULL) {
887
936
  // priority was mentioned as a policy in the deprecated
888
937
  // loadBalancingPolicy field or in the client API.
@@ -937,7 +986,7 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
937
986
  }
938
987
  }
939
988
  if (config == nullptr) {
940
- GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
989
+ GPR_DEBUG_ASSERT(!GRPC_ERROR_IS_NONE(parse_error));
941
990
  error_list.push_back(
942
991
  GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(
943
992
  absl::StrCat("field:children key:", child_name).c_str(),