grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -0,0 +1,326 @@
1
+ // Copyright 2022 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ // TODO(ctiller): Add a unit test suite for these filters once it's practical to
16
+ // mock transport operations.
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include "src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h"
21
+
22
+ #include <functional>
23
+ #include <utility>
24
+
25
+ #include "absl/base/thread_annotations.h"
26
+ #include "absl/meta/type_traits.h"
27
+ #include "absl/random/random.h"
28
+ #include "absl/types/optional.h"
29
+
30
+ #include <grpc/impl/channel_arg_names.h>
31
+ #include <grpc/support/log.h>
32
+
33
+ #include "src/core/lib/channel/channel_args.h"
34
+ #include "src/core/lib/channel/promise_based_filter.h"
35
+ #include "src/core/lib/config/core_configuration.h"
36
+ #include "src/core/lib/debug/trace.h"
37
+ #include "src/core/lib/experiments/experiments.h"
38
+ #include "src/core/lib/gprpp/debug_location.h"
39
+ #include "src/core/lib/gprpp/no_destruct.h"
40
+ #include "src/core/lib/gprpp/orphanable.h"
41
+ #include "src/core/lib/gprpp/per_cpu.h"
42
+ #include "src/core/lib/gprpp/status_helper.h"
43
+ #include "src/core/lib/gprpp/sync.h"
44
+ #include "src/core/lib/iomgr/closure.h"
45
+ #include "src/core/lib/iomgr/error.h"
46
+ #include "src/core/lib/iomgr/exec_ctx.h"
47
+ #include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
48
+ #include "src/core/lib/promise/loop.h"
49
+ #include "src/core/lib/promise/poll.h"
50
+ #include "src/core/lib/promise/promise.h"
51
+ #include "src/core/lib/promise/sleep.h"
52
+ #include "src/core/lib/promise/try_seq.h"
53
+ #include "src/core/lib/surface/channel_stack_type.h"
54
+ #include "src/core/lib/transport/http2_errors.h"
55
+ #include "src/core/lib/transport/metadata_batch.h"
56
+
57
+ namespace grpc_core {
58
+
59
+ namespace {
60
+
61
+ // TODO(roth): This can go back to being a constant when the experiment
62
+ // is removed.
63
+ Duration DefaultIdleTimeout() {
64
+ if (IsClientIdlenessEnabled()) return Duration::Minutes(30);
65
+ return Duration::Infinity();
66
+ }
67
+
68
+ // If these settings change, make sure that we are not sending a GOAWAY for
69
+ // inproc transport, since a GOAWAY to inproc ends up destroying the transport.
70
+ const auto kDefaultMaxConnectionAge = Duration::Infinity();
71
+ const auto kDefaultMaxConnectionAgeGrace = Duration::Infinity();
72
+ const auto kDefaultMaxConnectionIdle = Duration::Infinity();
73
+ const auto kMaxConnectionAgeJitter = 0.1;
74
+
75
+ TraceFlag grpc_trace_client_idle_filter(false, "client_idle_filter");
76
+ } // namespace
77
+
78
+ #define GRPC_IDLE_FILTER_LOG(format, ...) \
79
+ do { \
80
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_client_idle_filter)) { \
81
+ gpr_log(GPR_INFO, "(client idle filter) " format, ##__VA_ARGS__); \
82
+ } \
83
+ } while (0)
84
+
85
+ namespace {
86
+
87
+ Duration GetClientIdleTimeout(const ChannelArgs& args) {
88
+ return args.GetDurationFromIntMillis(GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS)
89
+ .value_or(DefaultIdleTimeout());
90
+ }
91
+
92
+ } // namespace
93
+
94
+ struct LegacyMaxAgeFilter::Config {
95
+ Duration max_connection_age;
96
+ Duration max_connection_idle;
97
+ Duration max_connection_age_grace;
98
+
99
+ bool enable() const {
100
+ return max_connection_age != Duration::Infinity() ||
101
+ max_connection_idle != Duration::Infinity();
102
+ }
103
+
104
+ // A random jitter of +/-10% will be added to MAX_CONNECTION_AGE and
105
+ // MAX_CONNECTION_IDLE to spread out reconnection storms.
106
+ static Config FromChannelArgs(const ChannelArgs& args) {
107
+ const Duration args_max_age =
108
+ args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_AGE_MS)
109
+ .value_or(kDefaultMaxConnectionAge);
110
+ const Duration args_max_idle =
111
+ args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_IDLE_MS)
112
+ .value_or(kDefaultMaxConnectionIdle);
113
+ const Duration args_max_age_grace =
114
+ args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS)
115
+ .value_or(kDefaultMaxConnectionAgeGrace);
116
+ // generate a random number between 1 - kMaxConnectionAgeJitter and
117
+ // 1 + kMaxConnectionAgeJitter
118
+ struct BitGen {
119
+ Mutex mu;
120
+ absl::BitGen bit_gen ABSL_GUARDED_BY(mu);
121
+ double MakeUniformDouble(double min, double max) {
122
+ MutexLock lock(&mu);
123
+ return absl::Uniform(bit_gen, min, max);
124
+ }
125
+ };
126
+ static NoDestruct<PerCpu<BitGen>> bit_gen(PerCpuOptions().SetMaxShards(8));
127
+ const double multiplier = bit_gen->this_cpu().MakeUniformDouble(
128
+ 1.0 - kMaxConnectionAgeJitter, 1.0 + kMaxConnectionAgeJitter);
129
+ // GRPC_MILLIS_INF_FUTURE - 0.5 converts the value to float, so that result
130
+ // will not be cast to int implicitly before the comparison.
131
+ return Config{args_max_age * multiplier, args_max_idle * multiplier,
132
+ args_max_age_grace};
133
+ }
134
+ };
135
+
136
+ absl::StatusOr<LegacyClientIdleFilter> LegacyClientIdleFilter::Create(
137
+ const ChannelArgs& args, ChannelFilter::Args filter_args) {
138
+ LegacyClientIdleFilter filter(filter_args.channel_stack(),
139
+ GetClientIdleTimeout(args));
140
+ return absl::StatusOr<LegacyClientIdleFilter>(std::move(filter));
141
+ }
142
+
143
+ absl::StatusOr<LegacyMaxAgeFilter> LegacyMaxAgeFilter::Create(
144
+ const ChannelArgs& args, ChannelFilter::Args filter_args) {
145
+ LegacyMaxAgeFilter filter(filter_args.channel_stack(),
146
+ Config::FromChannelArgs(args));
147
+ return absl::StatusOr<LegacyMaxAgeFilter>(std::move(filter));
148
+ }
149
+
150
+ void LegacyMaxAgeFilter::Shutdown() {
151
+ max_age_activity_.Reset();
152
+ LegacyChannelIdleFilter::Shutdown();
153
+ }
154
+
155
+ void LegacyMaxAgeFilter::PostInit() {
156
+ struct StartupClosure {
157
+ RefCountedPtr<grpc_channel_stack> channel_stack;
158
+ LegacyMaxAgeFilter* filter;
159
+ grpc_closure closure;
160
+ };
161
+ auto run_startup = [](void* p, grpc_error_handle) {
162
+ auto* startup = static_cast<StartupClosure*>(p);
163
+ // Trigger idle timer
164
+ startup->filter->IncreaseCallCount();
165
+ startup->filter->DecreaseCallCount();
166
+ grpc_transport_op* op = grpc_make_transport_op(nullptr);
167
+ op->start_connectivity_watch.reset(
168
+ new ConnectivityWatcher(startup->filter));
169
+ op->start_connectivity_watch_state = GRPC_CHANNEL_IDLE;
170
+ grpc_channel_next_op(
171
+ grpc_channel_stack_element(startup->channel_stack.get(), 0), op);
172
+ delete startup;
173
+ };
174
+ auto* startup =
175
+ new StartupClosure{this->channel_stack()->Ref(), this, grpc_closure{}};
176
+ GRPC_CLOSURE_INIT(&startup->closure, run_startup, startup, nullptr);
177
+ ExecCtx::Run(DEBUG_LOCATION, &startup->closure, absl::OkStatus());
178
+
179
+ auto channel_stack = this->channel_stack()->Ref();
180
+
181
+ // Start the max age timer
182
+ if (max_connection_age_ != Duration::Infinity()) {
183
+ max_age_activity_.Set(MakeActivity(
184
+ TrySeq(
185
+ // First sleep until the max connection age
186
+ Sleep(Timestamp::Now() + max_connection_age_),
187
+ // Then send a goaway.
188
+ [this] {
189
+ GRPC_CHANNEL_STACK_REF(this->channel_stack(),
190
+ "max_age send_goaway");
191
+ // Jump out of the activity to send the goaway.
192
+ auto fn = [](void* arg, grpc_error_handle) {
193
+ auto* channel_stack = static_cast<grpc_channel_stack*>(arg);
194
+ grpc_transport_op* op = grpc_make_transport_op(nullptr);
195
+ op->goaway_error = grpc_error_set_int(
196
+ GRPC_ERROR_CREATE("max_age"),
197
+ StatusIntProperty::kHttp2Error, GRPC_HTTP2_NO_ERROR);
198
+ grpc_channel_element* elem =
199
+ grpc_channel_stack_element(channel_stack, 0);
200
+ elem->filter->start_transport_op(elem, op);
201
+ GRPC_CHANNEL_STACK_UNREF(channel_stack, "max_age send_goaway");
202
+ };
203
+ ExecCtx::Run(
204
+ DEBUG_LOCATION,
205
+ GRPC_CLOSURE_CREATE(fn, this->channel_stack(), nullptr),
206
+ absl::OkStatus());
207
+ return Immediate(absl::OkStatus());
208
+ },
209
+ // Sleep for the grace period
210
+ [this] {
211
+ return Sleep(Timestamp::Now() + max_connection_age_grace_);
212
+ }),
213
+ ExecCtxWakeupScheduler(),
214
+ [channel_stack, this](absl::Status status) {
215
+ // OnDone -- close the connection if the promise completed
216
+ // successfully.
217
+ // (if it did not, it was cancelled)
218
+ if (status.ok()) CloseChannel();
219
+ },
220
+ channel_stack->EventEngine()));
221
+ }
222
+ }
223
+
224
+ // Construct a promise for one call.
225
+ ArenaPromise<ServerMetadataHandle> LegacyChannelIdleFilter::MakeCallPromise(
226
+ CallArgs call_args, NextPromiseFactory next_promise_factory) {
227
+ using Decrementer =
228
+ std::unique_ptr<LegacyChannelIdleFilter, CallCountDecreaser>;
229
+ IncreaseCallCount();
230
+ return ArenaPromise<ServerMetadataHandle>(
231
+ [decrementer = Decrementer(this),
232
+ next = next_promise_factory(std::move(call_args))]() mutable
233
+ -> Poll<ServerMetadataHandle> { return next(); });
234
+ }
235
+
236
+ bool LegacyChannelIdleFilter::StartTransportOp(grpc_transport_op* op) {
237
+ // Catch the disconnect_with_error transport op.
238
+ if (!op->disconnect_with_error.ok()) Shutdown();
239
+ // Pass the op to the next filter.
240
+ return false;
241
+ }
242
+
243
+ void LegacyChannelIdleFilter::Shutdown() {
244
+ // IncreaseCallCount() introduces a phony call and prevent the timer from
245
+ // being reset by other threads.
246
+ IncreaseCallCount();
247
+ activity_.Reset();
248
+ }
249
+
250
+ void LegacyChannelIdleFilter::IncreaseCallCount() {
251
+ idle_filter_state_->IncreaseCallCount();
252
+ }
253
+
254
+ void LegacyChannelIdleFilter::DecreaseCallCount() {
255
+ if (idle_filter_state_->DecreaseCallCount()) {
256
+ // If there are no more calls in progress, start the idle timer.
257
+ StartIdleTimer();
258
+ }
259
+ }
260
+
261
+ void LegacyChannelIdleFilter::StartIdleTimer() {
262
+ GRPC_IDLE_FILTER_LOG("timer has started");
263
+ auto idle_filter_state = idle_filter_state_;
264
+ // Hold a ref to the channel stack for the timer callback.
265
+ auto channel_stack = channel_stack_->Ref();
266
+ auto timeout = client_idle_timeout_;
267
+ auto promise = Loop([timeout, idle_filter_state]() {
268
+ return TrySeq(Sleep(Timestamp::Now() + timeout),
269
+ [idle_filter_state]() -> Poll<LoopCtl<absl::Status>> {
270
+ if (idle_filter_state->CheckTimer()) {
271
+ return Continue{};
272
+ } else {
273
+ return absl::OkStatus();
274
+ }
275
+ });
276
+ });
277
+ activity_.Set(MakeActivity(
278
+ std::move(promise), ExecCtxWakeupScheduler{},
279
+ [channel_stack, this](absl::Status status) {
280
+ if (status.ok()) CloseChannel();
281
+ },
282
+ channel_stack->EventEngine()));
283
+ }
284
+
285
+ void LegacyChannelIdleFilter::CloseChannel() {
286
+ auto* op = grpc_make_transport_op(nullptr);
287
+ op->disconnect_with_error = grpc_error_set_int(
288
+ GRPC_ERROR_CREATE("enter idle"),
289
+ StatusIntProperty::ChannelConnectivityState, GRPC_CHANNEL_IDLE);
290
+ // Pass the transport op down to the channel stack.
291
+ auto* elem = grpc_channel_stack_element(channel_stack_, 0);
292
+ elem->filter->start_transport_op(elem, op);
293
+ }
294
+
295
+ const grpc_channel_filter LegacyClientIdleFilter::kFilter =
296
+ MakePromiseBasedFilter<LegacyClientIdleFilter, FilterEndpoint::kClient>(
297
+ "client_idle");
298
+ const grpc_channel_filter LegacyMaxAgeFilter::kFilter =
299
+ MakePromiseBasedFilter<LegacyMaxAgeFilter, FilterEndpoint::kServer>(
300
+ "max_age");
301
+
302
+ void RegisterLegacyChannelIdleFilters(CoreConfiguration::Builder* builder) {
303
+ if (IsV3ChannelIdleFiltersEnabled()) return;
304
+ builder->channel_init()
305
+ ->RegisterFilter<LegacyClientIdleFilter>(GRPC_CLIENT_CHANNEL)
306
+ .ExcludeFromMinimalStack()
307
+ .If([](const ChannelArgs& channel_args) {
308
+ return GetClientIdleTimeout(channel_args) != Duration::Infinity();
309
+ });
310
+ builder->channel_init()
311
+ ->RegisterFilter<LegacyMaxAgeFilter>(GRPC_SERVER_CHANNEL)
312
+ .ExcludeFromMinimalStack()
313
+ .If([](const ChannelArgs& channel_args) {
314
+ return LegacyMaxAgeFilter::Config::FromChannelArgs(channel_args)
315
+ .enable();
316
+ });
317
+ }
318
+
319
+ LegacyMaxAgeFilter::LegacyMaxAgeFilter(grpc_channel_stack* channel_stack,
320
+ const Config& max_age_config)
321
+ : LegacyChannelIdleFilter(channel_stack,
322
+ max_age_config.max_connection_idle),
323
+ max_connection_age_(max_age_config.max_connection_age),
324
+ max_connection_age_grace_(max_age_config.max_connection_age_grace) {}
325
+
326
+ } // namespace grpc_core
@@ -0,0 +1,143 @@
1
+ // Copyright 2022 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_LEGACY_CHANNEL_IDLE_FILTER_H
16
+ #define GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_LEGACY_CHANNEL_IDLE_FILTER_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <memory>
21
+
22
+ #include "absl/status/status.h"
23
+ #include "absl/status/statusor.h"
24
+
25
+ #include <grpc/impl/connectivity_state.h>
26
+
27
+ #include "src/core/ext/filters/channel_idle/idle_filter_state.h"
28
+ #include "src/core/lib/channel/channel_args.h"
29
+ #include "src/core/lib/channel/channel_fwd.h"
30
+ #include "src/core/lib/channel/channel_stack.h"
31
+ #include "src/core/lib/channel/promise_based_filter.h"
32
+ #include "src/core/lib/gprpp/orphanable.h"
33
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
34
+ #include "src/core/lib/gprpp/single_set_ptr.h"
35
+ #include "src/core/lib/gprpp/time.h"
36
+ #include "src/core/lib/promise/activity.h"
37
+ #include "src/core/lib/promise/arena_promise.h"
38
+ #include "src/core/lib/transport/connectivity_state.h"
39
+ #include "src/core/lib/transport/transport.h"
40
+
41
+ namespace grpc_core {
42
+
43
+ class LegacyChannelIdleFilter : public ChannelFilter {
44
+ public:
45
+ ~LegacyChannelIdleFilter() override = default;
46
+
47
+ LegacyChannelIdleFilter(const LegacyChannelIdleFilter&) = delete;
48
+ LegacyChannelIdleFilter& operator=(const LegacyChannelIdleFilter&) = delete;
49
+ LegacyChannelIdleFilter(LegacyChannelIdleFilter&&) = default;
50
+ LegacyChannelIdleFilter& operator=(LegacyChannelIdleFilter&&) = default;
51
+
52
+ // Construct a promise for one call.
53
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
54
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override;
55
+
56
+ bool StartTransportOp(grpc_transport_op* op) override;
57
+
58
+ protected:
59
+ using SingleSetActivityPtr =
60
+ SingleSetPtr<Activity, typename ActivityPtr::deleter_type>;
61
+
62
+ LegacyChannelIdleFilter(grpc_channel_stack* channel_stack,
63
+ Duration client_idle_timeout)
64
+ : channel_stack_(channel_stack),
65
+ client_idle_timeout_(client_idle_timeout) {}
66
+
67
+ grpc_channel_stack* channel_stack() { return channel_stack_; };
68
+
69
+ virtual void Shutdown();
70
+ void CloseChannel();
71
+
72
+ void IncreaseCallCount();
73
+ void DecreaseCallCount();
74
+
75
+ private:
76
+ void StartIdleTimer();
77
+
78
+ struct CallCountDecreaser {
79
+ void operator()(LegacyChannelIdleFilter* filter) const {
80
+ filter->DecreaseCallCount();
81
+ }
82
+ };
83
+
84
+ // The channel stack to which we take refs for pending callbacks.
85
+ grpc_channel_stack* channel_stack_;
86
+ Duration client_idle_timeout_;
87
+ std::shared_ptr<IdleFilterState> idle_filter_state_{
88
+ std::make_shared<IdleFilterState>(false)};
89
+
90
+ SingleSetActivityPtr activity_;
91
+ };
92
+
93
+ class LegacyClientIdleFilter final : public LegacyChannelIdleFilter {
94
+ public:
95
+ static const grpc_channel_filter kFilter;
96
+
97
+ static absl::StatusOr<LegacyClientIdleFilter> Create(
98
+ const ChannelArgs& args, ChannelFilter::Args filter_args);
99
+
100
+ private:
101
+ using LegacyChannelIdleFilter::LegacyChannelIdleFilter;
102
+ };
103
+
104
+ class LegacyMaxAgeFilter final : public LegacyChannelIdleFilter {
105
+ public:
106
+ static const grpc_channel_filter kFilter;
107
+ struct Config;
108
+
109
+ static absl::StatusOr<LegacyMaxAgeFilter> Create(
110
+ const ChannelArgs& args, ChannelFilter::Args filter_args);
111
+
112
+ void PostInit() override;
113
+
114
+ private:
115
+ class ConnectivityWatcher : public AsyncConnectivityStateWatcherInterface {
116
+ public:
117
+ explicit ConnectivityWatcher(LegacyMaxAgeFilter* filter)
118
+ : channel_stack_(filter->channel_stack()->Ref()), filter_(filter) {}
119
+ ~ConnectivityWatcher() override = default;
120
+
121
+ void OnConnectivityStateChange(grpc_connectivity_state new_state,
122
+ const absl::Status&) override {
123
+ if (new_state == GRPC_CHANNEL_SHUTDOWN) filter_->Shutdown();
124
+ }
125
+
126
+ private:
127
+ RefCountedPtr<grpc_channel_stack> channel_stack_;
128
+ LegacyMaxAgeFilter* filter_;
129
+ };
130
+
131
+ LegacyMaxAgeFilter(grpc_channel_stack* channel_stack,
132
+ const Config& max_age_config);
133
+
134
+ void Shutdown() override;
135
+
136
+ SingleSetActivityPtr max_age_activity_;
137
+ Duration max_connection_age_;
138
+ Duration max_connection_age_grace_;
139
+ };
140
+
141
+ } // namespace grpc_core
142
+
143
+ #endif // GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_LEGACY_CHANNEL_IDLE_FILTER_H
@@ -24,8 +24,8 @@
24
24
 
