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
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2022 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_OUTLIER_DETECTION_OUTLIER_DETECTION_H
18
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_OUTLIER_DETECTION_OUTLIER_DETECTION_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <stdint.h> // for uint32_t
23
+
24
+ #include "absl/types/optional.h"
25
+
26
+ #include "src/core/lib/gprpp/time.h"
27
+
28
+ namespace grpc_core {
29
+
30
+ bool XdsOutlierDetectionEnabled();
31
+
32
+ struct OutlierDetectionConfig {
33
+ Duration interval = Duration::Infinity();
34
+ Duration base_ejection_time = Duration::Milliseconds(30000);
35
+ Duration max_ejection_time = Duration::Milliseconds(30000);
36
+ uint32_t max_ejection_percent = 10;
37
+ struct SuccessRateEjection {
38
+ uint32_t stdev_factor = 1900;
39
+ uint32_t enforcement_percentage = 0;
40
+ uint32_t minimum_hosts = 5;
41
+ uint32_t request_volume = 100;
42
+ };
43
+ struct FailurePercentageEjection {
44
+ uint32_t threshold = 85;
45
+ uint32_t enforcement_percentage = 0;
46
+ uint32_t minimum_hosts = 5;
47
+ uint32_t request_volume = 50;
48
+ };
49
+ absl::optional<SuccessRateEjection> success_rate_ejection;
50
+ absl::optional<FailurePercentageEjection> failure_percentage_ejection;
51
+ };
52
+ } // namespace grpc_core
53
+
54
+ #endif // GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_OUTLIER_DETECTION_OUTLIER_DETECTION_H
@@ -16,19 +16,37 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <inttypes.h>
19
20
  #include <string.h>
20
21
 
21
- #include <grpc/support/alloc.h>
22
+ #include <memory>
23
+ #include <string>
24
+ #include <utility>
22
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"
23
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"
24
39
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
25
- #include "src/core/ext/filters/client_channel/subchannel.h"
26
- #include "src/core/lib/address_utils/sockaddr_utils.h"
40
+ #include "src/core/ext/filters/client_channel/subchannel_interface.h"
27
41
  #include "src/core/lib/channel/channel_args.h"
28
- #include "src/core/lib/gprpp/sync.h"
42
+ #include "src/core/lib/debug/trace.h"
43
+ #include "src/core/lib/gprpp/debug_location.h"
44
+ #include "src/core/lib/gprpp/orphanable.h"
45
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
46
+ #include "src/core/lib/iomgr/error.h"
47
+ #include "src/core/lib/json/json.h"
29
48
  #include "src/core/lib/resolver/server_address.h"
30
49
  #include "src/core/lib/transport/connectivity_state.h"
31
- #include "src/core/lib/transport/error_utils.h"
32
50
 
33
51
  namespace grpc_core {
34
52
 
@@ -81,11 +99,14 @@ class PickFirst : public LoadBalancingPolicy {
81
99
  : public SubchannelList<PickFirstSubchannelList,
82
100
  PickFirstSubchannelData> {
83
101
  public:
84
- PickFirstSubchannelList(PickFirst* policy, TraceFlag* tracer,
85
- ServerAddressList addresses,
102
+ PickFirstSubchannelList(PickFirst* policy, ServerAddressList addresses,
86
103
  const grpc_channel_args& args)
87
- : SubchannelList(policy, tracer, std::move(addresses),
88
- policy->channel_control_helper(), args) {
104
+ : SubchannelList(policy,
105
+ (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)
106
+ ? "PickFirstSubchannelList"
107
+ : nullptr),
108
+ std::move(addresses), policy->channel_control_helper(),
109
+ args) {
89
110
  // Need to maintain a ref to the LB policy as long as we maintain
90
111
  // any references to subchannels, since the subchannels'
91
112
  // pollset_sets will include the LB policy's pollset_set.
@@ -185,8 +206,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
185
206
  addresses = *latest_update_args_.addresses;
186
207
  }
187
208
  auto subchannel_list = MakeOrphanable<PickFirstSubchannelList>(
188
- this, &grpc_lb_pick_first_trace, std::move(addresses),
189
- *latest_update_args_.args);
209
+ this, std::move(addresses), *latest_update_args_.args);
190
210
  // Empty update or no valid subchannels.
191
211
  if (subchannel_list->num_subchannels() == 0) {
192
212
  // Unsubscribe from all current subchannels.
@@ -201,6 +221,10 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
201
221
  channel_control_helper()->UpdateState(
202
222
  GRPC_CHANNEL_TRANSIENT_FAILURE, status,
203
223
  absl::make_unique<TransientFailurePicker>(status));
224
+ // If there was a previously pending update (which may or may
225
+ // not have contained the currently selected subchannel), drop
226
+ // it, so that it doesn't override what we've done here.
227
+ latest_pending_subchannel_list_.reset();
204
228
  return;
205
229
  }
206
230
  // If one of the subchannels in the new list is already in state
@@ -232,7 +256,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
232
256
  // here, since we've already checked the initial connectivity
233
257
  // state of all subchannels above.
234
258
  subchannel_list_->subchannel(0)->StartConnectivityWatchLocked();
235
- subchannel_list_->subchannel(0)->subchannel()->AttemptToConnect();
259
+ subchannel_list_->subchannel(0)->subchannel()->RequestConnection();
236
260
  } else {
237
261
  // We do have a selected subchannel (which means it's READY), so keep
238
262
  // using it until one of the subchannels in the new list reports READY.
@@ -255,7 +279,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
255
279
  ->StartConnectivityWatchLocked();
256
280
  latest_pending_subchannel_list_->subchannel(0)
257
281
  ->subchannel()
258
- ->AttemptToConnect();
282
+ ->RequestConnection();
259
283
  }
260
284
  }
261
285
 
@@ -307,10 +331,13 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
307
331
  "Pick First %p selected subchannel connectivity changed to %s", p,
308
332
  ConnectivityStateName(connectivity_state));
