grpc 1.46.3-x86_64-linux → 1.47.0-x86_64-linux

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 (487) 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/2.5/grpc_c.so +0 -0
  461. data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
  462. data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
  463. data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
  464. data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
  465. data/src/ruby/lib/grpc/grpc_c.so +0 -0
  466. data/src/ruby/lib/grpc/version.rb +1 -1
  467. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  468. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  469. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  470. metadata +36 -29
  471. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  472. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  473. data/src/core/lib/event_engine/sockaddr.h +0 -44
  474. data/src/core/lib/gprpp/capture.h +0 -76
  475. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  476. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  477. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  478. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  479. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  480. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  481. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  482. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  483. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  484. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  485. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  486. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  487. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -23,36 +23,43 @@
23
23
 
24
24
  #include <algorithm>
25
25
  #include <cstring>
26
+ #include <memory>
27
+ #include <new>
28
+ #include <type_traits>
29
+ #include <utility>
26
30
 
27
- #include "absl/strings/str_format.h"
31
+ #include "absl/status/statusor.h"
28
32
 
33
+ #include <grpc/slice.h>
29
34
  #include <grpc/status.h>
30
35
  #include <grpc/support/alloc.h>
31
- #include <grpc/support/string_util.h>
36
+ #include <grpc/support/log.h>
32
37
 
33
- #include "src/core/ext/filters/client_channel/client_channel.h"
34
38
  #include "src/core/ext/filters/client_channel/health/health_check_client.h"
35
39
  #include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
36
40
  #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
37
- #include "src/core/lib/address_utils/parse_address.h"
41
+ #include "src/core/ext/filters/client_channel/subchannel_stream_client.h"
38
42
  #include "src/core/lib/address_utils/sockaddr_utils.h"
39
43
  #include "src/core/lib/backoff/backoff.h"
40
44
  #include "src/core/lib/channel/channel_args.h"
45
+ #include "src/core/lib/channel/channel_stack_builder.h"
41
46
  #include "src/core/lib/channel/channel_stack_builder_impl.h"
42
- #include "src/core/lib/channel/connected_channel.h"
47
+ #include "src/core/lib/channel/channel_trace.h"
48
+ #include "src/core/lib/channel/channelz.h"
43
49
  #include "src/core/lib/config/core_configuration.h"
44
50
  #include "src/core/lib/debug/stats.h"
51
+ #include "src/core/lib/debug/trace.h"
45
52
  #include "src/core/lib/gpr/alloc.h"
46
53
  #include "src/core/lib/gprpp/debug_location.h"
47
- #include "src/core/lib/gprpp/manual_constructor.h"
48
54
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
49
55
  #include "src/core/lib/gprpp/sync.h"
56
+ #include "src/core/lib/iomgr/exec_ctx.h"
57
+ #include "src/core/lib/iomgr/pollset_set.h"
50
58
  #include "src/core/lib/profiling/timers.h"
51
- #include "src/core/lib/slice/slice_internal.h"
52
- #include "src/core/lib/surface/channel.h"
59
+ #include "src/core/lib/surface/channel_init.h"
60
+ #include "src/core/lib/surface/channel_stack_type.h"
53
61
  #include "src/core/lib/transport/connectivity_state.h"
54
62
  #include "src/core/lib/transport/error_utils.h"
55
- #include "src/core/lib/uri/uri_parser.h"
56
63
 
57
64
  // Strong and weak refs.
58
65
  #define INTERNAL_REF_BITS 16
