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
@@ -56,6 +56,11 @@ extern TraceFlag grpc_xds_client_refcount_trace;
56
56
 
57
57
  class XdsClient : public DualRefCounted<XdsClient> {
58
58
  public:
59
+ class ReadDelayHandle : public RefCounted<ReadDelayHandle> {
60
+ public:
61
+ static RefCountedPtr<ReadDelayHandle> NoWait() { return nullptr; }
62
+ };
63
+
59
64
  // Resource watcher interface. Implemented by callers.
60
65
  // Note: Most callers will not use this API directly but rather via a
61
66
  // resource-type-specific wrapper API provided by the relevant
@@ -63,11 +68,14 @@ class XdsClient : public DualRefCounted<XdsClient> {
63
68
  class ResourceWatcherInterface : public RefCounted<ResourceWatcherInterface> {
64
69
  public:
65
70
  virtual void OnGenericResourceChanged(
66
- std::shared_ptr<const XdsResourceType::ResourceData> resource)
71
+ std::shared_ptr<const XdsResourceType::ResourceData> resource,
72
+ RefCountedPtr<ReadDelayHandle> read_delay_handle)
67
73
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
68
- virtual void OnError(absl::Status status)
74
+ virtual void OnError(absl::Status status,
75
+ RefCountedPtr<ReadDelayHandle> read_delay_handle)
69
76
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
70
- virtual void OnResourceDoesNotExist()
77
+ virtual void OnResourceDoesNotExist(
78
+ RefCountedPtr<ReadDelayHandle> read_delay_handle)
71
79
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
72
80
  };
73
81
 
@@ -171,23 +179,23 @@ class XdsClient : public DualRefCounted<XdsClient> {
171
179
 
172
180
  // Contains a channel to the xds server and all the data related to the
173
181
  // channel. Holds a ref to the xds client object.
174
- class ChannelState : public DualRefCounted<ChannelState> {
182
+ class XdsChannel : public DualRefCounted<XdsChannel> {
175
183
  public:
176
184
  template <typename T>
177
185
  class RetryableCall;
178
186
 
179
- class AdsCallState;
180
- class LrsCallState;
187
+ class AdsCall;
188
+ class LrsCall;
181
189
 
182
- ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
183
- const XdsBootstrap::XdsServer& server);
184
- ~ChannelState() override;
190
+ XdsChannel(WeakRefCountedPtr<XdsClient> xds_client,
191
+ const XdsBootstrap::XdsServer& server);
192
+ ~XdsChannel() override;
185
193
 
186
194
  void Orphan() override;
187
195
 
188
196
  XdsClient* xds_client() const { return xds_client_.get(); }
189
- AdsCallState* ads_calld() const;
190
- LrsCallState* lrs_calld() const;
197
+ AdsCall* ads_call() const;
198
+ LrsCall* lrs_call() const;
191
199
 
192
200
  void ResetBackoff();
193
201
 
@@ -223,9 +231,9 @@ class XdsClient : public DualRefCounted<XdsClient> {
223
231
 
224
232
  bool shutting_down_ = false;
225
233
 
226
- // The retryable XDS calls.
227
- OrphanablePtr<RetryableCall<AdsCallState>> ads_calld_;
228
- OrphanablePtr<RetryableCall<LrsCallState>> lrs_calld_;
234
+ // The retryable ADS and LRS calls.
235
+ OrphanablePtr<RetryableCall<AdsCall>> ads_call_;
236
+ OrphanablePtr<RetryableCall<LrsCall>> lrs_call_;
229
237
 
230
238
  // Stores the most recent accepted resource version for each resource type.
231
239
  std::map<const XdsResourceType*, std::string /*version*/>
@@ -244,7 +252,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
244
252
  };
245
253
 
246
254
  struct AuthorityState {
247
- RefCountedPtr<ChannelState> channel_state;
255
+ RefCountedPtr<XdsChannel> xds_channel;
248
256
  std::map<const XdsResourceType*, std::map<XdsResourceKey, ResourceState>>
249
257
  resource_map;
250
258
  };
@@ -269,7 +277,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
269
277
  LoadReportState>;
270
278
 
271
279
  struct LoadReportServer {
272
- RefCountedPtr<ChannelState> channel_state;
280
+ RefCountedPtr<XdsChannel> xds_channel;
273
281
  LoadReportMap load_report_map;
274
282
  };
275
283
 
@@ -277,11 +285,12 @@ class XdsClient : public DualRefCounted<XdsClient> {
277
285
  void NotifyWatchersOnErrorLocked(
278
286
  const std::map<ResourceWatcherInterface*,
279
287
  RefCountedPtr<ResourceWatcherInterface>>& watchers,
280
- absl::Status status);
288
+ absl::Status status, RefCountedPtr<ReadDelayHandle> read_delay_handle);
281
289
  // Sends a resource-does-not-exist notification to a specific set of watchers.
282
290
  void NotifyWatchersOnResourceDoesNotExist(
283
291
  const std::map<ResourceWatcherInterface*,
284
- RefCountedPtr<ResourceWatcherInterface>>& watchers);
292
+ RefCountedPtr<ResourceWatcherInterface>>& watchers,
293
+ RefCountedPtr<ReadDelayHandle> read_delay_handle);
285
294
 
286
295
  void MaybeRegisterResourceTypeLocked(const XdsResourceType* resource_type)
287
296
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
@@ -300,7 +309,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
300
309
  const XdsBootstrap::XdsServer& xds_server, bool send_all_clusters,
301
310
  const std::set<std::string>& clusters) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
302
311
 
303
- RefCountedPtr<ChannelState> GetOrCreateChannelStateLocked(
312
+ RefCountedPtr<XdsChannel> GetOrCreateXdsChannelLocked(
304
313
  const XdsBootstrap::XdsServer& server, const char* reason)
305
314
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
306
315
 
@@ -317,12 +326,12 @@ class XdsClient : public DualRefCounted<XdsClient> {
317
326
  // Stores resource type objects seen by type URL.
318
327
  std::map<absl::string_view /*resource_type*/, const XdsResourceType*>
319
328
  resource_types_ ABSL_GUARDED_BY(mu_);
320
- upb::SymbolTable symtab_ ABSL_GUARDED_BY(mu_);
329
+ upb::DefPool def_pool_ ABSL_GUARDED_BY(mu_);
321
330
 
322
331
  // Map of existing xDS server channels.
323
332
  // Key is owned by the bootstrap config.
324
- std::map<const XdsBootstrap::XdsServer*, ChannelState*>
325
- xds_server_channel_map_ ABSL_GUARDED_BY(mu_);
333
+ std::map<const XdsBootstrap::XdsServer*, XdsChannel*> xds_server_channel_map_
334
+ ABSL_GUARDED_BY(mu_);
326
335
 
327
336
  std::map<std::string /*authority*/, AuthorityState> authority_state_map_
328
337
  ABSL_GUARDED_BY(mu_);
@@ -155,7 +155,9 @@ absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
155
155
  MutexLock lock(g_mu);
156
156
  if (g_xds_client != nullptr) {
157
157
  auto xds_client = g_xds_client->RefIfNonZero(DEBUG_LOCATION, reason);
158
- if (xds_client != nullptr) return xds_client;
158
+ if (xds_client != nullptr) {
159
+ return xds_client.TakeAsSubclass<GrpcXdsClient>();
160
+ }
159
161
  }
160
162
  // Find bootstrap contents.
161
163
  auto bootstrap_contents = GetBootstrapContents(g_fallback_bootstrap_config);
@@ -38,13 +38,17 @@
38
38
  #include "envoy/config/core/v3/address.upb.h"
39
39
  #include "envoy/config/core/v3/base.upb.h"
40
40
  #include "envoy/config/core/v3/config_source.upb.h"
41
+ #include "envoy/config/core/v3/extension.upb.h"
41
42
  #include "envoy/config/core/v3/health_check.upb.h"
43
+ #include "envoy/config/core/v3/protocol.upb.h"
42
44
  #include "envoy/config/endpoint/v3/endpoint.upb.h"
43
45
  #include "envoy/config/endpoint/v3/endpoint_components.upb.h"
44
46
  #include "envoy/extensions/clusters/aggregate/v3/cluster.upb.h"
45
47
  #include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
48
+ #include "envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h"
46
49
  #include "google/protobuf/any.upb.h"
47
50
  #include "google/protobuf/duration.upb.h"
51
+ #include "google/protobuf/struct.upb.h"
48
52
  #include "google/protobuf/wrappers.upb.h"
49
53
  #include "upb/base/string_view.h"
50
54
  #include "upb/text/encode.h"
@@ -105,17 +109,14 @@ std::string XdsClusterResource::ToString() const {
105
109
  contents.push_back(
106
110
  absl::StrCat("common_tls_context=", common_tls_context.ToString()));
107
111
  }
112
+ if (connection_idle_timeout != Duration::Zero()) {
113
+ contents.push_back(absl::StrCat("connection_idle_timeout=",
114
+ connection_idle_timeout.ToString()));
115
+ }
108
116
  contents.push_back(
109
117
  absl::StrCat("max_concurrent_requests=", max_concurrent_requests));
110
- if (!override_host_statuses.empty()) {
111
- std::vector<const char*> statuses;
112
- statuses.reserve(override_host_statuses.size());
113
- for (const auto& status : override_host_statuses) {
114
- statuses.push_back(status.ToString());
115
- }
116
- contents.push_back(absl::StrCat("override_host_statuses={",
117
- absl::StrJoin(statuses, ", "), "}"));
118
- }
118
+ contents.push_back(absl::StrCat("override_host_statuses=",
119
+ override_host_statuses.ToString()));
119
120
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
120
121
  }
121
122
 
@@ -407,6 +408,50 @@ void ParseLbPolicyConfig(const XdsResourceType::DecodeContext& context,
407
408
  }
408
409
  }
409
410
 
411
+ void ParseUpstreamConfig(
412
+ const XdsResourceType::DecodeContext& context,
413
+ const envoy_config_core_v3_TypedExtensionConfig* upstream_config,
414
+ XdsClusterResource* cds_update, ValidationErrors* errors) {
415
+ ValidationErrors::ScopedField field(errors, ".typed_config");
416
+ const auto* typed_config =
417
+ envoy_config_core_v3_TypedExtensionConfig_typed_config(upstream_config);
418
+ auto extension = ExtractXdsExtension(context, typed_config, errors);
419
+ if (!extension.has_value()) return;
420
+ if (extension->type !=
421
+ "envoy.extensions.upstreams.http.v3.HttpProtocolOptions") {
422
+ ValidationErrors::ScopedField field(errors, ".type_url");
423
+ errors->AddError("unsupported upstream config type");
424
+ return;
425
+ }
426
+ absl::string_view* serialized_http_protocol_options =
427
+ absl::get_if<absl::string_view>(&extension->value);
428
+ if (serialized_http_protocol_options == nullptr) {
429
+ errors->AddError("can't decode HttpProtocolOptions");
430
+ return;
431
+ }
432
+ const auto* http_protocol_options =
433
+ envoy_extensions_upstreams_http_v3_HttpProtocolOptions_parse(
434
+ serialized_http_protocol_options->data(),
435
+ serialized_http_protocol_options->size(), context.arena);
436
+ if (http_protocol_options == nullptr) {
437
+ errors->AddError("can't decode HttpProtocolOptions");
438
+ return;
439
+ }
440
+ ValidationErrors::ScopedField field2(errors, ".common_http_protocol_options");
441
+ const auto* common_http_protocol_options =
442
+ envoy_extensions_upstreams_http_v3_HttpProtocolOptions_common_http_protocol_options(
443
+ http_protocol_options);
444
+ if (common_http_protocol_options != nullptr) {
445
+ const auto* idle_timeout =
446
+ envoy_config_core_v3_HttpProtocolOptions_idle_timeout(
447
+ common_http_protocol_options);
448
+ if (idle_timeout != nullptr) {
449
+ ValidationErrors::ScopedField field(errors, ".idle_timeout");
450
+ cds_update->connection_idle_timeout = ParseDuration(idle_timeout, errors);
451
+ }
452
+ }
453
+ }
454
+
410
455
  absl::StatusOr<std::shared_ptr<const XdsClusterResource>> CdsResourceParse(
411
456
  const XdsResourceType::DecodeContext& context,
412
457
  const envoy_config_cluster_v3_Cluster* cluster) {
@@ -474,6 +519,13 @@ absl::StatusOr<std::shared_ptr<const XdsClusterResource>> CdsResourceParse(
474
519
  cds_update->lrs_load_reporting_server.emplace(
475
520
  static_cast<const GrpcXdsBootstrap::GrpcXdsServer&>(context.server));
476
521
  }
522
+ // Protocol options.
523
+ auto* upstream_config =
524
+ envoy_config_cluster_v3_Cluster_upstream_config(cluster);
525
+ if (upstream_config != nullptr) {
526
+ ValidationErrors::ScopedField field(&errors, ".upstream_config");
527
+ ParseUpstreamConfig(context, upstream_config, cds_update.get(), &errors);
528
+ }
477
529
  // The Cluster resource encodes the circuit breaking parameters in a list of
478
530
  // Thresholds messages, where each message specifies the parameters for a
479
531
  // particular RoutingPriority. we will look only at the first entry in the
@@ -625,6 +677,7 @@ absl::StatusOr<std::shared_ptr<const XdsClusterResource>> CdsResourceParse(
625
677
  // Validate override host status.
626
678
  const auto* common_lb_config =
627
679
  envoy_config_cluster_v3_Cluster_common_lb_config(cluster);
680
+ bool override_host_status_found = false;
628
681
  if (common_lb_config != nullptr) {
629
682
  ValidationErrors::ScopedField field(&errors, ".common_lb_config");
630
683
  const auto* override_host_status =
@@ -638,9 +691,48 @@ absl::StatusOr<std::shared_ptr<const XdsClusterResource>> CdsResourceParse(
638
691
  for (size_t i = 0; i < size; ++i) {
639
692
  auto status = XdsHealthStatus::FromUpb(statuses[i]);
640
693
  if (status.has_value()) {
641
- cds_update->override_host_statuses.insert(*status);
694
+ cds_update->override_host_statuses.Add(*status);
695
+ }
696
+ }
697
+ override_host_status_found = true;
698
+ }
699
+ }
700
+ // If the field is not set, we default to [UNKNOWN, HEALTHY].
701
+ if (!override_host_status_found) {
702
+ cds_update->override_host_statuses.Add(
703
+ XdsHealthStatus(XdsHealthStatus::kUnknown));
704
+ cds_update->override_host_statuses.Add(
705
+ XdsHealthStatus(XdsHealthStatus::kHealthy));
706
+ }
707
+ // Record telemetry labels (if any).
708
+ const envoy_config_core_v3_Metadata* metadata =
709
+ envoy_config_cluster_v3_Cluster_metadata(cluster);
710
+ if (metadata != nullptr) {
711
+ google_protobuf_Struct* telemetry_labels_struct;
712
+ if (envoy_config_core_v3_Metadata_filter_metadata_get(
713
+ metadata,
714
+ StdStringToUpbString(
715
+ absl::string_view("com.google.csm.telemetry_labels")),
716
+ &telemetry_labels_struct)) {
717
+ auto telemetry_labels =
718
+ std::make_shared<std::map<std::string, std::string>>();
719
+ size_t iter = kUpb_Map_Begin;
720
+ const google_protobuf_Struct_FieldsEntry* fields_entry;
721
+ while ((fields_entry = google_protobuf_Struct_fields_next(
722
+ telemetry_labels_struct, &iter)) != nullptr) {
723
+ // Adds any entry whose value is a string to telemetry_labels.
724
+ const google_protobuf_Value* value =
725
+ google_protobuf_Struct_FieldsEntry_value(fields_entry);
726
+ if (google_protobuf_Value_has_string_value(value)) {
727
+ telemetry_labels->emplace(
728
+ UpbStringToStdString(
729
+ google_protobuf_Struct_FieldsEntry_key(fields_entry)),
730
+ UpbStringToStdString(google_protobuf_Value_string_value(value)));
642
731
  }
643
732
  }
733
+ if (!telemetry_labels->empty()) {
734
+ cds_update->telemetry_labels = std::move(telemetry_labels);
735
+ }
644
736
  }
645
737
  }
646
738
  // Return result.
@@ -658,7 +750,8 @@ void MaybeLogCluster(const XdsResourceType::DecodeContext& context,
658
750
  const upb_MessageDef* msg_type =
659
751
  envoy_config_cluster_v3_Cluster_getmsgdef(context.symtab);
660
752
  char buf[10240];
661
- upb_TextEncode(cluster, msg_type, nullptr, 0, buf, sizeof(buf));
753
+ upb_TextEncode(reinterpret_cast<const upb_Message*>(cluster), msg_type,
754
+ nullptr, 0, buf, sizeof(buf));
662
755
  gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", context.client, buf);
663
756
  }
664
757
  }
@@ -31,6 +31,7 @@
31
31
  #include "envoy/config/cluster/v3/cluster.upbdefs.h"
32
32
  #include "envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h"
33
33
  #include "envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h"
34
+ #include "envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h"
34
35
  #include "upb/reflection/def.h"
35
36
 
36
37
  #include <grpc/support/json.h>
@@ -89,18 +90,24 @@ struct XdsClusterResource : public XdsResourceType::ResourceData {
89
90
  // Tls Context used by clients
90
91
  CommonTlsContext common_tls_context;
91
92
 
93
+ // Connection idle timeout. Currently used only for SSA.
94
+ Duration connection_idle_timeout = Duration::Hours(1);
95
+
92
96
  // Maximum number of outstanding requests can be made to the upstream
93
97
  // cluster.
94
98
  uint32_t max_concurrent_requests = 1024;
95
99
 
96
100
  absl::optional<OutlierDetectionConfig> outlier_detection;
97
101
 
98
- std::set<XdsHealthStatus> override_host_statuses;
102
+ XdsHealthStatusSet override_host_statuses;
103
+
104
+ std::shared_ptr<std::map<std::string, std::string>> telemetry_labels;
99
105
 
100
106
  bool operator==(const XdsClusterResource& other) const {
101
107
  return type == other.type && lb_policy_config == other.lb_policy_config &&
102
108
  lrs_load_reporting_server == other.lrs_load_reporting_server &&
103
109
  common_tls_context == other.common_tls_context &&
110
+ connection_idle_timeout == other.connection_idle_timeout &&
104
111
  max_concurrent_requests == other.max_concurrent_requests &&
105
112
  outlier_detection == other.outlier_detection &&
106
113
  override_host_statuses == other.override_host_statuses;
@@ -126,6 +133,7 @@ class XdsClusterResourceType
126
133
  envoy_extensions_clusters_aggregate_v3_ClusterConfig_getmsgdef(symtab);
127
134
  envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_getmsgdef(
128
135
  symtab);
136
+ envoy_extensions_upstreams_http_v3_HttpProtocolOptions_getmsgdef(symtab);
129
137
  }
130
138
  };
131
139
 
@@ -26,9 +26,9 @@
26
26
  #include "absl/status/statusor.h"
27
27
  #include "absl/strings/str_cat.h"
28
28
  #include "absl/types/variant.h"
29
- #include "upb/base/status.h"
29
+ #include "upb/base/status.hpp"
30
30
  #include "upb/json/encode.h"
31
- #include "upb/upb.hpp"
31
+ #include "upb/mem/arena.hpp"
32
32
 
33
33
  #include <grpc/support/json.h>
34
34
  #include <grpc/support/log.h>
@@ -70,8 +70,9 @@ Json XdsRouteLookupClusterSpecifierPlugin::GenerateLoadBalancingPolicyConfig(
70
70
  errors->AddError("could not parse plugin config");
71
71
  return {};
72
72
  }
73
- const auto* plugin_config =
74
- grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(specifier);
73
+ const auto* plugin_config = reinterpret_cast<const upb_Message*>(
74
+ grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(
75
+ specifier));
75
76
  if (plugin_config == nullptr) {
76
77
  ValidationErrors::ScopedField field(errors, ".route_lookup_config");
77
78
  errors->AddError("field not present");
@@ -98,7 +99,10 @@ Json XdsRouteLookupClusterSpecifierPlugin::GenerateLoadBalancingPolicyConfig(
98
99
  {"routeLookupConfig", std::move(*json)},
99
100
  {"childPolicy",
100
101
  Json::FromArray({
101
- Json::FromObject({{"cds_experimental", Json::FromObject({})}}),
102
+ Json::FromObject({{"cds_experimental",
103
+ Json::FromObject({
104
+ {"isDynamic", Json::FromBool(true)},
105
+ })}}),
102
106
  })},
103
107
  {"childPolicyConfigTargetFieldName", Json::FromString("cluster")},
104
108
  })}})});