309
333
  }
310
- // If the new state is anything other than READY and there is a
311
- // pending update, switch to the pending update.
312
- if (connectivity_state != GRPC_CHANNEL_READY &&
313
- p->latest_pending_subchannel_list_ != nullptr) {
334
+ // We might miss a connectivity state update between calling
335
+ // CheckConnectivityStateLocked() and StartConnectivityWatchLocked().
336
+ // If the new state is READY, just ignore it; otherwise, regardless of
337
+ // what state it is, we treat it as a failure of the existing connection.
338
+ if (connectivity_state == GRPC_CHANNEL_READY) return;
339
+ // If there is a pending update, switch to the pending update.
340
+ if (p->latest_pending_subchannel_list_ != nullptr) {
314
341
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
315
342
  gpr_log(GPR_INFO,
316
343
  "Pick First %p promoting pending subchannel list %p to "
@@ -335,38 +362,19 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
335
362
  absl::make_unique<QueuePicker>(
336
363
  p->Ref(DEBUG_LOCATION, "QueuePicker")));
337
364
  }
338
- } else {
339
- if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
340
- // If the selected subchannel goes bad, request a re-resolution. We
341
- // also set the channel state to IDLE. The reason is that if the new
342
- // state is TRANSIENT_FAILURE due to a GOAWAY reception we don't want
343
- // to connect to the re-resolved backends until we leave IDLE state.
344
- // TODO(qianchengz): We may want to request re-resolution in
345
- // ExitIdleLocked().
346
- p->idle_ = true;
347
- p->channel_control_helper()->RequestReresolution();
348
- p->selected_ = nullptr;
349
- p->subchannel_list_.reset();
350
- p->channel_control_helper()->UpdateState(
351
- GRPC_CHANNEL_IDLE, absl::Status(),
352
- absl::make_unique<QueuePicker>(
353
- p->Ref(DEBUG_LOCATION, "QueuePicker")));
354
- } else {
355
- // This is unlikely but can happen when a subchannel has been asked
356
- // to reconnect by a different channel and this channel has dropped
357
- // some connectivity state notifications.
358
- if (connectivity_state == GRPC_CHANNEL_READY) {
359
- p->channel_control_helper()->UpdateState(
360
- GRPC_CHANNEL_READY, absl::Status(),
361
- absl::make_unique<Picker>(subchannel()->Ref()));
362
- } else { // CONNECTING
363
- p->channel_control_helper()->UpdateState(
364
- connectivity_state, absl::Status(),
365
- absl::make_unique<QueuePicker>(
366
- p->Ref(DEBUG_LOCATION, "QueuePicker")));
367
- }
368
- }
365
+ return;
369
366
  }
