grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -51,6 +51,7 @@
51
51
  #include "src/core/lib/channel/channel_trace.h"
52
52
  #include "src/core/lib/channel/channelz.h"
53
53
  #include "src/core/lib/config/core_configuration.h"
54
+ #include "src/core/lib/debug/stats.h"
54
55
  #include "src/core/lib/experiments/experiments.h"
55
56
  #include "src/core/lib/gpr/useful.h"
56
57
  #include "src/core/lib/gprpp/crash.h"
@@ -67,6 +68,7 @@
67
68
  #include "src/core/lib/promise/poll.h"
68
69
  #include "src/core/lib/promise/promise.h"
69
70
  #include "src/core/lib/promise/seq.h"
71
+ #include "src/core/lib/promise/try_join.h"
70
72
  #include "src/core/lib/promise/try_seq.h"
71
73
  #include "src/core/lib/slice/slice_buffer.h"
72
74
  #include "src/core/lib/slice/slice_internal.h"
@@ -75,6 +77,7 @@
75
77
  #include "src/core/lib/surface/channel.h"
76
78
  #include "src/core/lib/surface/channel_stack_type.h"
77
79
  #include "src/core/lib/surface/completion_queue.h"
80
+ #include "src/core/lib/surface/wait_for_cq_end_op.h"
78
81
  #include "src/core/lib/transport/connectivity_state.h"
79
82
  #include "src/core/lib/transport/error_utils.h"
80
83
 
@@ -82,57 +85,6 @@ namespace grpc_core {
82
85
 
83
86
  TraceFlag grpc_server_channel_trace(false, "server_channel");
84
87
 
85
- //
86
- // Server::RequestedCall
87
- //
88
-
89
- struct Server::RequestedCall {
90
- enum class Type { BATCH_CALL, REGISTERED_CALL };
91
-
92
- RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
93
- grpc_call** call_arg, grpc_metadata_array* initial_md,
94
- grpc_call_details* details)
95
- : type(Type::BATCH_CALL),
96
- tag(tag_arg),
97
- cq_bound_to_call(call_cq),
98
- call(call_arg),
99
- initial_metadata(initial_md) {
100
- data.batch.details = details;
101
- }
102
-
103
- RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
104
- grpc_call** call_arg, grpc_metadata_array* initial_md,
105
- RegisteredMethod* rm, gpr_timespec* deadline,
106
- grpc_byte_buffer** optional_payload)
107
- : type(Type::REGISTERED_CALL),
108
- tag(tag_arg),
109
- cq_bound_to_call(call_cq),
110
- call(call_arg),
111
- initial_metadata(initial_md) {
112
- data.registered.method = rm;
113
- data.registered.deadline = deadline;
114
- data.registered.optional_payload = optional_payload;
115
- }
116
-
117
- MultiProducerSingleConsumerQueue::Node mpscq_node;
118
- const Type type;
119
- void* const tag;
120
- grpc_completion_queue* const cq_bound_to_call;
121
- grpc_call** const call;
122
- grpc_cq_completion completion;
123
- grpc_metadata_array* const initial_metadata;
124
- union {
125
- struct {
126
- grpc_call_details* details;
127
- } batch;
128
- struct {
129
- RegisteredMethod* method;
130
- gpr_timespec* deadline;
131
- grpc_byte_buffer** optional_payload;
132
- } registered;
133
- } data;
134
- };
135
-
136
88
  //
137
89
  // Server::RegisteredMethod
138
90
  //
@@ -248,6 +200,87 @@ class Server::RequestMatcherInterface {
248
200
  virtual Server* server() const = 0;
249
201
  };
250
202
 
