grpc 1.46.3 → 1.47.0

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

Potentially problematic release.


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

Files changed (481) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +49 -97
  3. data/include/grpc/event_engine/event_engine.h +42 -7
  4. data/include/grpc/event_engine/memory_allocator.h +0 -15
  5. data/include/grpc/event_engine/port.h +1 -1
  6. data/include/grpc/event_engine/slice.h +286 -0
  7. data/include/grpc/event_engine/slice_buffer.h +112 -0
  8. data/include/grpc/grpc_security.h +11 -0
  9. data/include/grpc/impl/codegen/port_platform.h +100 -36
  10. data/include/grpc/impl/codegen/slice.h +1 -1
  11. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
  12. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  14. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
  16. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
  18. data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
  19. data/src/core/ext/filters/client_channel/client_channel.h +26 -6
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  25. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  26. data/src/core/ext/filters/client_channel/config_selector.h +7 -5
  27. data/src/core/ext/filters/client_channel/connector.h +8 -2
  28. data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
  29. data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
  30. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  32. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  33. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  34. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  35. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
  52. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
  53. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
  54. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
  56. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
  57. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
  58. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
  60. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
  64. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  65. data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
  66. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  67. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  68. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  69. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  70. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  71. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  72. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
  73. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  74. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
  75. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  82. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  84. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
  85. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
  86. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  87. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
  88. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
  89. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  90. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
  91. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
  92. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
  93. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  94. data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
  95. data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
  96. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  97. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  98. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  99. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
  100. data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
  101. data/src/core/ext/filters/client_channel/subchannel.h +80 -20
  102. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
  103. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  104. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  105. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  106. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
  107. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
  108. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
  109. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
  110. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
  111. data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
  112. data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
  113. data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
  114. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
  115. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
  116. data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
  117. data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
  118. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
  119. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  120. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
  121. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
  122. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  123. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
  124. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  125. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  126. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  127. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  128. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
  129. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
  130. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  131. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  132. data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
  133. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
  134. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  135. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
  136. data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
  137. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  138. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  139. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  140. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  141. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  142. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  143. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  145. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
  146. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  147. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  148. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  149. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  150. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  151. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
  152. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  153. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  155. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  156. data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
  157. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
  158. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
  159. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  160. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  161. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  162. data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
  163. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
  164. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  165. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  166. data/src/core/ext/xds/certificate_provider_store.cc +4 -2
  167. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  168. data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
  169. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  170. data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
  171. data/src/core/ext/xds/xds_client.cc +46 -22
  172. data/src/core/ext/xds/xds_cluster.cc +106 -16
  173. data/src/core/ext/xds/xds_cluster.h +3 -0
  174. data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
  175. data/src/core/ext/xds/xds_listener.cc +19 -9
  176. data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
  177. data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
  178. data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
  179. data/src/core/lib/avl/avl.h +3 -1
  180. data/src/core/lib/channel/call_finalization.h +4 -0
  181. data/src/core/lib/channel/call_tracer.h +8 -2
  182. data/src/core/lib/channel/channel_args.cc +41 -22
  183. data/src/core/lib/channel/channel_args.h +33 -3
  184. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
  185. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  186. data/src/core/lib/channel/channel_stack.cc +41 -3
  187. data/src/core/lib/channel/channel_stack.h +49 -3
  188. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  189. data/src/core/lib/channel/channel_stack_builder.h +15 -27
  190. data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
  191. data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
  192. data/src/core/lib/channel/channel_trace.cc +8 -13
  193. data/src/core/lib/channel/channel_trace.h +6 -3
  194. data/src/core/lib/channel/channelz.cc +8 -13
  195. data/src/core/lib/channel/channelz.h +13 -4
  196. data/src/core/lib/channel/channelz_registry.cc +7 -14
  197. data/src/core/lib/channel/channelz_registry.h +10 -9
  198. data/src/core/lib/channel/connected_channel.cc +21 -31
  199. data/src/core/lib/channel/connected_channel.h +1 -0
  200. data/src/core/lib/channel/promise_based_filter.cc +444 -189
  201. data/src/core/lib/channel/promise_based_filter.h +160 -27
  202. data/src/core/lib/channel/status_util.cc +2 -0
  203. data/src/core/lib/channel/status_util.h +0 -3
  204. data/src/core/lib/compression/compression_internal.cc +45 -10
  205. data/src/core/lib/compression/compression_internal.h +1 -1
  206. data/src/core/lib/config/core_configuration.cc +3 -0
  207. data/src/core/lib/config/core_configuration.h +2 -1
  208. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  209. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  210. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  211. data/src/core/lib/event_engine/event_engine.cc +12 -2
  212. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  213. data/src/core/lib/event_engine/handle_containers.h +67 -0
  214. data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
  215. data/src/core/lib/event_engine/iomgr_engine.h +118 -0
  216. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  217. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  218. data/src/core/lib/event_engine/slice.cc +102 -0
  219. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  220. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  221. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  222. data/src/core/lib/gpr/log.cc +5 -0
  223. data/src/core/lib/gpr/tls.h +3 -5
  224. data/src/core/lib/gprpp/bitset.h +5 -1
  225. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  226. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  227. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  228. data/src/core/lib/gprpp/examine_stack.h +0 -1
  229. data/src/core/lib/gprpp/fork.cc +3 -6
  230. data/src/core/lib/gprpp/global_config.h +2 -4
  231. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  232. data/src/core/lib/gprpp/global_config_env.h +3 -1
  233. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  234. data/src/core/lib/gprpp/host_port.cc +2 -0
  235. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  236. data/src/core/lib/gprpp/match.h +2 -0
  237. data/src/core/lib/gprpp/memory.h +1 -5
  238. data/src/core/lib/gprpp/orphanable.h +1 -4
  239. data/src/core/lib/gprpp/ref_counted.h +1 -3
  240. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  241. data/src/core/lib/gprpp/stat.h +0 -2
  242. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  243. data/src/core/lib/gprpp/status_helper.cc +8 -4
  244. data/src/core/lib/gprpp/status_helper.h +4 -0
  245. data/src/core/lib/gprpp/sync.h +3 -1
  246. data/src/core/lib/gprpp/table.h +10 -0
  247. data/src/core/lib/gprpp/thd.h +2 -5
  248. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  249. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  250. data/src/core/lib/gprpp/time.cc +8 -0
  251. data/src/core/lib/gprpp/time.h +6 -1
  252. data/src/core/lib/gprpp/time_util.cc +4 -0
  253. data/src/core/lib/gprpp/time_util.h +1 -1
  254. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  255. data/src/core/lib/http/format_request.cc +29 -0
  256. data/src/core/lib/http/format_request.h +2 -0
  257. data/src/core/lib/http/httpcli.cc +88 -81
  258. data/src/core/lib/http/httpcli.h +39 -7
  259. data/src/core/lib/http/httpcli_security_connector.cc +3 -4
  260. data/src/core/lib/iomgr/endpoint.cc +4 -4
  261. data/src/core/lib/iomgr/endpoint.h +6 -4
  262. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
  263. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  264. data/src/core/lib/iomgr/ev_posix.cc +1 -4
  265. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  266. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  267. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  268. data/src/core/lib/iomgr/iomgr.cc +0 -1
  269. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  270. data/src/core/lib/iomgr/pollset_set.h +1 -2
  271. data/src/core/lib/iomgr/port.h +25 -6
  272. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  273. data/src/core/lib/iomgr/resolve_address.h +21 -14
  274. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  275. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
  276. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  277. data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
  278. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  279. data/src/core/lib/iomgr/sockaddr.h +2 -3
  280. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  281. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  282. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  283. data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
  284. data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
  285. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
  286. data/src/core/lib/iomgr/tcp_posix.cc +9 -27
  287. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
  288. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
  289. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
  290. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
  291. data/src/core/lib/iomgr/tcp_windows.cc +7 -4
  292. data/src/core/lib/json/json.h +1 -2
  293. data/src/core/lib/json/json_reader.cc +9 -1
  294. data/src/core/lib/json/json_util.cc +7 -0
  295. data/src/core/lib/json/json_util.h +10 -1
  296. data/src/core/lib/json/json_writer.cc +6 -1
  297. data/src/core/lib/promise/activity.cc +1 -1
  298. data/src/core/lib/promise/activity.h +6 -6
  299. data/src/core/lib/promise/arena_promise.h +11 -1
  300. data/src/core/lib/promise/call_push_pull.h +4 -0
  301. data/src/core/lib/promise/context.h +1 -1
  302. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  303. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  304. data/src/core/lib/promise/latch.h +0 -1
  305. data/src/core/lib/promise/loop.h +1 -0
  306. data/src/core/lib/promise/race.h +0 -1
  307. data/src/core/lib/promise/seq.h +0 -2
  308. data/src/core/lib/promise/sleep.cc +2 -0
  309. data/src/core/lib/promise/sleep.h +10 -0
  310. data/src/core/lib/promise/try_seq.h +2 -2
  311. data/src/core/lib/resolver/resolver_factory.h +1 -2
  312. data/src/core/lib/resolver/server_address.cc +9 -3
  313. data/src/core/lib/resolver/server_address.h +4 -4
  314. data/src/core/lib/resource_quota/api.cc +14 -1
  315. data/src/core/lib/resource_quota/api.h +4 -1
  316. data/src/core/lib/resource_quota/arena.cc +0 -6
  317. data/src/core/lib/resource_quota/arena.h +1 -2
  318. data/src/core/lib/resource_quota/memory_quota.cc +47 -5
  319. data/src/core/lib/resource_quota/memory_quota.h +24 -5
  320. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  321. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  322. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  323. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
  324. data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
  325. data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
  326. data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
  327. data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
  328. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
  329. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
  330. data/src/core/lib/security/credentials/credentials.h +17 -10
  331. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
  333. data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
  334. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
  335. data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
  340. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  341. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
  342. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
  344. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  345. data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
  346. data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  348. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
  350. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
  351. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
  352. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
  353. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
  354. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
  355. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
  356. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
  357. data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
  358. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  359. data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
  360. data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
  361. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  362. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  364. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  365. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
  366. data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
  367. data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
  368. data/src/core/lib/security/transport/security_handshaker.cc +5 -5
  369. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  370. data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
  371. data/src/core/lib/service_config/service_config.h +4 -8
  372. data/src/core/lib/service_config/service_config_call_data.h +4 -1
  373. data/src/core/lib/service_config/service_config_impl.cc +7 -0
  374. data/src/core/lib/service_config/service_config_impl.h +9 -2
  375. data/src/core/lib/service_config/service_config_parser.cc +8 -0
  376. data/src/core/lib/service_config/service_config_parser.h +7 -0
  377. data/src/core/lib/slice/b64.cc +1 -1
  378. data/src/core/lib/slice/b64.h +2 -0
  379. data/src/core/lib/slice/percent_encoding.cc +4 -1
  380. data/src/core/lib/slice/percent_encoding.h +0 -6
  381. data/src/core/lib/slice/slice.cc +2 -1
  382. data/src/core/lib/slice/slice.h +10 -5
  383. data/src/core/lib/slice/slice_api.cc +1 -1
  384. data/src/core/lib/slice/slice_buffer.cc +50 -23
  385. data/src/core/lib/slice/slice_buffer.h +106 -0
  386. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  387. data/src/core/lib/slice/slice_internal.h +4 -3
  388. data/src/core/lib/slice/slice_refcount.h +2 -3
  389. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  390. data/src/core/lib/slice/slice_split.cc +3 -0
  391. data/src/core/lib/slice/slice_split.h +0 -4
  392. data/src/core/lib/slice/slice_string_helpers.cc +4 -0
  393. data/src/core/lib/slice/slice_string_helpers.h +1 -4
  394. data/src/core/lib/surface/builtins.cc +7 -2
  395. data/src/core/lib/surface/byte_buffer.cc +7 -1
  396. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  397. data/src/core/lib/surface/call.cc +41 -26
  398. data/src/core/lib/surface/call.h +16 -2
  399. data/src/core/lib/surface/call_details.cc +4 -4
  400. data/src/core/lib/surface/call_log_batch.cc +7 -1
  401. data/src/core/lib/surface/call_test_only.h +4 -1
  402. data/src/core/lib/surface/channel.cc +179 -242
  403. data/src/core/lib/surface/channel.h +94 -57
  404. data/src/core/lib/surface/channel_init.h +2 -0
  405. data/src/core/lib/surface/channel_ping.cc +8 -2
  406. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  407. data/src/core/lib/surface/channel_stack_type.h +0 -2
  408. data/src/core/lib/surface/completion_queue.cc +14 -6
  409. data/src/core/lib/surface/completion_queue.h +5 -1
  410. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  411. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  412. data/src/core/lib/surface/event_string.cc +1 -7
  413. data/src/core/lib/surface/event_string.h +1 -1
  414. data/src/core/lib/surface/init.cc +17 -45
  415. data/src/core/lib/surface/init.h +0 -8
  416. data/src/core/lib/surface/lame_client.cc +64 -110
  417. data/src/core/lib/surface/lame_client.h +40 -2
  418. data/src/core/lib/surface/metadata_array.cc +2 -0
  419. data/src/core/lib/surface/server.cc +69 -56
  420. data/src/core/lib/surface/server.h +39 -9
  421. data/src/core/lib/surface/validate_metadata.cc +2 -5
  422. data/src/core/lib/surface/validate_metadata.h +3 -0
  423. data/src/core/lib/surface/version.cc +2 -2
  424. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  425. data/src/core/lib/transport/bdp_estimator.h +2 -3
  426. data/src/core/lib/transport/byte_stream.cc +4 -3
  427. data/src/core/lib/transport/byte_stream.h +5 -1
  428. data/src/core/lib/transport/connectivity_state.cc +6 -4
  429. data/src/core/lib/transport/connectivity_state.h +2 -3
  430. data/src/core/lib/transport/error_utils.cc +4 -2
  431. data/src/core/lib/transport/error_utils.h +5 -1
  432. data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
  433. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  434. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  435. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  436. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  437. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
  438. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  439. data/src/core/lib/transport/metadata_batch.cc +287 -0
  440. data/src/core/lib/transport/metadata_batch.h +133 -264
  441. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  442. data/src/core/lib/transport/parsed_metadata.h +10 -3
  443. data/src/core/lib/transport/status_conversion.cc +2 -0
  444. data/src/core/lib/transport/status_conversion.h +2 -2
  445. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  446. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  447. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  448. data/src/core/lib/transport/timeout_encoding.h +5 -1
  449. data/src/core/lib/transport/transport.cc +18 -17
  450. data/src/core/lib/transport/transport.h +28 -2
  451. data/src/core/lib/transport/transport_impl.h +10 -0
  452. data/src/core/lib/transport/transport_op_string.cc +9 -10
  453. data/src/core/lib/uri/uri_parser.cc +11 -3
  454. data/src/core/lib/uri/uri_parser.h +0 -2
  455. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  456. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  457. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  458. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  459. data/src/ruby/ext/grpc/extconf.rb +2 -2
  460. data/src/ruby/lib/grpc/version.rb +1 -1
  461. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  462. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  463. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  464. metadata +36 -29
  465. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  466. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  467. data/src/core/lib/event_engine/sockaddr.h +0 -44
  468. data/src/core/lib/gprpp/capture.h +0 -76
  469. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  470. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  471. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  472. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  473. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  474. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  475. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  476. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  477. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  478. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  479. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  480. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  481. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -16,21 +16,36 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <inttypes.h>
