grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -52,7 +52,7 @@
52
52
  #include "google/protobuf/wrappers.upb.h"
53
53
  #include "re2/re2.h"
54
54
  #include "upb/base/string_view.h"
55
- #include "upb/collections/map.h"
55
+ #include "upb/message/map.h"
56
56
  #include "upb/text/encode.h"
57
57
 
58
58
  #include <grpc/status.h>
@@ -288,33 +288,44 @@ std::string XdsRouteConfigResource::Route::ToString() const {
288
288
  return absl::StrJoin(contents, "\n");
289
289
  }
290
290
 
291
+ //
292
+ // XdsRouteConfigResource::Route
293
+ //
294
+
295
+ std::string XdsRouteConfigResource::VirtualHost::ToString() const {
296
+ std::vector<std::string> parts;
297
+ parts.push_back(
298
+ absl::StrCat("vhost={\n"
299
+ " domains=[",
300
+ absl::StrJoin(domains, ", "),
301
+ "]\n"
302
+ " routes=[\n"));
303
+ for (const XdsRouteConfigResource::Route& route : routes) {
304
+ parts.push_back(" {\n");
305
+ parts.push_back(route.ToString());
306
+ parts.push_back("\n }\n");
307
+ }
308
+ parts.push_back(" ]\n");
309
+ parts.push_back(" typed_per_filter_config={\n");
310
+ for (const auto& p : typed_per_filter_config) {
311
+ const std::string& name = p.first;
312
+ const auto& config = p.second;
313
+ parts.push_back(absl::StrCat(" ", name, "=", config.ToString(), "\n"));
314
+ }
315
+ parts.push_back(" }\n");
316
+ parts.push_back("}\n");
317
+ return absl::StrJoin(parts, "");
318
+ }
319
+
291
320
  //
292
321
  // XdsRouteConfigResource
293
322
  //
294
323
 
295
324
  std::string XdsRouteConfigResource::ToString() const {
296
325
  std::vector<std::string> parts;
326
+ parts.reserve(virtual_hosts.size());
297
327
  for (const VirtualHost& vhost : virtual_hosts) {
298
- parts.push_back(
299
- absl::StrCat("vhost={\n"
300
- " domains=[",
301
- absl::StrJoin(vhost.domains, ", "),
302
- "]\n"
303
- " routes=[\n"));
304
- for (const XdsRouteConfigResource::Route& route : vhost.routes) {
305
- parts.push_back(" {\n");
306
- parts.push_back(route.ToString());
307
- parts.push_back("\n }\n");
308
- }
309
- parts.push_back(" ]\n");
310
- parts.push_back(" typed_per_filter_config={\n");
311
- for (const auto& p : vhost.typed_per_filter_config) {
312
- const std::string& name = p.first;
313
- const auto& config = p.second;
314
- parts.push_back(absl::StrCat(" ", name, "=", config.ToString(), "\n"));
315
- }
316
- parts.push_back(" }\n");
317
- parts.push_back("]\n");
328
+ parts.push_back(vhost.ToString());
318
329
  }
319
330
  parts.push_back("cluster_specifier_plugins={\n");
320
331
  for (const auto& it : cluster_specifier_plugin_map) {
@@ -1137,7 +1148,8 @@ void MaybeLogRouteConfiguration(
1137
1148
  const upb_MessageDef* msg_type =
1138
1149
  envoy_config_route_v3_RouteConfiguration_getmsgdef(context.symtab);
1139
1150
  char buf[10240];
1140
- upb_TextEncode(route_config, msg_type, nullptr, 0, buf, sizeof(buf));
1151
+ upb_TextEncode(reinterpret_cast<const upb_Message*>(route_config), msg_type,
1152
+ nullptr, 0, buf, sizeof(buf));
1141
1153
  gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", context.client,
1142
1154
  buf);
1143
1155
  }
@@ -209,6 +209,7 @@ struct XdsRouteConfigResource : public XdsResourceType::ResourceData {
209
209
  return domains == other.domains && routes == other.routes &&
210
210
  typed_per_filter_config == other.typed_per_filter_config;
211
211
  }
212
+ std::string ToString() const;
212
213
  };
213
214
 
214
215
  std::vector<VirtualHost> virtual_hosts;
@@ -52,6 +52,7 @@
52
52
  #include "src/core/ext/xds/xds_bootstrap_grpc.h"