203
+ //
204
+ // Server::RequestedCall
205
+ //
206
+
207
+ struct Server::RequestedCall {
208
+ enum class Type { BATCH_CALL, REGISTERED_CALL };
209
+
210
+ RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
211
+ grpc_call** call_arg, grpc_metadata_array* initial_md,
212
+ grpc_call_details* details)
213
+ : type(Type::BATCH_CALL),
214
+ tag(tag_arg),
215
+ cq_bound_to_call(call_cq),
216
+ call(call_arg),
217
+ initial_metadata(initial_md) {
218
+ data.batch.details = details;
219
+ }
220
+
221
+ RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
222
+ grpc_call** call_arg, grpc_metadata_array* initial_md,
223
+ RegisteredMethod* rm, gpr_timespec* deadline,
224
+ grpc_byte_buffer** optional_payload)
225
+ : type(Type::REGISTERED_CALL),
226
+ tag(tag_arg),
227
+ cq_bound_to_call(call_cq),
228
+ call(call_arg),
229
+ initial_metadata(initial_md) {
230
+ data.registered.method = rm;
231
+ data.registered.deadline = deadline;
232
+ data.registered.optional_payload = optional_payload;
233
+ }
234
+
235
+ void Complete(NextResult<MessageHandle> payload, ClientMetadata& md) {
236
+ Timestamp deadline = GetContext<CallContext>()->deadline();
237
+ switch (type) {
238
+ case RequestedCall::Type::BATCH_CALL:
239
+ GPR_ASSERT(!payload.has_value());
240
+ data.batch.details->host =
241
+ CSliceRef(md.get_pointer(HttpAuthorityMetadata())->c_slice());
242
+ data.batch.details->method =
243
+ CSliceRef(md.Take(HttpPathMetadata())->c_slice());
244
+ data.batch.details->deadline =
245
+ deadline.as_timespec(GPR_CLOCK_MONOTONIC);
246
+ break;
247
+ case RequestedCall::Type::REGISTERED_CALL:
248
+ md.Remove(HttpPathMetadata());
249
+ *data.registered.deadline = deadline.as_timespec(GPR_CLOCK_MONOTONIC);
250
+ if (data.registered.optional_payload != nullptr) {
251
+ if (payload.has_value()) {
252
+ auto* sb = payload.value()->payload()->c_slice_buffer();
253
+ *data.registered.optional_payload =
254
+ grpc_raw_byte_buffer_create(sb->slices, sb->count);
255
+ } else {
256
+ *data.registered.optional_payload = nullptr;
257
+ }
258
+ }
259
+ break;
260
+ default:
261
+ GPR_UNREACHABLE_CODE(abort());
262
+ }
263
+ }
264
+
265
+ MultiProducerSingleConsumerQueue::Node mpscq_node;
266
+ const Type type;
267
+ void* const tag;
268
+ grpc_completion_queue* const cq_bound_to_call;
269
+ grpc_call** const call;
270
+ grpc_cq_completion completion;
271
+ grpc_metadata_array* const initial_metadata;
272
+ union {
273
+ struct {
274
+ grpc_call_details* details;
275
+ } batch;
276
+ struct {
277
+ RegisteredMethod* method;
278
+ gpr_timespec* deadline;
279
+ grpc_byte_buffer** optional_payload;
280
+ } registered;
281
+ } data;
282
+ };
283
+
251
284
  // The RealRequestMatcher is an implementation of RequestMatcherInterface that
252
285
  // actually uses all the features of RequestMatcherInterface: expecting the
253
286
  // application to explicitly request RPCs and then matching those to incoming