19
20
  #include <stdlib.h>
20
- #include <string.h>
21
21
 
22
- #include <grpc/support/alloc.h>
22
+ #include <memory>
23
+ #include <string>
24
+ #include <utility>
23
25
 
26
+ #include "absl/container/inlined_vector.h"
27
+ #include "absl/memory/memory.h"
28
+ #include "absl/status/status.h"
29
+ #include "absl/status/statusor.h"
30
+ #include "absl/strings/str_cat.h"
31
+
32
+ #include <grpc/impl/codegen/connectivity_state.h>
33
+ #include <grpc/impl/codegen/grpc_types.h>
34
+ #include <grpc/support/log.h>
35
+
36
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
24
37
  #include "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h"
38
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
25
39
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
26
- #include "src/core/ext/filters/client_channel/subchannel.h"
27
- #include "src/core/lib/address_utils/sockaddr_utils.h"
28
- #include "src/core/lib/channel/channel_args.h"
40
+ #include "src/core/ext/filters/client_channel/subchannel_interface.h"
29
41
  #include "src/core/lib/debug/trace.h"
42
+ #include "src/core/lib/gprpp/debug_location.h"
43
+ #include "src/core/lib/gprpp/orphanable.h"
30
44
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
31
- #include "src/core/lib/gprpp/sync.h"
45
+ #include "src/core/lib/iomgr/error.h"
46
+ #include "src/core/lib/json/json.h"
47
+ #include "src/core/lib/resolver/server_address.h"
32
48
  #include "src/core/lib/transport/connectivity_state.h"
