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
@@ -55,9 +55,13 @@
55
55
  #include "src/core/lib/promise/context.h"
56
56
  #include "src/core/lib/promise/detail/status.h"
57
57
  #include "src/core/lib/promise/latch.h"
58
+ #include "src/core/lib/promise/party.h"
58
59
  #include "src/core/lib/promise/pipe.h"
60
+ #include "src/core/lib/promise/race.h"
61
+ #include "src/core/lib/promise/status_flag.h"
59
62
  #include "src/core/lib/resource_quota/arena.h"
60
63
  #include "src/core/lib/slice/slice_buffer.h"
64
+ #include "src/core/lib/transport/call_final_info.h"
61
65
  #include "src/core/lib/transport/connectivity_state.h"
62
66
  #include "src/core/lib/transport/metadata_batch.h"
63
67
  #include "src/core/lib/transport/transport_fwd.h"
@@ -147,6 +151,17 @@ struct StatusCastImpl<ServerMetadataHandle, absl::Status&> {
147
151
  }
148
152
  };
149
153
 
154
+ // Anything that can be first cast to absl::Status can then be cast to
155
+ // ServerMetadataHandle.
156
+ template <typename T>
157
+ struct StatusCastImpl<
158
+ ServerMetadataHandle, T,
159
+ absl::void_t<decltype(StatusCast<absl::Status>(std::declval<T>()))>> {
160
+ static ServerMetadataHandle Cast(const T& m) {
161
+ return ServerMetadataFromStatus(StatusCast<absl::Status>(m));
162
+ }
163
+ };
164
+
150
165
  // Move only type that tracks call startup.
151
166
  // Allows observation of when client_initial_metadata has been processed by the
152
167
  // end of the local call stack.