@@ -38,10 +38,9 @@
38
38
  #include "google/protobuf/struct.upb.h"
39
39
  #include "google/protobuf/struct.upbdefs.h"
40
40
  #include "google/protobuf/wrappers.upb.h"
41
- #include "upb/base/status.h"
41
+ #include "upb/base/status.hpp"
42
42
  #include "upb/json/encode.h"
43
43
  #include "upb/mem/arena.h"
44
- #include "upb/upb.hpp"
45
44
  #include "xds/type/v3/typed_struct.upb.h"
46
45
 
47
46
  #include <grpc/support/json.h>
@@ -385,13 +384,16 @@ CommonTlsContext CommonTlsContext::Parse(
385
384
  CertificateProviderInstanceParse(
386
385
  context, tls_certificate_certificate_provider_instance, errors);
387
386
  } else {
388
- if (envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_has_tls_certificates(
389
- common_tls_context_proto)) {
387
+ size_t size;
388
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificates(
389
+ common_tls_context_proto, &size);
390
+ if (size != 0) {
390
391
  ValidationErrors::ScopedField field(errors, ".tls_certificates");
391
392
  errors->AddError("feature unsupported");
392
393
  }
393
- if (envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_has_tls_certificate_sds_secret_configs(
394
- common_tls_context_proto)) {
394
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_sds_secret_configs(
395
+ common_tls_context_proto, &size);
396
+ if (size != 0) {
395
397
  ValidationErrors::ScopedField field(
396
398
  errors, ".tls_certificate_sds_secret_configs");
397
399
  errors->AddError("feature unsupported");
@@ -422,16 +424,18 @@ absl::StatusOr<Json> ParseProtobufStructToJson(
422
424
  const google_protobuf_Struct* resource) {
423
425
  upb::Status status;
424
426
  const auto* msg_def = google_protobuf_Struct_getmsgdef(context.symtab);
425
- size_t json_size = upb_JsonEncode(resource, msg_def, context.symtab, 0,
426
- nullptr, 0, status.ptr());
427
+ size_t json_size =
428
+ upb_JsonEncode(reinterpret_cast<const upb_Message*>(resource), msg_def,
429
+ context.symtab, 0, nullptr, 0, status.ptr());
427
430
  if (json_size == static_cast<size_t>(-1)) {
428
431
  return absl::InvalidArgumentError(
429
432
  absl::StrCat("error encoding google::Protobuf::Struct as JSON: ",
430
433
  upb_Status_ErrorMessage(status.ptr())));
431
434
  }
432
435
  void* buf = upb_Arena_Malloc(context.arena, json_size + 1);
433
- upb_JsonEncode(resource, msg_def, context.symtab, 0,
434
- reinterpret_cast<char*>(buf), json_size + 1, status.ptr());
436
+ upb_JsonEncode(reinterpret_cast<const upb_Message*>(resource), msg_def,
437
+ context.symtab, 0, reinterpret_cast<char*>(buf), json_size + 1,
438
+ status.ptr());
435
439
  auto json = JsonParse(reinterpret_cast<char*>(buf));
436
440
  if (!json.ok()) {
437
441
  // This should never happen.
@@ -142,8 +142,9 @@ std::string XdsEndpointResource::ToString() const {
142
142
  priority_strings.emplace_back(
143
143
  absl::StrCat("priority ", i, ": ", priority.ToString()));
144
144
  }
145
- return absl::StrCat("priorities=[", absl::StrJoin(priority_strings, ", "),
146
- "], drop_config=", drop_config->ToString());
145
+ return absl::StrCat(
146
+ "priorities=[", absl::StrJoin(priority_strings, ", "), "], drop_config=",
147
+ drop_config == nullptr ? "<null>" : drop_config->ToString());
147
148
  }
148
149
 
149
150
  //
@@ -161,7 +162,8 @@ void MaybeLogClusterLoadAssignment(
161
162
  envoy_config_endpoint_v3_ClusterLoadAssignment_getmsgdef(
162
163
  context.symtab);
163
164
  char buf[10240];
164
- upb_TextEncode(cla, msg_type, nullptr, 0, buf, sizeof(buf));
165
+ upb_TextEncode(reinterpret_cast<const upb_Message*>(cla), msg_type, nullptr,
166
+ 0, buf, sizeof(buf));
165
167
  gpr_log(GPR_DEBUG, "[xds_client %p] ClusterLoadAssignment: %s",
166
168
  context.client, buf);
167
169
  }
@@ -447,7 +449,6 @@ absl::StatusOr<std::shared_ptr<const XdsEndpointResource>> EdsResourceParse(
447
449
  }
448
450
  }
449
451
  // policy
450
- eds_resource->drop_config = MakeRefCounted<XdsEndpointResource::DropConfig>();
451
452
  const auto* policy = envoy_config_endpoint_v3_ClusterLoadAssignment_policy(
452
453
  cluster_load_assignment);
453
454
  if (policy != nullptr) {
@@ -456,6 +457,10 @@ absl::StatusOr<std::shared_ptr<const XdsEndpointResource>> EdsResourceParse(
456
457
  const auto* const* drop_overload =
457
458
  envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
458
459
  policy, &drop_size);
460
+ if (drop_size > 0) {
461
+ eds_resource->drop_config =
462
+ MakeRefCounted<XdsEndpointResource::DropConfig>();
463
+ }
459
464
  for (size_t i = 0; i < drop_size; ++i) {
460
465
  ValidationErrors::ScopedField field(
461
466
  &errors, absl::StrCat(".drop_overloads[", i, "]"));
@@ -62,6 +62,7 @@ struct XdsEndpointResource : public XdsResourceType::ResourceData {
62
62
  std::map<XdsLocalityName*, Locality, XdsLocalityName::Less> localities;
63
63
 
64
64
  bool operator==(const Priority& other) const;
65
+ bool operator!=(const Priority& other) const { return !(*this == other); }
65
66
  std::string ToString() const;
66
67
  };
67
68
  using PriorityList = std::vector<Priority>;
@@ -121,7 +122,10 @@ struct XdsEndpointResource : public XdsResourceType::ResourceData {
121
122
  RefCountedPtr<DropConfig> drop_config;
122
123
 
123
124
  bool operator==(const XdsEndpointResource& other) const {
124
- return priorities == other.priorities && *drop_config == *other.drop_config;
125
+ if (priorities != other.priorities) return false;
126
+ if (drop_config == nullptr) return other.drop_config == nullptr;
127
+ if (other.drop_config == nullptr) return false;
128
+ return *drop_config == *other.drop_config;
125
129
  }
126
130
  std::string ToString() const;
127
131
  };
@@ -20,6 +20,8 @@
20
20
 
21
21
  #include <string>
22
22
 
23
+ #include "absl/strings/str_cat.h"
24
+ #include "absl/strings/str_join.h"
23
25
  #include "envoy/config/core/v3/health_check.upb.h"
24
26
 
25
27
  namespace grpc_core {
@@ -58,8 +60,16 @@ const char* XdsHealthStatus::ToString() const {
58
60
  }
59
61
  }
60
62
 
61
- bool operator<(const XdsHealthStatus& hs1, const XdsHealthStatus& hs2) {
62
- return hs1.status() < hs2.status();
63
+ std::string XdsHealthStatusSet::ToString() const {
64
+ std::vector<const char*> set;
65
+ set.reserve(3);
66
+ for (const auto& status :
67
+ {XdsHealthStatus::kUnknown, XdsHealthStatus::kHealthy,
68
+ XdsHealthStatus::kDraining}) {
69
+ const XdsHealthStatus health_status(status);
70
+ if (Contains(health_status)) set.push_back(health_status.ToString());
71
+ }
72
+ return absl::StrCat("{", absl::StrJoin(set, ", "), "}");
63
73
  }
64
74
 
65
75
  } // namespace grpc_core
@@ -70,6 +70,8 @@ class XdsHealthStatusSet {
70
70
  return status_mask_ == other.status_mask_;
71
71
  }
72
72
 
73
+ bool Empty() const { return status_mask_ == 0; }
74
+
73
75
  void Clear() { status_mask_ = 0; }
74
76
 
75
77
  void Add(XdsHealthStatus status) { status_mask_ |= (0x1 << status.status()); }
@@ -78,12 +80,12 @@ class XdsHealthStatusSet {
78
80
  return status_mask_ & (0x1 << status.status());
79
81
  }
80
82
 
83
+ std::string ToString() const;
84
+
81
85
  private:
82
86
  int status_mask_ = 0;
83
87
  };
84
88
 
85
- bool operator<(const XdsHealthStatus& hs1, const XdsHealthStatus& hs2);
86
-
87
89
  } // namespace grpc_core
88
90
 
89
91
  #endif // GRPC_SRC_CORE_EXT_XDS_XDS_HEALTH_STATUS_H
@@ -40,7 +40,7 @@
40
40
  #include "envoy/type/matcher/v3/string.upb.h"
41
41
  #include "envoy/type/v3/range.upb.h"
42
42
  #include "google/protobuf/wrappers.upb.h"
43
- #include "upb/collections/map.h"
43
+ #include "upb/message/map.h"
44
44
 
45
45
  #include <grpc/support/json.h>
46
46
 
@@ -486,8 +486,10 @@ Json ParseHttpRbacToJson(const XdsResourceType::DecodeContext& context,
486
486
  ValidationErrors::ScopedField field(errors, ".audit_condition");
487
487
  errors->AddError("invalid audit condition");
488
488
  }
489
- if (envoy_config_rbac_v3_RBAC_AuditLoggingOptions_has_logger_configs(
490
- audit_logging_options)) {
489
+ size_t size;
490
+ envoy_config_rbac_v3_RBAC_AuditLoggingOptions_logger_configs(
491
+ audit_logging_options, &size);
492
+ if (size != 0) {
491
493
  inner_rbac_json.emplace("audit_loggers",
492
494
  ParseAuditLoggerConfigsToJson(
493
495
  context, audit_logging_options, errors));
@@ -291,8 +291,9 @@ void MaybeLogHttpConnectionManager(
291
291
  envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_getmsgdef(
292
292
  context.symtab);
293
293
  char buf[10240];
294
- upb_TextEncode(http_connection_manager_config, msg_type, nullptr, 0, buf,
295
- sizeof(buf));
294
+ upb_TextEncode(
295
+ reinterpret_cast<const upb_Message*>(http_connection_manager_config),
296
+ msg_type, nullptr, 0, buf, sizeof(buf));
296
297
  gpr_log(GPR_DEBUG, "[xds_client %p] HttpConnectionManager: %s",
297
298
  context.client, buf);
298
299
  }
@@ -332,11 +333,15 @@ XdsListenerResource::HttpConnectionManager HttpConnectionManagerParse(
332
333
  }
333
334
  // original_ip_detection_extensions -- must be empty as per
334
335
  // https://github.com/grpc/proposal/blob/master/A41-xds-rbac.md
335
- if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_original_ip_detection_extensions(
336
- http_connection_manager_proto)) {
337
- ValidationErrors::ScopedField field(errors,
338
- ".original_ip_detection_extensions");
339
- errors->AddError("must be empty");
336
+ {
337
+ size_t size;
338
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_original_ip_detection_extensions(
339
+ http_connection_manager_proto, &size);
340
+ if (size != 0) {
341
+ ValidationErrors::ScopedField field(errors,
342
+ ".original_ip_detection_extensions");
343
+ errors->AddError("must be empty");
344
+ }
340
345
  }
341
346
  // common_http_protocol_options
342
347
  const envoy_config_core_v3_HttpProtocolOptions* options =
@@ -1091,7 +1096,8 @@ void MaybeLogListener(const XdsResourceType::DecodeContext& context,
1091
1096
  const upb_MessageDef* msg_type =
1092
1097
  envoy_config_listener_v3_Listener_getmsgdef(context.symtab);
1093
1098
  char buf[10240];
1094
- upb_TextEncode(listener, msg_type, nullptr, 0, buf, sizeof(buf));
1099
+ upb_TextEncode(reinterpret_cast<const upb_Message*>(listener), msg_type,
1100
+ nullptr, 0, buf, sizeof(buf));
1095
1101
  gpr_log(GPR_DEBUG, "[xds_client %p] Listener: %s", context.client, buf);
1096
1102
  }
1097
1103
  }
@@ -42,16 +42,18 @@ class XdsResourceTypeImpl : public XdsResourceType {
42
42
  class WatcherInterface : public XdsClient::ResourceWatcherInterface {
43
43
  public:
44
44
  virtual void OnResourceChanged(
45
- std::shared_ptr<const ResourceType> resource) = 0;
45
+ std::shared_ptr<const ResourceType> resource,
46
+ RefCountedPtr<XdsClient::ReadDelayHandle> read_delay_handle) = 0;
46
47
 
47
48
  private:
48
49
  // Get result from XdsClient generic watcher interface, perform
49
50
  // down-casting, and invoke the caller's OnResourceChanged() method.
50
51
  void OnGenericResourceChanged(
51
- std::shared_ptr<const XdsResourceType::ResourceData> resource)
52
- override {
52
+ std::shared_ptr<const XdsResourceType::ResourceData> resource,
53
+ RefCountedPtr<XdsClient::ReadDelayHandle> read_delay_handle) override {
53
54
  OnResourceChanged(
54
- std::static_pointer_cast<const ResourceType>(std::move(resource)));
55
+ std::static_pointer_cast<const ResourceType>(std::move(resource)),
56
+ std::move(read_delay_handle));
55
57
  }
56
58
  };
57
59