@@ -308,43 +315,33 @@ class Subchannel::ConnectedSubchannelStateWatcher
308
315
  const absl::Status& status) override {
309
316
  Subchannel* c = subchannel_.get();
310
317
  MutexLock lock(&c->mu_);
311
- switch (new_state) {
312
- case GRPC_CHANNEL_TRANSIENT_FAILURE:
313
- case GRPC_CHANNEL_SHUTDOWN: {
314
- if (!c->disconnected_ && c->connected_subchannel_ != nullptr) {
315
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_subchannel)) {
316
- gpr_log(GPR_INFO,
317
- "subchannel %p %s: Connected subchannel %p has gone into "
318
- "%s. Attempting to reconnect.",
319
- c, c->key_.ToString().c_str(),
320
- c->connected_subchannel_.get(),
321
- ConnectivityStateName(new_state));
322
- }
323
- c->connected_subchannel_.reset();
324
- if (c->channelz_node() != nullptr) {
325
- c->channelz_node()->SetChildSocket(nullptr);
326
- }
327
- // We need to construct our own status if the underlying state was
328
- // shutdown since the accompanying status will be StatusCode::OK
329
- // otherwise.
330
- c->SetConnectivityStateLocked(
331
- GRPC_CHANNEL_TRANSIENT_FAILURE,
332
- new_state == GRPC_CHANNEL_SHUTDOWN
333
- ? absl::Status(absl::StatusCode::kUnavailable,
334
- "Subchannel has disconnected.")
335
- : status);
336
- c->backoff_begun_ = false;
337
- c->backoff_.Reset();
338
- }
339
- break;
318
+ // If we're either shutting down or have already seen this connection
319
+ // failure (i.e., c->connected_subchannel_ is null), do nothing.
320
+ //
321
+ // The transport reports TRANSIENT_FAILURE upon GOAWAY but SHUTDOWN
322
+ // upon connection close. So if the server gracefully shuts down,
323
+ // we will see TRANSIENT_FAILURE followed by SHUTDOWN, but if not, we
324
+ // will see only SHUTDOWN. Either way, we react to the first one we
325
+ // see, ignoring anything that happens after that.
326
+ if (c->connected_subchannel_ == nullptr) return;
327
+ if (new_state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
328
+ new_state == GRPC_CHANNEL_SHUTDOWN) {
329
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_subchannel)) {
330
+ gpr_log(GPR_INFO,
331
+ "subchannel %p %s: Connected subchannel %p reports %s: %s", c,
332
+ c->key_.ToString().c_str(), c->connected_subchannel_.get(),
333
+ ConnectivityStateName(new_state), status.ToString().c_str());
340
334
  }
341
- default: {
342
- // In principle, this should never happen. We should not get
343
- // a callback for READY, because that was the state we started
344
- // this watch from. And a connected subchannel should never go
345
- // from READY to CONNECTING or IDLE.
346
- c->SetConnectivityStateLocked(new_state, status);
335
+ c->connected_subchannel_.reset();
336
+ if (c->channelz_node() != nullptr) {
337
+ c->channelz_node()->SetChildSocket(nullptr);
347
338
  }
339
+ // Even though we're reporting IDLE instead of TRANSIENT_FAILURE here,
340
+ // pass along the status from the transport, since it may have
341
+ // keepalive info attached to it that the channel needs.
342
+ // TODO(roth): Consider whether there's a cleaner way to do this.
343
+ c->SetConnectivityStateLocked(GRPC_CHANNEL_IDLE, status);
344
+ c->backoff_.Reset();
348
345
  }
349
346
  }
350
347
 
@@ -563,6 +560,25 @@ Subchannel::HealthWatcherMap::CheckConnectivityStateLocked(
563
560
 
564
561
  void Subchannel::HealthWatcherMap::ShutdownLocked() { map_.clear(); }
565
562
 
563
+ //
564
+ // Subchannel::ConnectivityStateWatcherInterface
565
+ //
566
+
567
+ void Subchannel::ConnectivityStateWatcherInterface::PushConnectivityStateChange(
568
+ ConnectivityStateChange state_change) {
569
+ MutexLock lock(&mu_);
570
+ connectivity_state_queue_.push_back(std::move(state_change));
571
+ }
572
+
573
+ Subchannel::ConnectivityStateWatcherInterface::ConnectivityStateChange
574
+ Subchannel::ConnectivityStateWatcherInterface::PopConnectivityStateChange() {
575
+ MutexLock lock(&mu_);
576
+ GPR_ASSERT(!connectivity_state_queue_.empty());
577
+ ConnectivityStateChange state_change = connectivity_state_queue_.front();
578
+ connectivity_state_queue_.pop_front();
579
+ return state_change;
580
+ }
581
+
566
582
  //
567
583
  // Subchannel
568
584
  //
@@ -622,21 +638,6 @@ BackOff::Options ParseArgsForBackoffValues(const grpc_channel_args* args,
622
638
 
623
639
  } // namespace
624
640
 
625
- void Subchannel::ConnectivityStateWatcherInterface::PushConnectivityStateChange(
626
- ConnectivityStateChange state_change) {
627
- MutexLock lock(&mu_);
628
- connectivity_state_queue_.push_back(std::move(state_change));
629
- }
630
-
631
- Subchannel::ConnectivityStateWatcherInterface::ConnectivityStateChange
632
- Subchannel::ConnectivityStateWatcherInterface::PopConnectivityStateChange() {
633
- MutexLock lock(&mu_);
634
- GPR_ASSERT(!connectivity_state_queue_.empty());
635
- ConnectivityStateChange state_change = connectivity_state_queue_.front();
636
- connectivity_state_queue_.pop_front();
637
- return state_change;
638
- }
639
-
640
641
  Subchannel::Subchannel(SubchannelKey key,
641
642
  OrphanablePtr<SubchannelConnector> connector,
642
643
  const grpc_channel_args* args)
@@ -650,6 +651,7 @@ Subchannel::Subchannel(SubchannelKey key,
650
651
  GRPC_STATS_INC_CLIENT_SUBCHANNELS_CREATED();
651
652
  GRPC_CLOSURE_INIT(&on_connecting_finished_, OnConnectingFinished, this,
652
653
  grpc_schedule_on_exec_ctx);
654
+ GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this, nullptr);
653
655
  // Check proxy mapper to determine address to connect to and channel
654
656
  // args to use.
655
657
  address_for_connect_ = key_.address();
@@ -676,7 +678,9 @@ Subchannel::Subchannel(SubchannelKey key,
676
678
  {GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0,
677
679
  INT_MAX}));
