grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
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(