33
- #include "src/core/lib/transport/error_utils.h"
34
49
 
35
50
  namespace grpc_core {
36
51
 
@@ -75,14 +90,15 @@ class RoundRobin : public LoadBalancingPolicy {
75
90
  : SubchannelData(subchannel_list, address, std::move(subchannel)) {}
76
91
 
77
92
  grpc_connectivity_state connectivity_state() const {
78
- return last_connectivity_state_;
93
+ return logical_connectivity_state_;
79
94
  }
80
95
 
81
- bool seen_failure_since_ready() const { return seen_failure_since_ready_; }
82
-
83
- // Performs connectivity state updates that need to be done both when we
84
- // first start watching and when a watcher notification is received.
85
- void UpdateConnectivityStateLocked(
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(
86
102
  grpc_connectivity_state connectivity_state);
87
103
 
88
104
  private:
@@ -91,8 +107,7 @@ class RoundRobin : public LoadBalancingPolicy {
91
107
  void ProcessConnectivityChangeLocked(
92
108
  grpc_connectivity_state connectivity_state) override;
93
109
 
94
- grpc_connectivity_state last_connectivity_state_ = GRPC_CHANNEL_IDLE;
95
- bool seen_failure_since_ready_ = false;
110
+ grpc_connectivity_state logical_connectivity_state_ = GRPC_CHANNEL_IDLE;
96
111
  };
97
112
 
98
113
  // A list of subchannels.
@@ -100,11 +115,14 @@ class RoundRobin : public LoadBalancingPolicy {
100
115
  : public SubchannelList<RoundRobinSubchannelList,
101
116
  RoundRobinSubchannelData> {
102
117
  public:
103
- RoundRobinSubchannelList(RoundRobin* policy, TraceFlag* tracer,
104
- ServerAddressList addresses,
118
+ RoundRobinSubchannelList(RoundRobin* policy, ServerAddressList addresses,
105
119
  const grpc_channel_args& args)
106
- : SubchannelList(policy, tracer, std::move(addresses),
107
- policy->channel_control_helper(), args) {
120
+ : SubchannelList(policy,
121
+ (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)
122
+ ? "RoundRobinSubchannelList"
123
+ : nullptr),
124
+ std::move(addresses), policy->channel_control_helper(),
125
+ args) {
108
126
  // Need to maintain a ref to the LB policy as long as we maintain
109
127
  // any references to subchannels, since the subchannels'
110
128
  // pollset_sets will include the LB policy's pollset_set.
@@ -117,23 +135,27 @@ class RoundRobin : public LoadBalancingPolicy {
117
135
  }
118
136
 
119
137
  // Starts watching the subchannels in this list.
120
- void StartWatchingLocked();
138
+ void StartWatchingLocked(absl::Status status_for_tf);
121
139
 
122
140
  // Updates the counters of subchannels in each state when a
123
141
  // subchannel transitions from old_state to new_state.
124
142
  void UpdateStateCountersLocked(grpc_connectivity_state old_state,
125
143
  grpc_connectivity_state new_state);
126
144
 
127
- // If this subchannel list is the RR policy's current subchannel
128
- // list, updates the RR policy's connectivity state based on the
129
- // subchannel list's state counters.
130
- void MaybeUpdateRoundRobinConnectivityStateLocked();
131
-
132
- // Updates the RR policy's overall state based on the counters of
133
- // subchannels in each state.
134
- void UpdateRoundRobinStateFromSubchannelStateCountsLocked();
145
+ // Ensures that the right subchannel list is used and then updates
146
+ // the RR policy's connectivity state based on the subchannel list's
147
+ // state counters.
148
+ void MaybeUpdateRoundRobinConnectivityStateLocked(
149
+ absl::Status status_for_tf);
135
150
 
136
151
  private:
152
+ std::string CountersString() const {
153
+ return absl::StrCat("num_subchannels=", num_subchannels(),
154
+ " num_ready=", num_ready_,
155
+ " num_connecting=", num_connecting_,
156
+ " num_transient_failure=", num_transient_failure_);
157
+ }
158
+
137
159
  size_t num_ready_ = 0;
138
160
  size_t num_connecting_ = 0;
139
161
  size_t num_transient_failure_ = 0;
@@ -238,8 +260,45 @@ void RoundRobin::ResetBackoffLocked() {
238
260
  }
239
261
  }
240
262
 
241
- void RoundRobin::RoundRobinSubchannelList::StartWatchingLocked() {
242
- if (num_subchannels() == 0) return;
263
+ void RoundRobin::UpdateLocked(UpdateArgs args) {
264
+ ServerAddressList addresses;
265
+ if (args.addresses.ok()) {
266
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
267
+ gpr_log(GPR_INFO, "[RR %p] received update with %" PRIuPTR " addresses",
268
+ this, args.addresses->size());
269
+ }
270
+ addresses = std::move(*args.addresses);
271
+ } else {
272
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
273
+ gpr_log(GPR_INFO, "[RR %p] received update with address error: %s", this,
274
+ args.addresses.status().ToString().c_str());
275
+ }
276
+ // If we already have a subchannel list, then ignore the resolver
277
+ // failure and keep using the existing list.
278
+ if (subchannel_list_ != nullptr) return;
279
+ }
280
+ // Create new subchannel list, replacing the previous pending list, if any.
281
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace) &&
282
+ latest_pending_subchannel_list_ != nullptr) {
283
+ gpr_log(GPR_INFO, "[RR %p] replacing previous pending subchannel list %p",
284
+ this, latest_pending_subchannel_list_.get());
285
+ }
286
+ latest_pending_subchannel_list_ = MakeOrphanable<RoundRobinSubchannelList>(
287
+ 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());
294
+ }
295
+
296
+ //
297
+ // RoundRobinSubchannelList
298
+ //
299
+
300
+ void RoundRobin::RoundRobinSubchannelList::StartWatchingLocked(
301
+ absl::Status status_for_tf) {
243
302
  // Check current state of each subchannel synchronously, since any
244
303
  // subchannel already used by some other channel may have a non-IDLE
245
304
  // state.
@@ -247,18 +306,18 @@ void RoundRobin::RoundRobinSubchannelList::StartWatchingLocked() {
247
306
  grpc_connectivity_state state =
248
307
  subchannel(i)->CheckConnectivityStateLocked();
249
308
  if (state != GRPC_CHANNEL_IDLE) {
250
- subchannel(i)->UpdateConnectivityStateLocked(state);
309
+ subchannel(i)->UpdateLogicalConnectivityStateLocked(state);
251
310
  }
252
311
  }
253
312
  // Start connectivity watch for each subchannel.
254
313
  for (size_t i = 0; i < num_subchannels(); i++) {
255
314
  if (subchannel(i)->subchannel() != nullptr) {
256
315
  subchannel(i)->StartConnectivityWatchLocked();
257
- subchannel(i)->subchannel()->AttemptToConnect();
316
+ subchannel(i)->subchannel()->RequestConnection();
258
317
  }
259
318
  }
260
- // Now set the LB policy's state based on the subchannels' states.
261
- UpdateRoundRobinStateFromSubchannelStateCountsLocked();
319
+ // Update RR connectivity state if needed.
320
+ MaybeUpdateRoundRobinConnectivityStateLocked(status_for_tf);
262
321
  }
263
322
 
264
323
  void RoundRobin::RoundRobinSubchannelList::UpdateStateCountersLocked(
@@ -284,80 +343,73 @@ void RoundRobin::RoundRobinSubchannelList::UpdateStateCountersLocked(
284
343
  }
285
344
  }
286
345
 
287
- // Sets the RR policy's connectivity state and generates a new picker based
288
- // on the current subchannel list.
289
346
  void RoundRobin::RoundRobinSubchannelList::
290
- MaybeUpdateRoundRobinConnectivityStateLocked() {
347
+ MaybeUpdateRoundRobinConnectivityStateLocked(absl::Status status_for_tf) {
291
348
  RoundRobin* p = static_cast<RoundRobin*>(policy());
349
+ // If this is latest_pending_subchannel_list_, then swap it into
350
+ // subchannel_list_ in the following cases:
351
+ // - subchannel_list_ is null (i.e., this is the first update).
352
+ // - subchannel_list_ has no READY subchannels.
353
+ // - 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.
358
+ 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.
362
+ num_transient_failure_ == num_subchannels())) {
363
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
364
+ const std::string old_counters_string =
365
+ p->subchannel_list_ != nullptr ? p->subchannel_list_->CountersString()
366
+ : "";
367
+ gpr_log(
368
+ GPR_INFO,
369
+ "[RR %p] swapping out subchannel list %p (%s) in favor of %p (%s)", p,
370
+ p->subchannel_list_.get(), old_counters_string.c_str(), this,
371
+ CountersString().c_str());
372
+ }
373
+ p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_);
374
+ }
292
375
  // Only set connectivity state if this is the current subchannel list.
293
376
  if (p->subchannel_list_.get() != this) return;
294
- // In priority order. The first rule to match terminates the search (ie, if we
295
- // are on rule n, all previous rules were unfulfilled).
296
- //
297
- // 1) RULE: ANY subchannel is READY => policy is READY.
298
- // CHECK: subchannel_list->num_ready > 0.
299
- //
300
- // 2) RULE: ANY subchannel is CONNECTING => policy is CONNECTING.
301
- // CHECK: sd->curr_connectivity_state == CONNECTING.
302
- //
303
- // 3) RULE: ALL subchannels are TRANSIENT_FAILURE => policy is
304
- // TRANSIENT_FAILURE.
305
- // CHECK: subchannel_list->num_transient_failures ==
306
- // subchannel_list->num_subchannels.
377
+ // First matching rule wins:
378
+ // 1) ANY subchannel is READY => policy is READY.
379
+ // 2) ANY subchannel is CONNECTING => policy is CONNECTING.
380
+ // 3) ALL subchannels are TRANSIENT_FAILURE => policy is TRANSIENT_FAILURE.
307
381
  if (num_ready_ > 0) {
308
- // 1) READY
382
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
383
+ gpr_log(GPR_INFO, "[RR %p] reporting READY with subchannel list %p", p,
384
+ this);
385
+ }
309
386
  p->channel_control_helper()->UpdateState(
310
387
  GRPC_CHANNEL_READY, absl::Status(), absl::make_unique<Picker>(p, this));
311
388
  } else if (num_connecting_ > 0) {
312
- // 2) CONNECTING
389
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
390
+ gpr_log(GPR_INFO, "[RR %p] reporting CONNECTING with subchannel list %p",
391
+ p, this);
392
+ }
313
393
  p->channel_control_helper()->UpdateState(
314
394
  GRPC_CHANNEL_CONNECTING, absl::Status(),
315
395
  absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
316
396
  } else if (num_transient_failure_ == num_subchannels()) {
317
- // 3) TRANSIENT_FAILURE
318
- absl::Status status =
319
- absl::UnavailableError("connections to all backends failing");
397
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
398
+ gpr_log(GPR_INFO,
399
+ "[RR %p] reporting TRANSIENT_FAILURE with subchannel list %p: %s",
400
+ p, this, status_for_tf.ToString().c_str());
401
+ }
320
402
  p->channel_control_helper()->UpdateState(
321
- GRPC_CHANNEL_TRANSIENT_FAILURE, status,
322
- absl::make_unique<TransientFailurePicker>(status));
403
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status_for_tf,
404
+ absl::make_unique<TransientFailurePicker>(status_for_tf));
323
405
  }
