grpc 1.60.0.pre1 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (277) 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 +67 -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/http2_settings.cc +122 -32
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  94. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  95. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  96. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  97. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  98. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  99. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  101. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  102. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  103. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  104. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  105. data/src/core/ext/xds/xds_api.cc +31 -18
  106. data/src/core/ext/xds/xds_api.h +2 -2
  107. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  108. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  109. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  110. data/src/core/ext/xds/xds_client.cc +420 -414
  111. data/src/core/ext/xds/xds_client.h +31 -22
  112. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  113. data/src/core/ext/xds/xds_cluster.cc +104 -11
  114. data/src/core/ext/xds/xds_cluster.h +9 -1
  115. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  116. data/src/core/ext/xds/xds_common_types.cc +14 -10
  117. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  118. data/src/core/ext/xds/xds_endpoint.h +5 -1
  119. data/src/core/ext/xds/xds_health_status.cc +12 -2
  120. data/src/core/ext/xds/xds_health_status.h +4 -2
  121. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  122. data/src/core/ext/xds/xds_listener.cc +14 -8
  123. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  124. data/src/core/ext/xds/xds_route_config.cc +34 -22
  125. data/src/core/ext/xds/xds_route_config.h +1 -0
  126. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  127. data/src/core/ext/xds/xds_transport.h +3 -0
  128. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  129. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  130. data/src/core/lib/channel/call_tracer.cc +12 -0
  131. data/src/core/lib/channel/call_tracer.h +17 -3
  132. data/src/core/lib/channel/channel_args.cc +24 -14
  133. data/src/core/lib/channel/channel_args.h +74 -13
  134. data/src/core/lib/channel/channel_stack.cc +27 -0
  135. data/src/core/lib/channel/channel_stack.h +10 -10
  136. data/src/core/lib/channel/connected_channel.cc +64 -18
  137. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  138. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  139. data/src/core/lib/compression/compression_internal.cc +0 -3
  140. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  141. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  142. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  143. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  144. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  146. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  147. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  148. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  149. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  150. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  151. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  152. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  153. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  154. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  155. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  156. data/src/core/lib/experiments/config.cc +13 -0
  157. data/src/core/lib/experiments/config.h +3 -0
  158. data/src/core/lib/experiments/experiments.cc +245 -366
  159. data/src/core/lib/experiments/experiments.h +50 -156
  160. data/src/core/lib/gprpp/debug_location.h +13 -0
  161. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  162. data/src/core/lib/gprpp/orphanable.h +27 -0
  163. data/src/core/lib/gprpp/ref_counted.h +63 -22
  164. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  165. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  166. data/src/core/lib/gprpp/status_helper.cc +1 -2
  167. data/src/core/lib/iomgr/combiner.cc +15 -51
  168. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  169. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  170. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  171. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  172. data/src/core/lib/promise/activity.cc +17 -2
  173. data/src/core/lib/promise/activity.h +5 -4
  174. data/src/core/lib/promise/all_ok.h +80 -0
  175. data/src/core/lib/promise/detail/join_state.h +2077 -0
  176. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  177. data/src/core/lib/promise/detail/promise_like.h +8 -1
  178. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  179. data/src/core/lib/promise/detail/status.h +42 -5
  180. data/src/core/lib/promise/for_each.h +13 -1
  181. data/src/core/lib/promise/if.h +4 -0
  182. data/src/core/lib/promise/latch.h +6 -3
  183. data/src/core/lib/promise/party.cc +33 -31
  184. data/src/core/lib/promise/party.h +142 -6
  185. data/src/core/lib/promise/poll.h +39 -13
  186. data/src/core/lib/promise/promise.h +4 -0
  187. data/src/core/lib/promise/seq.h +107 -7
  188. data/src/core/lib/promise/status_flag.h +196 -0
  189. data/src/core/lib/promise/try_join.h +132 -0
  190. data/src/core/lib/promise/try_seq.h +132 -10
  191. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  192. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  193. data/src/core/lib/resource_quota/arena.h +2 -2
  194. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  195. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  196. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  197. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  198. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  199. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  200. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  201. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  203. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  207. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  208. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  209. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  210. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  211. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  212. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  213. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  214. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  215. data/src/core/lib/security/transport/auth_filters.h +71 -4
  216. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  217. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  218. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  219. data/src/core/lib/slice/slice_buffer.h +3 -0
  220. data/src/core/lib/surface/builtins.cc +1 -1
  221. data/src/core/lib/surface/call.cc +683 -196
  222. data/src/core/lib/surface/call.h +26 -13
  223. data/src/core/lib/surface/call_trace.cc +42 -1
  224. data/src/core/lib/surface/channel.cc +0 -1
  225. data/src/core/lib/surface/channel.h +0 -6
  226. data/src/core/lib/surface/channel_init.h +26 -0
  227. data/src/core/lib/surface/init.cc +14 -8
  228. data/src/core/lib/surface/server.cc +256 -237
  229. data/src/core/lib/surface/server.h +26 -54
  230. data/src/core/lib/surface/version.cc +2 -2
  231. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  232. data/src/core/lib/transport/call_final_info.cc +38 -0
  233. data/src/core/lib/transport/call_final_info.h +54 -0
  234. data/src/core/lib/transport/connectivity_state.cc +3 -2
  235. data/src/core/lib/transport/connectivity_state.h +4 -0
  236. data/src/core/lib/transport/metadata_batch.h +4 -4
  237. data/src/core/lib/transport/transport.cc +70 -19
  238. data/src/core/lib/transport/transport.h +395 -25
  239. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  240. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  241. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  242. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  243. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  244. data/src/core/tsi/ssl_transport_security.cc +65 -43
  245. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  246. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  247. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  248. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  249. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  250. data/src/ruby/lib/grpc/version.rb +1 -1
  251. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  252. data/third_party/zlib/adler32.c +5 -27
  253. data/third_party/zlib/compress.c +5 -16
  254. data/third_party/zlib/crc32.c +86 -162
  255. data/third_party/zlib/deflate.c +233 -336
  256. data/third_party/zlib/deflate.h +8 -8
  257. data/third_party/zlib/gzguts.h +11 -12
  258. data/third_party/zlib/infback.c +7 -23
  259. data/third_party/zlib/inffast.c +1 -4
  260. data/third_party/zlib/inffast.h +1 -1
  261. data/third_party/zlib/inflate.c +30 -99
  262. data/third_party/zlib/inftrees.c +6 -11
  263. data/third_party/zlib/inftrees.h +3 -3
  264. data/third_party/zlib/trees.c +224 -302
  265. data/third_party/zlib/uncompr.c +4 -12
  266. data/third_party/zlib/zconf.h +6 -2
  267. data/third_party/zlib/zlib.h +191 -188
  268. data/third_party/zlib/zutil.c +16 -44
  269. data/third_party/zlib/zutil.h +10 -10
  270. metadata +37 -15
  271. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  272. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  273. data/src/core/lib/transport/pid_controller.cc +0 -51
  274. data/src/core/lib/transport/pid_controller.h +0 -116
  275. data/third_party/upb/upb/collections/array.h +0 -17
  276. data/third_party/upb/upb/collections/map.h +0 -17
  277. 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
  //