grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -0,0 +1,277 @@
1
+ //
2
+ // Copyright 2019 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_XDS_XDS_DEPENDENCY_MANAGER_H
18
+ #define GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_XDS_XDS_DEPENDENCY_MANAGER_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include "absl/container/flat_hash_map.h"
23
+ #include "absl/container/flat_hash_set.h"
24
+ #include "absl/strings/string_view.h"
25
+
26
+ #include "src/core/ext/xds/xds_client_grpc.h"
27
+ #include "src/core/ext/xds/xds_cluster.h"
28
+ #include "src/core/ext/xds/xds_endpoint.h"
29
+ #include "src/core/ext/xds/xds_listener.h"
30
+ #include "src/core/ext/xds/xds_route_config.h"
31
+ #include "src/core/lib/gprpp/ref_counted.h"
32
+ #include "src/core/lib/resolver/resolver.h"
33
+
34
+ namespace grpc_core {
35
+
36
+ // Watches all xDS resources and handles dependencies between them.
37
+ // Reports updates only when all necessary resources have been obtained.
38
+ class XdsDependencyManager : public RefCounted<XdsDependencyManager>,
39
+ public Orphanable {
40
+ public:
41
+ struct XdsConfig : public RefCounted<XdsConfig> {
42
+ // Listener resource. Always non-null.
43
+ std::shared_ptr<const XdsListenerResource> listener;
44
+ // RouteConfig resource. Will be populated even if RouteConfig is
45
+ // inlined into the Listener resource.
46
+ std::shared_ptr<const XdsRouteConfigResource> route_config;
47
+ // Virtual host. Points into route_config. Will always be non-null.
48
+ const XdsRouteConfigResource::VirtualHost* virtual_host;
49
+
50
+ struct ClusterConfig {
51
+ // Cluster resource. Always non-null.
52
+ std::shared_ptr<const XdsClusterResource> cluster;
53
+ // Endpoint info for EDS and LOGICAL_DNS clusters. If there was an
54
+ // error, endpoints will be null and resolution_note will be set.
55
+ struct EndpointConfig {
56
+ std::shared_ptr<const XdsEndpointResource> endpoints;
57
+ std::string resolution_note;
58
+
59
+ EndpointConfig(std::shared_ptr<const XdsEndpointResource> endpoints,
60
+ std::string resolution_note)
61
+ : endpoints(std::move(endpoints)),
62
+ resolution_note(std::move(resolution_note)) {}
63
+ bool operator==(const EndpointConfig& other) const {
64
+ return endpoints == other.endpoints &&
65
+ resolution_note == other.resolution_note;
66
+ }
67
+ };
68
+ // The list of leaf clusters for an aggregate cluster.
69
+ struct AggregateConfig {
70
+ std::vector<absl::string_view> leaf_clusters;
71
+
72
+ explicit AggregateConfig(std::vector<absl::string_view> leaf_clusters)
73
+ : leaf_clusters(std::move(leaf_clusters)) {}
74
+ bool operator==(const AggregateConfig& other) const {
75
+ return leaf_clusters == other.leaf_clusters;
76
+ }
77
+ };
78
+ absl::variant<EndpointConfig, AggregateConfig> children;
79
+
80
+ // Ctor for leaf clusters.
81
+ ClusterConfig(std::shared_ptr<const XdsClusterResource> cluster,
82
+ std::shared_ptr<const XdsEndpointResource> endpoints,
83
+ std::string resolution_note);
84
+ // Ctor for aggregate clusters.
85
+ ClusterConfig(std::shared_ptr<const XdsClusterResource> cluster,
86
+ std::vector<absl::string_view> leaf_clusters);
87
+
88
+ bool operator==(const ClusterConfig& other) const {
89
+ return cluster == other.cluster && children == other.children;
90
+ }
91
+ };
92
+ // Cluster map. A cluster will have a non-OK status if either
93
+ // (a) there was an error and we did not already have a valid
94
+ // resource or (b) the resource does not exist.
95
+ absl::flat_hash_map<std::string, absl::StatusOr<ClusterConfig>> clusters;
96
+
97
+ std::string ToString() const;
98
+
99
+ static absl::string_view ChannelArgName() {
100
+ return GRPC_ARG_NO_SUBCHANNEL_PREFIX "xds_config";
101
+ }
102
+ static int ChannelArgsCompare(const XdsConfig* a, const XdsConfig* b) {
103
+ return QsortCompare(a, b);
104
+ }
105
+ static constexpr bool ChannelArgUseConstPtr() { return true; }
106
+ };
107
+
108
+ class Watcher {
109
+ public:
110
+ virtual ~Watcher() = default;
111
+
112
+ virtual void OnUpdate(RefCountedPtr<const XdsConfig> config) = 0;
113
+
114
+ // These methods are invoked when there is an error or
115
+ // does-not-exist on LDS or RDS only.
116
+ virtual void OnError(absl::string_view context, absl::Status status) = 0;
117
+ virtual void OnResourceDoesNotExist(std::string context) = 0;
118
+ };
119
+
120
+ class ClusterSubscription : public DualRefCounted<ClusterSubscription> {
121
+ public:
122
+ ClusterSubscription(absl::string_view cluster_name,
123
+ RefCountedPtr<XdsDependencyManager> dependency_mgr)
124
+ : cluster_name_(cluster_name),
125
+ dependency_mgr_(std::move(dependency_mgr)) {}
126
+
127
+ void Orphan() override;
128
+
129
+ absl::string_view cluster_name() const { return cluster_name_; }
130
+
131
+ private:
132
+ std::string cluster_name_;
133
+ RefCountedPtr<XdsDependencyManager> dependency_mgr_;
134
+ };
135
+
136
+ XdsDependencyManager(RefCountedPtr<GrpcXdsClient> xds_client,
137
+ std::shared_ptr<WorkSerializer> work_serializer,
138
+ std::unique_ptr<Watcher> watcher,
139
+ std::string data_plane_authority,
140
+ std::string listener_resource_name, ChannelArgs args,
141
+ grpc_pollset_set* interested_parties);
142
+
143
+ void Orphan() override;
144
+
145
+ // Gets an external cluster subscription. This allows us to include
146
+ // clusters in the config that are referenced by something other than
147
+ // the route config (e.g., RLS). The cluster will be included in the
148
+ // config as long as the returned object is still referenced.
149
+ RefCountedPtr<ClusterSubscription> GetClusterSubscription(
150
+ absl::string_view cluster_name);
151
+
152
+ static absl::string_view ChannelArgName() {
153
+ return GRPC_ARG_NO_SUBCHANNEL_PREFIX "xds_dependency_manager";
154
+ }
155
+ static int ChannelArgsCompare(const XdsDependencyManager* a,
156
+ const XdsDependencyManager* b) {
157
+ return QsortCompare(a, b);
158
+ }
159
+
160
+ private:
161
+ class ListenerWatcher;
162
+ class RouteConfigWatcher;
163
+ class ClusterWatcher;
164
+ class EndpointWatcher;
165
+
166
+ class DnsResultHandler;
167
+
168
+ struct ClusterWatcherState {
169
+ // Pointer to watcher, to be used when cancelling.
170
+ // Not owned, so do not dereference.
171
+ ClusterWatcher* watcher = nullptr;
172
+ // Most recent update obtained from this watcher.
173
+ absl::StatusOr<std::shared_ptr<const XdsClusterResource>> update = nullptr;
174
+ };
175
+
176
+ struct EndpointConfig {
177
+ // If there was an error, update will be null and resolution_note
178
+ // will be non-empty.
179
+ std::shared_ptr<const XdsEndpointResource> endpoints;
180
+ std::string resolution_note;
181
+ };
182
+
183
+ struct EndpointWatcherState {
184
+ // Pointer to watcher, to be used when cancelling.
185
+ // Not owned, so do not dereference.
186
+ EndpointWatcher* watcher = nullptr;
187
+ // Most recent update obtained from this watcher.
188
+ EndpointConfig update;
189
+ };
190
+
191
+ struct DnsState {
192
+ OrphanablePtr<Resolver> resolver;
193
+ // Most recent result from the resolver.
194
+ EndpointConfig update;
195
+ };
196
+
197
+ // Event handlers.
198
+ void OnListenerUpdate(std::shared_ptr<const XdsListenerResource> listener);
199
+ void OnRouteConfigUpdate(
200
+ const std::string& name,
201
+ std::shared_ptr<const XdsRouteConfigResource> route_config);
202
+ void OnError(std::string context, absl::Status status);
203
+ void OnResourceDoesNotExist(std::string context);
204
+
205
+ void OnClusterUpdate(const std::string& name,
206
+ std::shared_ptr<const XdsClusterResource> cluster);
207
+ void OnClusterError(const std::string& name, absl::Status status);
208
+ void OnClusterDoesNotExist(const std::string& name);
209
+
210
+ void OnEndpointUpdate(const std::string& name,
211
+ std::shared_ptr<const XdsEndpointResource> endpoint);
212
+ void OnEndpointError(const std::string& name, absl::Status status);
213
+ void OnEndpointDoesNotExist(const std::string& name);
214
+
215
+ void OnDnsResult(const std::string& dns_name, Resolver::Result result);
216
+ void PopulateDnsUpdate(const std::string& dns_name, Resolver::Result result,
217
+ DnsState* dns_state);
218
+
219
+ // Starts CDS and EDS/DNS watches for the specified cluster if needed.
220
+ // Adds an entry to cluster_config_map, which will contain the cluster
221
+ // data if the data is available.
222
+ // For each EDS cluster, adds the EDS resource to eds_resources_seen.
223
+ // For each Logical DNS cluster, adds the DNS hostname to dns_names_seen.
224
+ // For aggregate clusters, calls itself recursively. If leaf_clusters is
225
+ // non-null, populates it with a list of leaf clusters, or an error if
226
+ // max depth is exceeded.
227
+ // Returns true if all resources have been obtained.
228
+ bool PopulateClusterConfigMap(
229
+ absl::string_view name, int depth,
230
+ absl::flat_hash_map<std::string,
231
+ absl::StatusOr<XdsConfig::ClusterConfig>>*
232
+ cluster_config_map,
233
+ std::set<absl::string_view>* eds_resources_seen,
234
+ std::set<absl::string_view>* dns_names_seen,
235
+ absl::StatusOr<std::vector<absl::string_view>>* leaf_clusters = nullptr);
236
+
237
+ // Called when an external cluster subscription is unreffed.
238
+ void OnClusterSubscriptionUnref(absl::string_view cluster_name,
239
+ ClusterSubscription* subscription);
240
+
241
+ // Checks whether all necessary resources have been obtained, and if
242
+ // so reports an update to the watcher.
243
+ void MaybeReportUpdate();
244
+
245
+ // Parameters passed into ctor.
246
+ RefCountedPtr<GrpcXdsClient> xds_client_;
247
+ std::shared_ptr<WorkSerializer> work_serializer_;
248
+ std::unique_ptr<Watcher> watcher_;
249
+ const std::string data_plane_authority_;
250
+ const std::string listener_resource_name_;
251
+ ChannelArgs args_;
252
+ grpc_pollset_set* interested_parties_;
253
+
254
+ // Listener state.
255
+ ListenerWatcher* listener_watcher_ = nullptr;
256
+ std::shared_ptr<const XdsListenerResource> current_listener_;
257
+ std::string route_config_name_;
258
+
259
+ // RouteConfig state.
260
+ RouteConfigWatcher* route_config_watcher_ = nullptr;
261
+ std::shared_ptr<const XdsRouteConfigResource> current_route_config_;
262
+ const XdsRouteConfigResource::VirtualHost* current_virtual_host_ = nullptr;
263
+ absl::flat_hash_set<absl::string_view> clusters_from_route_config_;
264
+
265
+ // Cluster state.
266
+ absl::flat_hash_map<std::string, ClusterWatcherState> cluster_watchers_;
267
+ absl::flat_hash_map<absl::string_view, WeakRefCountedPtr<ClusterSubscription>>
268
+ cluster_subscriptions_;
269
+
270
+ // Endpoint state.
271
+ absl::flat_hash_map<std::string, EndpointWatcherState> endpoint_watchers_;
272
+ absl::flat_hash_map<std::string, DnsState> dns_resolvers_;
273
+ };
274
+
275
+ } // namespace grpc_core
276
+
277
+ #endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_XDS_XDS_DEPENDENCY_MANAGER_H