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
@@ -783,7 +783,7 @@ void RlsLb::ChildPolicyWrapper::StartUpdate() {
783
783
  grpc_error_handle error = InsertOrUpdateChildPolicyField(
784
784
  lb_policy_->config_->child_policy_config_target_field_name(), target_,
785
785
  &child_policy_config);
786
- GPR_ASSERT(error == GRPC_ERROR_NONE);
786
+ GPR_ASSERT(GRPC_ERROR_IS_NONE(error));
787
787
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
788
788
  gpr_log(
789
789
  GPR_INFO,
@@ -794,7 +794,7 @@ void RlsLb::ChildPolicyWrapper::StartUpdate() {
794
794
  pending_config_ = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
795
795
  child_policy_config, &error);
796
796
  // Returned RLS target fails the validation.
797
- if (error != GRPC_ERROR_NONE) {
797
+ if (!GRPC_ERROR_IS_NONE(error)) {
798
798
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
799
799
  gpr_log(GPR_INFO,
800
800
  "[rlslb %p] ChildPolicyWrapper=%p [%s]: config failed to parse: "
@@ -1084,7 +1084,8 @@ LoadBalancingPolicy::PickResult RlsLb::Picker::Pick(PickArgs args) {
1084
1084
  "[rlslb %p] picker=%p: RLS call in backoff; failing pick",
1085
1085
  lb_policy_.get(), this);
1086
1086
  }
1087
- return PickResult::Fail(entry->status());
1087
+ return PickResult::Fail(absl::UnavailableError(
1088
+ absl::StrCat("RLS request failed: ", entry->status().ToString())));
1088
1089
  }
1089
1090
  }
1090
1091
  // RLS call pending. Queue the pick.
@@ -1191,46 +1192,48 @@ size_t RlsLb::Cache::Entry::Size() const {
1191
1192
  }
1192
1193
 
1193
1194
  LoadBalancingPolicy::PickResult RlsLb::Cache::Entry::Pick(PickArgs args) {
1194
- for (const auto& child_policy_wrapper : child_policy_wrappers_) {
1195
+ size_t i = 0;
1196
+ ChildPolicyWrapper* child_policy_wrapper = nullptr;
1197
+ // Skip targets before the last one that are in state TRANSIENT_FAILURE.
1198
+ for (; i < child_policy_wrappers_.size(); ++i) {
1199
+ child_policy_wrapper = child_policy_wrappers_[i].get();
1195
1200
  if (child_policy_wrapper->connectivity_state() ==
1196
- GRPC_CHANNEL_TRANSIENT_FAILURE) {
1201
+ GRPC_CHANNEL_TRANSIENT_FAILURE &&
1202
+ i < child_policy_wrappers_.size() - 1) {
1197
1203
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
1198
1204
  gpr_log(GPR_INFO,
1199
- "[rlslb %p] cache entry=%p %s: target %s in state "
1200
- "TRANSIENT_FAILURE; skipping",
1205
+ "[rlslb %p] cache entry=%p %s: target %s (%" PRIuPTR
1206
+ " of %" PRIuPTR ") in state TRANSIENT_FAILURE; skipping",
1201
1207
  lb_policy_.get(), this, lru_iterator_->ToString().c_str(),
1202
- child_policy_wrapper->target().c_str());
1208
+ child_policy_wrapper->target().c_str(), i,
1209
+ child_policy_wrappers_.size());
1203
1210
  }
1204
1211
  continue;
1205
1212
  }
1206
- // Child policy not in TRANSIENT_FAILURE, so delegate.
1207
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
1208
- gpr_log(
1209
- GPR_INFO,
1210
- "[rlslb %p] cache entry=%p %s: target %s in state %s; "
1211
- "delegating",
1212
- lb_policy_.get(), this, lru_iterator_->ToString().c_str(),
1213
- child_policy_wrapper->target().c_str(),
1214
- ConnectivityStateName(child_policy_wrapper->connectivity_state()));
1215
- }
1216
- // Add header data.
1217
- if (!header_data_.empty()) {
1218
- char* copied_header_data =
1219
- static_cast<char*>(args.call_state->Alloc(header_data_.length() + 1));
1220
- strcpy(copied_header_data, header_data_.c_str());
1221
- args.initial_metadata->Add(kRlsHeaderKey, copied_header_data);
1222
- }
1223
- return child_policy_wrapper->Pick(args);
1213
+ break;
1224
1214
  }
1225
- // No child policy found.
1215
+ // Child policy not in TRANSIENT_FAILURE or is the last target in
1216
+ // the list, so delegate.
1226
1217
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
1227
1218
  gpr_log(GPR_INFO,
1228
- "[rlslb %p] cache entry=%p %s: no healthy target found; "
1229
- "failing pick",
1230
- lb_policy_.get(), this, lru_iterator_->ToString().c_str());
1231
- }
1232
- return PickResult::Fail(
1233
- absl::UnavailableError("all RLS targets unreachable"));
1219
+ "[rlslb %p] cache entry=%p %s: target %s (%" PRIuPTR " of %" PRIuPTR
1220
+ ") in state %s; delegating",
1221
+ lb_policy_.get(), this, lru_iterator_->ToString().c_str(),
1222
+ child_policy_wrapper->target().c_str(), i,
1223
+ child_policy_wrappers_.size(),
1224
+ ConnectivityStateName(child_policy_wrapper->connectivity_state()));
1225
+ }
1226
+ // Add header data.
1227
+ // Note that even if the target we're using is in TRANSIENT_FAILURE,
1228
+ // the pick might still succeed (e.g., if the child is ring_hash), so
1229
+ // we need to pass the right header info down in all cases.
1230
+ if (!header_data_.empty()) {
1231
+ char* copied_header_data =
1232
+ static_cast<char*>(args.call_state->Alloc(header_data_.length() + 1));
1233
+ strcpy(copied_header_data, header_data_.c_str());
1234
+ args.initial_metadata->Add(kRlsHeaderKey, copied_header_data);
1235
+ }
1236
+ return child_policy_wrapper->Pick(args);
1234
1237
  }