25
25
  #include "absl/strings/string_view.h"
26
26
  #include "upb/base/string_view.h"
27
- #include "upb/collections/map.h"
28
- #include "upb/upb.hpp"
27
+ #include "upb/mem/arena.hpp"
28
+ #include "upb/message/map.h"
29
29
  #include "xds/data/orca/v3/orca_load_report.upb.h"
30
30
 
31
31
  namespace grpc_core {
@@ -315,6 +315,14 @@ class ClientChannel::PromiseBasedCallData : public ClientChannel::CallData {
315
315
  public:
316
316
  explicit PromiseBasedCallData(ClientChannel* chand) : chand_(chand) {}
317
317
 
318
+ ~PromiseBasedCallData() override {
319
+ if (was_queued_ && client_initial_metadata_ != nullptr) {
320
+ MutexLock lock(&chand_->resolution_mu_);
321
+ RemoveCallFromResolverQueuedCallsLocked();
322
+ chand_->resolver_queued_calls_.erase(this);
323
+ }
324
+ }
325
+
318
326
  ArenaPromise<absl::StatusOr<CallArgs>> MakeNameResolutionPromise(
319
327
  CallArgs call_args) {
320
328
  pollent_ = NowOrNever(call_args.polling_entity->WaitAndCopy()).value();
@@ -399,6 +407,7 @@ class ClientChannel::PromiseBasedCallData : public ClientChannel::CallData {
399
407
  const grpc_channel_filter ClientChannel::kFilterVtableWithPromises = {
400
408
  ClientChannel::FilterBasedCallData::StartTransportStreamOpBatch,
401
409
  ClientChannel::MakeCallPromise,
410
+ /* init_call: */ nullptr,
402
411
  ClientChannel::StartTransportOp,
403
412
  sizeof(ClientChannel::FilterBasedCallData),
404
413
  ClientChannel::FilterBasedCallData::Init,
@@ -415,6 +424,7 @@ const grpc_channel_filter ClientChannel::kFilterVtableWithPromises = {
415
424
  const grpc_channel_filter ClientChannel::kFilterVtableWithoutPromises = {
416
425
  ClientChannel::FilterBasedCallData::StartTransportStreamOpBatch,
417
426
  nullptr,
427
+ /* init_call: */ nullptr,
418
428
  ClientChannel::StartTransportOp,
419
429
  sizeof(ClientChannel::FilterBasedCallData),
420
430
  ClientChannel::FilterBasedCallData::Init,
@@ -562,6 +572,7 @@ class DynamicTerminationFilter::CallData {
562
572
  const grpc_channel_filter DynamicTerminationFilter::kFilterVtable = {
563
573
  DynamicTerminationFilter::CallData::StartTransportStreamOpBatch,
564
574
  DynamicTerminationFilter::MakeCallPromise,
575
+ /* init_call: */ nullptr,
565
576
  DynamicTerminationFilter::StartTransportOp,
566
577
  sizeof(DynamicTerminationFilter::CallData),
567
578
  DynamicTerminationFilter::CallData::Init,
@@ -703,8 +714,9 @@ class ClientChannel::SubchannelWrapper : public SubchannelInterface {
703
714
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
704
715
  auto& watcher_wrapper = watcher_map_[watcher.get()];
705
716
  GPR_ASSERT(watcher_wrapper == nullptr);
706
- watcher_wrapper = new WatcherWrapper(std::move(watcher),
707
- Ref(DEBUG_LOCATION, "WatcherWrapper"));
717
+ watcher_wrapper = new WatcherWrapper(
718
+ std::move(watcher),
719
+ RefAsSubclass<SubchannelWrapper>(DEBUG_LOCATION, "WatcherWrapper"));
708
720
  subchannel_->WatchConnectivityState(
709
721
  RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
710
722
  watcher_wrapper));
@@ -908,7 +920,8 @@ ClientChannel::ExternalConnectivityWatcher::ExternalConnectivityWatcher(
908
920
  GPR_ASSERT(chand->external_watchers_[on_complete] == nullptr);
909
921
  // Store a ref to the watcher in the external_watchers_ map.
910
922
  chand->external_watchers_[on_complete] =
911
- Ref(DEBUG_LOCATION, "AddWatcherToExternalWatchersMapLocked");
923
+ RefAsSubclass<ExternalConnectivityWatcher>(
924
+ DEBUG_LOCATION, "AddWatcherToExternalWatchersMapLocked");
912
925
  }
913
926
  // Pass the ref from creating the object to Start().
914
927
  chand_->work_serializer_->Run(
@@ -1599,7 +1612,12 @@ absl::Status ClientChannel::CreateOrUpdateLbPolicyLocked(
1599
1612
  Resolver::Result result) {
1600
1613
  // Construct update.
1601
1614
  LoadBalancingPolicy::UpdateArgs update_args;
1602
- update_args.addresses = std::move(result.addresses);
1615
+ if (!result.addresses.ok()) {
1616
+ update_args.addresses = result.addresses.status();
1617
+ } else {
1618
+ update_args.addresses = std::make_shared<EndpointAddressesListIterator>(
1619
+ std::move(*result.addresses));
1620
+ }
1603
1621
  update_args.config = std::move(lb_policy_config);
1604
1622
  update_args.resolution_note = std::move(result.resolution_note);
1605
1623
  // Remove the config selector from channel args so that we're not holding
@@ -2585,6 +2603,8 @@ class ClientChannel::LoadBalancedCall::LbCallState
2585
2603
  ServiceConfigCallData::CallAttributeInterface* GetCallAttribute(
2586
2604
  UniqueTypeName type) const override;
2587
2605
 
2606
+ ClientCallTracer::CallAttemptTracer* GetCallAttemptTracer() const override;
2607
+
2588
2608
  private:
2589
2609
  LoadBalancedCall* lb_call_;
2590
2610
  };
@@ -2676,6 +2696,11 @@ ClientChannel::LoadBalancedCall::LbCallState::GetCallAttribute(
2676
2696
  return service_config_call_data->GetCallAttribute(type);
2677
2697
  }
2678
2698
 
2699
+ ClientCallTracer::CallAttemptTracer*
2700
+ ClientChannel::LoadBalancedCall::LbCallState::GetCallAttemptTracer() const {
2701
+ return lb_call_->call_attempt_tracer();
2702
+ }
2703
+
2679
2704
  //
2680
2705
  // ClientChannel::LoadBalancedCall::BackendMetricAccessor
2681
2706
  //
@@ -3405,7 +3430,8 @@ void ClientChannel::FilterBasedLoadBalancedCall::TryPick(bool was_queued) {
3405
3430
 
3406
3431
  void ClientChannel::FilterBasedLoadBalancedCall::OnAddToQueueLocked() {
3407
3432
  // Register call combiner cancellation callback.
3408
- lb_call_canceller_ = new LbQueuedCallCanceller(Ref());
3433
+ lb_call_canceller_ =
3434
+ new LbQueuedCallCanceller(RefAsSubclass<FilterBasedLoadBalancedCall>());
3409
3435
  }
3410
3436
 
3411
3437
  void ClientChannel::FilterBasedLoadBalancedCall::RetryPickLocked() {
@@ -3494,7 +3520,7 @@ ClientChannel::PromiseBasedLoadBalancedCall::MakeCallPromise(
3494
3520
  }
3495
3521
  // Extract peer name from server initial metadata.
3496
3522
  call_args.server_initial_metadata->InterceptAndMap(
3497
- [self = RefCountedPtr<PromiseBasedLoadBalancedCall>(lb_call->Ref())](
3523
+ [self = lb_call->RefAsSubclass<PromiseBasedLoadBalancedCall>()](
3498
3524
  ServerMetadataHandle metadata) {
3499
3525
  if (self->call_attempt_tracer() != nullptr) {
3500
3526
  self->call_attempt_tracer()->RecordReceivedInitialMetadata(
@@ -25,6 +25,7 @@
25
25
 
26
26
  #include <grpc/support/log.h>
27
27
 
28
+ #include "src/core/lib/channel/call_tracer.h"
28
29
  #include "src/core/lib/channel/context.h"
29
30
  #include "src/core/lib/gprpp/unique_type_name.h"
30
31
  #include "src/core/lib/load_balancing/lb_policy.h"
@@ -49,6 +50,7 @@ class ClientChannelLbCallState : public LoadBalancingPolicy::CallState {
49
50
  public:
50
51
  virtual ServiceConfigCallData::CallAttributeInterface* GetCallAttribute(
51
52
  UniqueTypeName type) const = 0;
53
+ virtual ClientCallTracer::CallAttemptTracer* GetCallAttemptTracer() const = 0;
52
54
  };
53
55
 
54
56
  // Internal type for ServiceConfigCallData. Handles call commits.
@@ -28,7 +28,7 @@ namespace grpc_core {
28
28
 
29
29
  RefCountedPtr<GlobalSubchannelPool> GlobalSubchannelPool::instance() {
30
30
  static GlobalSubchannelPool* p = new GlobalSubchannelPool();
31
- return p->Ref();
31
+ return p->RefAsSubclass<GlobalSubchannelPool>();
32
32
  }
33
33
 
34
34
  RefCountedPtr<Subchannel> GlobalSubchannelPool::RegisterSubchannel(