678
680
  channelz_node_ = MakeRefCounted<channelz::SubchannelNode>(
679
- grpc_sockaddr_to_uri(&key_.address()), channel_tracer_max_memory);
681
+ grpc_sockaddr_to_uri(&key_.address())
682
+ .value_or("<unknown address type>"),
683
+ channel_tracer_max_memory);
680
684
  channelz_node_->AddTraceEvent(
681
685
  channelz::ChannelTrace::Severity::Info,
682
686
  grpc_slice_from_static_string("subchannel created"));
@@ -787,20 +791,20 @@ void Subchannel::CancelConnectivityStateWatch(
787
791
  }
788
792
  }
789
793
 
790
- void Subchannel::AttemptToConnect() {
794
+ void Subchannel::RequestConnection() {
791
795
  MutexLock lock(&mu_);
792
- MaybeStartConnectingLocked();
796
+ if (state_ == GRPC_CHANNEL_IDLE) {
797
+ StartConnectingLocked();
798
+ } else if (state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) {
799
+ connection_requested_ = true;
800
+ }
793
801
  }
794
802
 
795
803
  void Subchannel::ResetBackoff() {
796
804
  MutexLock lock(&mu_);
797
805
  backoff_.Reset();
798
- if (have_retry_alarm_) {
799
- retry_immediately_ = true;
800
- grpc_timer_cancel(&retry_alarm_);
801
- } else {
802
- backoff_begun_ = false;
803
- MaybeStartConnectingLocked();
806
+ if (state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) {
807
+ grpc_timer_cancel(&retry_timer_);
804
808
  }
805
809
  }
806
810
 
@@ -812,13 +816,36 @@ void Subchannel::Orphan() {
812
816
  subchannel_pool_.reset();
813
817
  }
814
818
  MutexLock lock(&mu_);
815
- GPR_ASSERT(!disconnected_);
816
- disconnected_ = true;
819
+ GPR_ASSERT(!shutdown_);
820
+ shutdown_ = true;
817
821
  connector_.reset();
818
822
  connected_subchannel_.reset();
819
823
  health_watcher_map_.ShutdownLocked();
820
824
  }
821
825
 
826
+ void Subchannel::AddDataProducer(DataProducerInterface* data_producer) {
827
+ MutexLock lock(&mu_);
828
+ auto& entry = data_producer_map_[data_producer->type()];
829
+ GPR_ASSERT(entry == nullptr);
830
+ entry = data_producer;
831
+ }
832
+
833
+ void Subchannel::RemoveDataProducer(DataProducerInterface* data_producer) {
834
+ MutexLock lock(&mu_);
835
+ auto it = data_producer_map_.find(data_producer->type());
836
+ GPR_ASSERT(it != data_producer_map_.end());
837
+ GPR_ASSERT(it->second == data_producer);
838
+ data_producer_map_.erase(it);
839
+ }
840
+
841
+ Subchannel::DataProducerInterface* Subchannel::GetDataProducer(
842
+ UniqueTypeName type) {
843
+ MutexLock lock(&mu_);
844
+ auto it = data_producer_map_.find(type);
845
+ if (it == data_producer_map_.end()) return nullptr;
846
+ return it->second;
847
+ }
848
+
822
849
  namespace {
823
850
 
824
851
  // Returns a string indicating the subchannel's connectivity state change to
@@ -860,77 +887,44 @@ void Subchannel::SetConnectivityStateLocked(grpc_connectivity_state state,
860
887
  health_watcher_map_.NotifyLocked(state, status);
861
888
  }
862
889
 
863
- void Subchannel::MaybeStartConnectingLocked() {
864
- if (disconnected_) {
865
- // Don't try to connect if we're already disconnected.
866
- return;
867
- }
868
- if (connecting_) {
869
- // Already connecting: don't restart.
870
- return;
871
- }
872
- if (connected_subchannel_ != nullptr) {
873
- // Already connected: don't restart.
874
- return;
875
- }
876
- connecting_ = true;
877
- WeakRef(DEBUG_LOCATION, "connecting")
878
- .release(); // ref held by pending connect
879
- if (!backoff_begun_) {
880
- backoff_begun_ = true;
881
- ContinueConnectingLocked();
882
- } else {
883
- GPR_ASSERT(!have_retry_alarm_);
884
- have_retry_alarm_ = true;
885
- const Duration time_til_next =
886
- next_attempt_deadline_ - ExecCtx::Get()->Now();
887
- if (time_til_next <= Duration::Zero()) {
888
- gpr_log(GPR_INFO, "subchannel %p %s: Retry immediately", this,
889
- key_.ToString().c_str());
890
- } else {
891
- gpr_log(GPR_INFO, "subchannel %p %s: Retry in %" PRId64 " milliseconds",
892
- this, key_.ToString().c_str(), time_til_next.millis());
893
- }
894
- GRPC_CLOSURE_INIT(&on_retry_alarm_, OnRetryAlarm, this,
895
- grpc_schedule_on_exec_ctx);
896
- grpc_timer_init(&retry_alarm_, next_attempt_deadline_, &on_retry_alarm_);
890
+ void Subchannel::OnRetryTimer(void* arg, grpc_error_handle /*error*/) {
891
+ WeakRefCountedPtr<Subchannel> c(static_cast<Subchannel*>(arg));
892
+ {
893
+ MutexLock lock(&c->mu_);
894
+ c->OnRetryTimerLocked();
897
895
  }
896
+ c.reset(DEBUG_LOCATION, "RetryTimer");
898
897
  }
899
898
 
900
- void Subchannel::OnRetryAlarm(void* arg, grpc_error_handle error) {
901
- WeakRefCountedPtr<Subchannel> c(static_cast<Subchannel*>(arg));
902
- MutexLock lock(&c->mu_);
903
- c->have_retry_alarm_ = false;
904
- if (c->disconnected_) {
905
- error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Disconnected",
906
- &error, 1);
907
- } else if (c->retry_immediately_) {
908
- c->retry_immediately_ = false;
909
- error = GRPC_ERROR_NONE;
910
- } else {
911
- (void)GRPC_ERROR_REF(error);
912
- }
913
- if (error == GRPC_ERROR_NONE) {
899
+ void Subchannel::OnRetryTimerLocked() {
900
+ if (shutdown_) return;
901
+ if (connection_requested_) {
914
902
  gpr_log(GPR_INFO,
915
- "subchannel %p %s: failed to connect to channel, retrying", c.get(),
916
- c->key_.ToString().c_str());
917
- c->ContinueConnectingLocked();
918
- // Still connecting, keep ref around. Note that this stolen ref won't
919
- // be dropped without first acquiring c->mu_.
920
- c.release();
903
+ "subchannel %p %s: connection attempt requested while backoff "
904
+ "timer was pending, retrying now",
905
+ this, key_.ToString().c_str());
906
+ connection_requested_ = false;
907
+ StartConnectingLocked();
908
+ } else {
909
+ gpr_log(GPR_INFO, "subchannel %p %s: backoff delay elapsed, reporting IDLE",
910
+ this, key_.ToString().c_str());
911
+ SetConnectivityStateLocked(GRPC_CHANNEL_IDLE, absl::OkStatus());
921
912
  }
922
- GRPC_ERROR_UNREF(error);
923
913
  }
924
914
 
925
- void Subchannel::ContinueConnectingLocked() {
915
+ void Subchannel::StartConnectingLocked() {
916
+ // Set next attempt time.
917
+ const Timestamp min_deadline = min_connect_timeout_ + ExecCtx::Get()->Now();
918
+ next_attempt_time_ = backoff_.NextAttemptTime();
919
+ // Report CONNECTING.
920
+ SetConnectivityStateLocked(GRPC_CHANNEL_CONNECTING, absl::OkStatus());
921
+ // Start connection attempt.
926
922
  SubchannelConnector::Args args;
927
923
  args.address = &address_for_connect_;
928
924
  args.interested_parties = pollset_set_;
929
- const Timestamp min_deadline = min_connect_timeout_ + ExecCtx::Get()->Now();
930
- next_attempt_deadline_ = backoff_.NextAttemptTime();
931
- args.deadline = std::max(next_attempt_deadline_, min_deadline);
925
+ args.deadline = std::max(next_attempt_time_, min_deadline);
932
926
  args.channel_args = args_;
933
- SetConnectivityStateLocked(GRPC_CHANNEL_CONNECTING, absl::Status());
927
+ WeakRef(DEBUG_LOCATION, "Connect").release(); // Ref held by callback.
934
928
  connector_->Connect(args, &connecting_result_, &on_connecting_finished_);
935
929
  }
936
930
 
@@ -940,43 +934,49 @@ void Subchannel::OnConnectingFinished(void* arg, grpc_error_handle error) {
940
934
  c->connecting_result_.channel_args;
941
935
  {
942
936
  MutexLock lock(&c->mu_);
943
- c->connecting_ = false;
944
- if (c->connecting_result_.transport != nullptr &&
945
- c->PublishTransportLocked()) {
946
- // Do nothing, transport was published.
947
- } else if (!c->disconnected_) {
948
- gpr_log(GPR_INFO, "subchannel %p %s: connect failed: %s", c.get(),
949
- c->key_.ToString().c_str(), grpc_error_std_string(error).c_str());
950
- c->SetConnectivityStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE,
951
- grpc_error_to_absl_status(error));
952
- }
937
+ c->OnConnectingFinishedLocked(GRPC_ERROR_REF(error));
953
938
  }
954
939
  grpc_channel_args_destroy(delete_channel_args);
955
- c.reset(DEBUG_LOCATION, "connecting");
940
+ c.reset(DEBUG_LOCATION, "Connect");
956
941
  }
957
942
 
958
- namespace {
959
-
960
- void ConnectionDestroy(void* arg, grpc_error_handle /*error*/) {
961
- grpc_channel_stack* stk = static_cast<grpc_channel_stack*>(arg);
962
- grpc_channel_stack_destroy(stk);
963
- gpr_free(stk);
943
+ void Subchannel::OnConnectingFinishedLocked(grpc_error_handle error) {
944
+ if (shutdown_) {
945
+ (void)GRPC_ERROR_UNREF(error);
946
+ return;
947
+ }
948
+ // If we didn't get a transport or we fail to publish it, report
949
+ // TRANSIENT_FAILURE and start the retry timer.
950
+ // Note that if the connection attempt took longer than the backoff
951
+ // time, then the timer will fire immediately, and we will quickly
952
+ // transition back to IDLE.
953
+ if (connecting_result_.transport == nullptr || !PublishTransportLocked()) {
954
+ const Duration time_until_next_attempt =
955
+ next_attempt_time_ - ExecCtx::Get()->Now();
956
+ gpr_log(GPR_INFO,
957
+ "subchannel %p %s: connect failed (%s), backing off for %" PRId64
958
+ " ms",
959
+ this, key_.ToString().c_str(), grpc_error_std_string(error).c_str(),
960
+ time_until_next_attempt.millis());
961
+ SetConnectivityStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE,
962
+ grpc_error_to_absl_status(error));
963
+ WeakRef(DEBUG_LOCATION, "RetryTimer").release(); // Ref held by callback.
964
+ grpc_timer_init(&retry_timer_, next_attempt_time_, &on_retry_timer_);
965
+ }
966
+ (void)GRPC_ERROR_UNREF(error);
964
967
  }
965
968
 
966
- } // namespace
967
-
968
969
  bool Subchannel::PublishTransportLocked() {
969
970
  // Construct channel stack.
970
971
  ChannelStackBuilderImpl builder("subchannel", GRPC_CLIENT_SUBCHANNEL);
971
- builder.SetChannelArgs(connecting_result_.channel_args)
972
+ builder.SetChannelArgs(ChannelArgs::FromC(connecting_result_.channel_args))
972
973
  .SetTransport(connecting_result_.transport);
973
974
  if (!CoreConfiguration::Get().channel_init().CreateStack(&builder)) {
974
975
  return false;
975
976
  }
976
- grpc_channel_stack* stk;
977
- grpc_error_handle error = builder.Build(0, 1, ConnectionDestroy, nullptr,
978
- reinterpret_cast<void**>(&stk));
979
- if (error != GRPC_ERROR_NONE) {
977
+ absl::StatusOr<RefCountedPtr<grpc_channel_stack>> stk = builder.Build();
978
+ if (!stk.ok()) {
979
+ auto error = absl_status_to_grpc_error(stk.status());
980
980
  grpc_transport_destroy(connecting_result_.transport);
981
981
  gpr_log(GPR_ERROR,
982
982
  "subchannel %p %s: error initializing subchannel stack: %s", this,
@@ -987,14 +987,10 @@ bool Subchannel::PublishTransportLocked() {
987
987
  RefCountedPtr<channelz::SocketNode> socket =
988
988
  std::move(connecting_result_.socket_node);
989
989
  connecting_result_.Reset();
990
- if (disconnected_) {
991
- grpc_channel_stack_destroy(stk);
992
- gpr_free(stk);
993
- return false;
994
- }
990
+ if (shutdown_) return false;
995
991
  // Publish.
996
992
  connected_subchannel_.reset(
997
- new ConnectedSubchannel(stk, args_, channelz_node_));
993
+ new ConnectedSubchannel(stk->release(), args_, channelz_node_));
998
994
  if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_subchannel)) {
999
995
  gpr_log(GPR_INFO, "subchannel %p %s: new connected subchannel at %p", this,
1000
996
  key_.ToString().c_str(), connected_subchannel_.get());
@@ -19,22 +19,46 @@
19
19
 
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
+ #include <stddef.h>
23
+
22
24
  #include <deque>
25
+ #include <map>
26
+ #include <string>
27
+
28
+ #include "absl/base/thread_annotations.h"
29
+ #include "absl/status/status.h"
30
+ #include "absl/types/optional.h"
31
+
32
+ #include <grpc/impl/codegen/connectivity_state.h>
33
+ #include <grpc/impl/codegen/grpc_types.h>
23
34
 
24
35
  #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
25
36
  #include "src/core/ext/filters/client_channel/connector.h"
26
37
  #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
27
38
  #include "src/core/lib/backoff/backoff.h"
28
39
  #include "src/core/lib/channel/channel_stack.h"
40
+ #include "src/core/lib/channel/context.h"
29
41
  #include "src/core/lib/gpr/time_precise.h"
42
+ #include "src/core/lib/gprpp/debug_location.h"
30
43
  #include "src/core/lib/gprpp/dual_ref_counted.h"
44
+ #include "src/core/lib/gprpp/orphanable.h"
31
45
  #include "src/core/lib/gprpp/ref_counted.h"
32
46
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
33
47
  #include "src/core/lib/gprpp/sync.h"
48
+ #include "src/core/lib/gprpp/time.h"
49
+ #include "src/core/lib/gprpp/unique_type_name.h"
50
+ #include "src/core/lib/iomgr/call_combiner.h"
51
+ #include "src/core/lib/iomgr/closure.h"
52
+ #include "src/core/lib/iomgr/error.h"
53
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
34
54
  #include "src/core/lib/iomgr/polling_entity.h"
55
+ #include "src/core/lib/iomgr/resolved_address.h"
35
56
  #include "src/core/lib/iomgr/timer.h"
36
57
  #include "src/core/lib/resource_quota/arena.h"
58
+ #include "src/core/lib/slice/slice.h"
37
59
  #include "src/core/lib/transport/connectivity_state.h"
60
+ #include "src/core/lib/transport/metadata_batch.h"
61
+ #include "src/core/lib/transport/transport.h"
38
62
 
39
63
  namespace grpc_core {
40
64
 
@@ -183,6 +207,20 @@ class Subchannel : public DualRefCounted<Subchannel> {
183
207
  ABSL_GUARDED_BY(&mu_);
184
208
  };
185
209
 
210
+ // A base class for producers of subchannel-specific data.
211
+ // Implementations will typically add their own methods as needed.
212
+ class DataProducerInterface : public DualRefCounted<DataProducerInterface> {
213
+ public:
214
+ // A unique identifier for this implementation.
215
+ // Only one producer may be registered under a given type name on a
216
+ // given subchannel at any given time.
217
+ // Note that we use the pointer address instead of the string
218
+ // contents for uniqueness; all instances for a given implementation
219
+ // are expected to return the same string *instance*, not just the
220
+ // same string contents.
221
+ virtual UniqueTypeName type() const = 0;
222
+ };
223
+
186
224
  // Creates a subchannel.
187
225
  static RefCountedPtr<Subchannel> Create(
188
226
  OrphanablePtr<SubchannelConnector> connector,
@@ -198,6 +236,8 @@ class Subchannel : public DualRefCounted<Subchannel> {
198
236
  // will have an affect when the subchannel creates a new ConnectedSubchannel.
199
237
  void ThrottleKeepaliveTime(int new_keepalive_time) ABSL_LOCKS_EXCLUDED(mu_);
200
238
 
239
+ grpc_pollset_set* pollset_set() const { return pollset_set_; }
240
+
201
241
  const grpc_channel_args* channel_args() const { return args_; }
202
242
 
203
243
  channelz::SubchannelNode* channelz_node();
@@ -237,7 +277,7 @@ class Subchannel : public DualRefCounted<Subchannel> {
237
277
  }
238
278
 
239
279
  // Attempt to connect to the backend. Has no effect if already connected.
240
- void AttemptToConnect() ABSL_LOCKS_EXCLUDED(mu_);
280
+ void RequestConnection() ABSL_LOCKS_EXCLUDED(mu_);
241
281
 
242
282
  // Resets the connection backoff of the subchannel.
243
283
  void ResetBackoff() ABSL_LOCKS_EXCLUDED(mu_);
@@ -245,6 +285,17 @@ class Subchannel : public DualRefCounted<Subchannel> {
245
285
  // Tears down any existing connection, and arranges for destruction
246
286
  void Orphan() override ABSL_LOCKS_EXCLUDED(mu_);
247
287
 
288
+ // Access to data producer map.
289
+ // We do not hold refs to the data producer; the implementation is
290
+ // expected to register itself upon construction and remove itself
291
+ // upon destruction.
292
+ void AddDataProducer(DataProducerInterface* data_producer)
293
+ ABSL_LOCKS_EXCLUDED(mu_);
294
+ void RemoveDataProducer(DataProducerInterface* data_producer)
295
+ ABSL_LOCKS_EXCLUDED(mu_);
296
+ DataProducerInterface* GetDataProducer(UniqueTypeName type)
297
+ ABSL_LOCKS_EXCLUDED(mu_);
298
+
248
299
  private:
249
300
  // A linked list of ConnectivityStateWatcherInterfaces that are monitoring
250
301
  // the subchannel's state.
@@ -308,7 +359,6 @@ class Subchannel : public DualRefCounted<Subchannel> {
308
359
  };
309
360
 
310
361
  class ConnectedSubchannelStateWatcher;
311
-
312
362
  class AsyncWatcherNotifierLocked;
313
363
 
314
364
  // Sets the subchannel's connectivity state to \a state.
@@ -317,12 +367,14 @@ class Subchannel : public DualRefCounted<Subchannel> {
317
367
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
318
368
 
319
369
  // Methods for connection.
320
- void MaybeStartConnectingLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
321
- static void OnRetryAlarm(void* arg, grpc_error_handle error)
370
+ static void OnRetryTimer(void* arg, grpc_error_handle error)
322
371
  ABSL_LOCKS_EXCLUDED(mu_);
323
- void ContinueConnectingLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
372
+ void OnRetryTimerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
373
+ void StartConnectingLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
324
374
  static void OnConnectingFinished(void* arg, grpc_error_handle error)
325
375
  ABSL_LOCKS_EXCLUDED(mu_);
376
+ void OnConnectingFinishedLocked(grpc_error_handle error)
377
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
326
378
  bool PublishTransportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
327
379
 
328
380
  // The subchannel pool this subchannel is in.
@@ -338,6 +390,8 @@ class Subchannel : public DualRefCounted<Subchannel> {
338
390
  grpc_pollset_set* pollset_set_;
339
391
  // Channelz tracking.
340
392
  RefCountedPtr<channelz::SubchannelNode> channelz_node_;
393
+ // Minimum connection timeout.
394
+ Duration min_connect_timeout_;
341
395
 
342
396
  // Connection state.
343
397
  OrphanablePtr<SubchannelConnector> connector_;
@@ -347,12 +401,18 @@ class Subchannel : public DualRefCounted<Subchannel> {
347
401
  // Protects the other members.
348
402
  Mutex mu_;
349
403
 
350
- // Active connection, or null.
351
- RefCountedPtr<ConnectedSubchannel> connected_subchannel_ ABSL_GUARDED_BY(mu_);
352
- bool connecting_ ABSL_GUARDED_BY(mu_) = false;
353
- bool disconnected_ ABSL_GUARDED_BY(mu_) = false;
404
+ bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
405
+
406
+ // Records if RequestConnection() was called while in backoff.
407
+ bool connection_requested_ ABSL_GUARDED_BY(mu_) = false;
354
408
 
355
409
  // Connectivity state tracking.
410
+ // Note that the connectivity state implies the state of the
411
+ // Subchannel object:
412
+ // - IDLE: no retry timer pending, can start a connection attempt at any time
413
+ // - CONNECTING: connection attempt in progress
414
+ // - READY: connection attempt succeeded, connected_subchannel_ created
415
+ // - TRANSIENT_FAILURE: connection attempt failed, retry timer pending
356
416
  grpc_connectivity_state state_ ABSL_GUARDED_BY(mu_) = GRPC_CHANNEL_IDLE;
357
417
  absl::Status status_ ABSL_GUARDED_BY(mu_);
358
418
  // The list of watchers without a health check service name.
@@ -360,21 +420,21 @@ class Subchannel : public DualRefCounted<Subchannel> {
360
420
  // The map of watchers with health check service names.
361
421
  HealthWatcherMap health_watcher_map_ ABSL_GUARDED_BY(mu_);
362
422
 
363
- // Minimum connect timeout - must be located before backoff_.
364
- Duration min_connect_timeout_ ABSL_GUARDED_BY(mu_);
423
+ // Active connection, or null.
424
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_ ABSL_GUARDED_BY(mu_);
425
+
365
426
  // Backoff state.
366
427
  BackOff backoff_ ABSL_GUARDED_BY(mu_);
367
- Timestamp next_attempt_deadline_ ABSL_GUARDED_BY(mu_);
368
- bool backoff_begun_ ABSL_GUARDED_BY(mu_) = false;
369
-
370
- // Retry alarm.
371
- grpc_timer retry_alarm_ ABSL_GUARDED_BY(mu_);
372
- grpc_closure on_retry_alarm_ ABSL_GUARDED_BY(mu_);
373
- bool have_retry_alarm_ ABSL_GUARDED_BY(mu_) = false;
374
- // reset_backoff() was called while alarm was pending.
375
- bool retry_immediately_ ABSL_GUARDED_BY(mu_) = false;
428
+ Timestamp next_attempt_time_ ABSL_GUARDED_BY(mu_);
429
+ grpc_timer retry_timer_ ABSL_GUARDED_BY(mu_);
430
+ grpc_closure on_retry_timer_ ABSL_GUARDED_BY(mu_);
431
+
376
432
  // Keepalive time period (-1 for unset)
377
433
  int keepalive_time_ ABSL_GUARDED_BY(mu_) = -1;
434
+
435
+ // Data producer map.
436
+ std::map<UniqueTypeName, DataProducerInterface*> data_producer_map_
437
+ ABSL_GUARDED_BY(mu_);
378
438
  };
379
439
 
380
440
  } // namespace grpc_core