grpc 1.60.0 → 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 +35 -13
  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
@@ -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