53
53
  #include "src/core/ext/xds/xds_certificate_provider.h"
54
54
  #include "src/core/ext/xds/xds_channel_stack_modifier.h"
55
+ #include "src/core/ext/xds/xds_client.h"
55
56
  #include "src/core/ext/xds/xds_client_grpc.h"
56
57
  #include "src/core/ext/xds/xds_common_types.h"
57
58
  #include "src/core/ext/xds/xds_http_filters.h"
@@ -91,6 +92,8 @@
91
92
  namespace grpc_core {
92
93
  namespace {
93
94
 
95
+ using ReadDelayHandle = XdsClient::ReadDelayHandle;
96
+
94
97
  TraceFlag grpc_xds_server_config_fetcher_trace(false,
95
98
  "xds_server_config_fetcher");
96
99
 
@@ -151,11 +154,14 @@ class XdsServerConfigFetcher::ListenerWatcher
151
154
  }
152
155
 
153
156
  void OnResourceChanged(
154
- std::shared_ptr<const XdsListenerResource> listener) override;
157
+ std::shared_ptr<const XdsListenerResource> listener,
158
+ RefCountedPtr<ReadDelayHandle> read_delay_handle) override;
155
159
 
156
- void OnError(absl::Status status) override;
160
+ void OnError(absl::Status status,
161
+ RefCountedPtr<ReadDelayHandle> read_delay_handle) override;
157
162
 
158
- void OnResourceDoesNotExist() override;
163
+ void OnResourceDoesNotExist(
164
+ RefCountedPtr<ReadDelayHandle> read_delay_handle) override;
159
165
 
160
166
  const std::string& listening_address() const { return listening_address_; }
161
167
 
@@ -225,15 +231,6 @@ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager
225
231
  }
226
232
 
227
233
  private:
228
- struct CertificateProviders {
229
- // We need to save our own refs to the root and instance certificate
230
- // providers since the xds certificate provider just stores a ref to their
231
- // distributors.
232
- RefCountedPtr<grpc_tls_certificate_provider> root;
233
- RefCountedPtr<grpc_tls_certificate_provider> instance;
234
- RefCountedPtr<XdsCertificateProvider> xds;
235
- };
236
-
237
234
  class RouteConfigWatcher;
238
235
  struct RdsUpdateState {
239
236
  RouteConfigWatcher* watcher;
@@ -271,7 +268,8 @@ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager
271
268
  size_t rds_resources_yet_to_fetch_ ABSL_GUARDED_BY(mu_) = 0;
272
269
  std::map<std::string /* resource_name */, RdsUpdateState> rds_map_
273
270
  ABSL_GUARDED_BY(mu_);
274
- std::map<const XdsListenerResource::FilterChainData*, CertificateProviders>
271
+ std::map<const XdsListenerResource::FilterChainData*,
272
+ RefCountedPtr<XdsCertificateProvider>>
275
273
  certificate_providers_map_ ABSL_GUARDED_BY(mu_);
276
274
  };
277
275
 
@@ -292,16 +290,20 @@ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
292
290
  filter_chain_match_manager_(std::move(filter_chain_match_manager)) {}
293
291
 
294
292
  void OnResourceChanged(
295
- std::shared_ptr<const XdsRouteConfigResource> route_config) override {
293
+ std::shared_ptr<const XdsRouteConfigResource> route_config,
294
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) override {
296
295
  filter_chain_match_manager_->OnRouteConfigChanged(resource_name_,
297
296
  std::move(route_config));
298
297
  }
299
298
 