@@ -228,6 +243,367 @@ struct CallArgs {
228
243
  using NextPromiseFactory =
229
244
  std::function<ArenaPromise<ServerMetadataHandle>(CallArgs)>;
230
245
 
246
+ // The common middle part of a call - a reference is held by each of
247
+ // CallInitiator and CallHandler - which provide interfaces that are appropriate
248
+ // for each side of a call.
249
+ // The spine will ultimately host the pipes, filters, and context for one part
250
+ // of a call: ie top-half client channel, sub channel call, server call.
251
+ // TODO(ctiller): eventually drop this when we don't need to reference into
252
+ // legacy promise calls anymore
253
+ class CallSpineInterface {
254
+ public:
255
+ virtual ~CallSpineInterface() = default;
256
+ virtual Pipe<ClientMetadataHandle>& client_initial_metadata() = 0;
257
+ virtual Pipe<ServerMetadataHandle>& server_initial_metadata() = 0;
258
+ virtual Pipe<MessageHandle>& client_to_server_messages() = 0;
259
+ virtual Pipe<MessageHandle>& server_to_client_messages() = 0;
260
+ virtual Pipe<ServerMetadataHandle>& server_trailing_metadata() = 0;
261
+ virtual Latch<ServerMetadataHandle>& cancel_latch() = 0;
262
+ // Add a callback to be called when server trailing metadata is received.
263
+ void OnDone(absl::AnyInvocable<void()> fn) {
264
+ if (on_done_ == nullptr) {
265
+ on_done_ = std::move(fn);
266
+ return;
267
+ }
268
+ on_done_ = [first = std::move(fn), next = std::move(on_done_)]() mutable {
269
+ first();
270
+ next();
271
+ };
272
+ }
273
+ void CallOnDone() {
274
+ if (on_done_ != nullptr) std::exchange(on_done_, nullptr)();
275
+ }
276
+ virtual Party& party() = 0;
277
+ virtual void IncrementRefCount() = 0;
278
+ virtual void Unref() = 0;
279
+
280
+ // Cancel the call with the given metadata.
281
+ // Regarding the `MUST_USE_RESULT absl::nullopt_t`:
282
+ // Most cancellation calls right now happen in pipe interceptors;
283
+ // there `nullopt` indicates terminate processing of this pipe and close with
284
+ // error.
285
+ // It's convenient then to have the Cancel operation (setting the latch to
286
+ // terminate the call) be the last thing that occurs in a pipe interceptor,
287
+ // and this construction supports that (and has helped the author not write
288
+ // some bugs).
289
+ GRPC_MUST_USE_RESULT absl::nullopt_t Cancel(ServerMetadataHandle metadata) {
290
+ GPR_DEBUG_ASSERT(Activity::current() == &party());
291
+ auto& c = cancel_latch();
292
+ if (c.is_set()) return absl::nullopt;
293
+ c.Set(std::move(metadata));
294
+ CallOnDone();
295
+ client_initial_metadata().sender.CloseWithError();
296
+ server_initial_metadata().sender.CloseWithError();
297
+ client_to_server_messages().sender.CloseWithError();
298
+ server_to_client_messages().sender.CloseWithError();
299
+ return absl::nullopt;
300
+ }
301
+
302
+ auto WaitForCancel() {
303
+ GPR_DEBUG_ASSERT(Activity::current() == &party());
304
+ return cancel_latch().Wait();
305
+ }
306
+
307
+ // Wrap a promise so that if it returns failure it automatically cancels
308
+ // the rest of the call.
309
+ // The resulting (returned) promise will resolve to Empty.
310
+ template <typename Promise>
311
+ auto CancelIfFails(Promise promise) {
312
+ GPR_DEBUG_ASSERT(Activity::current() == &party());
313
+ using P = promise_detail::PromiseLike<Promise>;
314
+ using ResultType = typename P::Result;
315
+ return Map(std::move(promise), [this](ResultType r) {
316
+ if (!IsStatusOk(r)) {
317
+ std::ignore = Cancel(StatusCast<ServerMetadataHandle>(r));
318
+ }
319
+ return r;
320
+ });
321
+ }
322
+
323
+ // Spawn a promise that returns Empty{} and save some boilerplate handling
324
+ // that detail.
325
+ template <typename PromiseFactory>
326
+ void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
327
+ party().Spawn(name, std::move(promise_factory), [](Empty) {});
328
+ }
329
+
330
+ // Spawn a promise that returns some status-like type; if the status
331
+ // represents failure automatically cancel the rest of the call.
332
+ template <typename PromiseFactory>
333
+ void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) {
334
+ using FactoryType =
335
+ promise_detail::OncePromiseFactory<void, PromiseFactory>;
336
+ using PromiseType = typename FactoryType::Promise;
337
+ using ResultType = typename PromiseType::Result;
338
+ static_assert(
339
+ std::is_same<bool,
340
+ decltype(IsStatusOk(std::declval<ResultType>()))>::value,
341
+ "SpawnGuarded promise must return a status-like object");
342
+ party().Spawn(name, std::move(promise_factory), [this](ResultType r) {
343
+ if (!IsStatusOk(r)) {
344
+ std::ignore = Cancel(StatusCast<ServerMetadataHandle>(std::move(r)));
345
+ }
346
+ });
347
+ }
348
+
349
+ private:
350
+ absl::AnyInvocable<void()> on_done_{nullptr};
351
+ };
352
+
353
+ class CallSpine final : public CallSpineInterface, public Party {
354
+ public:
355
+ static RefCountedPtr<CallSpine> Create(
356
+ grpc_event_engine::experimental::EventEngine* event_engine,
357
+ Arena* arena) {
358
+ return RefCountedPtr<CallSpine>(arena->New<CallSpine>(event_engine, arena));
359
+ }
360
+
361
+ Pipe<ClientMetadataHandle>& client_initial_metadata() override {
362
+ return client_initial_metadata_;
363
+ }
364
+ Pipe<ServerMetadataHandle>& server_initial_metadata() override {
365
+ return server_initial_metadata_;
366
+ }
367
+ Pipe<MessageHandle>& client_to_server_messages() override {
368
+ return client_to_server_messages_;
369
+ }
370
+ Pipe<MessageHandle>& server_to_client_messages() override {
371
+ return server_to_client_messages_;
372
+ }
373
+ Pipe<ServerMetadataHandle>& server_trailing_metadata() override {
374
+ return server_trailing_metadata_;
375
+ }
376
+ Latch<ServerMetadataHandle>& cancel_latch() override { return cancel_latch_; }
377
+ Party& party() override { return *this; }
378
+ void IncrementRefCount() override { Party::IncrementRefCount(); }
379
+ void Unref() override { Party::Unref(); }
380
+
381
+ private:
382
+ friend class Arena;
383
+ CallSpine(grpc_event_engine::experimental::EventEngine* event_engine,
384
+ Arena* arena)
385
+ : Party(arena, 1), event_engine_(event_engine) {}
386
+
387
+ class ScopedContext : public ScopedActivity,
388
+ public promise_detail::Context<Arena> {
389
+ public:
390
+ explicit ScopedContext(CallSpine* spine)
391
+ : ScopedActivity(&spine->party()), Context<Arena>(spine->arena()) {}
392
+ };
393
+
394
+ bool RunParty() override {
395
+ ScopedContext context(this);
396
+ return Party::RunParty();
397
+ }
398
+
399
+ void PartyOver() override {
400
+ Arena* a = arena();
401
+ {
402
+ ScopedContext context(this);
403
+ CancelRemainingParticipants();
404
+ a->DestroyManagedNewObjects();
405
+ }
406
+ this->~CallSpine();
407
+ a->Destroy();
408
+ }
409
+
410
+ grpc_event_engine::experimental::EventEngine* event_engine() const override {
411
+ return event_engine_;
412
+ }
413
+
414
+ // Initial metadata from client to server
415
+ Pipe<ClientMetadataHandle> client_initial_metadata_{arena()};
416
+ // Initial metadata from server to client
417
+ Pipe<ServerMetadataHandle> server_initial_metadata_{arena()};
418
+ // Messages travelling from the application to the transport.
419
+ Pipe<MessageHandle> client_to_server_messages_{arena()};
420
+ // Messages travelling from the transport to the application.
421
+ Pipe<MessageHandle> server_to_client_messages_{arena()};
422
+ // Trailing metadata from server to client
423
+ Pipe<ServerMetadataHandle> server_trailing_metadata_{arena()};
424
+ // Latch that can be set to terminate the call
425
+ Latch<ServerMetadataHandle> cancel_latch_;
426
+ // Event engine associated with this call
427
+ grpc_event_engine::experimental::EventEngine* const event_engine_;
428
+ };
429
+
430
+ class CallInitiator {
431
+ public:
432
+ explicit CallInitiator(RefCountedPtr<CallSpineInterface> spine)
433
+ : spine_(std::move(spine)) {}
434
+
435
+ auto PushClientInitialMetadata(ClientMetadataHandle md) {
436
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
437
+ return Map(spine_->client_initial_metadata().sender.Push(std::move(md)),
438
+ [](bool ok) { return StatusFlag(ok); });
439
+ }
440
+
441
+ auto PullServerInitialMetadata() {
442
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
443
+ return Map(spine_->server_initial_metadata().receiver.Next(),
444
+ [](NextResult<ClientMetadataHandle> md)
445
+ -> ValueOrFailure<ClientMetadataHandle> {
446
+ if (!md.has_value()) return Failure{};
447
+ return std::move(*md);
448
+ });
449
+ }
450
+
451
+ auto PullServerTrailingMetadata() {
452
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
453
+ return Race(spine_->WaitForCancel(),
454
+ Map(spine_->server_trailing_metadata().receiver.Next(),
455
+ [spine = spine_](NextResult<ServerMetadataHandle> md)
456
+ -> ServerMetadataHandle {
457
+ GPR_ASSERT(md.has_value());
458
+ return std::move(*md);
459
+ }));
460
+ }
461
+
462
+ auto PullMessage() {
463
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
464
+ return spine_->server_to_client_messages().receiver.Next();
465
+ }
466
+
467
+ auto PushMessage(MessageHandle message) {
468
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
469
+ return Map(
470
+ spine_->client_to_server_messages().sender.Push(std::move(message)),
471
+ [](bool r) { return StatusFlag(r); });
472
+ }
473
+
474
+ void FinishSends() {
475
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
476
+ spine_->client_to_server_messages().sender.Close();
477
+ }
478
+
479
+ template <typename Promise>
480
+ auto CancelIfFails(Promise promise) {
481
+ return spine_->CancelIfFails(std::move(promise));
482
+ }
483
+
484
+ void Cancel() {
485
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
486
+ std::ignore =
487
+ spine_->Cancel(ServerMetadataFromStatus(absl::CancelledError()));
488
+ }
489
+
490
+ template <typename PromiseFactory>
491
+ void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) {
492
+ spine_->SpawnGuarded(name, std::move(promise_factory));
493
+ }
494
+
495
+ template <typename PromiseFactory>
496
+ void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
497
+ spine_->SpawnInfallible(name, std::move(promise_factory));
498
+ }
499
+
500
+ template <typename PromiseFactory>
501
+ auto SpawnWaitable(absl::string_view name, PromiseFactory promise_factory) {
502
+ return spine_->party().SpawnWaitable(name, std::move(promise_factory));
503
+ }
504
+
505
+ Arena* arena() { return spine_->party().arena(); }
506
+
507
+ private:
508
+ RefCountedPtr<CallSpineInterface> spine_;
509
+ };
510
+
511
+ class CallHandler {
512
+ public:
513
+ explicit CallHandler(RefCountedPtr<CallSpineInterface> spine)
514
+ : spine_(std::move(spine)) {}
515
+
516
+ auto PullClientInitialMetadata() {
517
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
518
+ return Map(spine_->client_initial_metadata().receiver.Next(),
519
+ [](NextResult<ClientMetadataHandle> md)
520
+ -> ValueOrFailure<ClientMetadataHandle> {
521
+ if (!md.has_value()) return Failure{};
522
+ return std::move(*md);
523
+ });
524
+ }
525
+
526
+ auto PushServerInitialMetadata(ServerMetadataHandle md) {
527
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
528
+ return Map(spine_->server_initial_metadata().sender.Push(std::move(md)),
529
+ [](bool ok) { return StatusFlag(ok); });
530
+ }
531
+
532
+ auto PushServerTrailingMetadata(ServerMetadataHandle md) {
533
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
534
+ spine_->server_to_client_messages().sender.Close();
535
+ spine_->CallOnDone();
536
+ return Map(spine_->server_trailing_metadata().sender.Push(std::move(md)),
537
+ [](bool ok) { return StatusFlag(ok); });
538
+ }
539
+
540
+ auto PullMessage() {
541
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
542
+ return spine_->client_to_server_messages().receiver.Next();
543
+ }
544
+
545
+ auto PushMessage(MessageHandle message) {
546
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
547
+ return Map(
548
+ spine_->server_to_client_messages().sender.Push(std::move(message)),
549
+ [](bool ok) { return StatusFlag(ok); });
550
+ }
551
+
552
+ void Cancel(ServerMetadataHandle status) {
553
+ GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
554
+ std::ignore = spine_->Cancel(std::move(status));
555
+ }
556
+
557
+ void OnDone(absl::AnyInvocable<void()> fn) { spine_->OnDone(std::move(fn)); }
558
+
559
+ template <typename Promise>
560
+ auto CancelIfFails(Promise promise) {
561
+ return spine_->CancelIfFails(std::move(promise));
562
+ }
563
+
564
+ template <typename PromiseFactory>
565
+ void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) {
566
+ spine_->SpawnGuarded(name, std::move(promise_factory));
567
+ }
568
+
569
+ template <typename PromiseFactory>
570
+ void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
571
+ spine_->SpawnInfallible(name, std::move(promise_factory));
572
+ }
573
+
574
+ template <typename PromiseFactory>
575
+ auto SpawnWaitable(absl::string_view name, PromiseFactory promise_factory) {
576
+ return spine_->party().SpawnWaitable(name, std::move(promise_factory));
577
+ }
578
+
579
+ Arena* arena() { return spine_->party().arena(); }
580
+
581
+ private:
582
+ RefCountedPtr<CallSpineInterface> spine_;
583
+ };
584
+
585
+ struct CallInitiatorAndHandler {
586
+ CallInitiator initiator;
587
+ CallHandler handler;
588
+ };
589
+
590
+ CallInitiatorAndHandler MakeCall(
591
+ grpc_event_engine::experimental::EventEngine* event_engine, Arena* arena);
592
+
593
+ template <typename CallHalf>
594
+ auto OutgoingMessages(CallHalf h) {
595
+ struct Wrapper {
596
+ CallHalf h;
597
+ auto Next() { return h.PullMessage(); }
598
+ };
599
+ return Wrapper{std::move(h)};
600
+ }
601
+
602
+ // Forward a call from `call_handler` to `call_initiator` (with initial metadata
603
+ // `client_initial_metadata`)
604
+ void ForwardCall(CallHandler call_handler, CallInitiator call_initiator,
605
+ ClientMetadataHandle client_initial_metadata);
606
+
231
607
  } // namespace grpc_core
