grpc 1.60.0 → 1.61.0.pre2

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