@@ -757,6 +790,9 @@ class ChannelBroadcaster {
757
790
  const grpc_channel_filter Server::kServerTopFilter = {
758
791
  Server::CallData::StartTransportStreamOpBatch,
759
792
  Server::ChannelData::MakeCallPromise,
793
+ [](grpc_channel_element*, CallSpineInterface*) {
794
+ // TODO(ctiller): remove the server filter when call-v3 is finalized
795
+ },
760
796
  grpc_channel_next_op,
761
797
  sizeof(Server::CallData),
762
798
  Server::CallData::InitCallElement,
@@ -794,7 +830,11 @@ RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
794
830
  Server::Server(const ChannelArgs& args)
795
831
  : channel_args_(args),
796
832
  channelz_node_(CreateChannelzNode(args)),
797
- server_call_tracer_factory_(ServerCallTracerFactory::Get(args)) {}
833
+ server_call_tracer_factory_(ServerCallTracerFactory::Get(args)),
834
+ max_time_in_pending_queue_(Duration::Seconds(
835
+ channel_args_
836
+ .GetInt(GRPC_ARG_SERVER_MAX_UNREQUESTED_TIME_IN_SERVER_SECONDS)
837
+ .value_or(30))) {}
798
838
 
799
839
  Server::~Server() {
800
840
  // Remove the cq pollsets from the config_fetcher.
@@ -814,7 +854,8 @@ void Server::AddListener(OrphanablePtr<ListenerInterface> listener) {
814
854
  channelz::ListenSocketNode* listen_socket_node =
815
855
  listener->channelz_listen_socket_node();
816
856
  if (listen_socket_node != nullptr && channelz_node_ != nullptr) {
817
- channelz_node_->AddChildListenSocket(listen_socket_node->Ref());
857
+ channelz_node_->AddChildListenSocket(
858
+ listen_socket_node->RefAsSubclass<channelz::ListenSocketNode>());
818
859
  }
819
860
  listeners_.emplace_back(std::move(listener));
820
861
  }
@@ -838,9 +879,9 @@ void Server::Start() {
838
879
  if (unregistered_request_matcher_ == nullptr) {
839
880
  unregistered_request_matcher_ = make_real_request_matcher();
840
881
  }
841
- for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
842
- if (rm->matcher == nullptr) {
843
- rm->matcher = make_real_request_matcher();
882
+ for (auto& rm : registered_methods_) {
883
+ if (rm.second->matcher == nullptr) {
884
+ rm.second->matcher = make_real_request_matcher();
844
885
  }
845
886
  }
846
887
  {
@@ -927,20 +968,11 @@ void Server::RegisterCompletionQueue(grpc_completion_queue* cq) {
927
968
  cqs_.push_back(cq);
928
969
  }
929
970
 
930
- namespace {
931
-
932
- bool streq(const std::string& a, const char* b) {
933
- return (a.empty() && b == nullptr) ||
934
- ((b != nullptr) && !strcmp(a.c_str(), b));
935
- }
936
-
937
- } // namespace
938
-
939
971
  Server::RegisteredMethod* Server::RegisterMethod(
940
972
  const char* method, const char* host,
941
973
  grpc_server_register_method_payload_handling payload_handling,
942
974
  uint32_t flags) {
943
- if (IsRegisteredMethodsMapEnabled() && started_) {
975
+ if (started_) {
944
976
  Crash("Attempting to register method after server started");
945
977
  }
946
978
 
@@ -949,21 +981,21 @@ Server::RegisteredMethod* Server::RegisterMethod(
949
981
  "grpc_server_register_method method string cannot be NULL");
950
982
  return nullptr;
951
983
  }
952
- for (std::unique_ptr<RegisteredMethod>& m : registered_methods_) {
953
- if (streq(m->method, method) && streq(m->host, host)) {
954
- gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
955
- host ? host : "*");
956
- return nullptr;
957
- }
984
+ auto key = std::make_pair(host ? host : "", method);
985
+ if (registered_methods_.find(key) != registered_methods_.end()) {
986
+ gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
987
+ host ? host : "*");
988
+ return nullptr;
958
989
  }
959
990
  if (flags != 0) {
960
991
  gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
961
992
  flags);
962
993
  return nullptr;
963
994
  }
964
- registered_methods_.emplace_back(std::make_unique<RegisteredMethod>(
965
- method, host, payload_handling, flags));
966
- return registered_methods_.back().get();
995
+ auto it = registered_methods_.emplace(
996
+ key, std::make_unique<RegisteredMethod>(method, host, payload_handling,
997
+ flags));
998
+ return it.first->second.get();
967
999
  }
968
1000
 
969
1001
  void Server::DoneRequestEvent(void* req, grpc_cq_completion* /*c*/) {
@@ -1014,9 +1046,9 @@ void Server::KillPendingWorkLocked(grpc_error_handle error) {
1014
1046
  if (started_) {
1015
1047
  unregistered_request_matcher_->KillRequests(error);
1016
1048
  unregistered_request_matcher_->ZombifyPending();
1017
- for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
1018
- rm->matcher->KillRequests(error);
1019
- rm->matcher->ZombifyPending();
1049
+ for (auto& rm : registered_methods_) {
1050
+ rm.second->matcher->KillRequests(error);
1051
+ rm.second->matcher->ZombifyPending();
1020
1052
  }
1021
1053
  }
1022
1054
  }
@@ -1251,7 +1283,6 @@ class Server::ChannelData::ConnectivityWatcher
1251
1283
  //
1252
1284
 
1253
1285
  Server::ChannelData::~ChannelData() {
1254
- old_registered_methods_.reset();
1255
1286
  if (server_ != nullptr) {
1256
1287
  if (server_->channelz_node_ != nullptr && channelz_socket_uuid_ != 0) {
1257
1288
  server_->channelz_node_->RemoveChildSocket(channelz_socket_uuid_);
@@ -1267,6 +1298,20 @@ Server::ChannelData::~ChannelData() {
1267
1298
  }
1268
1299
  }
1269
1300
 
1301
+ Arena* Server::ChannelData::CreateArena() {
1302
+ const auto initial_size = channel_->CallSizeEstimate();
1303
+ global_stats().IncrementCallInitialSize(initial_size);
1304
+ return Arena::Create(initial_size, channel_->allocator());
1305
+ }
1306
+
1307
+ absl::StatusOr<CallInitiator> Server::ChannelData::CreateCall(
1308
+ ClientMetadata& client_initial_metadata, Arena* arena) {
1309
+ SetRegisteredMethodOnMetadata(client_initial_metadata);
1310
+ auto call = MakeServerCall(server_.get(), channel_.get(), arena);
1311
+ InitCall(call);
1312
+ return CallInitiator(std::move(call));
1313
+ }
1314
+
1270
1315
  void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1271
1316
  RefCountedPtr<Channel> channel,
1272
1317
  size_t cq_idx, Transport* transport,
@@ -1275,50 +1320,6 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1275
1320
  channel_ = channel;
1276
1321
  cq_idx_ = cq_idx;
1277
1322
  channelz_socket_uuid_ = channelz_socket_uuid;
1278
- // Build a lookup table phrased in terms of mdstr's in this channels context
1279
- // to quickly find registered methods.
1280
- size_t num_registered_methods = server_->registered_methods_.size();
1281
- if (!IsRegisteredMethodsMapEnabled() && num_registered_methods > 0) {
1282
- uint32_t max_probes = 0;
1283
- size_t slots = 2 * num_registered_methods;
1284
- old_registered_methods_ =
1285
- std::make_unique<std::vector<ChannelRegisteredMethod>>(slots);
1286
- for (std::unique_ptr<RegisteredMethod>& rm : server_->registered_methods_) {
1287
- Slice host;
1288
- Slice method = Slice::FromExternalString(rm->method);
1289
- const bool has_host = !rm->host.empty();
1290
- if (has_host) {
1291
- host = Slice::FromExternalString(rm->host);
1292
- }
1293
- uint32_t hash = MixHash32(has_host ? host.Hash() : 0, method.Hash());
1294
- uint32_t probes = 0;
1295
- for (probes = 0; (*old_registered_methods_)[(hash + probes) % slots]
1296
- .server_registered_method != nullptr;
1297
- probes++) {
1298
- }
1299
- if (probes > max_probes) max_probes = probes;
1300
- ChannelRegisteredMethod* crm =
1301
- &(*old_registered_methods_)[(hash + probes) % slots];
1302
- crm->server_registered_method = rm.get();
1303
- crm->flags = rm->flags;
1304
- crm->has_host = has_host;
1305
- if (has_host) {
1306
- crm->host = std::move(host);
1307
- }
1308
- crm->method = std::move(method);
1309
- }
1310
- GPR_ASSERT(slots <= UINT32_MAX);
1311
- registered_method_max_probes_ = max_probes;
1312
- } else if (IsRegisteredMethodsMapEnabled()) {
1313
- for (std::unique_ptr<RegisteredMethod>& rm : server_->registered_methods_) {
1314
- auto key = std::make_pair(!rm->host.empty() ? rm->host : "", rm->method);
1315
- registered_methods_.emplace(
1316
- key, std::make_unique<ChannelRegisteredMethod>(
1317
- rm.get(), rm->flags, /*has_host=*/!rm->host.empty(),
1318
- Slice::FromExternalString(rm->method),
1319
- Slice::FromExternalString(rm->host)));
1320
- }
1321
- }
1322
1323
  // Publish channel.
1323
1324
  {
1324
1325
  MutexLock lock(&server_->mu_global_);
@@ -1327,13 +1328,25 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1327
1328
  }
1328
1329
  // Start accept_stream transport op.
1329
1330
  grpc_transport_op* op = grpc_make_transport_op(nullptr);
1330
- op->set_accept_stream = true;
1331
- op->set_accept_stream_fn = AcceptStream;
1332
- if (IsRegisteredMethodLookupInTransportEnabled()) {
1333
- op->set_registered_method_matcher_fn = SetRegisteredMethodOnMetadata;
1331
+ int accept_stream_types = 0;
1332
+ if (transport->filter_stack_transport() != nullptr) {
1333
+ ++accept_stream_types;
1334
+ op->set_accept_stream = true;
1335
+ op->set_accept_stream_fn = AcceptStream;
1336
+ if (IsRegisteredMethodLookupInTransportEnabled()) {
1337
+ op->set_registered_method_matcher_fn = [](void* arg,
1338
+ ClientMetadata* metadata) {
1339
+ static_cast<ChannelData*>(arg)->SetRegisteredMethodOnMetadata(
1340
+ *metadata);
1341
+ };
1342
+ }
1343
+ op->set_accept_stream_user_data = this;
1344
+ }
1345
+ if (transport->server_transport() != nullptr) {
1346
+ ++accept_stream_types;
1347
+ transport->server_transport()->SetAcceptor(this);
1334
1348
  }
1335
- // op->set_registered_method_matcher_fn = Registered
1336
- op->set_accept_stream_user_data = this;
1349
+ GPR_ASSERT(accept_stream_types == 1);
1337
1350
  op->start_connectivity_watch = MakeOrphanable<ConnectivityWatcher>(this);
1338
1351
  if (server_->ShutdownCalled()) {
1339
1352
  op->disconnect_with_error = GRPC_ERROR_CREATE("Server shutdown");
@@ -1341,75 +1354,41 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1341
1354
  transport->PerformOp(op);
1342
1355
  }
1343
1356
 
1344
- Server::ChannelRegisteredMethod* Server::ChannelData::GetRegisteredMethod(
1345
- const grpc_slice& host, const grpc_slice& path) {
1346
- if (old_registered_methods_ == nullptr) return nullptr;
1347
- // TODO(ctiller): unify these two searches
1348
- // check for an exact match with host
1349
- uint32_t hash = MixHash32(grpc_slice_hash(host), grpc_slice_hash(path));
1350
- for (size_t i = 0; i <= registered_method_max_probes_; i++) {
1351
- ChannelRegisteredMethod* rm = &(
1352
- *old_registered_methods_)[(hash + i) % old_registered_methods_->size()];
1353
- if (rm->server_registered_method == nullptr) break;
1354
- if (!rm->has_host) continue;
1355
- if (rm->host != host) continue;
1356
- if (rm->method != path) continue;
1357
- return rm;
1358
- }
1359
- // check for a wildcard method definition (no host set)
1360
- hash = MixHash32(0, grpc_slice_hash(path));
1361
- for (size_t i = 0; i <= registered_method_max_probes_; i++) {
1362
- ChannelRegisteredMethod* rm = &(
1363
- *old_registered_methods_)[(hash + i) % old_registered_methods_->size()];
1364
- if (rm->server_registered_method == nullptr) break;
1365
- if (rm->has_host) continue;
1366
- if (rm->method != path) continue;
1367
- return rm;
1368
- }
1369
- return nullptr;
1370
- }
1371
-
1372
- Server::ChannelRegisteredMethod* Server::ChannelData::GetRegisteredMethod(
1357
+ Server::RegisteredMethod* Server::ChannelData::GetRegisteredMethod(
1373
1358
  const absl::string_view& host, const absl::string_view& path) {
1374
- if (registered_methods_.empty()) return nullptr;
1359
+ if (server_->registered_methods_.empty()) return nullptr;
1375
1360
  // check for an exact match with host
1376
- auto it = registered_methods_.find(std::make_pair(host, path));
1377
- if (it != registered_methods_.end()) {
1361
+ auto it = server_->registered_methods_.find(std::make_pair(host, path));
1362
+ if (it != server_->registered_methods_.end()) {
1378
1363
  return it->second.get();
1379
1364
  }
1380
1365
  // check for wildcard method definition (no host set)
1381
- it = registered_methods_.find(std::make_pair("", path));
1382
- if (it != registered_methods_.end()) {
1366
+ it = server_->registered_methods_.find(std::make_pair("", path));
1367
+ if (it != server_->registered_methods_.end()) {
1383
1368
  return it->second.get();
1384
1369
  }
1385
1370
  return nullptr;
1386
1371
  }
1387
1372
 
1388
1373
  void Server::ChannelData::SetRegisteredMethodOnMetadata(
1389
- void* arg, ServerMetadata* metadata) {
1390
- auto* chand = static_cast<Server::ChannelData*>(arg);
1391
- auto* authority = metadata->get_pointer(HttpAuthorityMetadata());
1374
+ ClientMetadata& metadata) {
1375
+ auto* authority = metadata.get_pointer(HttpAuthorityMetadata());
1392
1376
  if (authority == nullptr) {
1393
- authority = metadata->get_pointer(HostMetadata());
1377
+ authority = metadata.get_pointer(HostMetadata());
1394
1378
  if (authority == nullptr) {
1395
1379
  // Authority not being set is an RPC error.
1396
1380
  return;
1397
1381
  }
1398
1382
  }
1399
- auto* path = metadata->get_pointer(HttpPathMetadata());
1383
+ auto* path = metadata.get_pointer(HttpPathMetadata());
1400
1384
  if (path == nullptr) {
1401
1385
  // Path not being set would result in an RPC error.
1402
1386
  return;
1403
1387
  }
1404
- ChannelRegisteredMethod* method;
1405
- if (!IsRegisteredMethodsMapEnabled()) {
1406
- method = chand->GetRegisteredMethod(authority->c_slice(), path->c_slice());
1407
- } else {
1408
- method = chand->GetRegisteredMethod(authority->as_string_view(),
1409
- path->as_string_view());
1410
- }
1388
+ RegisteredMethod* method =
1389
+ GetRegisteredMethod(authority->as_string_view(), path->as_string_view());
1411
1390
  // insert in metadata
1412
- metadata->Set(GrpcRegisteredMethod(), method);
1391
+ metadata.Set(GrpcRegisteredMethod(), method);
1413
1392
  }
1414
1393
 
1415
1394
  void Server::ChannelData::AcceptStream(void* arg, Transport* /*transport*/,
@@ -1451,17 +1430,89 @@ auto CancelledDueToServerShutdown() {
1451
1430
  }
1452
1431
  } // namespace
1453
1432
 
1433
+ void Server::ChannelData::InitCall(RefCountedPtr<CallSpineInterface> call) {
1434
+ call->SpawnGuarded("request_matcher", [this, call]() {
1435
+ return TrySeq(
1436
+ // Wait for initial metadata to pass through all filters
1437
+ Map(call->client_initial_metadata().receiver.Next(),
1438
+ [](NextResult<ClientMetadataHandle> md)
1439
+ -> absl::StatusOr<ClientMetadataHandle> {
1440
+ if (!md.has_value()) {
1441
+ return absl::InternalError("Missing metadata");
1442
+ }
1443
+ if (!md.value()->get_pointer(HttpPathMetadata())) {
1444
+ return absl::InternalError("Missing :path header");
1445
+ }
1446
+ if (!md.value()->get_pointer(HttpAuthorityMetadata())) {
1447
+ return absl::InternalError("Missing :authority header");
1448
+ }
1449
+ return std::move(*md);
1450
+ }),
1451
+ // Match request with requested call
1452
+ [this, call](ClientMetadataHandle md) {
1453
+ auto* registered_method = static_cast<RegisteredMethod*>(
1454
+ md->get(GrpcRegisteredMethod()).value_or(nullptr));
1455
+ RequestMatcherInterface* rm;
1456
+ grpc_server_register_method_payload_handling payload_handling =
1457
+ GRPC_SRM_PAYLOAD_NONE;
1458
+ if (registered_method == nullptr) {
1459
+ rm = server_->unregistered_request_matcher_.get();
1460
+ } else {
1461
+ rm = registered_method->matcher.get();
1462
+ }
1463
+ auto maybe_read_first_message = If(
1464
+ payload_handling == GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER,
1465
+ [call]() {
1466
+ return call->client_to_server_messages().receiver.Next();
1467
+ },
1468
+ []() -> NextResult<MessageHandle> {
1469
+ return NextResult<MessageHandle>();
1470
+ });
1471
+ return TryJoin<absl::StatusOr>(
1472
+ Map(std::move(maybe_read_first_message),
1473
+ [](NextResult<MessageHandle> n) {
1474
+ return ValueOrFailure<NextResult<MessageHandle>>{
1475
+ std::move(n)};
1476
+ }),
1477
+ rm->MatchRequest(cq_idx()), [md = std::move(md)]() mutable {
1478
+ return ValueOrFailure<ClientMetadataHandle>(std::move(md));
1479
+ });
1480
+ },
1481
+ // Publish call to cq
1482
+ [](std::tuple<NextResult<MessageHandle>,
1483
+ RequestMatcherInterface::MatchResult,
1484
+ ClientMetadataHandle>
1485
+ r) {
1486
+ RequestMatcherInterface::MatchResult& mr = std::get<1>(r);
1487
+ auto md = std::move(std::get<2>(r));
1488
+ auto* rc = mr.TakeCall();
1489
+ rc->Complete(std::move(std::get<0>(r)), *md);
1490
+ auto* call_context = GetContext<CallContext>();
1491
+ *rc->call = call_context->c_call();
1492
+ grpc_call_set_completion_queue(call_context->c_call(),
1493
+ rc->cq_bound_to_call);
1494
+ call_context->server_call_context()->PublishInitialMetadata(
1495
+ std::move(md), rc->initial_metadata);
1496
+ // TODO(ctiller): publish metadata
1497
+ return Map(WaitForCqEndOp(false, rc->tag, absl::OkStatus(), mr.cq()),
1498
+ [rc = std::unique_ptr<RequestedCall>(rc)](Empty) {
1499
+ return absl::OkStatus();
1500
+ });
1501
+ });
1502
+ });
1503
+ }
1504
+
1454
1505
  ArenaPromise<ServerMetadataHandle> Server::ChannelData::MakeCallPromise(
1455
1506
  grpc_channel_element* elem, CallArgs call_args, NextPromiseFactory) {
1456
1507
  auto* chand = static_cast<Server::ChannelData*>(elem->channel_data);
1457
1508
  auto* server = chand->server_.get();
1458
- absl::optional<Slice> path =
1459
- call_args.client_initial_metadata->Take(HttpPathMetadata());
1460
1509
  if (server->ShutdownCalled()) return CancelledDueToServerShutdown();
1461
1510
  auto cleanup_ref =
1462
1511
  absl::MakeCleanup([server] { server->ShutdownUnrefOnRequest(); });
1463
1512
  if (!server->ShutdownRefOnRequest()) return CancelledDueToServerShutdown();
1464
- if (!path.has_value()) {
1513
+ auto path_ptr =
1514
+ call_args.client_initial_metadata->get_pointer(HttpPathMetadata());
1515
+ if (path_ptr == nullptr) {
1465
1516
  return [] {
1466
1517
  return ServerMetadataFromStatus(
1467
1518
  absl::InternalError("Missing :path header"));
@@ -1475,27 +1526,22 @@ ArenaPromise<ServerMetadataHandle> Server::ChannelData::MakeCallPromise(
1475
1526
  absl::InternalError("Missing :authority header"));
1476
1527
  };
1477
1528
  }
1478
- Timestamp deadline = GetContext<CallContext>()->deadline();
1479
1529
  // Find request matcher.
1480
1530
  RequestMatcherInterface* matcher;
1481
- ChannelRegisteredMethod* rm = nullptr;
1531
+ RegisteredMethod* rm = nullptr;
1482
1532
  if (IsRegisteredMethodLookupInTransportEnabled()) {
1483
- rm = static_cast<ChannelRegisteredMethod*>(
1533
+ rm = static_cast<RegisteredMethod*>(
1484
1534
  call_args.client_initial_metadata->get(GrpcRegisteredMethod())
1485
1535
  .value_or(nullptr));
1486
1536
  } else {
1487
- if (!IsRegisteredMethodsMapEnabled()) {
1488
- rm = chand->GetRegisteredMethod(host_ptr->c_slice(), path->c_slice());
1489
- } else {
1490
- rm = chand->GetRegisteredMethod(host_ptr->as_string_view(),
1491
- path->as_string_view());
1492
- }
1537
+ rm = chand->GetRegisteredMethod(host_ptr->as_string_view(),
1538
+ path_ptr->as_string_view());
1493
1539
  }
1494
1540
  ArenaPromise<absl::StatusOr<NextResult<MessageHandle>>>
1495
1541
  maybe_read_first_message([] { return NextResult<MessageHandle>(); });
1496
1542
  if (rm != nullptr) {
1497
- matcher = rm->server_registered_method->matcher.get();
1498
- switch (rm->server_registered_method->payload_handling) {
1543
+ matcher = rm->matcher.get();
1544
+ switch (rm->payload_handling) {
1499
1545
  case GRPC_SRM_PAYLOAD_NONE:
1500
1546
  break;
1501
1547
  case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER:
@@ -1526,8 +1572,7 @@ ArenaPromise<ServerMetadataHandle> Server::ChannelData::MakeCallPromise(
1526
1572
  return std::make_pair(std::move(*mr), std::move(payload));
1527
1573
  });
1528
1574
  },
1529
- [host_ptr, path = std::move(path), deadline,
1530
- call_args =
1575
+ [call_args =
1531
1576
  std::move(call_args)](std::pair<RequestMatcherInterface::MatchResult,
1532
1577
  NextResult<MessageHandle>>
1533
1578
  r) mutable {
@@ -1535,41 +1580,19 @@ ArenaPromise<ServerMetadataHandle> Server::ChannelData::MakeCallPromise(
1535
1580
  auto& payload = r.second;
1536
1581
  auto* rc = mr.TakeCall();
1537
1582
  auto* cq_for_new_request = mr.cq();
1538
- switch (rc->type) {
1539
- case RequestedCall::Type::BATCH_CALL:
1540
- GPR_ASSERT(!payload.has_value());
1541
- rc->data.batch.details->host = CSliceRef(host_ptr->c_slice());
1542
- rc->data.batch.details->method = CSliceRef(path->c_slice());
1543
- rc->data.batch.details->deadline =
1544
- deadline.as_timespec(GPR_CLOCK_MONOTONIC);
1545
- break;
1546
- case RequestedCall::Type::REGISTERED_CALL:
1547
- *rc->data.registered.deadline =
1548
- deadline.as_timespec(GPR_CLOCK_MONOTONIC);
1549
- if (rc->data.registered.optional_payload != nullptr) {
1550
- if (payload.has_value()) {
1551
- auto* sb = payload.value()->payload()->c_slice_buffer();
1552
- *rc->data.registered.optional_payload =
1553
- grpc_raw_byte_buffer_create(sb->slices, sb->count);
1554
- } else {
1555
- *rc->data.registered.optional_payload = nullptr;
1556
- }
1557
- }
1558
- break;
1559
- default:
1560
- GPR_UNREACHABLE_CODE(abort());
1561
- }
1562
- return GetContext<CallContext>()
1563
- ->server_call_context()
1564
- ->MakeTopOfServerCallPromise(
1565
- std::move(call_args), rc->cq_bound_to_call,
1566
- rc->initial_metadata,
1567
- [rc, cq_for_new_request](grpc_call* call) {
1568
- *rc->call = call;
1569
- grpc_cq_end_op(cq_for_new_request, rc->tag, absl::OkStatus(),
1570
- Server::DoneRequestEvent, rc, &rc->completion,
1571
- true);
1572
- });
1583
+ auto* server_call_context =
1584
+ GetContext<CallContext>()->server_call_context();
1585
+ rc->Complete(std::move(payload), *call_args.client_initial_metadata);
1586
+ server_call_context->PublishInitialMetadata(
1587
+ std::move(call_args.client_initial_metadata), rc->initial_metadata);
1588
+ return server_call_context->MakeTopOfServerCallPromise(
1589
+ std::move(call_args), rc->cq_bound_to_call,
1590
+ [rc, cq_for_new_request](grpc_call* call) {
1591
+ *rc->call = call;
1592
+ grpc_cq_end_op(cq_for_new_request, rc->tag, absl::OkStatus(),
1593
+ Server::DoneRequestEvent, rc, &rc->completion,
1594
+ true);
1595
+ });
1573
1596
  });
1574
1597
  }
1575
1598
 
@@ -1749,22 +1772,18 @@ void Server::CallData::StartNewRpc(grpc_call_element* elem) {
1749
1772
  grpc_server_register_method_payload_handling payload_handling =
1750
1773
  GRPC_SRM_PAYLOAD_NONE;
1751
1774
  if (path_.has_value() && host_.has_value()) {
1752
- ChannelRegisteredMethod* rm;
1775
+ RegisteredMethod* rm;
1753
1776
  if (IsRegisteredMethodLookupInTransportEnabled()) {
1754
- rm = static_cast<ChannelRegisteredMethod*>(
1777
+ rm = static_cast<RegisteredMethod*>(
1755
1778
  recv_initial_metadata_->get(GrpcRegisteredMethod())
1756
1779
  .value_or(nullptr));
1757
1780
  } else {
1758
- if (!IsRegisteredMethodsMapEnabled()) {
1759
- rm = chand->GetRegisteredMethod(host_->c_slice(), path_->c_slice());
1760
- } else {
1761
- rm = chand->GetRegisteredMethod(host_->as_string_view(),
1762
- path_->as_string_view());
1763
- }
1781
+ rm = chand->GetRegisteredMethod(host_->as_string_view(),
1782
+ path_->as_string_view());
1764
1783
  }
1765
1784
  if (rm != nullptr) {
1766
- matcher_ = rm->server_registered_method->matcher.get();
1767
- payload_handling = rm->server_registered_method->payload_handling;
1785
+ matcher_ = rm->matcher.get();
1786
+ payload_handling = rm->payload_handling;
1768
1787
  }
1769
1788
  }
1770
1789
  // Start recv_message op if needed.