300
- void OnError(absl::Status status) override {
299
+ void OnError(
300
+ absl::Status status,
301
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) override {
301
302
  filter_chain_match_manager_->OnError(resource_name_, status);
302
303
  }
303
304
 
304
- void OnResourceDoesNotExist() override {
305
+ void OnResourceDoesNotExist(
306
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) override {
305
307
  filter_chain_match_manager_->OnResourceDoesNotExist(resource_name_);
306
308
  }
307
309
 
@@ -488,13 +490,21 @@ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
488
490
  : parent_(std::move(parent)) {}
489
491
 
490
492
  void OnResourceChanged(
491
- std::shared_ptr<const XdsRouteConfigResource> route_config) override {
493
+ std::shared_ptr<const XdsRouteConfigResource> route_config,
494
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) override {
492
495
  parent_->OnRouteConfigChanged(std::move(route_config));
493
496
  }
494
497
 
495
- void OnError(absl::Status status) override { parent_->OnError(status); }
498
+ void OnError(
499
+ absl::Status status,
500
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) override {
501
+ parent_->OnError(status);
502
+ }
496
503
 
497
- void OnResourceDoesNotExist() override { parent_->OnResourceDoesNotExist(); }
504
+ void OnResourceDoesNotExist(
505
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) override {
506
+ parent_->OnResourceDoesNotExist();
507
+ }
498
508
 
499
509
  private:
500
510
  WeakRefCountedPtr<DynamicXdsServerConfigSelectorProvider> parent_;
@@ -527,7 +537,7 @@ void XdsServerConfigFetcher::StartWatch(
527
537
  std::unique_ptr<grpc_server_config_fetcher::WatcherInterface> watcher) {
528
538
  grpc_server_config_fetcher::WatcherInterface* watcher_ptr = watcher.get();
529
539
  auto listener_watcher = MakeRefCounted<ListenerWatcher>(
530
- xds_client_->Ref(DEBUG_LOCATION, "ListenerWatcher"), std::move(watcher),
540
+ xds_client_.Ref(DEBUG_LOCATION, "ListenerWatcher"), std::move(watcher),
531
541
  serving_status_notifier_, listening_address);
532
542
  auto* listener_watcher_ptr = listener_watcher.get();
533
543
  XdsListenerResourceType::StartWatch(
@@ -574,7 +584,8 @@ XdsServerConfigFetcher::ListenerWatcher::ListenerWatcher(
574
584
  listening_address_(std::move(listening_address)) {}
575
585
 
576
586
  void XdsServerConfigFetcher::ListenerWatcher::OnResourceChanged(
577
- std::shared_ptr<const XdsListenerResource> listener) {
587
+ std::shared_ptr<const XdsListenerResource> listener,
588
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) {
578
589
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_server_config_fetcher_trace)) {
579
590
  gpr_log(GPR_INFO,
580
591
  "[ListenerWatcher %p] Received LDS update from xds client %p: %s",
@@ -595,7 +606,7 @@ void XdsServerConfigFetcher::ListenerWatcher::OnResourceChanged(
595
606
  return;
596
607
  }
597
608
  auto new_filter_chain_match_manager = MakeRefCounted<FilterChainMatchManager>(
598
- xds_client_->Ref(DEBUG_LOCATION, "FilterChainMatchManager"),
609
+ xds_client_.Ref(DEBUG_LOCATION, "FilterChainMatchManager"),
599
610
  tcp_listener->filter_chain_map, tcp_listener->default_filter_chain);
600
611
  MutexLock lock(&mu_);
601
612
  if (filter_chain_match_manager_ == nullptr ||
@@ -605,11 +616,14 @@ void XdsServerConfigFetcher::ListenerWatcher::OnResourceChanged(
605
616
  filter_chain_match_manager_->default_filter_chain())) {
606
617
  pending_filter_chain_match_manager_ =
607
618
  std::move(new_filter_chain_match_manager);
608
- pending_filter_chain_match_manager_->StartRdsWatch(Ref());
619
+ pending_filter_chain_match_manager_->StartRdsWatch(
620
+ RefAsSubclass<ListenerWatcher>());
609
621
  }
610
622
  }
611
623
 
612
- void XdsServerConfigFetcher::ListenerWatcher::OnError(absl::Status status) {
624
+ void XdsServerConfigFetcher::ListenerWatcher::OnError(
625
+ absl::Status status,
626
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) {
613
627
  MutexLock lock(&mu_);
614
628
  if (filter_chain_match_manager_ != nullptr ||
615
629
  pending_filter_chain_match_manager_ != nullptr) {
@@ -652,7 +666,8 @@ void XdsServerConfigFetcher::ListenerWatcher::OnFatalError(
652
666
  }
653
667
  }
654
668
 
655
- void XdsServerConfigFetcher::ListenerWatcher::OnResourceDoesNotExist() {
669
+ void XdsServerConfigFetcher::ListenerWatcher::OnResourceDoesNotExist(
670
+ RefCountedPtr<ReadDelayHandle> /* read_delay_handle */) {
656
671
  MutexLock lock(&mu_);
657
672
  OnFatalError(absl::NotFoundError("Requested listener does not exist"));
658
673
  }
@@ -743,8 +758,8 @@ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
743
758
  MutexLock lock(&mu_);
744
759
  for (const auto& resource_name : resource_names) {
745
760
  ++rds_resources_yet_to_fetch_;
746
- auto route_config_watcher =
747
- MakeRefCounted<RouteConfigWatcher>(resource_name, WeakRef());
761
+ auto route_config_watcher = MakeRefCounted<RouteConfigWatcher>(
762
+ resource_name, WeakRefAsSubclass<FilterChainMatchManager>());
748
763
  rds_map_.emplace(resource_name, RdsUpdateState{route_config_watcher.get(),
749
764
  absl::nullopt});
750
765
  watchers_to_start.push_back(
@@ -786,10 +801,7 @@ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
786
801
  const XdsListenerResource::FilterChainData* filter_chain) {
787
802
  MutexLock lock(&mu_);
788
803
  auto it = certificate_providers_map_.find(filter_chain);
789
- if (it != certificate_providers_map_.end()) {
790
- return it->second.xds;
791
- }
792
- CertificateProviders certificate_providers;
804
+ if (it != certificate_providers_map_.end()) return it->second;
793
805
  // Configure root cert.
794
806
  absl::string_view root_provider_instance_name =
795
807
  filter_chain->downstream_tls_context.common_tls_context
@@ -799,11 +811,12 @@ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
799
811
  filter_chain->downstream_tls_context.common_tls_context
800
812
  .certificate_validation_context.ca_certificate_provider_instance
801
813
  .certificate_name;
814
+ RefCountedPtr<grpc_tls_certificate_provider> root_cert_provider;
802
815
  if (!root_provider_instance_name.empty()) {
803
- certificate_providers.root =
816
+ root_cert_provider =
804
817
  xds_client_->certificate_provider_store()
805
818
  .CreateOrGetCertificateProvider(root_provider_instance_name);
806
- if (certificate_providers.root == nullptr) {
819
+ if (root_cert_provider == nullptr) {
807
820
  return absl::NotFoundError(
808
821
  absl::StrCat("Certificate provider instance name: \"",
809
822
  root_provider_instance_name, "\" not recognized."));
@@ -816,33 +829,23 @@ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
816
829
  absl::string_view identity_provider_cert_name =
817
830
  filter_chain->downstream_tls_context.common_tls_context
818
831
  .tls_certificate_provider_instance.certificate_name;
832
+ RefCountedPtr<grpc_tls_certificate_provider> identity_cert_provider;
819
833
  if (!identity_provider_instance_name.empty()) {
820
- certificate_providers.instance =
834
+ identity_cert_provider =
821
835
  xds_client_->certificate_provider_store()
822
836
  .CreateOrGetCertificateProvider(identity_provider_instance_name);
823
- if (certificate_providers.instance == nullptr) {
837
+ if (identity_cert_provider == nullptr) {
824
838
  return absl::NotFoundError(
825
839
  absl::StrCat("Certificate provider instance name: \"",
826
840
  identity_provider_instance_name, "\" not recognized."));
827
841
  }
828
842
  }
829
- certificate_providers.xds = MakeRefCounted<XdsCertificateProvider>();
830
- certificate_providers.xds->UpdateRootCertNameAndDistributor(
831
- "", root_provider_cert_name,
832
- certificate_providers.root == nullptr
833
- ? nullptr
834
- : certificate_providers.root->distributor());
835
- certificate_providers.xds->UpdateIdentityCertNameAndDistributor(
836
- "", identity_provider_cert_name,
837
- certificate_providers.instance == nullptr
838
- ? nullptr
839
- : certificate_providers.instance->distributor());
840
- certificate_providers.xds->UpdateRequireClientCertificate(
841
- "", filter_chain->downstream_tls_context.require_client_certificate);
842
- auto xds_certificate_provider = certificate_providers.xds;
843
- certificate_providers_map_.emplace(filter_chain,
844
- std::move(certificate_providers));
845
- return xds_certificate_provider;
843
+ auto xds_cert_provider = MakeRefCounted<XdsCertificateProvider>(
844
+ std::move(root_cert_provider), root_provider_cert_name,
845
+ std::move(identity_cert_provider), identity_provider_cert_name,
846
+ filter_chain->downstream_tls_context.require_client_certificate);
847
+ certificate_providers_map_.emplace(filter_chain, xds_cert_provider);
848
+ return xds_cert_provider;
846
849
  }
847
850
 
848
851
  void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
@@ -1122,8 +1125,8 @@ absl::StatusOr<ChannelArgs> XdsServerConfigFetcher::ListenerWatcher::
1122
1125
  }
1123
1126
  server_config_selector_provider =
1124
1127
  MakeRefCounted<DynamicXdsServerConfigSelectorProvider>(
1125
- xds_client_->Ref(DEBUG_LOCATION,
1126
- "DynamicXdsServerConfigSelectorProvider"),
1128
+ xds_client_.Ref(DEBUG_LOCATION,
1129
+ "DynamicXdsServerConfigSelectorProvider"),
1127
1130
  rds_name, std::move(initial_resource),
1128
1131
  filter_chain->http_connection_manager.http_filters);
1129
1132
  },
@@ -1131,8 +1134,8 @@ absl::StatusOr<ChannelArgs> XdsServerConfigFetcher::ListenerWatcher::
1131
1134
  [&](const std::shared_ptr<const XdsRouteConfigResource>& route_config) {
1132
1135
  server_config_selector_provider =
1133
1136
  MakeRefCounted<StaticXdsServerConfigSelectorProvider>(
1134
- xds_client_->Ref(DEBUG_LOCATION,
1135
- "StaticXdsServerConfigSelectorProvider"),
1137
+ xds_client_.Ref(DEBUG_LOCATION,
1138
+ "StaticXdsServerConfigSelectorProvider"),
1136
1139
  route_config,
1137
1140
  filter_chain->http_connection_manager.http_filters);
1138
1141
  });
@@ -1270,7 +1273,8 @@ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1270
1273
  // RouteConfigWatcher is being created here instead of in Watch() to avoid
1271
1274
  // deadlocks from invoking XdsRouteConfigResourceType::StartWatch whilst in a
1272
1275
  // critical region.
1273
- auto route_config_watcher = MakeRefCounted<RouteConfigWatcher>(WeakRef());
1276
+ auto route_config_watcher = MakeRefCounted<RouteConfigWatcher>(
1277
+ WeakRefAsSubclass<DynamicXdsServerConfigSelectorProvider>());
1274
1278
  route_config_watcher_ = route_config_watcher.get();
1275
1279
  XdsRouteConfigResourceType::StartWatch(xds_client_.get(), resource_name_,
1276
1280
  std::move(route_config_watcher));
@@ -58,6 +58,9 @@ class XdsTransportFactory : public InternallyRefCounted<XdsTransportFactory> {
58
58
  // Only one message will be in flight at a time; subsequent
59
59
  // messages will not be sent until this one is done.
60
60
  virtual void SendMessage(std::string payload) = 0;
61
+
62
+ // Starts a recv_message operation on the stream.
63
+ virtual void StartRecvMessage() = 0;
61
64
  };
62
65
 
63
66
  // Create a streaming call on this transport for the specified method.
@@ -86,39 +86,31 @@ GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::GrpcStreamingCall(
86
86
  GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this, nullptr);
87
87
  // Start ops on the call.
88
88
  grpc_call_error call_error;
89
- grpc_op ops[3];
89
+ grpc_op ops[2];
90
90
  memset(ops, 0, sizeof(ops));
91
- // Send initial metadata. No callback for this, since we don't really
92
- // care when it finishes.
91
+ // Send initial metadata.
93
92
  grpc_op* op = ops;
94
93
  op->op = GRPC_OP_SEND_INITIAL_METADATA;
95
94
  op->data.send_initial_metadata.count = 0;
96
95
  op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
97
96
  GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
98
97
  op->reserved = nullptr;
99
- op++;
100
- call_error = grpc_call_start_batch_and_execute(
101
- call_, ops, static_cast<size_t>(op - ops), nullptr);
102
- GPR_ASSERT(GRPC_CALL_OK == call_error);
103
- // Start a batch with recv_initial_metadata and recv_message.
104
- op = ops;
98
+ ++op;
105
99
  op->op = GRPC_OP_RECV_INITIAL_METADATA;
106
100
  op->data.recv_initial_metadata.recv_initial_metadata =
107
101
  &initial_metadata_recv_;
108
102
  op->flags = 0;
109
103
  op->reserved = nullptr;
110
- op++;
111
- op->op = GRPC_OP_RECV_MESSAGE;
112
- op->data.recv_message.recv_message = &recv_message_payload_;
113
- op->flags = 0;
114
- op->reserved = nullptr;
115
- op++;
116
- Ref(DEBUG_LOCATION, "OnResponseReceived").release();
117
- GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this, nullptr);
104
+ ++op;
105
+ // Ref will be released in the callback
106
+ GRPC_CLOSURE_INIT(
107
+ &on_recv_initial_metadata_, OnRecvInitialMetadata,
108
+ this->Ref(DEBUG_LOCATION, "OnRecvInitialMetadata").release(), nullptr);
118
109
  call_error = grpc_call_start_batch_and_execute(
119
- call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
110
+ call_, ops, static_cast<size_t>(op - ops), &on_recv_initial_metadata_);
120
111
  GPR_ASSERT(GRPC_CALL_OK == call_error);
121
112
  // Start a batch for recv_trailing_metadata.
113
+ memset(ops, 0, sizeof(ops));
122
114
  op = ops;
123
115
  op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
124
116
  op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
@@ -126,7 +118,7 @@ GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::GrpcStreamingCall(
126
118
  op->data.recv_status_on_client.status_details = &status_details_;
127
119
  op->flags = 0;
128
120
  op->reserved = nullptr;
129
- op++;
121
+ ++op;
130
122
  // This callback signals the end of the call, so it relies on the initial
131
123
  // ref instead of a new ref. When it's invoked, it's the initial ref that is
132
124
  // unreffed.
@@ -134,11 +126,11 @@ GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::GrpcStreamingCall(
134
126
  call_error = grpc_call_start_batch_and_execute(
135
127
  call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
136
128
  GPR_ASSERT(GRPC_CALL_OK == call_error);
129
+ GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this, nullptr);
137
130
  }
138
131
 
139
132
  GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::
140
133
  ~GrpcStreamingCall() {
141
- grpc_metadata_array_destroy(&initial_metadata_recv_);
142
134
  grpc_metadata_array_destroy(&trailing_metadata_recv_);
143
135
  grpc_byte_buffer_destroy(send_message_payload_);
144
136
  grpc_byte_buffer_destroy(recv_message_payload_);
@@ -175,55 +167,59 @@ void GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::SendMessage(
175
167
  GPR_ASSERT(GRPC_CALL_OK == call_error);
176
168
  }
177
169
 
170
+ void GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::
171
+ StartRecvMessage() {
172
+ Ref(DEBUG_LOCATION, "StartRecvMessage").release();
173
+ grpc_op op;
174
+ memset(&op, 0, sizeof(op));
175
+ op.op = GRPC_OP_RECV_MESSAGE;
176
+ op.data.recv_message.recv_message = &recv_message_payload_;
177
+ GPR_ASSERT(call_ != nullptr);
178
+ const grpc_call_error call_error =
179
+ grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
180
+ GPR_ASSERT(GRPC_CALL_OK == call_error);
181
+ }
182
+
183
+ void GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::
184
+ OnRecvInitialMetadata(void* arg, grpc_error_handle /*error*/) {
185
+ RefCountedPtr<GrpcStreamingCall> self(static_cast<GrpcStreamingCall*>(arg));
186
+ grpc_metadata_array_destroy(&self->initial_metadata_recv_);
187
+ }
188
+
178
189
  void GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::
179
190
  OnRequestSent(void* arg, grpc_error_handle error) {
180
- auto* self = static_cast<GrpcStreamingCall*>(arg);
191
+ RefCountedPtr<GrpcStreamingCall> self(static_cast<GrpcStreamingCall*>(arg));
181
192
  // Clean up the sent message.
182
193
  grpc_byte_buffer_destroy(self->send_message_payload_);
183
194
  self->send_message_payload_ = nullptr;
184
195
  // Invoke request handler.
185
196
  self->event_handler_->OnRequestSent(error.ok());
186
- // Drop the ref.
187
- self->Unref(DEBUG_LOCATION, "OnRequestSent");
188
197
  }
189
198
 
190
199
  void GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::
191
200
  OnResponseReceived(void* arg, grpc_error_handle /*error*/) {
192
- auto* self = static_cast<GrpcStreamingCall*>(arg);
201
+ RefCountedPtr<GrpcStreamingCall> self(static_cast<GrpcStreamingCall*>(arg));
193
202
  // If there was no payload, then we received status before we received
194
203
  // another message, so we stop reading.
195
- if (self->recv_message_payload_ == nullptr) {
196
- self->Unref(DEBUG_LOCATION, "OnResponseReceived");
197
- return;
204
+ if (self->recv_message_payload_ != nullptr) {
205
+ // Process the response.
206
+ grpc_byte_buffer_reader bbr;
207
+ grpc_byte_buffer_reader_init(&bbr, self->recv_message_payload_);
208
+ grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
209
+ grpc_byte_buffer_reader_destroy(&bbr);
210
+ grpc_byte_buffer_destroy(self->recv_message_payload_);
211
+ self->recv_message_payload_ = nullptr;
212
+ self->event_handler_->OnRecvMessage(StringViewFromSlice(response_slice));
213
+ CSliceUnref(response_slice);
198
214
  }
199
- // Process the response.
200
- grpc_byte_buffer_reader bbr;
201
- grpc_byte_buffer_reader_init(&bbr, self->recv_message_payload_);
202
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
203
- grpc_byte_buffer_reader_destroy(&bbr);
204
- grpc_byte_buffer_destroy(self->recv_message_payload_);
205
- self->recv_message_payload_ = nullptr;
206
- self->event_handler_->OnRecvMessage(StringViewFromSlice(response_slice));
207
- CSliceUnref(response_slice);
208
- // Keep reading.
209
- grpc_op op;
210
- memset(&op, 0, sizeof(op));
211
- op.op = GRPC_OP_RECV_MESSAGE;
212
- op.data.recv_message.recv_message = &self->recv_message_payload_;
213
- GPR_ASSERT(self->call_ != nullptr);
214
- // Reuses the "OnResponseReceived" ref taken in ctor.
215
- const grpc_call_error call_error = grpc_call_start_batch_and_execute(
216
- self->call_, &op, 1, &self->on_response_received_);
217
- GPR_ASSERT(GRPC_CALL_OK == call_error);
218
215
  }
219
216
 
220
217
  void GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall::
221
218
  OnStatusReceived(void* arg, grpc_error_handle /*error*/) {
222
- auto* self = static_cast<GrpcStreamingCall*>(arg);
219
+ RefCountedPtr<GrpcStreamingCall> self(static_cast<GrpcStreamingCall*>(arg));
223
220
  self->event_handler_->OnStatusReceived(
224
221
  absl::Status(static_cast<absl::StatusCode>(self->status_code_),
225
222
  StringViewFromSlice(self->status_details_)));
226
- self->Unref(DEBUG_LOCATION, "OnStatusReceived");
227
223
  }
228
224
 
229
225
  //
@@ -321,8 +317,9 @@ GrpcXdsTransportFactory::GrpcXdsTransport::CreateStreamingCall(
321
317
  const char* method,
322
318
  std::unique_ptr<StreamingCall::EventHandler> event_handler) {
323
319
  return MakeOrphanable<GrpcStreamingCall>(
324
- factory_->Ref(DEBUG_LOCATION, "StreamingCall"), channel_, method,
325
- std::move(event_handler));
320
+ factory_->RefAsSubclass<GrpcXdsTransportFactory>(DEBUG_LOCATION,
321
+ "StreamingCall"),
322
+ channel_, method, std::move(event_handler));
326
323
  }
327
324
 
328
325
  void GrpcXdsTransportFactory::GrpcXdsTransport::ResetBackoff() {
@@ -100,7 +100,10 @@ class GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall
100
100
 
101
101
  void SendMessage(std::string payload) override;
102
102
 
103
+ void StartRecvMessage() override;
104
+
103
105
  private:
106
+ static void OnRecvInitialMetadata(void* arg, grpc_error_handle /*error*/);
104
107
  static void OnRequestSent(void* arg, grpc_error_handle error);
105
108
  static void OnResponseReceived(void* arg, grpc_error_handle /*error*/);
106
109
  static void OnStatusReceived(void* arg, grpc_error_handle /*error*/);
@@ -114,6 +117,7 @@ class GrpcXdsTransportFactory::GrpcXdsTransport::GrpcStreamingCall
114
117
 
115
118
  // recv_initial_metadata
116
119
  grpc_metadata_array initial_metadata_recv_;
120
+ grpc_closure on_recv_initial_metadata_;
117
121
 
118
122
  // send_message
119
123
  grpc_byte_buffer* send_message_payload_ = nullptr;
@@ -60,6 +60,11 @@ void ServerCallTracerFactory::RegisterGlobal(ServerCallTracerFactory* factory) {
60
60
  g_server_call_tracer_factory_ = factory;
61
61
  }
62
62
 
63
+ void ServerCallTracerFactory::TestOnlyReset() {
64
+ delete g_server_call_tracer_factory_;
65
+ g_server_call_tracer_factory_ = nullptr;
66
+ }
67
+
63
68
  absl::string_view ServerCallTracerFactory::ChannelArgName() {
64
69
  return kServerCallTracerFactoryChannelArgName;
65
70
  }
@@ -146,6 +151,13 @@ class DelegatingClientCallTracer : public ClientCallTracer {
146
151
  std::shared_ptr<TcpTracerInterface> StartNewTcpTrace() override {
147
152
  return nullptr;
148
153
  }
154
+ void AddOptionalLabels(
155
+ OptionalLabelComponent component,
156
+ std::shared_ptr<std::map<std::string, std::string>> labels) override {
157
+ for (auto* tracer : tracers_) {
158
+ tracer->AddOptionalLabels(component, labels);
159
+ }
160
+ }
149
161
  std::string TraceId() override { return tracers_[0]->TraceId(); }
150
162
  std::string SpanId() override { return tracers_[0]->SpanId(); }
151
163
  bool IsSampled() override { return tracers_[0]->IsSampled(); }
@@ -44,9 +44,9 @@ namespace grpc_core {
44
44
 
45
45
  // The interface hierarchy is as follows -
46
46
  // CallTracerAnnotationInterface
47
- // / \
47
+ // | |
48
48
  // ClientCallTracer CallTracerInterface
49
- // / \
49
+ // | |
50
50
  // CallAttemptTracer ServerCallTracer
51
51
 
52
52
  // The base class for all tracer implementations.
@@ -128,6 +128,11 @@ class ClientCallTracer : public CallTracerAnnotationInterface {
128
128
  // as transparent retry attempts.)
129
129
  class CallAttemptTracer : public CallTracerInterface {
130
130
  public:
131
+ enum class OptionalLabelComponent : std::uint8_t {
132
+ kXdsServiceLabels = 0,
133
+ kSize = 1, // keep last
134
+ };
135
+
131
136
  ~CallAttemptTracer() override {}
132
137
  // TODO(yashykt): The following two methods `RecordReceivedTrailingMetadata`
133
138
  // and `RecordEnd` should be moved into CallTracerInterface.
@@ -140,6 +145,11 @@ class ClientCallTracer : public CallTracerAnnotationInterface {
140
145
  // Should be the last API call to the object. Once invoked, the tracer
141
146
  // library is free to destroy the object.
142
147
  virtual void RecordEnd(const gpr_timespec& latency) = 0;
148
+
149
+ // Adds optional labels to be reported by the underlying tracer in a call.
150
+ virtual void AddOptionalLabels(
151
+ OptionalLabelComponent component,
152
+ std::shared_ptr<std::map<std::string, std::string>> labels) = 0;
143
153
  };
144
154
 
145
155
  ~ClientCallTracer() override {}
@@ -175,7 +185,8 @@ class ServerCallTracerFactory {
175
185
 
176
186
  virtual ~ServerCallTracerFactory() {}
177
187
 
178
- virtual ServerCallTracer* CreateNewServerCallTracer(Arena* arena) = 0;
188
+ virtual ServerCallTracer* CreateNewServerCallTracer(
189
+ Arena* arena, const ChannelArgs& channel_args) = 0;
179
190
 
180
191
  // Returns true if a server is to be traced, false otherwise.
181
192
  virtual bool IsServerTraced(const ChannelArgs& /*args*/) { return true; }
@@ -190,6 +201,9 @@ class ServerCallTracerFactory {
190
201
  // this for the lifetime of the process.
191
202
  static void RegisterGlobal(ServerCallTracerFactory* factory);
192
203
 
204
+ // Deletes any previous registered ServerCallTracerFactory.
205
+ static void TestOnlyReset();
206
+
193
207
  static absl::string_view ChannelArgName();
194
208
  };
195
209