324
406
  }
325
407
 
326
- void RoundRobin::RoundRobinSubchannelList::
327
- UpdateRoundRobinStateFromSubchannelStateCountsLocked() {
328
- RoundRobin* p = static_cast<RoundRobin*>(policy());
329
- // If we have at least one READY subchannel, then swap to the new list.
330
- // Also, if all of the subchannels are in TRANSIENT_FAILURE, then we know
331
- // we've tried all of them and failed, so we go ahead and swap over
332
- // anyway; this may cause the channel to go from READY to TRANSIENT_FAILURE,
333
- // but we are doing what the control plane told us to do.
334
- if (num_ready_ > 0 || num_transient_failure_ == num_subchannels()) {
335
- if (p->subchannel_list_.get() != this) {
336
- // Promote this list to p->subchannel_list_.
337
- // This list must be p->latest_pending_subchannel_list_, because
338
- // any previous update would have been shut down already and
339
- // therefore we would not be receiving a notification for them.
340
- GPR_ASSERT(p->latest_pending_subchannel_list_.get() == this);
341
- GPR_ASSERT(!shutting_down());
342
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
343
- const size_t old_num_subchannels =
344
- p->subchannel_list_ != nullptr
345
- ? p->subchannel_list_->num_subchannels()
346
- : 0;
347
- gpr_log(GPR_INFO,
348
- "[RR %p] phasing out subchannel list %p (size %" PRIuPTR
349
- ") in favor of %p (size %" PRIuPTR ")",
350
- p, p->subchannel_list_.get(), old_num_subchannels, this,
351
- num_subchannels());
352
- }
353
- p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_);
354
- }
355
- }
356
- // Update the RR policy's connectivity state if needed.
357
- MaybeUpdateRoundRobinConnectivityStateLocked();
358
- }
408
+ //
409
+ // RoundRobinSubchannelData
410
+ //
359
411
 
