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
@@ -280,25 +280,35 @@ absl::optional<bool> ChannelArgs::GetBool(absl::string_view name) const {
280
280
  }
281
281
  }
282
282
 
283
- std::string ChannelArgs::Value::ToString() const {
284
- if (rep_.c_vtable() == &int_vtable_) {
285
- return std::to_string(reinterpret_cast<intptr_t>(rep_.c_pointer()));
286
- }
283
+ absl::string_view ChannelArgs::Value::ToString(
284
+ std::list<std::string>& backing_strings) const {
287
285
  if (rep_.c_vtable() == &string_vtable_) {
288
- return std::string(
289
- static_cast<RefCountedString*>(rep_.c_pointer())->as_string_view());
286
+ return static_cast<RefCountedString*>(rep_.c_pointer())->as_string_view();
287
+ }
288
+ if (rep_.c_vtable() == &int_vtable_) {
289
+ backing_strings.emplace_back(
290
+ std::to_string(reinterpret_cast<intptr_t>(rep_.c_pointer())));
291
+ return backing_strings.back();
290
292
  }
291
- return absl::StrFormat("%p", rep_.c_pointer());
293
+ backing_strings.emplace_back(absl::StrFormat("%p", rep_.c_pointer()));
294
+ return backing_strings.back();
292
295
  }
293
296
 
294
297
  std::string ChannelArgs::ToString() const {
295
- std::vector<std::string> arg_strings;
296
- args_.ForEach(
297
- [&arg_strings](const RefCountedStringValue& key, const Value& value) {
298
- arg_strings.push_back(
299
- absl::StrCat(key.as_string_view(), "=", value.ToString()));
300
- });
301
- return absl::StrCat("{", absl::StrJoin(arg_strings, ", "), "}");
298
+ std::vector<absl::string_view> strings;
299
+ std::list<std::string> backing_strings;
300
+ strings.push_back("{");
301
+ bool first = true;
302
+ args_.ForEach([&strings, &first, &backing_strings](
303
+ const RefCountedStringValue& key, const Value& value) {
304
+ if (!first) strings.push_back(", ");
305
+ first = false;
306
+ strings.push_back(key.as_string_view());
307
+ strings.push_back("=");
308
+ strings.push_back(value.ToString(backing_strings));
309
+ });
310
+ strings.push_back("}");
311
+ return absl::StrJoin(strings, "");
302
312
  }
303
313
 
304
314
  ChannelArgs ChannelArgs::UnionWith(ChannelArgs other) const {
@@ -125,6 +125,16 @@ struct ChannelArgTypeTraits<
125
125
  };
126
126
  };
127
127
 
128
+ // Define a check for shared_ptr supported types, which must extend
129
+ // enable_shared_from_this.
130
+ template <typename T>
131
+ struct SupportedSharedPtrType
132
+ : std::integral_constant<
133
+ bool, std::is_base_of<std::enable_shared_from_this<T>, T>::value> {};
134
+ template <>
135
+ struct SupportedSharedPtrType<grpc_event_engine::experimental::EventEngine>
136
+ : std::true_type {};
137
+
128
138
  // Specialization for shared_ptr
129
139
  // Incurs an allocation because shared_ptr.release is not a thing.
130
140
  template <typename T>
@@ -173,19 +183,27 @@ struct ChannelArgTypeTraits<T,
173
183
  };
174
184
  };
175
185
 
176
- // GetObject support for shared_ptr and RefCountedPtr
186
+ // Determine if the pointer for a channel arg name should be const or not
187
+ template <typename T, typename SfinaeVoid = void>
188
+ struct ChannelArgPointerShouldBeConst {
189
+ static constexpr bool kValue = false;
190
+ };
191
+
177
192
  template <typename T>
178
- struct WrapInSharedPtr
179
- : std::integral_constant<
180
- bool, std::is_base_of<std::enable_shared_from_this<T>, T>::value> {};
181
- template <>
182
- struct WrapInSharedPtr<grpc_event_engine::experimental::EventEngine>
183
- : std::true_type {};
193
+ struct ChannelArgPointerShouldBeConst<
194
+ T, absl::void_t<decltype(T::ChannelArgUseConstPtr())>> {
195
+ static constexpr bool kValue = T::ChannelArgUseConstPtr();
196
+ };
197
+
198
+ // GetObject support for shared_ptr and RefCountedPtr
184
199
  template <typename T, typename Ignored = void /* for SFINAE */>
185
200
  struct GetObjectImpl;
186
201
  // std::shared_ptr implementation
187
202
  template <typename T>
