grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -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