360
- void RoundRobin::RoundRobinSubchannelData::UpdateConnectivityStateLocked(
412
+ bool RoundRobin::RoundRobinSubchannelData::UpdateLogicalConnectivityStateLocked(
361
413
  grpc_connectivity_state connectivity_state) {
362
414
  RoundRobin* p = static_cast<RoundRobin*>(subchannel_list()->policy());
363
415
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
@@ -367,115 +419,74 @@ void RoundRobin::RoundRobinSubchannelData::UpdateConnectivityStateLocked(
367
419
  "(index %" PRIuPTR " of %" PRIuPTR "): prev_state=%s new_state=%s",
368
420
  p, subchannel(), subchannel_list(), Index(),
369
421
  subchannel_list()->num_subchannels(),
370
- ConnectivityStateName(last_connectivity_state_),
422
+ ConnectivityStateName(logical_connectivity_state_),
371
423
  ConnectivityStateName(connectivity_state));
372
424
  }
373
425
  // Decide what state to report for aggregation purposes.
374
- // If we haven't seen a failure since the last time we were in state
375
- // READY, then we report the state change as-is. However, once we do see
376
- // a failure, we report TRANSIENT_FAILURE and do not report any subsequent
377
- // state changes until we go back into state READY.
378
- if (!seen_failure_since_ready_) {
379
- if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
380
- seen_failure_since_ready_ = true;
381
- }
382
- subchannel_list()->UpdateStateCountersLocked(last_connectivity_state_,
383
- connectivity_state);
384
- } else {
385
- if (connectivity_state == GRPC_CHANNEL_READY) {
386
- seen_failure_since_ready_ = false;
387
- subchannel_list()->UpdateStateCountersLocked(
388
- GRPC_CHANNEL_TRANSIENT_FAILURE, connectivity_state);
426
+ // If the last logical state was TRANSIENT_FAILURE, then ignore the
427
+ // state change unless the new state is READY.
428
+ if (logical_connectivity_state_ == GRPC_CHANNEL_TRANSIENT_FAILURE &&
429
+ connectivity_state != GRPC_CHANNEL_READY) {
430
+ return false;
431
+ }
432
+ // If the new state is IDLE, treat it as CONNECTING, since it will
433
+ // immediately transition into CONNECTING anyway.
434
+ if (connectivity_state == GRPC_CHANNEL_IDLE) {
435
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
436
+ gpr_log(GPR_INFO,
437
+ "[RR %p] subchannel %p, subchannel_list %p (index %" PRIuPTR
438
+ " of %" PRIuPTR "): treating IDLE as CONNECTING",
439
+ p, subchannel(), subchannel_list(), Index(),
440
+ subchannel_list()->num_subchannels());
389
441
  }
442
+ connectivity_state = GRPC_CHANNEL_CONNECTING;
390
443
  }
391
- // Record last seen connectivity state.
392
- last_connectivity_state_ = connectivity_state;
444
+ // If no change, return false.
445
+ if (logical_connectivity_state_ == connectivity_state) return false;
446
+ // Otherwise, update counters and logical state.
447
+ subchannel_list()->UpdateStateCountersLocked(logical_connectivity_state_,
448
+ connectivity_state);
449
+ logical_connectivity_state_ = connectivity_state;
450
+ return true;
393
451
  }