367
+ // If the selected subchannel goes bad, request a re-resolution.
368
+ // TODO(qianchengz): We may want to request re-resolution in
369
+ // ExitIdleLocked().
370
+ p->channel_control_helper()->RequestReresolution();
371
+ // Enter idle.
372
+ p->idle_ = true;
373
+ p->selected_ = nullptr;
374
+ p->subchannel_list_.reset();
375
+ p->channel_control_helper()->UpdateState(
376
+ GRPC_CHANNEL_IDLE, absl::Status(),
377
+ absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
370
378
  return;
371
379
  }
372
380
  // If we get here, there are two possible cases:
@@ -384,7 +392,8 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
384
392
  ProcessUnselectedReadyLocked();
385
393
  break;
386
394
  }
387
- case GRPC_CHANNEL_TRANSIENT_FAILURE: {
395
+ case GRPC_CHANNEL_TRANSIENT_FAILURE:
396
+ case GRPC_CHANNEL_IDLE: {
388
397
  CancelConnectivityWatchLocked("connection attempt failed");
389
398
  PickFirstSubchannelData* sd = this;
390
399
  size_t next_index =
@@ -428,8 +437,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
428
437
  sd->CheckConnectivityStateAndStartWatchingLocked();
429
438
  break;
430
439
  }
431
- case GRPC_CHANNEL_CONNECTING:
432
- case GRPC_CHANNEL_IDLE: {
440
+ case GRPC_CHANNEL_CONNECTING: {
433
441
  // Only update connectivity state in case 1, and only if we're not
434
442
  // already in TRANSIENT_FAILURE.
435
443
  if (subchannel_list() == p->subchannel_list_.get() &&
@@ -499,7 +507,7 @@ void PickFirst::PickFirstSubchannelData::
499
507
  if (current_state == GRPC_CHANNEL_READY) {
500
508
  if (p->selected_ != this) ProcessUnselectedReadyLocked();
501
509
  } else {
502
- subchannel()->AttemptToConnect();
510
+ subchannel()->RequestConnection();
503
511
  }
504
512
  }
505
513
 
@@ -14,27 +14,53 @@
14
14
  // limitations under the License.
15
15
  //
16
16
 
17
+ // IWYU pragma: no_include <ext/alloc_traits.h>
18
+
17
19
  #include <grpc/support/port_platform.h>
18
20
 
19
21
  #include <inttypes.h>
20
22
  #include <limits.h>
21
-
23
+ #include <stddef.h>
24
+
25
+ #include <algorithm>
26
+ #include <map>
27
+ #include <memory>
28
+ #include <string>
29
+ #include <utility>
30
+ #include <vector>
31
+
32
+ #include "absl/memory/memory.h"
33
+ #include "absl/status/status.h"
34
+ #include "absl/status/statusor.h"
22
35
  #include "absl/strings/str_cat.h"
23
- #include "absl/strings/str_format.h"
36
+ #include "absl/strings/string_view.h"
24
37
 
25
- #include <grpc/grpc.h>
38
+ #include <grpc/impl/codegen/connectivity_state.h>
39
+ #include <grpc/impl/codegen/grpc_types.h>
40
+ #include <grpc/support/log.h>
26
41
 
27
42
  #include "src/core/ext/filters/client_channel/lb_policy.h"
28
43
  #include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
29
44
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
30
45
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
31
46
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
47
+ #include "src/core/ext/filters/client_channel/subchannel_interface.h"
32
48
  #include "src/core/lib/channel/channel_args.h"
49
+ #include "src/core/lib/debug/trace.h"
50
+ #include "src/core/lib/gprpp/debug_location.h"
33
51
  #include "src/core/lib/gprpp/orphanable.h"
52
+ #include "src/core/lib/gprpp/ref_counted.h"
34
53
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
54
+ #include "src/core/lib/gprpp/time.h"
55
+ #include "src/core/lib/iomgr/closure.h"
56
+ #include "src/core/lib/iomgr/error.h"
57
+ #include "src/core/lib/iomgr/exec_ctx.h"
58
+ #include "src/core/lib/iomgr/pollset_set.h"
35
59
  #include "src/core/lib/iomgr/timer.h"
36
60
  #include "src/core/lib/iomgr/work_serializer.h"
37
- #include "src/core/lib/transport/error_utils.h"
61
+ #include "src/core/lib/json/json.h"
62
+ #include "src/core/lib/resolver/server_address.h"
63
+ #include "src/core/lib/transport/connectivity_state.h"
38
64
 
39
65
  namespace grpc_core {
40
66
 
@@ -104,7 +130,7 @@ class PriorityLb : public LoadBalancingPolicy {
104
130
  bool ignore_reresolution_requests);
105
131
  void ExitIdleLocked();
106
132
  void ResetBackoffLocked();
107
- void DeactivateLocked();
133
+ void MaybeDeactivateLocked();
108
134
  void MaybeReactivateLocked();
109
135
 
110
136
  void Orphan() override;
@@ -217,6 +243,8 @@ class PriorityLb : public LoadBalancingPolicy {
217
243
  absl::Status connectivity_status_;
218
244
  RefCountedPtr<RefCountedPicker> picker_wrapper_;
219
245
 
246
+ bool seen_ready_or_idle_since_transient_failure_ = true;
247
+
220
248
  OrphanablePtr<DeactivationTimer> deactivation_timer_;
221
249
  OrphanablePtr<FailoverTimer> failover_timer_;
222
250
  };
@@ -225,14 +253,37 @@ class PriorityLb : public LoadBalancingPolicy {
225
253
 
226
254
  void ShutdownLocked() override;
227
255
 
228
- // Returns UINT32_MAX if child is not in current priority list.
256
+ // Returns the priority of the specified child name, or UINT32_MAX if
257
+ // the child is not in the current priority list.
229
258
  uint32_t GetChildPriorityLocked(const std::string& child_name) const;
230
259
 
260
+ // Called when a child's connectivity state has changed.
261
+ // May propagate the update to the channel or trigger choosing a new
262
+ // priority.
231
263
  void HandleChildConnectivityStateChangeLocked(ChildPriority* child);
264
+
265
+ // Deletes a child. Called when the child's deactivation timer fires.
232
266
  void DeleteChild(ChildPriority* child);
233
267
 
234
- void TryNextPriorityLocked(bool report_connecting);
235
- void SelectPriorityLocked(uint32_t priority);
268
+ // Iterates through the list of priorities to choose one:
269
+ // - If the child for a priority doesn't exist, creates it.
270
+ // - If a child's failover timer is pending, returns without selecting
271
+ // a priority while we wait for the child to attempt to connect. In
272
+ // this case, if report_connecting is true, reports CONNECTING state to
273
+ // the channel.
274
+ // - If the child is connected, it will be used as the current priority.
275
+ // - Otherwise, continues on to the next child.
276
+ // Reports TRANSIENT_FAILURE to the channel if all children are not
277
+ // connected.
278
+ //
279
+ // This method is idempotent; it should yield the same result every
280
+ // time as a function of the state of the children.
281
+ void ChoosePriorityLocked(bool report_connecting);
282
+
283
+ // Sets the specified priority as the current priority.
284
+ // Deactivates any children at lower priorities.
285
+ // Returns the child's picker to the channel.
286
+ void SetCurrentPriorityLocked(uint32_t priority);
236
287
 
237
288
  const Duration child_failover_timeout_;
238
289
 
@@ -246,6 +297,8 @@ class PriorityLb : public LoadBalancingPolicy {
246
297
 
247
298
  bool update_in_progress_ = false;
248
299
 
300
+ // All children that currently exist.
301
+ // Some of these children may be in deactivated state.
249
302
  std::map<std::string, OrphanablePtr<ChildPriority>> children_;
250
303
  // The priority that is being used.
251
304
  uint32_t current_priority_ = UINT32_MAX;
@@ -312,7 +365,7 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
312
365
  current_child_from_before_update_ = children_[child_name].get();
313
366
  // Unset current_priority_, since it was an index into the old
314
367
  // config's priority list and may no longer be valid. It will be
315
- // reset later by TryNextPriorityLocked(), but we unset it here in
368
+ // reset later by ChoosePriorityLocked(), but we unset it here in
316
369
  // case updating any of our children triggers a state update.
317
370
  current_priority_ = UINT32_MAX;
318
371
  }
@@ -332,7 +385,7 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
332
385
  auto config_it = config_->children().find(child_name);
333
386
  if (config_it == config_->children().end()) {
334
387
  // Existing child not found in new config. Deactivate it.
335
- child->DeactivateLocked();
388
+ child->MaybeDeactivateLocked();
336
389
  } else {
337
390
  // Existing child found in new config. Update it.
338
391
  child->UpdateLocked(config_it->second.config,
@@ -341,7 +394,7 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
341
394
  }
342
395
  update_in_progress_ = false;
343
396
  // Try to get connected.
344
- TryNextPriorityLocked(/*report_connecting=*/children_.empty());
397
+ ChoosePriorityLocked(/*report_connecting=*/children_.empty());
345
398
  }
346
399
 
347
400
  uint32_t PriorityLb::GetChildPriorityLocked(
@@ -380,11 +433,11 @@ void PriorityLb::HandleChildConnectivityStateChangeLocked(
380
433
  } else {
381
434
  // If it's no longer READY or IDLE, we should stop using it.
382
435
  // We already started trying other priorities as a result of the
383
- // update, but calling TryNextPriorityLocked() ensures that we will
436
+ // update, but calling ChoosePriorityLocked() ensures that we will
384
437
  // properly select between CONNECTING and TRANSIENT_FAILURE as the
385
438
  // new state to report to our parent.
386
439
  current_child_from_before_update_ = nullptr;
387
- TryNextPriorityLocked(/*report_connecting=*/true);
440
+ ChoosePriorityLocked(/*report_connecting=*/true);
388
441
  }
389
442
  return;
390
443
  }
@@ -396,52 +449,26 @@ void PriorityLb::HandleChildConnectivityStateChangeLocked(
396
449
  "priority %u",
397
450
  this, child_priority, child->name().c_str(), current_priority_);
398
451
  }
399
- // Ignore priorities not in the current config.
400
- if (child_priority == UINT32_MAX) return;
401
- // Ignore lower-than-current priorities.
402
- if (child_priority > current_priority_) return;
403
- // If a child reports TRANSIENT_FAILURE, start trying the next priority.
404
- // Note that even if this is for a higher-than-current priority, we
405
- // may still need to create some children between this priority and
406
- // the current one (e.g., if we got an update that inserted new
407
- // priorities ahead of the current one).
408
- if (child->connectivity_state() == GRPC_CHANNEL_TRANSIENT_FAILURE) {
409
- TryNextPriorityLocked(
410
- /*report_connecting=*/child_priority == current_priority_);
411
- return;
412
- }
413
- // The update is for a higher-than-current priority (or for any
414
- // priority if we don't have any current priority).
415
- if (child_priority < current_priority_) {
416
- // If the child reports READY or IDLE, switch to that priority.
417
- // Otherwise, ignore the update.
418
- if (child->connectivity_state() == GRPC_CHANNEL_READY ||
419
- child->connectivity_state() == GRPC_CHANNEL_IDLE) {
420
- SelectPriorityLocked(child_priority);
421
- }
422
- return;
423
- }
424
- // The current priority has returned a new picker, so pass it up to
425
- // our parent.
426
- channel_control_helper()->UpdateState(child->connectivity_state(),
427
- child->connectivity_status(),
428
- child->GetPicker());
452
+ // Unconditionally call ChoosePriorityLocked(). It should do the
453
+ // right thing based on the state of all children.
454
+ ChoosePriorityLocked(
455
+ /*report_connecting=*/child_priority == current_priority_);
429
456
  }
430
457
 
431
458
  void PriorityLb::DeleteChild(ChildPriority* child) {
432
459
  // If this was the current child from before the most recent update,
433
460
  // stop using it. We already started trying other priorities as a
434
- // result of the update, but calling TryNextPriorityLocked() ensures that
461
+ // result of the update, but calling ChoosePriorityLocked() ensures that
435
462
  // we will properly select between CONNECTING and TRANSIENT_FAILURE as the
436
463
  // new state to report to our parent.
437
464
  if (current_child_from_before_update_ == child) {
438
465
  current_child_from_before_update_ = nullptr;
439
- TryNextPriorityLocked(/*report_connecting=*/true);
466
+ ChoosePriorityLocked(/*report_connecting=*/true);
440
467
  }
441
468
  children_.erase(child->name());
442
469
  }
443
470
 
444
- void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
471
+ void PriorityLb::ChoosePriorityLocked(bool report_connecting) {
445
472
  current_priority_ = UINT32_MAX;
446
473
  for (uint32_t priority = 0; priority < config_->priorities().size();
447
474
  ++priority) {
@@ -471,7 +498,7 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
471
498
  // If the child is in state READY or IDLE, switch to it.
472
499
  if (child->connectivity_state() == GRPC_CHANNEL_READY ||
473
500
  child->connectivity_state() == GRPC_CHANNEL_IDLE) {
474
- SelectPriorityLocked(priority);
501
+ SetCurrentPriorityLocked(priority);
475
502
  return;
476
503
  }
477
504
  // Child is not READY or IDLE.
@@ -491,6 +518,13 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
491
518
  return;
492
519
  }
493
520
  // Child has been failing for a while. Move on to the next priority.
521
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
522
+ gpr_log(GPR_INFO,
523
+ "[priority_lb %p] skipping priority %u, child %s: state=%s, "
524
+ "failover timer not pending",
525
+ this, priority, child_name.c_str(),
526
+ ConnectivityStateName(child->connectivity_state()));
527
+ }
494
528
  }
495
529
  // If there are no more priorities to try, report TRANSIENT_FAILURE.
496
530
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
@@ -506,7 +540,7 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
506
540
  absl::make_unique<TransientFailurePicker>(status));
507
541
  }