1235
1238
 
1236
1239
  void RlsLb::Cache::Entry::ResetBackoff() {
@@ -1776,7 +1779,7 @@ void RlsLb::RlsRequest::OnRlsCallCompleteLocked(grpc_error_handle error) {
1776
1779
  }
1777
1780
  // Parse response.
1778
1781
  ResponseInfo response;
1779
- if (error != GRPC_ERROR_NONE) {
1782
+ if (!GRPC_ERROR_IS_NONE(error)) {
1780
1783
  grpc_status_code code;
1781
1784
  std::string message;
1782
1785
  grpc_error_get_status(error, deadline_, &code, &message,
@@ -1979,7 +1982,7 @@ void RlsLb::UpdateLocked(UpdateArgs args) {
1979
1982
  // Resize cache if needed.
1980
1983
  if (old_config == nullptr ||
1981
1984
  config_->cache_size_bytes() != old_config->cache_size_bytes()) {
1982
- cache_.Resize(config_->cache_size_bytes());
1985
+ cache_.Resize(static_cast<size_t>(config_->cache_size_bytes()));
1983
1986
  }
1984
1987
  // Start update of child policies if needed.
1985
1988
  if (update_child_policies) {
@@ -2230,7 +2233,7 @@ grpc_error_handle ParseGrpcKeybuilder(
2230
2233
  grpc_error_handle child_error = GRPC_ERROR_NONE;
2231
2234
  std::string name =
2232
2235
  ParseJsonMethodName(name_idx++, name_json, &child_error);
2233
- if (child_error != GRPC_ERROR_NONE) {
2236
+ if (!GRPC_ERROR_IS_NONE(child_error)) {
2234
2237
  error_list.push_back(child_error);
2235
2238
  } else {
2236
2239
  bool inserted = names.insert(name).second;
@@ -2266,7 +2269,7 @@ grpc_error_handle ParseGrpcKeybuilder(
2266
2269
  std::vector<std::string> headers;
2267
2270
  grpc_error_handle child_error =
2268
2271
  ParseJsonHeaders(header_idx++, header_json, &key, &headers);
2269
- if (child_error != GRPC_ERROR_NONE) {
2272
+ if (!GRPC_ERROR_IS_NONE(child_error)) {
2270
2273
  error_list.push_back(child_error);
2271
2274
  } else {
2272
2275
  duplicate_key_check_func(key);
@@ -2359,7 +2362,7 @@ RlsLbConfig::KeyBuilderMap ParseGrpcKeybuilders(
2359
2362
  for (const Json& key_builder : key_builder_list) {
2360
2363
  grpc_error_handle child_error =
2361
2364
  ParseGrpcKeybuilder(idx++, key_builder, &key_builder_map);
2362
- if (child_error != GRPC_ERROR_NONE) error_list.push_back(child_error);
2365
+ if (!GRPC_ERROR_IS_NONE(child_error)) error_list.push_back(child_error);
2363
2366
  }
2364
2367
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("field:grpcKeybuilders", &error_list);
2365
2368
  return key_builder_map;
@@ -2376,7 +2379,7 @@ RlsLbConfig::RouteLookupConfig ParseRouteLookupConfig(
2376
2379
  grpc_error_handle child_error = GRPC_ERROR_NONE;
2377
2380
  route_lookup_config.key_builder_map =
2378
2381
  ParseGrpcKeybuilders(*keybuilder_list, &child_error);
2379
- if (child_error != GRPC_ERROR_NONE) error_list.push_back(child_error);
2382
+ if (!GRPC_ERROR_IS_NONE(child_error)) error_list.push_back(child_error);
2380
2383
  }
2381
2384
  // Parse lookupService.
2382
2385
  if (ParseJsonObjectField(json, "lookupService",
@@ -2452,12 +2455,12 @@ grpc_error_handle ValidateChildPolicyList(
2452
2455
  default_target.empty() ? kFakeTargetFieldValue : default_target;
2453
2456
  grpc_error_handle error = InsertOrUpdateChildPolicyField(
2454
2457
  child_policy_config_target_field_name, target, child_policy_config);
2455
- if (error != GRPC_ERROR_NONE) return error;
2458
+ if (!GRPC_ERROR_IS_NONE(error)) return error;
2456
2459
  // Parse the config.
2457
2460
  RefCountedPtr<LoadBalancingPolicy::Config> parsed_config =
2458
2461
  LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
2459
2462
  *child_policy_config, &error);
2460
- if (error != GRPC_ERROR_NONE) return error;
2463
+ if (!GRPC_ERROR_IS_NONE(error)) return error;
2461
2464
  // Find the chosen config and return it in JSON form.
2462
2465
  // We remove all non-selected configs, and in the selected config, we leave
2463
2466
  // the target field in place, set to the default value. This slightly
@@ -2500,7 +2503,7 @@ class RlsLbFactory : public LoadBalancingPolicyFactory {
2500
2503
  grpc_error_handle child_error = GRPC_ERROR_NONE;
2501
2504
  route_lookup_config =
2502
2505
  ParseRouteLookupConfig(*route_lookup_config_json, &child_error);
2503
- if (child_error != GRPC_ERROR_NONE) error_list.push_back(child_error);
2506
+ if (!GRPC_ERROR_IS_NONE(child_error)) error_list.push_back(child_error);
2504
2507
  }
2505
2508
  // Parse routeLookupChannelServiceConfig.
2506
2509
  std::string rls_channel_service_config;
@@ -2516,7 +2519,7 @@ class RlsLbFactory : public LoadBalancingPolicyFactory {
2516
2519
  auto service_config = MakeRefCounted<ServiceConfigImpl>(
2517
2520
  /*args=*/nullptr, rls_channel_service_config,
2518
2521
  std::move(rls_channel_service_config_json), &child_error);
2519
- if (child_error != GRPC_ERROR_NONE) {
2522
+ if (!GRPC_ERROR_IS_NONE(child_error)) {
2520
2523
  error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
2521
2524
  "field:routeLookupChannelServiceConfig", &child_error, 1));
2522
2525
  GRPC_ERROR_UNREF(child_error);
@@ -2548,7 +2551,7 @@ class RlsLbFactory : public LoadBalancingPolicyFactory {
2548
2551
  it->second, child_policy_config_target_field_name,
2549
2552
  route_lookup_config.default_target, &child_policy_config,
2550
2553
  &default_child_policy_parsed_config);
2551
- if (child_error != GRPC_ERROR_NONE) {
2554
+ if (!GRPC_ERROR_IS_NONE(child_error)) {
2552
2555
  error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
2553
2556
  "field:childPolicy", &child_error, 1));
2554
2557
  GRPC_ERROR_UNREF(child_error);
@@ -19,15 +19,17 @@
19
19
  #include <inttypes.h>
20
20
  #include <stdlib.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>
@@ -89,25 +91,27 @@ class RoundRobin : public LoadBalancingPolicy {
89
91
  RefCountedPtr<SubchannelInterface> subchannel)
90
92
  : SubchannelData(subchannel_list, address, std::move(subchannel)) {}
91
93
 
92
- grpc_connectivity_state connectivity_state() const {
94
+ absl::optional<grpc_connectivity_state> connectivity_state() const {
93
95
  return logical_connectivity_state_;
94
96
  }
95
97
 
96
- // Computes and updates the logical connectivity state of the subchannel.
97
- // Note that the logical connectivity state may differ from the
98
- // actual reported state in some cases (e.g., after we see
99
- // TRANSIENT_FAILURE, we ignore any subsequent state changes until
100
- // we see READY). Returns true if the state changed.
101
- bool UpdateLogicalConnectivityStateLocked(
102
- grpc_connectivity_state connectivity_state);
103
-
104
98
  private:
105
99
  // Performs connectivity state updates that need to be done only
106
100
  // after we have started watching.
107
101
  void ProcessConnectivityChangeLocked(
108
- grpc_connectivity_state connectivity_state) override;
102
+ absl::optional<grpc_connectivity_state> old_state,
103
+ grpc_connectivity_state new_state) override;
104
+
105
+ // Updates the logical connectivity state.
106
+ void UpdateLogicalConnectivityStateLocked(
107
+ grpc_connectivity_state connectivity_state);
109
108
 
110
- grpc_connectivity_state logical_connectivity_state_ = GRPC_CHANNEL_IDLE;
109
+ // The logical connectivity state of the subchannel.
110
+ // Note that the logical connectivity state may differ from the
111
+ // actual reported state in some cases (e.g., after we see
112
+ // TRANSIENT_FAILURE, we ignore any subsequent state changes until
113
+ // we see READY).
114
+ absl::optional<grpc_connectivity_state> logical_connectivity_state_;
111
115
  };
112
116
 
113
117
  // A list of subchannels.
@@ -134,13 +138,11 @@ class RoundRobin : public LoadBalancingPolicy {
134
138
  p->Unref(DEBUG_LOCATION, "subchannel_list");
135
139
  }
136
140
 
137
- // Starts watching the subchannels in this list.
138
- void StartWatchingLocked(absl::Status status_for_tf);
139
-
140
141
  // Updates the counters of subchannels in each state when a
141
142
  // subchannel transitions from old_state to new_state.
142
- void UpdateStateCountersLocked(grpc_connectivity_state old_state,
143
- grpc_connectivity_state new_state);
143
+ void UpdateStateCountersLocked(
144
+ absl::optional<grpc_connectivity_state> old_state,
145
+ grpc_connectivity_state new_state);
144
146
 
145
147
  // Ensures that the right subchannel list is used and then updates
146
148
  // the RR policy's connectivity state based on the subchannel list's
@@ -159,6 +161,8 @@ class RoundRobin : public LoadBalancingPolicy {
159
161
  size_t num_ready_ = 0;
160
162
  size_t num_connecting_ = 0;
161
163
  size_t num_transient_failure_ = 0;
164
+
165
+ absl::Status last_failure_;
162
166
  };
163
167
 
164
168
  class Picker : public SubchannelPicker {
@@ -172,7 +176,7 @@ class RoundRobin : public LoadBalancingPolicy {
172
176
  RoundRobin* parent_;
173
177
 
174
178
  size_t last_picked_index_;
175
- absl::InlinedVector<RefCountedPtr<SubchannelInterface>, 10> subchannels_;
179
+ std::vector<RefCountedPtr<SubchannelInterface>> subchannels_;
176
180
  };
177
181
 
178
182
  void ShutdownLocked() override;
@@ -197,7 +201,8 @@ RoundRobin::Picker::Picker(RoundRobin* parent,
197
201
  : parent_(parent) {
198
202
  for (size_t i = 0; i < subchannel_list->num_subchannels(); ++i) {
199
203
  RoundRobinSubchannelData* sd = subchannel_list->subchannel(i);
200
- if (sd->connectivity_state() == GRPC_CHANNEL_READY) {
204
+ if (sd->connectivity_state().value_or(GRPC_CHANNEL_IDLE) ==
205
+ GRPC_CHANNEL_READY) {
201
206
  subchannels_.push_back(sd->subchannel()->Ref());
202
207
  }
203
208
  }
@@ -285,55 +290,54 @@ void RoundRobin::UpdateLocked(UpdateArgs args) {
285
290
  }
286
291
  latest_pending_subchannel_list_ = MakeOrphanable<RoundRobinSubchannelList>(
287
292
  this, std::move(addresses), *args.args);
288
- // Start watching the new list. If appropriate, this will cause it to be
289
- // immediately promoted to subchannel_list_ and to generate a new picker.
290
- latest_pending_subchannel_list_->StartWatchingLocked(
291
- args.addresses.ok() ? absl::UnavailableError(absl::StrCat(
292
- "empty address list: ", args.resolution_note))
293
- : args.addresses.status());
293
+ // If the new list is empty, immediately promote it to
294
+ // subchannel_list_ and report TRANSIENT_FAILURE.
295
+ if (latest_pending_subchannel_list_->num_subchannels() == 0) {
296
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace) &&
297
+ subchannel_list_ != nullptr) {
298
+ gpr_log(GPR_INFO, "[RR %p] replacing previous subchannel list %p", this,
299
+ subchannel_list_.get());
300
+ }
301
+ subchannel_list_ = std::move(latest_pending_subchannel_list_);
302
+ absl::Status status =
303
+ args.addresses.ok() ? absl::UnavailableError(absl::StrCat(
304
+ "empty address list: ", args.resolution_note))
305
+ : args.addresses.status();
306
+ channel_control_helper()->UpdateState(
307
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
308
+ absl::make_unique<TransientFailurePicker>(status));
309
+ }
310
+ // Otherwise, if this is the initial update, immediately promote it to
311
+ // subchannel_list_ and report CONNECTING.
312
+ else if (subchannel_list_.get() == nullptr) {
313
+ subchannel_list_ = std::move(latest_pending_subchannel_list_);
314
+ channel_control_helper()->UpdateState(
315
+ GRPC_CHANNEL_CONNECTING, absl::Status(),
316
+ absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
317
+ }
294
318
  }
295
319
 
296
320
  //
297
321
  // RoundRobinSubchannelList
298
322
  //
299
323
 
300
- void RoundRobin::RoundRobinSubchannelList::StartWatchingLocked(
301
- absl::Status status_for_tf) {
302
- // Check current state of each subchannel synchronously, since any
303
- // subchannel already used by some other channel may have a non-IDLE
304
- // state.
305
- for (size_t i = 0; i < num_subchannels(); ++i) {
306
- grpc_connectivity_state state =
307
- subchannel(i)->CheckConnectivityStateLocked();
308
- if (state != GRPC_CHANNEL_IDLE) {
309
- subchannel(i)->UpdateLogicalConnectivityStateLocked(state);
310
- }
311
- }
312
- // Start connectivity watch for each subchannel.
313
- for (size_t i = 0; i < num_subchannels(); i++) {
314
- if (subchannel(i)->subchannel() != nullptr) {
315
- subchannel(i)->StartConnectivityWatchLocked();
316
- subchannel(i)->subchannel()->RequestConnection();
324
+ void RoundRobin::RoundRobinSubchannelList::UpdateStateCountersLocked(
325
+ absl::optional<grpc_connectivity_state> old_state,
326
+ grpc_connectivity_state new_state) {
327
+ if (old_state.has_value()) {
328
+ GPR_ASSERT(*old_state != GRPC_CHANNEL_SHUTDOWN);
329
+ if (*old_state == GRPC_CHANNEL_READY) {
330
+ GPR_ASSERT(num_ready_ > 0);
331
+ --num_ready_;
332
+ } else if (*old_state == GRPC_CHANNEL_CONNECTING) {
333
+ GPR_ASSERT(num_connecting_ > 0);
334
+ --num_connecting_;
335
+ } else if (*old_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
336
+ GPR_ASSERT(num_transient_failure_ > 0);
337
+ --num_transient_failure_;
317
338
  }
318
339
  }
319
- // Update RR connectivity state if needed.
320
- MaybeUpdateRoundRobinConnectivityStateLocked(status_for_tf);
321
- }
322
-
323
- void RoundRobin::RoundRobinSubchannelList::UpdateStateCountersLocked(
324
- grpc_connectivity_state old_state, grpc_connectivity_state new_state) {
325
- GPR_ASSERT(old_state != GRPC_CHANNEL_SHUTDOWN);
326
340
  GPR_ASSERT(new_state != GRPC_CHANNEL_SHUTDOWN);
327
- if (old_state == GRPC_CHANNEL_READY) {
328
- GPR_ASSERT(num_ready_ > 0);
329
- --num_ready_;
330
- } else if (old_state == GRPC_CHANNEL_CONNECTING) {
331
- GPR_ASSERT(num_connecting_ > 0);
332
- --num_connecting_;
333
- } else if (old_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
334
- GPR_ASSERT(num_transient_failure_ > 0);
335
- --num_transient_failure_;
336
- }
337
341
  if (new_state == GRPC_CHANNEL_READY) {
338
342
  ++num_ready_;
339
343
  } else if (new_state == GRPC_CHANNEL_CONNECTING) {
@@ -348,17 +352,13 @@ void RoundRobin::RoundRobinSubchannelList::
348
352
  RoundRobin* p = static_cast<RoundRobin*>(policy());
349
353
  // If this is latest_pending_subchannel_list_, then swap it into
350
354
  // subchannel_list_ in the following cases:
351
- // - subchannel_list_ is null (i.e., this is the first update).
352
355
  // - subchannel_list_ has no READY subchannels.
353
356
  // - This list has at least one READY subchannel.
354
- // - All of the subchannels in this list are in TRANSIENT_FAILURE, or
355
- // the list is empty. (This may cause the channel to go from READY
356
- // to TRANSIENT_FAILURE, but we're doing what the control plane told
357
- // us to do.
357
+ // - All of the subchannels in this list are in TRANSIENT_FAILURE.
358
+ // (This may cause the channel to go from READY to TRANSIENT_FAILURE,
359
+ // but we're doing what the control plane told us to do.)
358
360
  if (p->latest_pending_subchannel_list_.get() == this &&
359
- (p->subchannel_list_ == nullptr || p->subchannel_list_->num_ready_ == 0 ||
360
- num_ready_ > 0 ||
361
- // Note: num_transient_failure_ and num_subchannels() may both be 0.
361
+ (p->subchannel_list_->num_ready_ == 0 || num_ready_ > 0 ||
362
362
  num_transient_failure_ == num_subchannels())) {
363
363
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
364
364
  const std::string old_counters_string =
@@ -399,9 +399,14 @@ void RoundRobin::RoundRobinSubchannelList::
399
399
  "[RR %p] reporting TRANSIENT_FAILURE with subchannel list %p: %s",
400
400
  p, this, status_for_tf.ToString().c_str());
401
401
  }
402
+ if (!status_for_tf.ok()) {
403
+ last_failure_ = absl::UnavailableError(
404
+ absl::StrCat("connections to all backends failing; last error: ",
405
+ status_for_tf.ToString()));
406
+ }
402
407
  p->channel_control_helper()->UpdateState(
403
- GRPC_CHANNEL_TRANSIENT_FAILURE, status_for_tf,
404
- absl::make_unique<TransientFailurePicker>(status_for_tf));
408
+ GRPC_CHANNEL_TRANSIENT_FAILURE, last_failure_,
409
+ absl::make_unique<TransientFailurePicker>(last_failure_));
405
410
  }
406
411
  }
407
412
 
@@ -409,7 +414,40 @@ void RoundRobin::RoundRobinSubchannelList::
409
414
  // RoundRobinSubchannelData
410
415
  //
411
416
 
412
- bool RoundRobin::RoundRobinSubchannelData::UpdateLogicalConnectivityStateLocked(
417
+ void RoundRobin::RoundRobinSubchannelData::ProcessConnectivityChangeLocked(
418
+ absl::optional<grpc_connectivity_state> old_state,
419
+ grpc_connectivity_state new_state) {
420
+ RoundRobin* p = static_cast<RoundRobin*>(subchannel_list()->policy());
421
+ GPR_ASSERT(subchannel() != nullptr);
422
+ // If this is not the initial state notification and the new state is
423
+ // TRANSIENT_FAILURE or IDLE, re-resolve.
424
+ // Note that we don't want to do this on the initial state notification,
425
+ // because that would result in an endless loop of re-resolution.
426
+ if (old_state.has_value() && (new_state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
427
+ new_state == GRPC_CHANNEL_IDLE)) {
428
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
429
+ gpr_log(GPR_INFO,
430
+ "[RR %p] Subchannel %p reported %s; requesting re-resolution", p,
431
+ subchannel(), ConnectivityStateName(new_state));
432
+ }
433
+ p->channel_control_helper()->RequestReresolution();
434
+ }
435
+ if (new_state == GRPC_CHANNEL_IDLE) {
436
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
437
+ gpr_log(GPR_INFO,
438
+ "[RR %p] Subchannel %p reported IDLE; requesting connection", p,
439
+ subchannel());
440
+ }
441
+ subchannel()->RequestConnection();
442
+ }
443
+ // Update logical connectivity state.
444
+ UpdateLogicalConnectivityStateLocked(new_state);
445
+ // Update the policy state.
446
+ subchannel_list()->MaybeUpdateRoundRobinConnectivityStateLocked(
447
+ connectivity_status());
448
+ }
449
+
450
+ void RoundRobin::RoundRobinSubchannelData::UpdateLogicalConnectivityStateLocked(
413
451
  grpc_connectivity_state connectivity_state) {
414
452
  RoundRobin* p = static_cast<RoundRobin*>(subchannel_list()->policy());
415
453
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
@@ -419,15 +457,18 @@ bool RoundRobin::RoundRobinSubchannelData::UpdateLogicalConnectivityStateLocked(
419
457
  "(index %" PRIuPTR " of %" PRIuPTR "): prev_state=%s new_state=%s",
420
458
  p, subchannel(), subchannel_list(), Index(),
421
459
  subchannel_list()->num_subchannels(),
422
- ConnectivityStateName(logical_connectivity_state_),
460
+ (logical_connectivity_state_.has_value()
461
+ ? ConnectivityStateName(*logical_connectivity_state_)
462
+ : "N/A"),
423
463
  ConnectivityStateName(connectivity_state));
424
464
  }
425
465
  // Decide what state to report for aggregation purposes.
426
466
  // If the last logical state was TRANSIENT_FAILURE, then ignore the
427
467
  // state change unless the new state is READY.
428
- if (logical_connectivity_state_ == GRPC_CHANNEL_TRANSIENT_FAILURE &&
468
+ if (logical_connectivity_state_.has_value() &&
469
+ *logical_connectivity_state_ == GRPC_CHANNEL_TRANSIENT_FAILURE &&
429
470
  connectivity_state != GRPC_CHANNEL_READY) {
430
- return false;
471
+ return;
431
472
  }
432
473
  // If the new state is IDLE, treat it as CONNECTING, since it will
433
474
  // immediately transition into CONNECTING anyway.
@@ -442,40 +483,14 @@ bool RoundRobin::RoundRobinSubchannelData::UpdateLogicalConnectivityStateLocked(
442
483
  connectivity_state = GRPC_CHANNEL_CONNECTING;
443
484
  }
444
485
  // If no change, return false.
445
- if (logical_connectivity_state_ == connectivity_state) return false;
486
+ if (logical_connectivity_state_.has_value() &&
487
+ *logical_connectivity_state_ == connectivity_state) {
488
+ return;
489
+ }
446
490
  // Otherwise, update counters and logical state.
447
491
  subchannel_list()->UpdateStateCountersLocked(logical_connectivity_state_,
448
492
  connectivity_state);
449
493
  logical_connectivity_state_ = connectivity_state;
450
- return true;
451
- }
452
-
453
- void RoundRobin::RoundRobinSubchannelData::ProcessConnectivityChangeLocked(
454
- grpc_connectivity_state connectivity_state) {
455
- RoundRobin* p = static_cast<RoundRobin*>(subchannel_list()->policy());
456
- GPR_ASSERT(subchannel() != nullptr);
457
- // If the new state is TRANSIENT_FAILURE or IDLE, re-resolve.
458
- // Only do this if we've started watching, not at startup time.
459
- // Otherwise, if the subchannel was already in state TRANSIENT_FAILURE
460
- // when the subchannel list was created, we'd wind up in a constant
461
- // loop of re-resolution.
462
- // Also attempt to reconnect.
463
- if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
464
- connectivity_state == GRPC_CHANNEL_IDLE) {
465
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
466
- gpr_log(GPR_INFO,
467
- "[RR %p] Subchannel %p reported %s; requesting re-resolution", p,
468
- subchannel(), ConnectivityStateName(connectivity_state));
469
- }
470
- p->channel_control_helper()->RequestReresolution();
471
- subchannel()->RequestConnection();
472
- }
473
- // Update logical connectivity state.
474
- // If it changed, update the policy state.
475
- if (UpdateLogicalConnectivityStateLocked(connectivity_state)) {
476
- subchannel_list()->MaybeUpdateRoundRobinConnectivityStateLocked(
477
- absl::UnavailableError("connections to all backends failing"));
478
- }
479
494
  }
480
495
 
481
496
  //