394
452
 
395
453
  void RoundRobin::RoundRobinSubchannelData::ProcessConnectivityChangeLocked(
396
454
  grpc_connectivity_state connectivity_state) {
397
455
  RoundRobin* p = static_cast<RoundRobin*>(subchannel_list()->policy());
398
456
  GPR_ASSERT(subchannel() != nullptr);
399
- // If the new state is TRANSIENT_FAILURE, re-resolve.
457
+ // If the new state is TRANSIENT_FAILURE or IDLE, re-resolve.
400
458
  // Only do this if we've started watching, not at startup time.
401
459
  // Otherwise, if the subchannel was already in state TRANSIENT_FAILURE
402
460
  // when the subchannel list was created, we'd wind up in a constant
403
461
  // loop of re-resolution.
404
462
  // Also attempt to reconnect.
405
- if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
463
+ if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
464
+ connectivity_state == GRPC_CHANNEL_IDLE) {
406
465
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
407
466
  gpr_log(GPR_INFO,
408
- "[RR %p] Subchannel %p has gone into TRANSIENT_FAILURE. "
409
- "Requesting re-resolution",
410
- p, subchannel());
467
+ "[RR %p] Subchannel %p reported %s; requesting re-resolution", p,
468
+ subchannel(), ConnectivityStateName(connectivity_state));
411
469
  }
