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
@@ -49,7 +49,7 @@
49
49
  #include "absl/strings/string_view.h"
50
50
  #include "absl/types/optional.h"
51
51
  #include "upb/base/string_view.h"
52
- #include "upb/upb.hpp"
52
+ #include "upb/mem/arena.hpp"
53
53
 
54
54
  #include <grpc/byte_buffer.h>
55
55
  #include <grpc/byte_buffer_reader.h>
@@ -707,7 +707,7 @@ class RlsLb : public LoadBalancingPolicy {
707
707
  OrphanablePtr<RlsChannel> rls_channel_ ABSL_GUARDED_BY(mu_);
708
708
 
709
709
  // Accessed only from within WorkSerializer.
710
- absl::StatusOr<EndpointAddressesList> addresses_;
710
+ absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses_;
711
711
  ChannelArgs channel_args_;
712
712
  RefCountedPtr<RlsLbConfig> config_;
713
713
  RefCountedPtr<ChildPolicyWrapper> default_child_policy_;
@@ -1282,7 +1282,7 @@ RlsLb::Cache::Entry::OnRlsResponseLocked(
1282
1282
  auto it = lb_policy_->child_policy_map_.find(target);
1283
1283
  if (it == lb_policy_->child_policy_map_.end()) {
1284
1284
  auto new_child = MakeRefCounted<ChildPolicyWrapper>(
1285
- lb_policy_->Ref(DEBUG_LOCATION, "ChildPolicyWrapper"), target);
1285
+ lb_policy_.Ref(DEBUG_LOCATION, "ChildPolicyWrapper"), target);
1286
1286
  new_child->StartUpdate();
1287
1287
  child_policies_to_finish_update.push_back(new_child.get());
1288
1288
  new_child_policy_wrappers.emplace_back(std::move(new_child));
@@ -1326,8 +1326,8 @@ RlsLb::Cache::Entry* RlsLb::Cache::FindOrInsert(const RequestKey& key) {
1326
1326
  if (it == map_.end()) {
1327
1327
  size_t entry_size = EntrySizeForKey(key);
1328
1328
  MaybeShrinkSize(size_limit_ - std::min(size_limit_, entry_size));
1329
- Entry* entry =
1330
- new Entry(lb_policy_->Ref(DEBUG_LOCATION, "CacheEntry"), key);
1329
+ Entry* entry = new Entry(
1330
+ lb_policy_->RefAsSubclass<RlsLb>(DEBUG_LOCATION, "CacheEntry"), key);
1331
1331
  map_.emplace(key, OrphanablePtr<Entry>(entry));
1332
1332
  size_ += entry_size;
1333
1333
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
@@ -1550,11 +1550,11 @@ RlsLb::RlsChannel::RlsChannel(RefCountedPtr<RlsLb> lb_policy)
1550
1550
  // Set up channelz linkage.
1551
1551
  channelz::ChannelNode* child_channelz_node =
1552
1552
  grpc_channel_get_channelz_node(channel_);
1553
- channelz::ChannelNode* parent_channelz_node =
1554
- lb_policy_->channel_args_.GetObject<channelz::ChannelNode>();
1553
+ auto parent_channelz_node =
1554
+ lb_policy_->channel_args_.GetObjectRef<channelz::ChannelNode>();
1555
1555
  if (child_channelz_node != nullptr && parent_channelz_node != nullptr) {
1556
1556
  parent_channelz_node->AddChildChannel(child_channelz_node->uuid());
1557
- parent_channelz_node_ = parent_channelz_node->Ref();
1557
+ parent_channelz_node_ = std::move(parent_channelz_node);
1558
1558
  }
1559
1559
  // Start connectivity watch.
1560
1560
  ClientChannel* client_channel =
@@ -1607,7 +1607,7 @@ void RlsLb::RlsChannel::StartRlsCall(const RequestKey& key,
1607
1607
  }
1608
1608
  lb_policy_->request_map_.emplace(
1609
1609
  key, MakeOrphanable<RlsRequest>(
1610
- lb_policy_->Ref(DEBUG_LOCATION, "RlsRequest"), key,
1610
+ lb_policy_.Ref(DEBUG_LOCATION, "RlsRequest"), key,
1611
1611
  lb_policy_->rls_channel_->Ref(DEBUG_LOCATION, "RlsRequest"),
1612
1612
  std::move(backoff_state), reason, std::move(stale_header_data)));
1613
1613
  }
@@ -1858,6 +1858,27 @@ RlsLb::RlsLb(Args args) : LoadBalancingPolicy(std::move(args)), cache_(this) {
1858
1858
  }
1859
1859
  }
1860
1860
 
1861
+ bool EndpointsEqual(
1862
+ const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> endpoints1,
1863
+ const absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>>
1864
+ endpoints2) {
1865
+ if (endpoints1.status() != endpoints2.status()) return false;
1866
+ if (endpoints1.ok()) {
1867
+ std::vector<EndpointAddresses> e1_list;
1868
+ (*endpoints1)->ForEach([&](const EndpointAddresses& endpoint) {
1869
+ e1_list.push_back(endpoint);
1870
+ });
1871
+ size_t i = 0;
1872
+ bool different = false;
1873
+ (*endpoints2)->ForEach([&](const EndpointAddresses& endpoint) {
1874
+ if (endpoint != e1_list[i++]) different = true;
1875
+ });
1876
+ if (different) return false;
1877
+ if (i != e1_list.size()) return false;
1878
+ }
1879
+ return true;
1880
+ }
1881
+
1861
1882
  absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
1862
1883
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace)) {
1863
1884
  gpr_log(GPR_INFO, "[rlslb %p] policy updated", this);
@@ -1865,7 +1886,7 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
1865
1886
  update_in_progress_ = true;
1866
1887
  // Swap out config.
1867
1888
  RefCountedPtr<RlsLbConfig> old_config = std::move(config_);
1868
- config_ = std::move(args.config);
1889
+ config_ = args.config.TakeAsSubclass<RlsLbConfig>();
1869
1890
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace) &&
1870
1891
  (old_config == nullptr ||
1871
1892
  old_config->child_policy_config() != config_->child_policy_config())) {
@@ -1875,7 +1896,7 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
1875
1896
  // Swap out addresses.
1876
1897
  // If the new address list is an error and we have an existing address list,
1877
1898
  // stick with the existing addresses.
1878
- absl::StatusOr<EndpointAddressesList> old_addresses;
1899
+ absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> old_addresses;
1879
1900
  if (args.addresses.ok()) {
1880
1901
  old_addresses = std::move(addresses_);
1881
1902
  addresses_ = std::move(args.addresses);
@@ -1888,7 +1909,7 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
1888
1909
  bool update_child_policies =
1889
1910
  old_config == nullptr ||
1890
1911
  old_config->child_policy_config() != config_->child_policy_config() ||
1891
- old_addresses != addresses_ || args.args != channel_args_;
1912
+ !EndpointsEqual(old_addresses, addresses_) || args.args != channel_args_;
1892
1913
  // If default target changes, swap out child policy.
1893
1914
  bool created_default_child = false;
1894
1915
  if (old_config == nullptr ||
@@ -1905,7 +1926,7 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
1905
1926
  gpr_log(GPR_INFO, "[rlslb %p] creating new default target", this);
1906
1927
  }
1907
1928
  default_child_policy_ = MakeRefCounted<ChildPolicyWrapper>(
1908
- Ref(DEBUG_LOCATION, "ChildPolicyWrapper"),
1929
+ RefAsSubclass<RlsLb>(DEBUG_LOCATION, "ChildPolicyWrapper"),
1909
1930
  config_->default_target());
1910
1931
  created_default_child = true;
1911
1932
  } else {
@@ -1924,8 +1945,8 @@ absl::Status RlsLb::UpdateLocked(UpdateArgs args) {
1924
1945
  // Swap out RLS channel if needed.
1925
1946
  if (old_config == nullptr ||
1926
1947
  config_->lookup_service() != old_config->lookup_service()) {
1927
- rls_channel_ =
1928
- MakeOrphanable<RlsChannel>(Ref(DEBUG_LOCATION, "RlsChannel"));
1948
+ rls_channel_ = MakeOrphanable<RlsChannel>(
1949
+ RefAsSubclass<RlsLb>(DEBUG_LOCATION, "RlsChannel"));
1929
1950
  }
1930
1951
  // Resize cache if needed.
1931
1952
  if (old_config == nullptr ||
@@ -2095,7 +2116,8 @@ void RlsLb::UpdatePickerLocked() {
2095
2116
  status = absl::UnavailableError("no children available");
2096
2117
  }
2097
2118
  channel_control_helper()->UpdateState(
2098
- state, status, MakeRefCounted<Picker>(Ref(DEBUG_LOCATION, "Picker")));
2119
+ state, status,
2120
+ MakeRefCounted<Picker>(RefAsSubclass<RlsLb>(DEBUG_LOCATION, "Picker")));
2099
2121
  }
2100
2122
 
2101
2123
  //
@@ -125,14 +125,14 @@ class OldRoundRobin : public LoadBalancingPolicy {
125
125
  : public SubchannelList<RoundRobinSubchannelList,
126
126
  RoundRobinSubchannelData> {
127
127
  public:
128
- RoundRobinSubchannelList(OldRoundRobin* policy, ServerAddressList addresses,
128
+ RoundRobinSubchannelList(OldRoundRobin* policy,
129
+ EndpointAddressesIterator* addresses,
129
130
  const ChannelArgs& args)
130
131
  : SubchannelList(policy,
131
132
  (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)
132
133
  ? "RoundRobinSubchannelList"
133
134
  : nullptr),
134
- std::move(addresses), policy->channel_control_helper(),
135
- args) {
135
+ addresses, policy->channel_control_helper(), args) {
136
136
  // Need to maintain a ref to the LB policy as long as we maintain
137
137
  // any references to subchannels, since the subchannels'
138
138
  // pollset_sets will include the LB policy's pollset_set.
@@ -277,13 +277,12 @@ void OldRoundRobin::ResetBackoffLocked() {
277
277
  }
278
278
 
279
279
  absl::Status OldRoundRobin::UpdateLocked(UpdateArgs args) {
280
- ServerAddressList addresses;
280
+ EndpointAddressesIterator* addresses = nullptr;
281
281
  if (args.addresses.ok()) {
282
282
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
283
- gpr_log(GPR_INFO, "[RR %p] received update with %" PRIuPTR " addresses",
284
- this, args.addresses->size());
283
+ gpr_log(GPR_INFO, "[RR %p] received update", this);
285
284
  }
286
- addresses = std::move(*args.addresses);
285
+ addresses = args.addresses->get();
287
286
  } else {
288
287
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
289
288
  gpr_log(GPR_INFO, "[RR %p] received update with address error: %s", this,
@@ -299,8 +298,8 @@ absl::Status OldRoundRobin::UpdateLocked(UpdateArgs args) {
299
298
  gpr_log(GPR_INFO, "[RR %p] replacing previous pending subchannel list %p",
300
299
  this, latest_pending_subchannel_list_.get());
301
300
  }
302
- latest_pending_subchannel_list_ = MakeRefCounted<RoundRobinSubchannelList>(
303
- this, std::move(addresses), args.args);
301
+ latest_pending_subchannel_list_ =
302
+ MakeRefCounted<RoundRobinSubchannelList>(this, addresses, args.args);
304
303
  latest_pending_subchannel_list_->StartWatchingLocked(args.args);
305
304
  // If the new list is empty, immediately promote it to
306
305
  // subchannel_list_ and report TRANSIENT_FAILURE.
@@ -405,7 +404,8 @@ void OldRoundRobin::RoundRobinSubchannelList::
405
404
  }
406
405
  p->channel_control_helper()->UpdateState(
407
406
  GRPC_CHANNEL_CONNECTING, absl::Status(),
408
- MakeRefCounted<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
407
+ MakeRefCounted<QueuePicker>(
408
+ p->RefAsSubclass<OldRoundRobin>(DEBUG_LOCATION, "QueuePicker")));
409
409
  } else if (num_transient_failure_ == num_subchannels()) {
410
410
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
411
411
  gpr_log(GPR_INFO,
@@ -524,14 +524,14 @@ class RoundRobin : public LoadBalancingPolicy {
524
524
  class RoundRobinEndpointList : public EndpointList {
525
525
  public:
526
526
  RoundRobinEndpointList(RefCountedPtr<RoundRobin> round_robin,
527
- const EndpointAddressesList& endpoints,
527
+ EndpointAddressesIterator* endpoints,
528
528
  const ChannelArgs& args)
529
529
  : EndpointList(std::move(round_robin),
530
530
  GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)
531
531
  ? "RoundRobinEndpointList"
532
532
  : nullptr) {
533
533
  Init(endpoints, args,
534
- [&](RefCountedPtr<RoundRobinEndpointList> endpoint_list,
534
+ [&](RefCountedPtr<EndpointList> endpoint_list,
535
535
  const EndpointAddresses& addresses, const ChannelArgs& args) {
536
536
  return MakeOrphanable<RoundRobinEndpoint>(
537
537
  std::move(endpoint_list), addresses, args,
@@ -542,7 +542,7 @@ class RoundRobin : public LoadBalancingPolicy {
542
542
  private:
543
543
  class RoundRobinEndpoint : public Endpoint {
544
544
  public:
545
- RoundRobinEndpoint(RefCountedPtr<RoundRobinEndpointList> endpoint_list,
545
+ RoundRobinEndpoint(RefCountedPtr<EndpointList> endpoint_list,
546
546
  const EndpointAddresses& addresses,
547
547
  const ChannelArgs& args,
548
548
  std::shared_ptr<WorkSerializer> work_serializer)
@@ -687,13 +687,12 @@ void RoundRobin::ResetBackoffLocked() {
687
687
  }
688
688
 
689
689
  absl::Status RoundRobin::UpdateLocked(UpdateArgs args) {
690
- EndpointAddressesList addresses;
690
+ EndpointAddressesIterator* addresses = nullptr;
691
691
  if (args.addresses.ok()) {
692
692
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
693
- gpr_log(GPR_INFO, "[RR %p] received update with %" PRIuPTR " endpoints",
694
- this, args.addresses->size());
693
+ gpr_log(GPR_INFO, "[RR %p] received update", this);
695
694
  }
696
- addresses = std::move(*args.addresses);
695
+ addresses = args.addresses->get();
697
696
  } else {
698
697
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
699
698
  gpr_log(GPR_INFO, "[RR %p] received update with address error: %s", this,
@@ -710,8 +709,8 @@ absl::Status RoundRobin::UpdateLocked(UpdateArgs args) {
710
709
  latest_pending_endpoint_list_.get());
711
710
  }
712
711
  latest_pending_endpoint_list_ = MakeOrphanable<RoundRobinEndpointList>(
713
- Ref(DEBUG_LOCATION, "RoundRobinEndpointList"), std::move(addresses),
714
- args.args);
712
+ RefAsSubclass<RoundRobin>(DEBUG_LOCATION, "RoundRobinEndpointList"),
713
+ addresses, args.args);
715
714
  // If the new list is empty, immediately promote it to
716
715
  // endpoint_list_ and report TRANSIENT_FAILURE.
717
716
  if (latest_pending_endpoint_list_->size() == 0) {
@@ -748,15 +747,13 @@ void RoundRobin::RoundRobinEndpointList::RoundRobinEndpoint::OnStateUpdate(
748
747
  auto* rr_endpoint_list = endpoint_list<RoundRobinEndpointList>();
749
748
  auto* round_robin = policy<RoundRobin>();
750
749
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
751
- gpr_log(GPR_INFO,
752
- "[RR %p] connectivity changed for child %p, endpoint_list %p "
753
- "(index %" PRIuPTR " of %" PRIuPTR
754
- "): prev_state=%s new_state=%s "
755
- "(%s)",
756
- round_robin, this, rr_endpoint_list, Index(),
757
- rr_endpoint_list->size(),
758
- (old_state.has_value() ? ConnectivityStateName(*old_state) : "N/A"),
759
- ConnectivityStateName(new_state), status.ToString().c_str());
750
+ gpr_log(
751
+ GPR_INFO,
752
+ "[RR %p] connectivity changed for child %p, endpoint_list %p "
753
+ "(index %" PRIuPTR " of %" PRIuPTR "): prev_state=%s new_state=%s (%s)",
754
+ round_robin, this, rr_endpoint_list, Index(), rr_endpoint_list->size(),
755
+ (old_state.has_value() ? ConnectivityStateName(*old_state) : "N/A"),
756
+ ConnectivityStateName(new_state), status.ToString().c_str());
760
757
  }
761
758
  if (new_state == GRPC_CHANNEL_IDLE) {
762
759
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_round_robin_trace)) {
@@ -42,6 +42,7 @@
42
42
  #include "src/core/lib/iomgr/iomgr_fwd.h"
43
43
  #include "src/core/lib/load_balancing/lb_policy.h"
44
44
  #include "src/core/lib/load_balancing/subchannel_interface.h"
45
+ #include "src/core/lib/resolver/endpoint_addresses.h"
45
46
  #include "src/core/lib/resolver/server_address.h"
46
47
  #include "src/core/lib/transport/connectivity_state.h"
47
48
 
@@ -208,7 +209,7 @@ class SubchannelList : public DualRefCounted<SubchannelListType> {
208
209
 
209
210
  protected:
210
211
  SubchannelList(LoadBalancingPolicy* policy, const char* tracer,
211
- ServerAddressList addresses,
212
+ EndpointAddressesIterator* addresses,
212
213
  LoadBalancingPolicy::ChannelControlHelper* helper,
213
214
  const ChannelArgs& args);
214
215
 
@@ -365,19 +366,18 @@ void SubchannelData<SubchannelListType, SubchannelDataType>::ShutdownLocked() {
365
366
  template <typename SubchannelListType, typename SubchannelDataType>
366
367
  SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
367
368
  LoadBalancingPolicy* policy, const char* tracer,
368
- ServerAddressList addresses,
369
+ EndpointAddressesIterator* addresses,
369
370
  LoadBalancingPolicy::ChannelControlHelper* helper, const ChannelArgs& args)
370
371
  : DualRefCounted<SubchannelListType>(tracer),
371
372
  policy_(policy),
372
373
  tracer_(tracer) {
373
374
  if (GPR_UNLIKELY(tracer_ != nullptr)) {
374
- gpr_log(GPR_INFO,
375
- "[%s %p] Creating subchannel list %p for %" PRIuPTR " subchannels",
376
- tracer_, policy, this, addresses.size());
375
+ gpr_log(GPR_INFO, "[%s %p] Creating subchannel list %p", tracer_, policy,
376
+ this);
377
377
  }
378
- subchannels_.reserve(addresses.size());
378
+ if (addresses == nullptr) return;
379
379
  // Create a subchannel for each address.
380
- for (ServerAddress address : addresses) {
380
+ addresses->ForEach([&](const EndpointAddresses& address) {
381
381
  RefCountedPtr<SubchannelInterface> subchannel =
382
382
  helper->CreateSubchannel(address.address(), address.args(), args);
383
383
  if (subchannel == nullptr) {
@@ -387,7 +387,7 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
387
387
  "[%s %p] could not create subchannel for address %s, ignoring",
388
388
  tracer_, policy_, address.ToString().c_str());
389
389
  }
390
- continue;
390
+ return;
391
391
  }
392
392
  if (GPR_UNLIKELY(tracer_ != nullptr)) {
393
393
  gpr_log(GPR_INFO,
@@ -397,8 +397,8 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
397
397
  address.ToString().c_str());
398
398
  }
399
399
  subchannels_.emplace_back();
400
- subchannels_.back().Init(this, std::move(address), std::move(subchannel));
401
- }
400
+ subchannels_.back().Init(this, address, std::move(subchannel));
401
+ });
402
402
  }
403
403
 
404
404
  template <typename SubchannelListType, typename SubchannelDataType>
@@ -247,14 +247,13 @@ class OldWeightedRoundRobin : public LoadBalancingPolicy {
247
247
  WeightedRoundRobinSubchannelData> {
248
248
  public:
249
249
  WeightedRoundRobinSubchannelList(OldWeightedRoundRobin* policy,
250
- ServerAddressList addresses,
250
+ EndpointAddressesIterator* addresses,
251
251
  const ChannelArgs& args)
252
252
  : SubchannelList(policy,
253
253
  (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)
254
254
  ? "WeightedRoundRobinSubchannelList"
255
255
  : nullptr),
256
- std::move(addresses), policy->channel_control_helper(),
257
- args) {
256
+ addresses, policy->channel_control_helper(), args) {
258
257
  // Need to maintain a ref to the LB policy as long as we maintain
259
258
  // any references to subchannels, since the subchannels'
260
259
  // pollset_sets will include the LB policy's pollset_set.
@@ -611,10 +610,9 @@ void OldWeightedRoundRobin::Picker::BuildSchedulerAndStartTimerLocked() {
611
610
  scheduler_ = std::move(scheduler);
612
611
  }
613
612
  // Start timer.
614
- WeakRefCountedPtr<Picker> self = WeakRef();
615
613
  timer_handle_ = wrr_->channel_control_helper()->GetEventEngine()->RunAfter(
616
614
  config_->weight_update_period(),
617
- [self = std::move(self),
615
+ [self = WeakRefAsSubclass<Picker>(),
618
616
  work_serializer = wrr_->work_serializer()]() mutable {
619
617
  ApplicationCallbackExecCtx callback_exec_ctx;
620
618
  ExecCtx exec_ctx;
@@ -674,12 +672,11 @@ void OldWeightedRoundRobin::ResetBackoffLocked() {
674
672
 
675
673
  absl::Status OldWeightedRoundRobin::UpdateLocked(UpdateArgs args) {
676
674
  global_stats().IncrementWrrUpdates();
677
- config_ = std::move(args.config);
678
- ServerAddressList addresses;
675
+ config_ = args.config.TakeAsSubclass<WeightedRoundRobinConfig>();
676
+ std::shared_ptr<EndpointAddressesIterator> addresses;
679
677
  if (args.addresses.ok()) {
680
678
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
681
- gpr_log(GPR_INFO, "[WRR %p] received update with %" PRIuPTR " addresses",
682
- this, args.addresses->size());
679
+ gpr_log(GPR_INFO, "[WRR %p] received update", this);
683
680
  }
684
681
  // Weed out duplicate addresses. Also sort the addresses so that if
685
682
  // the set of the addresses don't change, their indexes in the
@@ -698,10 +695,12 @@ absl::Status OldWeightedRoundRobin::UpdateLocked(UpdateArgs args) {
698
695
  return memcmp(addr1.addr, addr2.addr, addr1.len) < 0;
699
696
  }
700
697
  };
701
- std::set<ServerAddress, AddressLessThan> ordered_addresses(
702
- args.addresses->begin(), args.addresses->end());
703
- addresses =
704
- ServerAddressList(ordered_addresses.begin(), ordered_addresses.end());
698
+ std::set<ServerAddress, AddressLessThan> ordered_addresses;
699
+ (*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
700
+ ordered_addresses.insert(endpoint);
701
+ });
702
+ addresses = std::make_shared<EndpointAddressesListIterator>(
703
+ ServerAddressList(ordered_addresses.begin(), ordered_addresses.end()));
705
704
  } else {
706
705
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
707
706
  gpr_log(GPR_INFO, "[WRR %p] received update with address error: %s", this,
@@ -718,8 +717,8 @@ absl::Status OldWeightedRoundRobin::UpdateLocked(UpdateArgs args) {
718
717
  this, latest_pending_subchannel_list_.get());
719
718
  }
720
719
  latest_pending_subchannel_list_ =
721
- MakeRefCounted<WeightedRoundRobinSubchannelList>(
722
- this, std::move(addresses), args.args);
720
+ MakeRefCounted<WeightedRoundRobinSubchannelList>(this, addresses.get(),
721
+ args.args);
723
722
  latest_pending_subchannel_list_->StartWatchingLocked(args.args);
724
723
  // If the new list is empty, immediately promote it to
725
724
  // subchannel_list_ and report TRANSIENT_FAILURE.
@@ -757,8 +756,9 @@ OldWeightedRoundRobin::GetOrCreateWeight(const grpc_resolved_address& address) {
757
756
  auto weight = it->second->RefIfNonZero();
758
757
  if (weight != nullptr) return weight;
759
758
  }
760
- auto weight =
761
- MakeRefCounted<AddressWeight>(Ref(DEBUG_LOCATION, "AddressWeight"), *key);
759
+ auto weight = MakeRefCounted<AddressWeight>(
760
+ RefAsSubclass<OldWeightedRoundRobin>(DEBUG_LOCATION, "AddressWeight"),
761
+ *key);
762
762
  address_weight_map_.emplace(*key, weight.get());
763
763
  return weight;
764
764
  }
@@ -833,7 +833,8 @@ void OldWeightedRoundRobin::WeightedRoundRobinSubchannelList::
833
833
  }
834
834
  p->channel_control_helper()->UpdateState(
835
835
  GRPC_CHANNEL_READY, absl::Status(),
836
- MakeRefCounted<Picker>(p->Ref(), this));
836
+ MakeRefCounted<Picker>(p->RefAsSubclass<OldWeightedRoundRobin>(),
837
+ this));
837
838
  } else if (num_connecting_ > 0) {
838
839
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
839
840
  gpr_log(GPR_INFO, "[WRR %p] reporting CONNECTING with subchannel list %p",
@@ -1038,7 +1039,7 @@ class WeightedRoundRobin : public LoadBalancingPolicy {
1038
1039
  public:
1039
1040
  class WrrEndpoint : public Endpoint {
1040
1041
  public:
1041
- WrrEndpoint(RefCountedPtr<WrrEndpointList> endpoint_list,
1042
+ WrrEndpoint(RefCountedPtr<EndpointList> endpoint_list,
1042
1043
  const EndpointAddresses& addresses, const ChannelArgs& args,
1043
1044
  std::shared_ptr<WorkSerializer> work_serializer)
1044
1045
  : Endpoint(std::move(endpoint_list)),
@@ -1079,14 +1080,14 @@ class WeightedRoundRobin : public LoadBalancingPolicy {
1079
1080
  };
1080
1081
 
1081
1082
  WrrEndpointList(RefCountedPtr<WeightedRoundRobin> wrr,
1082
- const EndpointAddressesList& endpoints,
1083
+ EndpointAddressesIterator* endpoints,
1083
1084
  const ChannelArgs& args)
1084
1085
  : EndpointList(std::move(wrr),
1085
1086
  GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)
1086
1087
  ? "WrrEndpointList"
1087
1088
  : nullptr) {
1088
1089
  Init(endpoints, args,
1089
- [&](RefCountedPtr<WrrEndpointList> endpoint_list,
1090
+ [&](RefCountedPtr<EndpointList> endpoint_list,
1090
1091
  const EndpointAddresses& addresses, const ChannelArgs& args) {
1091
1092
  return MakeOrphanable<WrrEndpoint>(
1092
1093
  std::move(endpoint_list), addresses, args,
@@ -1452,10 +1453,9 @@ void WeightedRoundRobin::Picker::BuildSchedulerAndStartTimerLocked() {
1452
1453
  gpr_log(GPR_INFO, "[WRR %p picker %p] scheduling timer for %s", wrr_.get(),
1453
1454
  this, config_->weight_update_period().ToString().c_str());
1454
1455
  }
1455
- WeakRefCountedPtr<Picker> self = WeakRef();
1456
1456
  timer_handle_ = wrr_->channel_control_helper()->GetEventEngine()->RunAfter(
1457
1457
  config_->weight_update_period(),
1458
- [self = std::move(self),
1458
+ [self = WeakRefAsSubclass<Picker>(),
1459
1459
  work_serializer = wrr_->work_serializer()]() mutable {
1460
1460
  ApplicationCallbackExecCtx callback_exec_ctx;
1461
1461
  ExecCtx exec_ctx;
@@ -1515,12 +1515,11 @@ void WeightedRoundRobin::ResetBackoffLocked() {
1515
1515
 
1516
1516
  absl::Status WeightedRoundRobin::UpdateLocked(UpdateArgs args) {
1517
1517
  global_stats().IncrementWrrUpdates();
1518
- config_ = std::move(args.config);
1519
- EndpointAddressesList addresses;
1518
+ config_ = args.config.TakeAsSubclass<WeightedRoundRobinConfig>();
1519
+ std::shared_ptr<EndpointAddressesIterator> addresses;
1520
1520
  if (args.addresses.ok()) {
1521
1521
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
1522
- gpr_log(GPR_INFO, "[WRR %p] received update with %" PRIuPTR " addresses",
1523
- this, args.addresses->size());
1522
+ gpr_log(GPR_INFO, "[WRR %p] received update", this);
1524
1523
  }
1525
1524
  // Weed out duplicate endpoints. Also sort the endpoints so that if
1526
1525
  // the set of endpoints doesn't change, their indexes in the endpoint
@@ -1539,10 +1538,13 @@ absl::Status WeightedRoundRobin::UpdateLocked(UpdateArgs args) {
1539
1538
  return e1 < e2;
1540
1539
  }
1541
1540
  };
1542
- std::set<EndpointAddresses, EndpointAddressesLessThan> ordered_addresses(
1543
- args.addresses->begin(), args.addresses->end());
1544
- addresses = EndpointAddressesList(ordered_addresses.begin(),
1545
- ordered_addresses.end());
1541
+ std::set<EndpointAddresses, EndpointAddressesLessThan> ordered_addresses;
1542
+ (*args.addresses)->ForEach([&](const EndpointAddresses& endpoint) {
1543
+ ordered_addresses.insert(endpoint);
1544
+ });
1545
+ addresses =
1546
+ std::make_shared<EndpointAddressesListIterator>(EndpointAddressesList(
1547
+ ordered_addresses.begin(), ordered_addresses.end()));
1546
1548
  } else {
1547
1549
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
1548
1550
  gpr_log(GPR_INFO, "[WRR %p] received update with address error: %s", this,
@@ -1558,8 +1560,8 @@ absl::Status WeightedRoundRobin::UpdateLocked(UpdateArgs args) {
1558
1560
  gpr_log(GPR_INFO, "[WRR %p] replacing previous pending endpoint list %p",
1559
1561
  this, latest_pending_endpoint_list_.get());
1560
1562
  }
1561
- latest_pending_endpoint_list_ =
1562
- MakeOrphanable<WrrEndpointList>(Ref(), std::move(addresses), args.args);
1563
+ latest_pending_endpoint_list_ = MakeOrphanable<WrrEndpointList>(
1564
+ RefAsSubclass<WeightedRoundRobin>(), addresses.get(), args.args);
1563
1565
  // If the new list is empty, immediately promote it to
1564
1566
  // endpoint_list_ and report TRANSIENT_FAILURE.
1565
1567
  if (latest_pending_endpoint_list_->size() == 0) {
@@ -1597,7 +1599,7 @@ WeightedRoundRobin::GetOrCreateWeight(
1597
1599
  if (weight != nullptr) return weight;
1598
1600
  }
1599
1601
  auto weight = MakeRefCounted<EndpointWeight>(
1600
- Ref(DEBUG_LOCATION, "EndpointWeight"), key);
1602
+ RefAsSubclass<WeightedRoundRobin>(DEBUG_LOCATION, "EndpointWeight"), key);
1601
1603
  endpoint_weight_map_.emplace(key, weight.get());
1602
1604
  return weight;
1603
1605
  }
@@ -1757,7 +1759,7 @@ void WeightedRoundRobin::WrrEndpointList::
1757
1759
  }
1758
1760
  wrr->channel_control_helper()->UpdateState(
1759
1761
  GRPC_CHANNEL_READY, absl::Status(),
1760
- MakeRefCounted<Picker>(wrr->Ref(), this));
1762
+ MakeRefCounted<Picker>(wrr->RefAsSubclass<WeightedRoundRobin>(), this));
1761
1763
  } else if (num_connecting_ > 0) {
1762
1764
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_wrr_trace)) {
1763
1765
  gpr_log(GPR_INFO, "[WRR %p] reporting CONNECTING with endpoint list %p",
@@ -157,10 +157,10 @@ class WeightedTargetLb : public LoadBalancingPolicy {
157
157
 
158
158
  void Orphan() override;
159
159
 
160
- absl::Status UpdateLocked(const WeightedTargetLbConfig::ChildConfig& config,
161
- absl::StatusOr<EndpointAddressesList> addresses,
162
- const std::string& resolution_note,
163
- const ChannelArgs& args);
160
+ absl::Status UpdateLocked(
161
+ const WeightedTargetLbConfig::ChildConfig& config,
162
+ absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
163
+ const std::string& resolution_note, const ChannelArgs& args);
164
164
  void ResetBackoffLocked();
165
165
  void DeactivateLocked();
166
166
 
@@ -316,7 +316,7 @@ absl::Status WeightedTargetLb::UpdateLocked(UpdateArgs args) {
316
316
  }
317
317
  update_in_progress_ = true;
318
318
  // Update config.
319
- config_ = std::move(args.config);
319
+ config_ = args.config.TakeAsSubclass<WeightedTargetLbConfig>();
320
320
  // Deactivate the targets not in the new config.
321
321
  for (const auto& p : targets_) {
322
322
  const std::string& name = p.first;
@@ -336,13 +336,15 @@ absl::Status WeightedTargetLb::UpdateLocked(UpdateArgs args) {
336
336
  // Create child if it does not already exist.
337
337
  if (target == nullptr) {
338
338
  target = MakeOrphanable<WeightedChild>(
339
- Ref(DEBUG_LOCATION, "WeightedChild"), name);
339
+ RefAsSubclass<WeightedTargetLb>(DEBUG_LOCATION, "WeightedChild"),
340
+ name);
340
341
  }
341
- absl::StatusOr<EndpointAddressesList> addresses;
342
+ absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses;
342
343
  if (address_map.ok()) {
343
344
  auto it = address_map->find(name);
344
345
  if (it == address_map->end()) {
345
- addresses.emplace();
346
+ addresses = std::make_shared<EndpointAddressesListIterator>(
347
+ EndpointAddressesList());
346
348
  } else {
347
349
  addresses = std::move(it->second);
348
350
  }
@@ -589,7 +591,7 @@ WeightedTargetLb::WeightedChild::CreateChildPolicyLocked(
589
591
 
590
592
  absl::Status WeightedTargetLb::WeightedChild::UpdateLocked(
591
593
  const WeightedTargetLbConfig::ChildConfig& config,
592
- absl::StatusOr<EndpointAddressesList> addresses,
594
+ absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses,
593
595
  const std::string& resolution_note, const ChannelArgs& args) {
594
596
  if (weighted_target_policy_->shutting_down_) return absl::OkStatus();
595
597
  // Update child weight.