232
608
 
233
609
  // forward declarations
@@ -304,24 +680,6 @@ inline void grpc_stream_unref(grpc_stream_refcount* refcount) {
304
680
  grpc_slice grpc_slice_from_stream_owned_buffer(grpc_stream_refcount* refcount,
305
681
  void* buffer, size_t length);
306
682
 
307
- struct grpc_transport_one_way_stats {
308
- uint64_t framing_bytes = 0;
309
- uint64_t data_bytes = 0;
310
- uint64_t header_bytes = 0;
311
- };
312
-
313
- struct grpc_transport_stream_stats {
314
- grpc_transport_one_way_stats incoming;
315
- grpc_transport_one_way_stats outgoing;
316
- gpr_timespec latency = gpr_inf_future(GPR_TIMESPAN);
317
- };
318
-
319
- void grpc_transport_move_one_way_stats(grpc_transport_one_way_stats* from,
320
- grpc_transport_one_way_stats* to);
321
-
322
- void grpc_transport_move_stats(grpc_transport_stream_stats* from,
323
- grpc_transport_stream_stats* to);
324
-
325
683
  // This struct (which is present in both grpc_transport_stream_op_batch
326
684
  // and grpc_transport_op_batch) is a convenience to allow filters or
327
685
  // transports to schedule a closure related to a particular batch without
@@ -633,9 +991,7 @@ class FilterStackTransport {
633
991
 
634
992
  class ClientTransport {
635
993
  public:
636
- // Create a promise to execute one client call.
637
- virtual ArenaPromise<ServerMetadataHandle> MakeCallPromise(
638
- CallArgs call_args) = 0;
994
+ virtual void StartCall(CallHandler call_handler) = 0;
639
995
 
640
996
  protected:
641
997
  ~ClientTransport() = default;
@@ -643,10 +999,24 @@ class ClientTransport {
643
999
 
644
1000
  class ServerTransport {
645
1001
  public:
646
- // Register the factory function for the filter stack part of a call
647
- // promise.
648
- void SetCallPromiseFactory(
649
- absl::AnyInvocable<ArenaPromise<ServerMetadataHandle>(CallArgs) const>);
1002
+ // Acceptor helps transports create calls.
1003
+ class Acceptor {
1004
+ public:
1005
+ // Returns an arena that can be used to allocate memory for initial metadata
1006
+ // parsing, and later passed to CreateCall() as the underlying arena for
1007
+ // that call.
1008
+ virtual Arena* CreateArena() = 0;
1009
+ // Create a call at the server (or fail)
1010
+ // arena must have been previously allocated by CreateArena()
1011
+ virtual absl::StatusOr<CallInitiator> CreateCall(
1012
+ ClientMetadata& client_initial_metadata, Arena* arena) = 0;
1013
+
1014
+ protected:
1015
+ ~Acceptor() = default;
1016
+ };
1017
+
1018
+ // Called once slightly after transport setup to register the accept function.
1019
+ virtual void SetAcceptor(Acceptor* acceptor) = 0;
650
1020
 
651
1021
  protected:
652
1022
  ~ServerTransport() = default;
@@ -40,6 +40,8 @@ extern void SecurityRegisterHandshakerFactories(
40
40
  CoreConfiguration::Builder* builder);
41
41
  extern void RegisterClientAuthorityFilter(CoreConfiguration::Builder* builder);
42
42
  extern void RegisterChannelIdleFilters(CoreConfiguration::Builder* builder);
43
+ extern void RegisterLegacyChannelIdleFilters(
44
+ CoreConfiguration::Builder* builder);
43
45
  extern void RegisterDeadlineFilter(CoreConfiguration::Builder* builder);
44
46
  extern void RegisterGrpcLbPolicy(CoreConfiguration::Builder* builder);
45
47
  extern void RegisterHttpFilters(CoreConfiguration::Builder* builder);
@@ -89,6 +91,7 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) {
89
91
  SecurityRegisterHandshakerFactories(builder);
90
92
  RegisterClientAuthorityFilter(builder);
91
93
  RegisterChannelIdleFilters(builder);
94
+ RegisterLegacyChannelIdleFilters(builder);
92
95
  RegisterConnectedChannel(builder);
93
96
  RegisterGrpcLbPolicy(builder);
94
97
  RegisterHttpFilters(builder);
@@ -34,8 +34,6 @@ extern void RegisterXdsClusterManagerLbPolicy(
34
34
  CoreConfiguration::Builder* builder);
35
35
  extern void RegisterXdsClusterImplLbPolicy(CoreConfiguration::Builder* builder);
36
36
  extern void RegisterCdsLbPolicy(CoreConfiguration::Builder* builder);
37
- extern void RegisterXdsClusterResolverLbPolicy(
38
- CoreConfiguration::Builder* builder);
39
37
  extern void RegisterXdsOverrideHostLbPolicy(
40
38
  CoreConfiguration::Builder* builder);
41
39
  extern void RegisterXdsWrrLocalityLbPolicy(CoreConfiguration::Builder* builder);
@@ -58,7 +56,6 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) {
58
56
  RegisterXdsClusterManagerLbPolicy(builder);
59
57
  RegisterXdsClusterImplLbPolicy(builder);
60
58
  RegisterCdsLbPolicy(builder);
61
- RegisterXdsClusterResolverLbPolicy(builder);
62
59
  RegisterXdsOverrideHostLbPolicy(builder);
63
60
  RegisterXdsWrrLocalityLbPolicy(builder);
64
61
  RegisterRingHashLbPolicy(builder);
@@ -23,7 +23,7 @@
23
23
  #include <list>
24
24
 
25
25
  #include "absl/strings/numbers.h"
26
- #include "upb/upb.hpp"
26
+ #include "upb/mem/arena.hpp"
27
27
 
28
28
  #include <grpc/byte_buffer.h>
29
29
  #include <grpc/support/alloc.h>
@@ -24,7 +24,7 @@
24
24
  #include <stdlib.h>
25
25
  #include <string.h>
26
26
 
27
- #include "upb/upb.hpp"
27
+ #include "upb/mem/arena.hpp"
28
28
 
29
29
  #include <grpc/grpc_security.h>
30
30
  #include <grpc/support/alloc.h>
@@ -20,7 +20,7 @@
20
20
 
21
21
  #include "src/core/tsi/alts/handshaker/transport_security_common_api.h"
22
22
 
23
- #include "upb/upb.hpp"
23
+ #include "upb/mem/arena.hpp"
24
24
 
25
25
  bool grpc_gcp_rpc_protocol_versions_set_max(
26
26
  grpc_gcp_rpc_protocol_versions* versions, uint32_t max_major,