188
- struct GetObjectImpl<T, absl::enable_if_t<WrapInSharedPtr<T>::value, void>> {
203
+ struct GetObjectImpl<
204
+ T, absl::enable_if_t<!ChannelArgPointerShouldBeConst<T>::kValue &&
205
+ SupportedSharedPtrType<T>::value,
206
+ void>> {
189
207
  using Result = T*;
190
208
  using ReffedResult = std::shared_ptr<T>;
191
209
  using StoredType = std::shared_ptr<T>*;
@@ -205,11 +223,34 @@ struct GetObjectImpl<T, absl::enable_if_t<WrapInSharedPtr<T>::value, void>> {
205
223
  };
206
224
  // RefCountedPtr
207
225
  template <typename T>
208
- struct GetObjectImpl<T, absl::enable_if_t<!WrapInSharedPtr<T>::value, void>> {
226
+ struct GetObjectImpl<
227
+ T, absl::enable_if_t<!ChannelArgPointerShouldBeConst<T>::kValue &&
228
+ !SupportedSharedPtrType<T>::value,
229
+ void>> {
209
230
  using Result = T*;
210
231
  using ReffedResult = RefCountedPtr<T>;
211
232
  using StoredType = Result;
212
233
  static Result Get(StoredType p) { return p; };
234
+ static ReffedResult GetReffed(StoredType p) {
235
+ if (p == nullptr) return nullptr;
236
+ return p->template RefAsSubclass<T>();
237
+ };
238
+ static ReffedResult GetReffed(StoredType p, const DebugLocation& location,
239
+ const char* reason) {
240
+ if (p == nullptr) return nullptr;
241
+ return p->template RefAsSubclass<T>(location, reason);
242
+ };
243
+ };
244
+
245
+ template <typename T>
246
+ struct GetObjectImpl<
247
+ T, absl::enable_if_t<ChannelArgPointerShouldBeConst<T>::kValue &&
248
+ !SupportedSharedPtrType<T>::value,
249
+ void>> {
250
+ using Result = const T*;
251
+ using ReffedResult = RefCountedPtr<const T>;
252
+ using StoredType = Result;
253
+ static Result Get(StoredType p) { return p; };
213
254
  static ReffedResult GetReffed(StoredType p) {
214
255
  if (p == nullptr) return nullptr;
215
256
  return p->Ref();
@@ -237,6 +278,7 @@ struct ChannelArgNameTraits<grpc_event_engine::experimental::EventEngine> {
237
278
  return GRPC_INTERNAL_ARG_EVENT_ENGINE;
238
279
  }
239
280
  };
281
+
240
282
  class ChannelArgs {
241
283
  public:
242
284
  class Pointer {
@@ -303,7 +345,7 @@ class ChannelArgs {
303
345
  return &rep_;
304
346
  }
305
347
 
306
- std::string ToString() const;
348
+ absl::string_view ToString(std::list<std::string>& backing) const;
307
349
 
308
350
  grpc_arg MakeCArg(const char* name) const;
309
351
 
@@ -376,21 +418,38 @@ class ChannelArgs {
376
418
  GRPC_MUST_USE_RESULT auto Set(absl::string_view name,
377
419
  RefCountedPtr<T> value) const
378
420
  -> absl::enable_if_t<
379
- std::is_same<const grpc_arg_pointer_vtable*,
380
- decltype(ChannelArgTypeTraits<
381
- absl::remove_cvref_t<T>>::VTable())>::value,
421
+ !ChannelArgPointerShouldBeConst<T>::kValue &&
422
+ std::is_same<const grpc_arg_pointer_vtable*,
423
+ decltype(ChannelArgTypeTraits<
424
+ absl::remove_cvref_t<T>>::VTable())>::value,
382
425
  ChannelArgs> {
383
426
  return Set(
384
427
  name, Pointer(value.release(),
385
428
  ChannelArgTypeTraits<absl::remove_cvref_t<T>>::VTable()));
386
429
  }
387
430
  template <typename T>
431
+ GRPC_MUST_USE_RESULT auto Set(absl::string_view name,
432
+ RefCountedPtr<const T> value) const
433
+ -> absl::enable_if_t<
434
+ ChannelArgPointerShouldBeConst<T>::kValue &&
435
+ std::is_same<const grpc_arg_pointer_vtable*,
436
+ decltype(ChannelArgTypeTraits<
437
+ absl::remove_cvref_t<T>>::VTable())>::value,
438
+ ChannelArgs> {
439
+ return Set(
440
+ name, Pointer(const_cast<T*>(value.release()),
441
+ ChannelArgTypeTraits<absl::remove_cvref_t<T>>::VTable()));
442
+ }
443
+ template <typename T>
388
444
  GRPC_MUST_USE_RESULT absl::enable_if_t<
389
445
  std::is_same<
390
446
  const grpc_arg_pointer_vtable*,
391
447
  decltype(ChannelArgTypeTraits<std::shared_ptr<T>>::VTable())>::value,
392
448
  ChannelArgs>
393
449
  Set(absl::string_view name, std::shared_ptr<T> value) const {
450
+ static_assert(SupportedSharedPtrType<T>::value,
451
+ "Type T must extend std::enable_shared_from_this to be added "
452
+ "into ChannelArgs as a shared_ptr<T>");
394
453
  auto* store_value = new std::shared_ptr<T>(value);
395
454
  return Set(
396
455
  name,
@@ -418,6 +477,8 @@ class ChannelArgs {
418
477
  absl::optional<int> GetInt(absl::string_view name) const;
419
478
  absl::optional<absl::string_view> GetString(absl::string_view name) const;
420
479
  absl::optional<std::string> GetOwnedString(absl::string_view name) const;
480
+ // WARNING: this is broken if `name` represents something that was stored as a
481
+ // RefCounted<const T> - we will discard the const-ness.
421
482
  void* GetVoidPointer(absl::string_view name) const;
422
483
  template <typename T>
423
484
  typename GetObjectImpl<T>::StoredType GetPointer(
@@ -28,6 +28,7 @@
28
28
  #include <grpc/support/log.h>
29
29
 
30
30
  #include "src/core/lib/channel/channel_args.h"
31
+ #include "src/core/lib/channel/channel_fwd.h"
31
32
  #include "src/core/lib/channel/channel_stack_trace.h"
32
33
  #include "src/core/lib/gpr/alloc.h"
33
34
  #include "src/core/lib/surface/channel_init.h"
@@ -320,3 +321,29 @@ grpc_channel_stack::MakeServerCallPromise(grpc_core::CallArgs call_args) {
320
321
  return ServerNext(grpc_channel_stack_element(this, this->count - 1))(
321
322
  std::move(call_args));
322
323
  }
324
+
325
+ void grpc_channel_stack::InitClientCallSpine(
326
+ grpc_core::CallSpineInterface* call) {
327
+ for (size_t i = 0; i < count; i++) {
328
+ auto* elem = grpc_channel_stack_element(this, i);
329
+ if (elem->filter->init_call == nullptr) {
330
+ grpc_core::Crash(
331
+ absl::StrCat("Filter '", elem->filter->name,
332
+ "' does not support the call-v3 interface"));
333
+ }
334
+ elem->filter->init_call(elem, call);
335
+ }
336
+ }
337
+
338
+ void grpc_channel_stack::InitServerCallSpine(
339
+ grpc_core::CallSpineInterface* call) {
340
+ for (size_t i = 0; i < count; i++) {
341
+ auto* elem = grpc_channel_stack_element(this, count - 1 - i);
342
+ if (elem->filter->init_call == nullptr) {
343
+ grpc_core::Crash(
344
+ absl::StrCat("Filter '", elem->filter->name,
345
+ "' does not support the call-v3 interface"));
346
+ }
347
+ elem->filter->init_call(elem, call);
348
+ }
349
+ }
@@ -72,6 +72,7 @@
72
72
  #include "src/core/lib/iomgr/polling_entity.h"
73
73
  #include "src/core/lib/promise/arena_promise.h"
74
74
  #include "src/core/lib/resource_quota/arena.h"
75
+ #include "src/core/lib/transport/call_final_info.h"
75
76
  #include "src/core/lib/transport/transport.h"
76
77
 
77
78
  struct grpc_channel_element_args {
@@ -90,16 +91,6 @@ struct grpc_call_element_args {
90
91
  grpc_core::Arena* arena;
91
92
  grpc_core::CallCombiner* call_combiner;
92
93
  };
93
- struct grpc_call_stats {
94
- grpc_transport_stream_stats transport_stream_stats;
95
- gpr_timespec latency; // From call creating to enqueing of received status
96
- };
97
- /// Information about the call upon completion.
98
- struct grpc_call_final_info {
99
- grpc_call_stats stats;
100
- grpc_status_code final_status = GRPC_STATUS_OK;
101
- const char* error_string = nullptr;
102
- };
103
94
 
104
95
  // Channel filters specify:
105
96
  // 1. the amount of memory needed in the channel & call (via the sizeof_XXX
@@ -128,6 +119,12 @@ struct grpc_channel_filter {
128
119
  grpc_core::ArenaPromise<grpc_core::ServerMetadataHandle> (*make_call_promise)(
129
120
  grpc_channel_element* elem, grpc_core::CallArgs call_args,
130
121
  grpc_core::NextPromiseFactory next_promise_factory);
122
+ // Register interceptors into a call.
123
+ // If this is non-null it may be used in preference to make_call_promise.
124
+ // There is an on-going migration to move all filters to providing this, and
125
+ // then to drop start_transport_stream_op_batch.
126
+ void (*init_call)(grpc_channel_element* elem,
127
+ grpc_core::CallSpineInterface* call_spine);
131
128
  // Called to handle channel level operations - e.g. new calls, or transport
132
129
  // closure.
133
130
  // See grpc_channel_next_op on how to call the next element in the stack
@@ -238,6 +235,9 @@ struct grpc_channel_stack {
238
235
  MakeClientCallPromise(grpc_core::CallArgs call_args);
239
236
  grpc_core::ArenaPromise<grpc_core::ServerMetadataHandle>
240
237
  MakeServerCallPromise(grpc_core::CallArgs call_args);
238
+
239
+ void InitClientCallSpine(grpc_core::CallSpineInterface* call);
240
+ void InitServerCallSpine(grpc_core::CallSpineInterface* call);
241
241
  };
242
242
 
243
243
  // A call stack tracks a set of related filters for one call, and guarantees
@@ -411,6 +411,8 @@ auto ConnectedChannelStream::RecvMessages(
411
411
  }
412
412
  if (cancel_on_error && !status.ok()) {
413
413
  incoming_messages.CloseWithError();
414
+ } else {
415
+ incoming_messages.Close();
414
416
  }
415
417
  return Immediate(LoopCtl<absl::Status>(status.status()));
416
418
  };
@@ -857,6 +859,7 @@ grpc_channel_filter MakeConnectedFilter() {
857
859
  return {
858
860
  connected_channel_start_transport_stream_op_batch,
859
861
  make_call_promise != nullptr ? make_call_wrapper : nullptr,
862
+ /* init_call: */ nullptr,
860
863
  connected_channel_start_transport_op,
861
864
  sizeof(call_data),
862
865
  connected_channel_init_call_elem,
@@ -870,10 +873,12 @@ grpc_channel_filter MakeConnectedFilter() {
870
873
  // do this, and I'm not sure what that is yet. This is only "safe"
871
874
  // because call stacks place no additional data after the last call
872
875
  // element, and the last call element MUST be the connected channel.
873
- channel_stack->call_stack_size +=
874
- static_cast<channel_data*>(elem->channel_data)
875
- ->transport->filter_stack_transport()
876
- ->SizeOfStream();
876
+ auto* transport =
877
+ static_cast<channel_data*>(elem->channel_data)->transport;
878
+ if (transport->filter_stack_transport() != nullptr) {
879
+ channel_stack->call_stack_size +=
880
+ transport->filter_stack_transport()->SizeOfStream();
881
+ }
877
882
  },
878
883
  connected_channel_destroy_channel_elem,
879
884
  connected_channel_get_channel_info,
@@ -881,13 +886,27 @@ grpc_channel_filter MakeConnectedFilter() {
881
886
  };
882
887
  }
883
888
 
884
- ArenaPromise<ServerMetadataHandle> MakeTransportCallPromise(
889
+ ArenaPromise<ServerMetadataHandle> MakeClientTransportCallPromise(
885
890
  Transport* transport, CallArgs call_args, NextPromiseFactory) {
886
- return transport->client_transport()->MakeCallPromise(std::move(call_args));
891
+ auto spine = GetContext<CallContext>()->MakeCallSpine(std::move(call_args));
892
+ transport->client_transport()->StartCall(CallHandler{spine});
893
+ return Map(spine->server_trailing_metadata().receiver.Next(),
894
+ [](NextResult<ServerMetadataHandle> r) {
895
+ if (r.has_value()) {
896
+ auto md = std::move(r.value());
897
+ md->Set(GrpcStatusFromWire(), true);
898
+ return md;
899
+ }
900
+ auto m = GetContext<Arena>()->MakePooled<ServerMetadata>(
901
+ GetContext<Arena>());
902
+ m->Set(GrpcStatusMetadata(), GRPC_STATUS_CANCELLED);
903
+ m->Set(GrpcCallWasCancelled(), true);
904
+ return m;
905
+ });
887
906
  }
888
907
 
889
- const grpc_channel_filter kPromiseBasedTransportFilter =
890
- MakeConnectedFilter<MakeTransportCallPromise>();
908
+ const grpc_channel_filter kClientPromiseBasedTransportFilter =
909
+ MakeConnectedFilter<MakeClientTransportCallPromise>();
891
910
 
892
911
  #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
893
912
  const grpc_channel_filter kClientEmulatedFilter =
@@ -905,11 +924,37 @@ const grpc_channel_filter kServerEmulatedFilter =
905
924
  MakeConnectedFilter<nullptr>();
906
925
  #endif
907
926
 
908
- bool TransportSupportsPromiseBasedCalls(const ChannelArgs& args) {
927
+ // noop filter for the v3 stack: placeholder for now because other code requires
928
+ // we have a terminator.
929
+ // TODO(ctiller): delete when v3 transition is complete.
930
+ const grpc_channel_filter kServerPromiseBasedTransportFilter = {
931
+ nullptr,
932
+ [](grpc_channel_element*, CallArgs, NextPromiseFactory)
933
+ -> ArenaPromise<ServerMetadataHandle> { Crash("not implemented"); },
934
+ /* init_call: */ [](grpc_channel_element*, CallSpineInterface*) {},
935
+ connected_channel_start_transport_op,
936
+ 0,
937
+ nullptr,
938
+ set_pollset_or_pollset_set,
939
+ nullptr,
940
+ sizeof(channel_data),
941
+ connected_channel_init_channel_elem,
942
+ +[](grpc_channel_stack*, grpc_channel_element*) {},
943
+ connected_channel_destroy_channel_elem,
944
+ connected_channel_get_channel_info,
945
+ "connected",
946
+ };
947
+
948
+ bool TransportSupportsClientPromiseBasedCalls(const ChannelArgs& args) {
909
949
  auto* transport = args.GetObject<Transport>();
910
950
  return transport->client_transport() != nullptr;
911
951
  }
912
952
 
953
+ bool TransportSupportsServerPromiseBasedCalls(const ChannelArgs& args) {
954
+ auto* transport = args.GetObject<Transport>();
955
+ return transport->server_transport() != nullptr;
956
+ }
957
+
913
958
  } // namespace
914
959
 
915
960
  void RegisterConnectedChannel(CoreConfiguration::Builder* builder) {
@@ -922,32 +967,33 @@ void RegisterConnectedChannel(CoreConfiguration::Builder* builder) {
922
967
  // Option 1, and our ideal: the transport supports promise based calls,
923
968
  // and so we simply use the transport directly.
924
969
  builder->channel_init()
925
- ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &kPromiseBasedTransportFilter)
970
+ ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL,
971
+ &kClientPromiseBasedTransportFilter)
926
972
  .Terminal()
927
- .If(TransportSupportsPromiseBasedCalls);
973
+ .If(TransportSupportsClientPromiseBasedCalls);
928
974
  builder->channel_init()
929
975
  ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL,
930
- &kPromiseBasedTransportFilter)
976
+ &kClientPromiseBasedTransportFilter)
931
977
  .Terminal()
932
- .If(TransportSupportsPromiseBasedCalls);
978
+ .If(TransportSupportsClientPromiseBasedCalls);
933
979
  builder->channel_init()
934
- ->RegisterFilter(GRPC_SERVER_CHANNEL, &kPromiseBasedTransportFilter)
980
+ ->RegisterFilter(GRPC_SERVER_CHANNEL, &kServerPromiseBasedTransportFilter)
935
981
  .Terminal()
936
- .If(TransportSupportsPromiseBasedCalls);
982
+ .If(TransportSupportsServerPromiseBasedCalls);
937
983
 
938
984
  // Option 2: the transport does not support promise based calls.
939
985
  builder->channel_init()
940
986
  ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL, &kClientEmulatedFilter)
941
987
  .Terminal()
942
- .IfNot(TransportSupportsPromiseBasedCalls);
988
+ .IfNot(TransportSupportsClientPromiseBasedCalls);
943
989
  builder->channel_init()
944
990
  ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL, &kClientEmulatedFilter)
945
991
  .Terminal()
946
- .IfNot(TransportSupportsPromiseBasedCalls);
992
+ .IfNot(TransportSupportsClientPromiseBasedCalls);
947
993
  builder->channel_init()
948
994
  ->RegisterFilter(GRPC_SERVER_CHANNEL, &kServerEmulatedFilter)
949
995
  .Terminal()
950
- .IfNot(TransportSupportsPromiseBasedCalls);
996
+ .IfNot(TransportSupportsServerPromiseBasedCalls);
951
997
  }
952
998
 
953
999
  } // namespace grpc_core