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
@@ -16,8 +16,6 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
- #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
20
-
21
19
  #include <stdint.h>
22
20
  #include <string.h>
23
21
 
@@ -53,6 +51,9 @@
53
51
  #include "src/core/ext/filters/client_channel/client_channel_internal.h"
54
52
  #include "src/core/ext/filters/client_channel/config_selector.h"
55
53
  #include "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h"
54
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h"
55
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver_attributes.h"
56
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h"
56
57
  #include "src/core/ext/xds/xds_bootstrap.h"
57
58
  #include "src/core/ext/xds/xds_bootstrap_grpc.h"
58
59
  #include "src/core/ext/xds/xds_client_grpc.h"
@@ -95,8 +96,6 @@
95
96
 
96
97
  namespace grpc_core {
97
98
 
98
- TraceFlag grpc_xds_resolver_trace(false, "xds_resolver");
99
-
100
99
  namespace {
101
100
 
102
101
  //
@@ -136,79 +135,22 @@ class XdsResolver : public Resolver {
136
135
  }
137
136
 
138
137
  private:
139
- class ListenerWatcher : public XdsListenerResourceType::WatcherInterface {
138
+ class XdsWatcher : public XdsDependencyManager::Watcher {
140
139
  public:
141
- explicit ListenerWatcher(RefCountedPtr<XdsResolver> resolver)
140
+ explicit XdsWatcher(RefCountedPtr<XdsResolver> resolver)
142
141
  : resolver_(std::move(resolver)) {}
143
- void OnResourceChanged(
144
- std::shared_ptr<const XdsListenerResource> listener) override {
145
- RefCountedPtr<ListenerWatcher> self = Ref();
146
- resolver_->work_serializer_->Run(
147
- [self = std::move(self), listener = std::move(listener)]() mutable {
148
- self->resolver_->OnListenerUpdate(std::move(listener));
149
- },
150
- DEBUG_LOCATION);
151
- }
152
- void OnError(absl::Status status) override {
153
- RefCountedPtr<ListenerWatcher> self = Ref();
154
- resolver_->work_serializer_->Run(
155
- [self = std::move(self), status = std::move(status)]() mutable {
156
- self->resolver_->OnError(self->resolver_->lds_resource_name_,
157
- std::move(status));
158
- },
159
- DEBUG_LOCATION);
160
- }
161
- void OnResourceDoesNotExist() override {
162
- RefCountedPtr<ListenerWatcher> self = Ref();
163
- resolver_->work_serializer_->Run(
164
- [self = std::move(self)]() {
165
- self->resolver_->OnResourceDoesNotExist(
166
- absl::StrCat(self->resolver_->lds_resource_name_,
167
- ": xDS listener resource does not exist"));
168
- },
169
- DEBUG_LOCATION);
170
- }
171
-
172
- private:
173
- RefCountedPtr<XdsResolver> resolver_;
174
- };
175
142
 
176
- class RouteConfigWatcher
177
- : public XdsRouteConfigResourceType::WatcherInterface {
178
- public:
179
- explicit RouteConfigWatcher(RefCountedPtr<XdsResolver> resolver)
180
- : resolver_(std::move(resolver)) {}
181
- void OnResourceChanged(
182
- std::shared_ptr<const XdsRouteConfigResource> route_config) override {
183
- RefCountedPtr<RouteConfigWatcher> self = Ref();
184
- resolver_->work_serializer_->Run(
185
- [self = std::move(self),
186
- route_config = std::move(route_config)]() mutable {
187
- if (self != self->resolver_->route_config_watcher_) return;
188
- self->resolver_->OnRouteConfigUpdate(std::move(route_config));
189
- },
190
- DEBUG_LOCATION);
143
+ void OnUpdate(
144
+ RefCountedPtr<const XdsDependencyManager::XdsConfig> config) override {
145
+ resolver_->OnUpdate(std::move(config));
191
146
  }
192
- void OnError(absl::Status status) override {
193
- RefCountedPtr<RouteConfigWatcher> self = Ref();
194
- resolver_->work_serializer_->Run(
195
- [self = std::move(self), status = std::move(status)]() mutable {
196
- if (self != self->resolver_->route_config_watcher_) return;
197
- self->resolver_->OnError(self->resolver_->route_config_name_,
198
- std::move(status));
199
- },
200
- DEBUG_LOCATION);
147
+
148
+ void OnError(absl::string_view context, absl::Status status) override {
149
+ resolver_->OnError(context, std::move(status));
201
150
  }
202
- void OnResourceDoesNotExist() override {
203
- RefCountedPtr<RouteConfigWatcher> self = Ref();
204
- resolver_->work_serializer_->Run(
205
- [self = std::move(self)]() {
206
- if (self != self->resolver_->route_config_watcher_) return;
207
- self->resolver_->OnResourceDoesNotExist(absl::StrCat(
208
- self->resolver_->route_config_name_,
209
- ": xDS route configuration resource does not exist"));
210
- },
211
- DEBUG_LOCATION);
151
+
152
+ void OnResourceDoesNotExist(std::string context) override {
153
+ resolver_->OnResourceDoesNotExist(std::move(context));
212
154
  }
213
155
 
214
156
  private:
@@ -224,8 +166,12 @@ class XdsResolver : public Resolver {
224
166
  class ClusterRef : public DualRefCounted<ClusterRef> {
225
167
  public:
226
168
  ClusterRef(RefCountedPtr<XdsResolver> resolver,
227
- absl::string_view cluster_name)
228
- : resolver_(std::move(resolver)), cluster_name_(cluster_name) {}
169
+ RefCountedPtr<XdsDependencyManager::ClusterSubscription>
170
+ cluster_subscription,
171
+ absl::string_view cluster_key)
172
+ : resolver_(std::move(resolver)),
173
+ cluster_subscription_(std::move(cluster_subscription)),
174
+ cluster_key_(cluster_key) {}
229
175
 
230
176
  void Orphan() override {
231
177
  XdsResolver* resolver_ptr = resolver_.get();
@@ -234,13 +180,16 @@ class XdsResolver : public Resolver {
234
180
  resolver->MaybeRemoveUnusedClusters();
235
181
  },
236
182
  DEBUG_LOCATION);
183
+ cluster_subscription_.reset();
237
184
  }
238
185
 
239
- const std::string& cluster_name() const { return cluster_name_; }
186
+ const std::string& cluster_key() const { return cluster_key_; }
240
187
 
241
188
  private:
242
189
  RefCountedPtr<XdsResolver> resolver_;
243
- std::string cluster_name_;
190
+ RefCountedPtr<XdsDependencyManager::ClusterSubscription>
191
+ cluster_subscription_;
192
+ std::string cluster_key_;
244
193
  };
245
194
 
246
195
  // A routing data including cluster refs and routes table held by the
@@ -277,9 +226,7 @@ class XdsResolver : public Resolver {
277
226
  };
278
227
 
279
228
  static absl::StatusOr<RefCountedPtr<RouteConfigData>> Create(
280
- XdsResolver* resolver,
281
- const std::vector<XdsRouteConfigResource::Route>& routes,
282
- const Duration& default_max_stream_duration);
229
+ XdsResolver* resolver, const Duration& default_max_stream_duration);
283
230
 
284
231
  bool operator==(const RouteConfigData& other) const {
285
232
  return clusters_ == other.clusters_ && routes_ == other.routes_;
@@ -311,9 +258,9 @@ class XdsResolver : public Resolver {
311
258
  return sc1->json_string() == sc2->json_string();
312
259
  }
313
260
 
314
- absl::Status AddRouteEntry(const XdsRouteConfigResource::Route& route,
315
- const Duration& default_max_stream_duration,
316
- XdsResolver* resolver);
261
+ absl::Status AddRouteEntry(XdsResolver* resolver,
262
+ const XdsRouteConfigResource::Route& route,
263
+ const Duration& default_max_stream_duration);
317
264
 
318
265
  std::map<absl::string_view, RefCountedPtr<ClusterRef>> clusters_;
319
266
  std::vector<RouteEntry> routes_;
@@ -365,7 +312,8 @@ class XdsResolver : public Resolver {
365
312
  RouteConfigData::RouteEntry* route_;
366
313
  };
367
314
 
368
- class ClusterSelectionFilter : public ChannelFilter {
315
+ class ClusterSelectionFilter
316
+ : public ImplementChannelFilter<ClusterSelectionFilter> {
369
317
  public:
370
318
  const static grpc_channel_filter kFilter;
371
319
 
@@ -375,8 +323,15 @@ class XdsResolver : public Resolver {
375
323
  }
376
324
 
377
325
  // Construct a promise for one call.
378
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
379
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
326
+ class Call {
327
+ public:
328
+ void OnClientInitialMetadata(ClientMetadata& md);
329
+ static const NoInterceptor OnServerInitialMetadata;
330
+ static const NoInterceptor OnServerTrailingMetadata;
331
+ static const NoInterceptor OnClientToServerMessage;
332
+ static const NoInterceptor OnServerToClientMessage;
333
+ static const NoInterceptor OnFinalize;
334
+ };
380
335
 
381
336
  private:
382
337
  explicit ClusterSelectionFilter(ChannelFilter::Args filter_args)
@@ -386,26 +341,31 @@ class XdsResolver : public Resolver {
386
341
  };
387
342
 
388
343
  RefCountedPtr<ClusterRef> GetOrCreateClusterRef(
389
- absl::string_view cluster_name) {
390
- auto it = cluster_ref_map_.find(cluster_name);
344
+ absl::string_view cluster_key, absl::string_view cluster_name) {
345
+ auto it = cluster_ref_map_.find(cluster_key);
391
346
  if (it == cluster_ref_map_.end()) {
392
- auto cluster = MakeRefCounted<ClusterRef>(Ref(), cluster_name);
393
- cluster_ref_map_.emplace(cluster->cluster_name(), cluster->WeakRef());
347
+ RefCountedPtr<XdsDependencyManager::ClusterSubscription> subscription;
348
+ if (!cluster_name.empty()) {
349
+ // The cluster ref will hold a subscription to ensure that the
350
+ // XdsDependencyManager stays subscribed to the CDS resource as
351
+ // long as the cluster ref exists.
352
+ subscription = dependency_mgr_->GetClusterSubscription(cluster_name);
353
+ }
354
+ auto cluster = MakeRefCounted<ClusterRef>(
355
+ RefAsSubclass<XdsResolver>(), std::move(subscription), cluster_key);
356
+ cluster_ref_map_.emplace(cluster->cluster_key(), cluster->WeakRef());
394
357
  return cluster;
395
358
  }
396
359
  return it->second->Ref();
397
360
  }
398
361
 
399
- void OnListenerUpdate(std::shared_ptr<const XdsListenerResource> listener);
400
- void OnRouteConfigUpdate(
401
- std::shared_ptr<const XdsRouteConfigResource> rds_update);
362
+ void OnUpdate(RefCountedPtr<const XdsDependencyManager::XdsConfig> config);
402
363
  void OnError(absl::string_view context, absl::Status status);
403
364
  void OnResourceDoesNotExist(std::string context);
404
365
 
405
366
  absl::StatusOr<RefCountedPtr<ServiceConfig>> CreateServiceConfig();
406
367
  void GenerateResult();
407
368
  void MaybeRemoveUnusedClusters();
408
- uint64_t channel_id() const { return channel_id_; }
409
369
 
410
370
  std::shared_ptr<WorkSerializer> work_serializer_;
411
371
  std::unique_ptr<ResultHandler> result_handler_;
@@ -415,20 +375,23 @@ class XdsResolver : public Resolver {
415
375
  RefCountedPtr<GrpcXdsClient> xds_client_;
416
376
  std::string lds_resource_name_;
417
377
  std::string data_plane_authority_;
418
- uint64_t channel_id_;
419
-
420
- ListenerWatcher* listener_watcher_ = nullptr;
421
- std::shared_ptr<const XdsListenerResource> current_listener_;
422
-
423
- std::string route_config_name_;
424
- RouteConfigWatcher* route_config_watcher_ = nullptr;
425
- std::shared_ptr<const XdsRouteConfigResource> current_route_config_;
426
-
427
- const XdsRouteConfigResource::VirtualHost* current_virtual_host_ = nullptr;
378
+ const uint64_t channel_id_;
428
379
 
380
+ OrphanablePtr<XdsDependencyManager> dependency_mgr_;
381
+ RefCountedPtr<const XdsDependencyManager::XdsConfig> current_config_;
429
382
  std::map<absl::string_view, WeakRefCountedPtr<ClusterRef>> cluster_ref_map_;
430
383
  };
431
384
 
385
+ const NoInterceptor
386
+ XdsResolver::ClusterSelectionFilter::Call::OnServerInitialMetadata;
387
+ const NoInterceptor
388
+ XdsResolver::ClusterSelectionFilter::Call::OnServerTrailingMetadata;
389
+ const NoInterceptor
390
+ XdsResolver::ClusterSelectionFilter::Call::OnClientToServerMessage;
391
+ const NoInterceptor
392
+ XdsResolver::ClusterSelectionFilter::Call::OnServerToClientMessage;
393
+ const NoInterceptor XdsResolver::ClusterSelectionFilter::Call::OnFinalize;
394
+
432
395
  //
433
396
  // XdsResolver::RouteConfigData::RouteListIterator
434
397
  //
@@ -458,19 +421,17 @@ class XdsResolver::RouteConfigData::RouteListIterator
458
421
 
459
422
  absl::StatusOr<RefCountedPtr<XdsResolver::RouteConfigData>>
460
423
  XdsResolver::RouteConfigData::Create(
461
- XdsResolver* resolver,
462
- const std::vector<XdsRouteConfigResource::Route>& routes,
463
- const Duration& default_max_stream_duration) {
424
+ XdsResolver* resolver, const Duration& default_max_stream_duration) {
464
425
  auto data = MakeRefCounted<RouteConfigData>();
465
426
  // Reserve the necessary entries up-front to avoid reallocation as we add
466
427
  // elements. This is necessary because the string_view in the entry's
467
428
  // weighted_cluster_state field points to the memory in the route field, so
468
429
  // moving the entry in a reallocation will cause the string_view to point to
469
430
  // invalid data.
470
- data->routes_.reserve(routes.size());
471
- for (auto& route : routes) {
431
+ data->routes_.reserve(resolver->current_config_->virtual_host->routes.size());
432
+ for (auto& route : resolver->current_config_->virtual_host->routes) {
472
433
  absl::Status status =
473
- data->AddRouteEntry(route, default_max_stream_duration, resolver);
434
+ data->AddRouteEntry(resolver, route, default_max_stream_duration);
474
435
  if (!status.ok()) {
475
436
  return status;
476
437
  }
@@ -543,12 +504,12 @@ XdsResolver::RouteConfigData::CreateMethodConfig(
543
504
  }
544
505
  // Handle xDS HTTP filters.
545
506
  const auto& hcm = absl::get<XdsListenerResource::HttpConnectionManager>(
546
- resolver->current_listener_->listener);
507
+ resolver->current_config_->listener->listener);
547
508
  auto result = XdsRouting::GeneratePerHTTPFilterConfigs(
548
509
  static_cast<const GrpcXdsBootstrap&>(resolver->xds_client_->bootstrap())
549
510
  .http_filter_registry(),
550
- hcm.http_filters, *resolver->current_virtual_host_, route, cluster_weight,
551
- resolver->args_);
511
+ hcm.http_filters, *resolver->current_config_->virtual_host, route,
512
+ cluster_weight, resolver->args_);
552
513
  if (!result.ok()) return result.status();
553
514
  for (const auto& p : result->per_filter_configs) {
554
515
  fields.emplace_back(absl::StrCat(" \"", p.first, "\": [\n",
@@ -573,19 +534,21 @@ XdsResolver::RouteConfigData::CreateMethodConfig(
573
534
  }
574
535
 
575
536
  absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
576
- const XdsRouteConfigResource::Route& route,
577
- const Duration& default_max_stream_duration, XdsResolver* resolver) {
537
+ XdsResolver* resolver, const XdsRouteConfigResource::Route& route,
538
+ const Duration& default_max_stream_duration) {
578
539
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
579
540
  gpr_log(GPR_INFO, "[xds_resolver %p] XdsConfigSelector %p: route: %s",
580
541
  resolver, this, route.ToString().c_str());
581
542
  }
582
543
  routes_.emplace_back(route);
583
544
  auto* route_entry = &routes_.back();
584
- auto maybe_add_cluster = [&](absl::string_view cluster_name) {
585
- if (clusters_.find(cluster_name) != clusters_.end()) return;
586
- auto cluster_state = resolver->GetOrCreateClusterRef(cluster_name);
587
- absl::string_view name = cluster_state->cluster_name();
588
- clusters_.emplace(name, std::move(cluster_state));
545
+ auto maybe_add_cluster = [&](absl::string_view cluster_key,
546
+ absl::string_view cluster_name) {
547
+ if (clusters_.find(cluster_key) != clusters_.end()) return;
548
+ auto cluster_state =
549
+ resolver->GetOrCreateClusterRef(cluster_key, cluster_name);
550
+ absl::string_view key = cluster_state->cluster_key();
551
+ clusters_.emplace(key, std::move(cluster_state));
589
552
  };
590
553
  auto* route_action = absl::get_if<XdsRouteConfigResource::Route::RouteAction>(
591
554
  &route_entry->route.action);
@@ -606,8 +569,8 @@ absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
606
569
  return result.status();
607
570
  }
608
571
  route_entry->method_config = std::move(*result);
609
- maybe_add_cluster(
610
- absl::StrCat("cluster:", cluster_name.cluster_name));
572
+ maybe_add_cluster(absl::StrCat("cluster:", cluster_name.cluster_name),
573
+ cluster_name.cluster_name);
611
574
  return absl::OkStatus();
612
575
  },
613
576
  // WeightedClusters
@@ -628,7 +591,8 @@ absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
628
591
  cluster_weight_state.cluster = weighted_cluster.name;
629
592
  route_entry->weighted_cluster_state.push_back(
630
593
  std::move(cluster_weight_state));
631
- maybe_add_cluster(absl::StrCat("cluster:", weighted_cluster.name));
594
+ maybe_add_cluster(absl::StrCat("cluster:", weighted_cluster.name),
595
+ weighted_cluster.name);
632
596
  }
633
597
  return absl::OkStatus();
634
598
  },
@@ -641,9 +605,11 @@ absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
641
605
  return result.status();
642
606
  }
643
607
  route_entry->method_config = std::move(*result);
644
- maybe_add_cluster(absl::StrCat(
645
- "cluster_specifier_plugin:",
646
- cluster_specifier_plugin_name.cluster_specifier_plugin_name));
608
+ maybe_add_cluster(
609
+ absl::StrCat(
610
+ "cluster_specifier_plugin:",
611
+ cluster_specifier_plugin_name.cluster_specifier_plugin_name),
612
+ /*subscription_name=*/"");
647
613
  return absl::OkStatus();
648
614
  });
649
615
  if (!status.ok()) {
@@ -671,7 +637,7 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
671
637
  static_cast<const GrpcXdsBootstrap&>(resolver_->xds_client_->bootstrap())
672
638
  .http_filter_registry();
673
639
  const auto& hcm = absl::get<XdsListenerResource::HttpConnectionManager>(
674
- resolver_->current_listener_->listener);
640
+ resolver_->current_config_->listener->listener);
675
641
  for (const auto& http_filter : hcm.http_filters) {
676
642
  // Find filter. This is guaranteed to succeed, because it's checked
677
643
  // at config validation time in the XdsApi code.
@@ -802,7 +768,7 @@ absl::Status XdsResolver::XdsConfigSelector::GetCallConfig(
802
768
  },
803
769
  [&](const XdsRouteConfigResource::Route::RouteAction::HashPolicy::
804
770
  ChannelId&) -> absl::optional<uint64_t> {
805
- return resolver_->channel_id();
771
+ return resolver_->channel_id_;
806
772
  });
807
773
  if (new_hash.has_value()) {
808
774
  // Rotating the old value prevents duplicate hash rules from cancelling
@@ -828,7 +794,7 @@ absl::Status XdsResolver::XdsConfigSelector::GetCallConfig(
828
794
  parsed_method_configs);
829
795
  }
830
796
  args.service_config_call_data->SetCallAttribute(
831
- args.arena->New<XdsClusterAttribute>(cluster->cluster_name()));
797
+ args.arena->New<XdsClusterAttribute>(cluster->cluster_key()));
832
798
  args.service_config_call_data->SetCallAttribute(
833
799
  args.arena->New<RequestHashAttribute>(*hash));
834
800
  args.service_config_call_data->SetCallAttribute(
@@ -887,9 +853,8 @@ const grpc_channel_filter XdsResolver::ClusterSelectionFilter::kFilter =
887
853
  kFilterExaminesServerInitialMetadata>(
888
854
  "cluster_selection_filter");
889
855
 
890
- ArenaPromise<ServerMetadataHandle>
891
- XdsResolver::ClusterSelectionFilter::MakeCallPromise(
892
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
856
+ void XdsResolver::ClusterSelectionFilter::Call::OnClientInitialMetadata(
857
+ ClientMetadata&) {
893
858
  auto* service_config_call_data =
894
859
  static_cast<ClientChannelServiceConfigCallData*>(
895
860
  GetContext<grpc_call_context_element>()
@@ -908,7 +873,6 @@ XdsResolver::ClusterSelectionFilter::MakeCallPromise(
908
873
  [cluster = std::move(cluster)]() mutable { cluster.reset(); });
909
874
  }
910
875
  }
911
- return next_promise_factory(std::move(call_args));
912
876
  }
913
877
 
914
878
  //
@@ -932,6 +896,9 @@ void XdsResolver::StartLocked() {
932
896
  return;
933
897
  }
934
898
  xds_client_ = std::move(*xds_client);
899
+ grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
900
+ interested_parties_);
901
+ // Determine LDS resource name.
935
902
  std::string resource_name_fragment(absl::StripPrefix(uri_.path(), "/"));
936
903
  if (!uri_.authority().empty()) {
937
904
  // target_uri.authority is set case
@@ -977,13 +944,11 @@ void XdsResolver::StartLocked() {
977
944
  gpr_log(GPR_INFO, "[xds_resolver %p] Started with lds_resource_name %s.",
978
945
  this, lds_resource_name_.c_str());
979
946
  }
980
- grpc_pollset_set_add_pollset_set(
981
- static_cast<GrpcXdsClient*>(xds_client_.get())->interested_parties(),
982
- interested_parties_);
983
- auto watcher = MakeRefCounted<ListenerWatcher>(Ref());
984
- listener_watcher_ = watcher.get();
985
- XdsListenerResourceType::StartWatch(xds_client_.get(), lds_resource_name_,
986
- std::move(watcher));
947
+ // Start watch for xDS config.
948
+ dependency_mgr_ = MakeOrphanable<XdsDependencyManager>(
949
+ xds_client_, work_serializer_,
950
+ std::make_unique<XdsWatcher>(RefAsSubclass<XdsResolver>()),
951
+ data_plane_authority_, lds_resource_name_, args_, interested_parties_);
987
952
  }
988
953
 
989
954
  void XdsResolver::ShutdownLocked() {
@@ -991,121 +956,20 @@ void XdsResolver::ShutdownLocked() {
991
956
  gpr_log(GPR_INFO, "[xds_resolver %p] shutting down", this);
992
957
  }
993
958
  if (xds_client_ != nullptr) {
994
- if (listener_watcher_ != nullptr) {
995
- XdsListenerResourceType::CancelWatch(
996
- xds_client_.get(), lds_resource_name_, listener_watcher_,
997
- /*delay_unsubscription=*/false);
998
- }
999
- if (route_config_watcher_ != nullptr) {
1000
- XdsRouteConfigResourceType::CancelWatch(
1001
- xds_client_.get(), route_config_name_, route_config_watcher_,
1002
- /*delay_unsubscription=*/false);
1003
- }
1004
- grpc_pollset_set_del_pollset_set(
1005
- static_cast<GrpcXdsClient*>(xds_client_.get())->interested_parties(),
1006
- interested_parties_);
959
+ dependency_mgr_.reset();
960
+ grpc_pollset_set_del_pollset_set(xds_client_->interested_parties(),
961
+ interested_parties_);
1007
962
  xds_client_.reset(DEBUG_LOCATION, "xds resolver");
1008
963
  }
1009
964
  }
1010
965
 
1011
- void XdsResolver::OnListenerUpdate(
1012
- std::shared_ptr<const XdsListenerResource> listener) {
966
+ void XdsResolver::OnUpdate(
967
+ RefCountedPtr<const XdsDependencyManager::XdsConfig> config) {
1013
968
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
1014
- gpr_log(GPR_INFO, "[xds_resolver %p] received updated listener data", this);
969
+ gpr_log(GPR_INFO, "[xds_resolver %p] received updated xDS config", this);
1015
970
  }
1016
971
  if (xds_client_ == nullptr) return;
1017
- const auto* hcm = absl::get_if<XdsListenerResource::HttpConnectionManager>(
1018
- &listener->listener);
1019
- if (hcm == nullptr) {
1020
- return OnError(lds_resource_name_,
1021
- absl::UnavailableError("not an API listener"));
1022
- }
1023
- current_listener_ = std::move(listener);
1024
- Match(
1025
- hcm->route_config,
1026
- // RDS resource name
1027
- [&](const std::string& rds_name) {
1028
- // If the RDS name changed, update the RDS watcher.
1029
- // Note that this will be true on the initial update, because
1030
- // route_config_name_ will be empty.
1031
- if (route_config_name_ != rds_name) {
1032
- // If we already had a watch (i.e., if the previous config had
1033
- // a different RDS name), stop the previous watch.
1034
- // There will be no previous watch if either (a) this is the
1035
- // initial resource update or (b) the previous Listener had an
1036
- // inlined RouteConfig.
1037
- if (route_config_watcher_ != nullptr) {
1038
- XdsRouteConfigResourceType::CancelWatch(
1039
- xds_client_.get(), route_config_name_, route_config_watcher_,
1040
- /*delay_unsubscription=*/true);
1041
- route_config_watcher_ = nullptr;
1042
- }
1043
- // Start watch for the new RDS resource name.
1044
- route_config_name_ = rds_name;
1045
- auto watcher = MakeRefCounted<RouteConfigWatcher>(Ref());
1046
- route_config_watcher_ = watcher.get();
1047
- XdsRouteConfigResourceType::StartWatch(
1048
- xds_client_.get(), route_config_name_, std::move(watcher));
1049
- } else {
1050
- // RDS resource name has not changed, so no watch needs to be
1051
- // updated, but we still need to propagate any changes in the
1052
- // HCM config (e.g., the list of HTTP filters).
1053
- GenerateResult();
1054
- }
1055
- },
1056
- // inlined RouteConfig
1057
- [&](const std::shared_ptr<const XdsRouteConfigResource>& route_config) {
1058
- // If the previous update specified an RDS resource instead of
1059
- // having an inlined RouteConfig, we need to cancel the RDS watch.
1060
- if (route_config_watcher_ != nullptr) {
1061
- XdsRouteConfigResourceType::CancelWatch(
1062
- xds_client_.get(), route_config_name_, route_config_watcher_);
1063
- route_config_watcher_ = nullptr;
1064
- route_config_name_.clear();
1065
- }
1066
- OnRouteConfigUpdate(route_config);
1067
- });
1068
- }
1069
-
1070
- class VirtualHostListIterator : public XdsRouting::VirtualHostListIterator {
1071
- public:
1072
- explicit VirtualHostListIterator(
1073
- const std::vector<XdsRouteConfigResource::VirtualHost>* virtual_hosts)
1074
- : virtual_hosts_(virtual_hosts) {}
1075
-
1076
- size_t Size() const override { return virtual_hosts_->size(); }
1077
-
1078
- const std::vector<std::string>& GetDomainsForVirtualHost(
1079
- size_t index) const override {
1080
- return (*virtual_hosts_)[index].domains;
1081
- }
1082
-
1083
- private:
1084
- const std::vector<XdsRouteConfigResource::VirtualHost>* virtual_hosts_;
1085
- };
1086
-
1087
- void XdsResolver::OnRouteConfigUpdate(
1088
- std::shared_ptr<const XdsRouteConfigResource> rds_update) {
1089
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
1090
- gpr_log(GPR_INFO, "[xds_resolver %p] received updated route config", this);
1091
- }
1092
- if (xds_client_ == nullptr) return;
1093
- // Find the relevant VirtualHost from the RouteConfiguration.
1094
- auto vhost_index = XdsRouting::FindVirtualHostForDomain(
1095
- VirtualHostListIterator(&rds_update->virtual_hosts),
1096
- data_plane_authority_);
1097
- if (!vhost_index.has_value()) {
1098
- OnError(
1099
- route_config_name_.empty() ? lds_resource_name_ : route_config_name_,
1100
- absl::UnavailableError(absl::StrCat("could not find VirtualHost for ",
1101
- data_plane_authority_,
1102
- " in RouteConfiguration")));
1103
- return;
1104
- }
1105
- // Save the virtual host in the resolver.
1106
- current_route_config_ = std::move(rds_update);
1107
- current_virtual_host_ = &current_route_config_->virtual_hosts[*vhost_index];
1108
- // Send a new result to the channel.
972
+ current_config_ = std::move(config);
1109
973
  GenerateResult();
1110
974
  }
1111
975
 
@@ -1118,11 +982,8 @@ void XdsResolver::OnError(absl::string_view context, absl::Status status) {
1118
982
  Result result;
1119
983
  result.addresses = status;
1120
984
  result.service_config = std::move(status);
1121
- // Need to explicitly convert to the right RefCountedPtr<> type for
1122
- // use with ChannelArgs::SetObject().
1123
- RefCountedPtr<GrpcXdsClient> xds_client =
1124
- xds_client_->Ref(DEBUG_LOCATION, "xds resolver result");
1125
- result.args = args_.SetObject(std::move(xds_client));
985
+ result.args =
986
+ args_.SetObject(xds_client_.Ref(DEBUG_LOCATION, "xds resolver result"));
1126
987
  result_handler_->ReportResult(std::move(result));
1127
988
  }
1128
989
 
@@ -1132,7 +993,7 @@ void XdsResolver::OnResourceDoesNotExist(std::string context) {
1132
993
  "update and returning empty service config",
1133
994
  this);
1134
995
  if (xds_client_ == nullptr) return;
1135
- current_virtual_host_ = nullptr;
996
+ current_config_.reset();
1136
997
  Result result;
1137
998
  result.addresses.emplace();
1138
999
  result.service_config = ServiceConfigImpl::Create(args_, "{}");
@@ -1153,7 +1014,7 @@ XdsResolver::CreateServiceConfig() {
1153
1014
  " \"childPolicy\": %s\n"
1154
1015
  " }",
1155
1016
  cluster.first,
1156
- current_route_config_->cluster_specifier_plugin_map.at(
1017
+ current_config_->route_config->cluster_specifier_plugin_map.at(
1157
1018
  std::string(child_name))));
1158
1019
  } else {
1159
1020
  absl::ConsumePrefix(&child_name, "cluster:");
@@ -1185,20 +1046,21 @@ XdsResolver::CreateServiceConfig() {
1185
1046
  }
1186
1047
 
1187
1048
  void XdsResolver::GenerateResult() {
1188
- if (current_virtual_host_ == nullptr) return;
1049
+ if (xds_client_ == nullptr || current_config_ == nullptr) return;
1189
1050
  // First create XdsConfigSelector, which may add new entries to the cluster
1190
- // state map, and then CreateServiceConfig for LB policies.
1051
+ // state map.
1191
1052
  const auto& hcm = absl::get<XdsListenerResource::HttpConnectionManager>(
1192
- current_listener_->listener);
1193
- auto route_config_data = RouteConfigData::Create(
1194
- this, current_virtual_host_->routes, hcm.http_max_stream_duration);
1053
+ current_config_->listener->listener);
1054
+ auto route_config_data =
1055
+ RouteConfigData::Create(this, hcm.http_max_stream_duration);
1195
1056
  if (!route_config_data.ok()) {
1196
1057
  OnError("could not create ConfigSelector",
1197
1058
  absl::UnavailableError(route_config_data.status().message()));
1198
1059
  return;
1199
1060
  }
1200
- auto config_selector =
1201
- MakeRefCounted<XdsConfigSelector>(Ref(), std::move(*route_config_data));
1061
+ auto config_selector = MakeRefCounted<XdsConfigSelector>(
1062
+ RefAsSubclass<XdsResolver>(), std::move(*route_config_data));
1063
+ // Now create the service config.
1202
1064
  Result result;
1203
1065
  result.addresses.emplace();
1204
1066
  result.service_config = CreateServiceConfig();
@@ -1208,12 +1070,11 @@ void XdsResolver::GenerateResult() {
1208
1070
  ? std::string((*result.service_config)->json_string()).c_str()
1209
1071
  : result.service_config.status().ToString().c_str());
1210
1072
  }
1211
- // Need to explicitly convert to the right RefCountedPtr<> type for
1212
- // use with ChannelArgs::SetObject().
1213
- RefCountedPtr<GrpcXdsClient> xds_client =
1214
- xds_client_->Ref(DEBUG_LOCATION, "xds resolver result");
1215
1073
  result.args =
1216
- args_.SetObject(std::move(xds_client)).SetObject(config_selector);
1074
+ args_.SetObject(xds_client_.Ref(DEBUG_LOCATION, "xds resolver result"))
1075
+ .SetObject(config_selector)
1076
+ .SetObject(current_config_)
1077
+ .SetObject(dependency_mgr_->Ref());
1217
1078
  result_handler_->ReportResult(std::move(result));
1218
1079
  }
1219
1080
 
@@ -1228,10 +1089,7 @@ void XdsResolver::MaybeRemoveUnusedClusters() {
1228
1089
  it = cluster_ref_map_.erase(it);
1229
1090
  }
1230
1091
  }
1231
- if (update_needed && xds_client_ != nullptr) {
1232
- // Send a new result to the channel.
1233
- GenerateResult();
1234
- }
1092
+ if (update_needed) GenerateResult();
1235
1093
  }
1236
1094
 
1237
1095
  //