508
542
 
509
- void PriorityLb::SelectPriorityLocked(uint32_t priority) {
543
+ void PriorityLb::SetCurrentPriorityLocked(uint32_t priority) {
510
544
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
511
545
  gpr_log(GPR_INFO, "[priority_lb %p] selected priority %u, child %s", this,
512
546
  priority, config_->priorities()[priority].c_str());
@@ -517,7 +551,7 @@ void PriorityLb::SelectPriorityLocked(uint32_t priority) {
517
551
  for (uint32_t p = priority + 1; p < config_->priorities().size(); ++p) {
518
552
  const std::string& child_name = config_->priorities()[p];
519
553
  auto it = children_.find(child_name);
520
- if (it != children_.end()) it->second->DeactivateLocked();
554
+ if (it != children_.end()) it->second->MaybeDeactivateLocked();
521
555
  }
522
556
  // Update picker.
523
557
  auto& child = children_[config_->priorities()[priority]];
@@ -742,9 +776,6 @@ PriorityLb::ChildPriority::CreateChildPolicyLocked(
742
776
  }
743
777
 
744
778
  void PriorityLb::ChildPriority::ExitIdleLocked() {
745
- if (connectivity_state_ == GRPC_CHANNEL_IDLE && failover_timer_ == nullptr) {
746
- failover_timer_ = MakeOrphanable<FailoverTimer>(Ref());
747
- }
748
779
  child_policy_->ExitIdleLocked();
749
780
  }
750
781
 
@@ -766,20 +797,31 @@ void PriorityLb::ChildPriority::OnConnectivityStateUpdateLocked(
766
797
  connectivity_state_ = state;
767
798
  connectivity_status_ = status;
768
799
  picker_wrapper_ = MakeRefCounted<RefCountedPicker>(std::move(picker));
769
- // If READY or IDLE or TRANSIENT_FAILURE, cancel failover timer.
770
- if (state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_IDLE ||
771
- state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
800
+ // If we transition to state CONNECTING and we've not seen
801
+ // TRANSIENT_FAILURE more recently than READY or IDLE, start failover
802
+ // timer if not already pending.
803
+ // In any other state, update seen_ready_or_idle_since_transient_failure_
804
+ // and cancel failover timer.
805
+ if (state == GRPC_CHANNEL_CONNECTING) {
806
+ if (seen_ready_or_idle_since_transient_failure_ &&
807
+ failover_timer_ == nullptr) {
808
+ failover_timer_ = MakeOrphanable<FailoverTimer>(Ref());
809
+ }
810
+ } else if (state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_IDLE) {
811
+ seen_ready_or_idle_since_transient_failure_ = true;
812
+ failover_timer_.reset();
813
+ } else if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
814
+ seen_ready_or_idle_since_transient_failure_ = false;
772
815
  failover_timer_.reset();
773
816
  }
774
817
  // Notify the parent policy.
775
818
  priority_policy_->HandleChildConnectivityStateChangeLocked(this);
776
819
  }
777
820
 
778
- void PriorityLb::ChildPriority::DeactivateLocked() {
779
- // If already deactivated, don't do it again.
780
- if (deactivation_timer_ != nullptr) return;
781
- failover_timer_.reset();
782
- deactivation_timer_ = MakeOrphanable<DeactivationTimer>(Ref());
821
+ void PriorityLb::ChildPriority::MaybeDeactivateLocked() {
822
+ if (deactivation_timer_ == nullptr) {
823
+ deactivation_timer_ = MakeOrphanable<DeactivationTimer>(Ref());
824
+ }
783
825
  }
784
826
 
785
827
  void PriorityLb::ChildPriority::MaybeReactivateLocked() {