412
470
  p->channel_control_helper()->RequestReresolution();
413
- subchannel()->AttemptToConnect();
471
+ subchannel()->RequestConnection();
414
472
  }
415
- // Update state counters.
416
- UpdateConnectivityStateLocked(connectivity_state);
417
- // Update overall state and renew notification.
418
- subchannel_list()->UpdateRoundRobinStateFromSubchannelStateCountsLocked();
419
- }
420
-
421
- void RoundRobin::UpdateLocked(UpdateArgs args) {
422
- ServerAddressList addresses;
423
- if (args.addresses.ok()) {
424
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
425
- gpr_log(GPR_INFO, "[RR %p] received update with %" PRIuPTR " addresses",
426
- this, args.addresses->size());
427
- }
428
- addresses = std::move(*args.addresses);
429
- } else {
430
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
431
- gpr_log(GPR_INFO, "[RR %p] received update with address error: %s", this,
432
- args.addresses.status().ToString().c_str());
433
- }
434
- // If we already have a subchannel list, then ignore the resolver
435
- // failure and keep using the existing list.
436
- if (subchannel_list_ != nullptr) return;
437
- }
438
- // Replace latest_pending_subchannel_list_.
439
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace) &&
440
- latest_pending_subchannel_list_ != nullptr) {
441
- gpr_log(GPR_INFO,
442
- "[RR %p] Shutting down previous pending subchannel list %p", this,
443
- latest_pending_subchannel_list_.get());
444
- }
445
- latest_pending_subchannel_list_ = MakeOrphanable<RoundRobinSubchannelList>(
446
- this, &grpc_lb_round_robin_trace, std::move(addresses), *args.args);
447
- if (latest_pending_subchannel_list_->num_subchannels() == 0) {
448
- // If the new list is empty, immediately promote the new list to the
449
- // current list and transition to TRANSIENT_FAILURE.
450
- absl::Status status =
451
- args.addresses.ok() ? absl::UnavailableError(absl::StrCat(
452
- "empty address list: ", args.resolution_note))
453
- : args.addresses.status();
454
- channel_control_helper()->UpdateState(
455
- GRPC_CHANNEL_TRANSIENT_FAILURE, status,
456
- absl::make_unique<TransientFailurePicker>(status));
457
- subchannel_list_ = std::move(latest_pending_subchannel_list_);
458
- } else if (subchannel_list_ == nullptr) {
459
- // If there is no current list, immediately promote the new list to
460
- // the current list and start watching it.
461
- subchannel_list_ = std::move(latest_pending_subchannel_list_);
462
- subchannel_list_->StartWatchingLocked();
463
- } else {
464
- // Start watching the pending list. It will get swapped into the
465
- // current list when it reports READY.
466
- latest_pending_subchannel_list_->StartWatchingLocked();
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"));
467
478
  }
468
479
  }
469
480
 
481
+ //
482
+ // factory
483
+ //
484
+
470
485
  class RoundRobinConfig : public LoadBalancingPolicy::Config {
471
486
  public:
472
487
  const char* name() const override { return kRoundRobin; }
473
488
  };
474
489
 
475
- //
476
- // factory
477
- //
478
-
479
490
  class RoundRobinFactory : public LoadBalancingPolicyFactory {
480
491
  public:
481
492
  OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(