grpc 1.53.0.pre2 → 1.54.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (685) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +80 -66
  3. data/include/grpc/event_engine/event_engine.h +30 -14
  4. data/include/grpc/grpc_security.h +4 -0
  5. data/include/grpc/impl/grpc_types.h +11 -2
  6. data/include/grpc/support/port_platform.h +4 -4
  7. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +11 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -0
  9. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -11
  10. data/src/core/ext/filters/client_channel/backup_poller.h +0 -3
  11. data/src/core/ext/filters/client_channel/client_channel.cc +848 -813
  12. data/src/core/ext/filters/client_channel/client_channel.h +131 -173
  13. data/src/core/ext/filters/client_channel/client_channel_internal.h +114 -0
  14. data/src/core/ext/filters/client_channel/config_selector.h +4 -3
  15. data/src/core/ext/filters/client_channel/http_proxy.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +6 -1
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +17 -18
  18. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +134 -151
  19. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -15
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +14 -10
  21. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +68 -30
  22. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +13 -5
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +2 -5
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +2 -2
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +30 -38
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +4 -4
  28. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +20 -26
  29. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +31 -179
  30. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -2
  31. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +1 -2
  32. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +4 -2
  33. data/src/core/ext/filters/client_channel/retry_filter.cc +95 -102
  34. data/src/core/ext/filters/client_channel/subchannel.cc +2 -4
  35. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +26 -27
  36. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +8 -5
  37. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -3
  38. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -12
  39. data/src/core/ext/filters/http/message_compress/compression_filter.cc +27 -11
  40. data/src/core/ext/filters/message_size/message_size_filter.cc +141 -224
  41. data/src/core/ext/filters/message_size/message_size_filter.h +48 -3
  42. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -6
  43. data/src/core/ext/gcp/metadata_query.cc +142 -0
  44. data/src/core/ext/gcp/metadata_query.h +82 -0
  45. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +70 -55
  46. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +149 -60
  47. data/src/core/ext/transport/chttp2/transport/flow_control.cc +5 -2
  48. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -1
  49. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +4 -1
  50. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +42 -23
  51. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +5 -3
  52. data/src/core/ext/transport/chttp2/transport/internal.h +18 -3
  53. data/src/core/ext/transport/chttp2/transport/parsing.cc +9 -2
  54. data/src/core/ext/transport/chttp2/transport/writing.cc +10 -5
  55. data/src/core/ext/transport/inproc/inproc_transport.cc +20 -14
  56. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +5 -3
  57. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +22 -0
  58. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +5 -3
  59. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +22 -0
  60. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +23 -5
  61. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +94 -3
  62. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -2
  63. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +120 -0
  64. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +6 -3
  65. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +22 -0
  66. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +24 -6
  67. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +111 -12
  68. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +9 -7
  69. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +27 -9
  70. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +0 -1
  71. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +11 -7
  72. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +56 -12
  73. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +5 -3
  74. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +24 -0
  75. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +5 -3
  76. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +24 -0
  77. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +13 -2
  78. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +49 -0
  79. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +24 -9
  80. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +66 -12
  81. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
  82. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +139 -136
  83. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +31 -15
  84. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +5 -0
  85. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +12 -9
  86. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +15 -0
  87. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +54 -45
  88. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +135 -119
  89. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  90. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +100 -97
  91. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +15 -18
  92. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +272 -264
  93. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +117 -117
  94. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +5 -5
  95. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +5 -5
  96. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +5 -5
  97. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +12 -9
  98. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +5 -0
  99. data/src/core/ext/xds/xds_channel_stack_modifier.cc +1 -2
  100. data/src/core/ext/xds/xds_client_stats.cc +29 -15
  101. data/src/core/ext/xds/xds_client_stats.h +24 -20
  102. data/src/core/ext/xds/xds_endpoint.cc +5 -2
  103. data/src/core/ext/xds/xds_endpoint.h +9 -1
  104. data/src/core/ext/xds/xds_http_rbac_filter.cc +1 -1
  105. data/src/core/ext/xds/xds_lb_policy_registry.cc +13 -0
  106. data/src/core/ext/xds/xds_transport_grpc.cc +1 -1
  107. data/src/core/{ext/filters/client_channel/resolver/dns/dns_resolver_selection.h → lib/backoff/random_early_detection.cc} +14 -12
  108. data/src/core/lib/backoff/random_early_detection.h +59 -0
  109. data/src/core/lib/channel/call_finalization.h +1 -1
  110. data/src/core/lib/channel/call_tracer.cc +51 -0
  111. data/src/core/lib/channel/call_tracer.h +101 -38
  112. data/src/core/lib/channel/connected_channel.cc +483 -1050
  113. data/src/core/lib/channel/context.h +8 -1
  114. data/src/core/lib/channel/promise_based_filter.cc +106 -42
  115. data/src/core/lib/channel/promise_based_filter.h +27 -13
  116. data/src/core/lib/channel/server_call_tracer_filter.cc +110 -0
  117. data/src/core/lib/config/config_vars.cc +151 -0
  118. data/src/core/lib/config/config_vars.h +127 -0
  119. data/src/core/lib/config/config_vars_non_generated.cc +51 -0
  120. data/src/core/lib/config/load_config.cc +66 -0
  121. data/src/core/lib/config/load_config.h +49 -0
  122. data/src/core/lib/debug/trace.cc +5 -6
  123. data/src/core/lib/debug/trace.h +0 -5
  124. data/src/core/lib/event_engine/event_engine.cc +37 -2
  125. data/src/core/lib/event_engine/handle_containers.h +7 -22
  126. data/src/core/lib/event_engine/memory_allocator_factory.h +47 -0
  127. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +0 -4
  128. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +3 -9
  129. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +48 -15
  130. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +8 -8
  131. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -5
  132. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +6 -3
  133. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +27 -18
  134. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +0 -3
  135. data/src/core/lib/event_engine/resolved_address.cc +2 -1
  136. data/src/core/lib/event_engine/windows/win_socket.cc +0 -1
  137. data/src/core/lib/event_engine/windows/windows_endpoint.cc +129 -82
  138. data/src/core/lib/event_engine/windows/windows_endpoint.h +21 -5
  139. data/src/core/lib/event_engine/windows/windows_engine.cc +39 -18
  140. data/src/core/lib/event_engine/windows/windows_engine.h +2 -1
  141. data/src/core/lib/event_engine/windows/windows_listener.cc +370 -0
  142. data/src/core/lib/event_engine/windows/windows_listener.h +155 -0
  143. data/src/core/lib/experiments/config.cc +3 -10
  144. data/src/core/lib/experiments/experiments.cc +7 -0
  145. data/src/core/lib/experiments/experiments.h +9 -1
  146. data/src/core/lib/gpr/log.cc +15 -28
  147. data/src/core/lib/gprpp/fork.cc +8 -14
  148. data/src/core/lib/gprpp/orphanable.h +4 -3
  149. data/src/core/lib/gprpp/per_cpu.h +9 -3
  150. data/src/core/lib/gprpp/{thd_posix.cc → posix/thd.cc} +49 -37
  151. data/src/core/lib/gprpp/ref_counted.h +33 -34
  152. data/src/core/lib/gprpp/thd.h +16 -0
  153. data/src/core/lib/gprpp/time.cc +1 -0
  154. data/src/core/lib/gprpp/time.h +4 -4
  155. data/src/core/lib/gprpp/{thd_windows.cc → windows/thd.cc} +2 -2
  156. data/src/core/lib/iomgr/call_combiner.h +2 -2
  157. data/src/core/lib/iomgr/endpoint_cfstream.cc +4 -2
  158. data/src/core/lib/iomgr/endpoint_pair.h +2 -2
  159. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  160. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  161. data/src/core/lib/iomgr/ev_posix.cc +13 -53
  162. data/src/core/lib/iomgr/ev_posix.h +0 -3
  163. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +103 -76
  164. data/src/core/lib/iomgr/iomgr.cc +4 -8
  165. data/src/core/lib/iomgr/iomgr_windows.cc +8 -2
  166. data/src/core/lib/iomgr/pollset_set_windows.cc +9 -9
  167. data/src/core/lib/iomgr/pollset_windows.cc +1 -1
  168. data/src/core/lib/iomgr/socket_utils_common_posix.cc +16 -3
  169. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -2
  170. data/src/core/lib/iomgr/tcp_posix.cc +0 -1
  171. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -16
  172. data/src/core/lib/iomgr/tcp_server_windows.cc +176 -9
  173. data/src/core/lib/iomgr/tcp_windows.cc +12 -8
  174. data/src/core/lib/load_balancing/lb_policy.cc +9 -13
  175. data/src/core/lib/load_balancing/lb_policy.h +4 -2
  176. data/src/core/lib/promise/activity.cc +22 -6
  177. data/src/core/lib/promise/activity.h +61 -24
  178. data/src/core/lib/promise/cancel_callback.h +77 -0
  179. data/src/core/lib/promise/detail/basic_seq.h +1 -1
  180. data/src/core/lib/promise/detail/promise_factory.h +4 -0
  181. data/src/core/lib/promise/for_each.h +176 -0
  182. data/src/core/lib/promise/if.h +9 -0
  183. data/src/core/lib/promise/interceptor_list.h +23 -2
  184. data/src/core/lib/promise/latch.h +89 -3
  185. data/src/core/lib/promise/loop.h +13 -9
  186. data/src/core/lib/promise/map.h +7 -0
  187. data/src/core/lib/promise/party.cc +286 -0
  188. data/src/core/lib/promise/party.h +499 -0
  189. data/src/core/lib/promise/pipe.h +197 -57
  190. data/src/core/lib/promise/poll.h +48 -0
  191. data/src/core/lib/promise/promise.h +2 -2
  192. data/src/core/lib/resource_quota/arena.cc +19 -3
  193. data/src/core/lib/resource_quota/arena.h +119 -5
  194. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  195. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +12 -35
  196. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
  197. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +0 -59
  198. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -5
  199. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  200. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +13 -0
  201. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +2 -0
  202. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +5 -9
  203. data/src/core/lib/security/security_connector/ssl_utils.cc +11 -25
  204. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +12 -0
  205. data/src/core/lib/security/transport/secure_endpoint.cc +4 -2
  206. data/src/core/lib/security/transport/server_auth_filter.cc +20 -2
  207. data/src/core/lib/slice/slice.cc +1 -1
  208. data/src/core/lib/surface/builtins.cc +2 -0
  209. data/src/core/lib/surface/call.cc +926 -1024
  210. data/src/core/lib/surface/call.h +10 -0
  211. data/src/core/lib/surface/lame_client.cc +1 -0
  212. data/src/core/lib/surface/version.cc +2 -2
  213. data/src/core/lib/transport/batch_builder.cc +179 -0
  214. data/src/core/lib/transport/batch_builder.h +468 -0
  215. data/src/core/lib/transport/bdp_estimator.cc +7 -7
  216. data/src/core/lib/transport/bdp_estimator.h +10 -6
  217. data/src/core/lib/transport/custom_metadata.h +30 -0
  218. data/src/core/lib/transport/metadata_batch.cc +9 -6
  219. data/src/core/lib/transport/metadata_batch.h +58 -16
  220. data/src/core/lib/transport/parsed_metadata.h +3 -3
  221. data/src/core/lib/transport/timeout_encoding.cc +6 -1
  222. data/src/core/lib/transport/transport.cc +30 -2
  223. data/src/core/lib/transport/transport.h +70 -14
  224. data/src/core/lib/transport/transport_impl.h +7 -0
  225. data/src/core/lib/transport/transport_op_string.cc +52 -42
  226. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -2
  227. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +1 -0
  228. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +21 -4
  229. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +5 -0
  230. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  231. data/src/core/tsi/ssl_transport_security.cc +4 -2
  232. data/src/ruby/lib/grpc/version.rb +1 -1
  233. data/third_party/abseil-cpp/absl/base/config.h +1 -1
  234. data/third_party/abseil-cpp/absl/flags/commandlineflag.cc +34 -0
  235. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +200 -0
  236. data/third_party/abseil-cpp/absl/flags/config.h +68 -0
  237. data/third_party/abseil-cpp/absl/flags/declare.h +73 -0
  238. data/third_party/abseil-cpp/absl/flags/flag.cc +38 -0
  239. data/third_party/abseil-cpp/absl/flags/flag.h +310 -0
  240. data/{src/core/lib/gprpp/global_config_custom.h → third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc} +11 -14
  241. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +68 -0
  242. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +615 -0
  243. data/third_party/abseil-cpp/absl/flags/internal/flag.h +800 -0
  244. data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +116 -0
  245. data/third_party/abseil-cpp/absl/flags/internal/path_util.h +62 -0
  246. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.cc +65 -0
  247. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.h +61 -0
  248. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +60 -0
  249. data/third_party/abseil-cpp/absl/flags/internal/program_name.h +50 -0
  250. data/third_party/abseil-cpp/absl/flags/internal/registry.h +97 -0
  251. data/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h +187 -0
  252. data/third_party/abseil-cpp/absl/flags/marshalling.cc +241 -0
  253. data/third_party/abseil-cpp/absl/flags/marshalling.h +356 -0
  254. data/third_party/abseil-cpp/absl/flags/reflection.cc +354 -0
  255. data/third_party/abseil-cpp/absl/flags/reflection.h +90 -0
  256. data/third_party/abseil-cpp/absl/flags/usage_config.cc +165 -0
  257. data/third_party/abseil-cpp/absl/flags/usage_config.h +135 -0
  258. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +12 -8
  259. data/third_party/boringssl-with-bazel/err_data.c +728 -712
  260. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +177 -177
  261. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +28 -55
  262. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +21 -23
  263. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c +20 -23
  264. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +66 -185
  265. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c +18 -21
  266. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +356 -311
  267. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +174 -194
  268. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +146 -210
  269. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +6 -9
  270. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +346 -526
  271. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +110 -131
  272. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +130 -116
  273. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +93 -60
  274. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +93 -181
  275. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +242 -305
  276. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +41 -18
  277. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +30 -33
  278. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +36 -33
  279. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +29 -26
  280. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +133 -88
  281. data/third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.c +230 -0
  282. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +791 -791
  283. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +526 -526
  284. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +114 -135
  285. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +201 -207
  286. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +21 -26
  287. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +55 -68
  288. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +2 -4
  289. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +11 -7
  290. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +4 -4
  291. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +15 -9
  292. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -4
  293. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +17 -10
  294. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -3
  295. data/third_party/boringssl-with-bazel/src/crypto/bio/printf.c +0 -13
  296. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -6
  297. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -0
  298. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +9 -5
  299. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c +10 -23
  300. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +2 -6
  301. data/third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c +2 -1
  302. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +29 -28
  303. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +161 -201
  304. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +254 -39
  305. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +2 -2
  306. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +0 -2
  307. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +4 -4
  308. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c +9 -8
  309. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +37 -75
  310. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +8 -10
  311. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/cipher → cipher_extra}/e_des.c +100 -78
  312. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c +1 -0
  313. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c +1 -0
  314. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c +2 -0
  315. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +6 -12
  316. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -11
  317. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +6 -10
  318. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -1
  319. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +12 -0
  320. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +74 -0
  321. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +62 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-fuchsia.c → cpu_aarch64_fuchsia.c} +8 -7
  323. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-linux.c → cpu_aarch64_linux.c} +6 -4
  324. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-win.c → cpu_aarch64_win.c} +4 -4
  325. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm.c → cpu_arm.c} +1 -1
  326. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +55 -0
  327. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.c → cpu_arm_linux.c} +11 -90
  328. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.h → cpu_arm_linux.h} +0 -38
  329. data/third_party/boringssl-with-bazel/src/crypto/{cpu-intel.c → cpu_intel.c} +1 -2
  330. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +25 -20
  331. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +16 -27
  332. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +17 -32
  333. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/des.c +232 -232
  334. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/internal.h +1 -1
  335. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +1 -0
  336. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +232 -29
  337. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +0 -3
  338. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +39 -16
  339. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +37 -7
  340. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +3 -3
  341. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +11 -36
  342. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +214 -99
  343. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +21 -5
  344. data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c +2 -4
  345. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +83 -60
  346. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +46 -12
  347. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +3 -3
  348. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c +25 -23
  349. data/third_party/boringssl-with-bazel/src/crypto/evp/internal.h +43 -9
  350. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +75 -44
  351. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +19 -25
  352. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +96 -45
  353. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c +7 -8
  354. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c +26 -23
  355. data/third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.c +233 -0
  356. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +5 -5
  357. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c +42 -25
  358. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c +4 -5
  359. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +35 -47
  360. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +135 -244
  361. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +2 -4
  362. data/third_party/boringssl-with-bazel/src/crypto/evp/sign.c +15 -10
  363. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +29 -15
  364. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +0 -2
  365. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +13 -14
  366. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +3 -13
  367. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c +13 -7
  368. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +9 -7
  369. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +35 -27
  370. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +16 -26
  371. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c +88 -60
  372. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c +4 -3
  373. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c +0 -2
  374. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +1 -1
  375. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c +1 -1
  376. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +99 -113
  377. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +0 -1
  378. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +5 -3
  379. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c +112 -168
  380. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +86 -31
  381. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +11 -6
  382. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +4 -5
  383. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +4 -5
  384. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +13 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c +13 -5
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +19 -108
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h +19 -15
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c +15 -16
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +22 -21
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c +3 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +79 -19
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +102 -99
  393. data/third_party/boringssl-with-bazel/src/crypto/{cipher_extra → fipsmodule/cipher}/e_aesccm.c +52 -46
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h +39 -0
  395. data/third_party/boringssl-with-bazel/src/crypto/{cmac → fipsmodule/cmac}/cmac.c +55 -11
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +2 -3
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +21 -6
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +56 -0
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +5 -3
  400. data/third_party/boringssl-with-bazel/src/crypto/{evp → fipsmodule/digestsign}/digestsign.c +51 -15
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +25 -25
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +91 -17
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +5 -5
  404. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +34 -12
  405. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +54 -23
  406. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +44 -60
  407. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64-table.h → p256-nistz-table.h} +1 -1
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.c → p256-nistz.c} +60 -53
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.h → p256-nistz.h} +5 -13
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +48 -36
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +2 -8
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +2 -7
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -3
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +0 -1
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +8 -0
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +42 -14
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +6 -0
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c +52 -24
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +9 -15
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +1 -4
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +2 -4
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +71 -43
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +14 -16
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -4
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c +31 -13
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +16 -8
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +3 -2
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +2 -2
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +9 -38
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +73 -59
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -45
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +0 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +22 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +63 -52
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +107 -62
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +58 -31
  437. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +41 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +523 -422
  439. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/internal.h +89 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +334 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +3 -12
  442. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +2 -0
  443. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +12 -8
  444. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +14 -12
  445. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +19 -6
  446. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +32 -14
  447. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +65 -29
  448. data/third_party/boringssl-with-bazel/src/crypto/internal.h +373 -18
  449. data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +61 -0
  450. data/third_party/boringssl-with-bazel/src/crypto/kyber/keccak.c +205 -0
  451. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +13 -1
  452. data/third_party/boringssl-with-bazel/src/crypto/mem.c +220 -13
  453. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -7
  454. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +13 -1
  455. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +81 -90
  456. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +150 -245
  457. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +629 -613
  458. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +17 -17
  459. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +142 -149
  460. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +99 -131
  461. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c +0 -1
  462. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c +0 -1
  463. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +0 -1
  464. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +0 -3
  465. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -66
  466. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +31 -38
  467. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +2 -1
  468. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +18 -31
  469. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  470. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +8 -1
  471. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +129 -5
  472. data/third_party/boringssl-with-bazel/src/crypto/refcount_c11.c +0 -2
  473. data/third_party/boringssl-with-bazel/src/crypto/refcount_lock.c +3 -4
  474. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +8 -11
  475. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +61 -27
  476. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +10 -13
  477. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +10 -13
  478. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +66 -34
  479. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +190 -77
  480. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +81 -284
  481. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +109 -42
  482. data/third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c +22 -24
  483. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +54 -55
  484. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +32 -34
  485. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +32 -16
  486. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +465 -704
  487. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +284 -331
  488. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +183 -178
  489. data/third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c +11 -15
  490. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +67 -50
  491. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +153 -150
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/policy.c +786 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +95 -102
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +72 -57
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +12 -10
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +227 -252
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +52 -47
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +3 -4
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +230 -224
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +161 -327
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +37 -33
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c +14 -31
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +55 -85
  504. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +534 -618
  505. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +129 -122
  506. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +116 -182
  507. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +132 -132
  508. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +181 -202
  509. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +64 -79
  510. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +175 -160
  511. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1865 -2050
  512. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +433 -462
  513. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +156 -163
  514. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +267 -263
  515. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +40 -15
  516. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +59 -63
  517. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +63 -67
  518. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +114 -144
  519. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +25 -26
  520. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +326 -415
  521. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +8 -7
  522. data/third_party/boringssl-with-bazel/src/crypto/x509/x_info.c +30 -28
  523. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +354 -370
  524. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +37 -32
  525. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +116 -119
  526. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +36 -26
  527. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +3 -4
  528. data/third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c +10 -13
  529. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +3 -4
  530. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +419 -261
  531. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +113 -105
  532. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +11 -15
  533. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +78 -170
  534. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +126 -131
  535. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c +3 -4
  536. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +465 -469
  537. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c +56 -54
  538. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +46 -49
  539. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +309 -346
  540. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +341 -365
  541. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +429 -393
  542. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +29 -24
  543. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c +65 -59
  544. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +125 -121
  545. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +43 -42
  546. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +122 -125
  547. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c +50 -20
  548. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +247 -253
  549. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +386 -389
  550. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c +45 -32
  551. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c +57 -54
  552. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c +63 -67
  553. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +143 -136
  554. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +664 -707
  555. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +83 -75
  556. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1062 -1146
  557. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +8 -4
  558. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +28 -48
  559. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +211 -187
  560. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +26 -78
  561. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +19 -14
  562. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +21 -2
  563. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +49 -17
  564. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +99 -29
  565. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +49 -60
  566. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +2 -15
  567. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +16 -200
  568. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +34 -0
  569. data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +82 -0
  570. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +32 -30
  571. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +7 -0
  572. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +4 -0
  573. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +48 -5
  574. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +37 -8
  575. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +1 -0
  576. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +33 -5
  577. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +22 -30
  578. data/third_party/boringssl-with-bazel/src/include/openssl/ex_data.h +1 -1
  579. data/third_party/boringssl-with-bazel/src/include/openssl/hmac.h +7 -0
  580. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +41 -16
  581. data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +91 -0
  582. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +74 -8
  583. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +13 -0
  584. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -0
  585. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +11 -15
  586. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +8 -0
  587. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +12 -1
  588. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +7 -4
  589. data/third_party/boringssl-with-bazel/src/include/openssl/service_indicator.h +96 -0
  590. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +13 -21
  591. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +139 -75
  592. data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +1 -6
  593. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +384 -286
  594. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +5 -6
  595. data/third_party/boringssl-with-bazel/src/include/openssl/time.h +41 -0
  596. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +18 -7
  597. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +49 -23
  598. data/third_party/boringssl-with-bazel/src/include/openssl/type_check.h +0 -11
  599. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1592 -1074
  600. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +202 -205
  601. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +2 -2
  602. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +6 -13
  603. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +17 -18
  604. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +4 -5
  605. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +25 -33
  606. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +34 -20
  607. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +65 -34
  608. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +198 -54
  609. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +5 -5
  610. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +32 -28
  611. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +76 -44
  612. data/third_party/boringssl-with-bazel/src/ssl/internal.h +130 -98
  613. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +27 -11
  614. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  615. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +91 -75
  616. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +8 -10
  617. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +39 -65
  618. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +1 -0
  619. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +5 -9
  620. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +30 -33
  621. data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +77 -100
  622. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +120 -107
  623. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +164 -30
  624. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +150 -60
  625. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +22 -11
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +22 -6
  627. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +15 -13
  628. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +5 -43
  629. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +7 -4
  630. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +2 -2
  631. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +22 -34
  632. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +2 -2
  633. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +16 -98
  634. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +1241 -657
  635. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +751 -398
  636. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3551 -1938
  637. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1272 -487
  638. metadata +107 -72
  639. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +0 -39
  640. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +0 -30
  641. data/src/core/lib/gprpp/global_config.h +0 -93
  642. data/src/core/lib/gprpp/global_config_env.cc +0 -140
  643. data/src/core/lib/gprpp/global_config_env.h +0 -133
  644. data/src/core/lib/gprpp/global_config_generic.h +0 -40
  645. data/src/core/lib/promise/intra_activity_waiter.h +0 -55
  646. data/src/core/lib/security/security_connector/ssl_utils_config.cc +0 -32
  647. data/src/core/lib/security/security_connector/ssl_utils_config.h +0 -29
  648. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +0 -195
  649. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +0 -83
  650. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +0 -236
  651. data/third_party/boringssl-with-bazel/src/crypto/asn1/charmap.h +0 -15
  652. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +0 -206
  653. data/third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c +0 -38
  654. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c +0 -361
  655. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +0 -287
  656. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +0 -132
  657. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +0 -155
  658. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +0 -131
  659. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +0 -189
  660. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +0 -843
  661. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +0 -289
  662. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c +0 -57
  663. /data/src/core/lib/gpr/{log_android.cc → android/log.cc} +0 -0
  664. /data/src/core/lib/gpr/{cpu_iphone.cc → iphone/cpu.cc} +0 -0
  665. /data/src/core/lib/gpr/{cpu_linux.cc → linux/cpu.cc} +0 -0
  666. /data/src/core/lib/gpr/{log_linux.cc → linux/log.cc} +0 -0
  667. /data/src/core/lib/gpr/{tmpfile_msys.cc → msys/tmpfile.cc} +0 -0
  668. /data/src/core/lib/gpr/{cpu_posix.cc → posix/cpu.cc} +0 -0
  669. /data/src/core/lib/gpr/{log_posix.cc → posix/log.cc} +0 -0
  670. /data/src/core/lib/gpr/{string_posix.cc → posix/string.cc} +0 -0
  671. /data/src/core/lib/gpr/{sync_posix.cc → posix/sync.cc} +0 -0
  672. /data/src/core/lib/gpr/{time_posix.cc → posix/time.cc} +0 -0
  673. /data/src/core/lib/gpr/{tmpfile_posix.cc → posix/tmpfile.cc} +0 -0
  674. /data/src/core/lib/gpr/{cpu_windows.cc → windows/cpu.cc} +0 -0
  675. /data/src/core/lib/gpr/{log_windows.cc → windows/log.cc} +0 -0
  676. /data/src/core/lib/gpr/{string_windows.cc → windows/string.cc} +0 -0
  677. /data/src/core/lib/gpr/{string_util_windows.cc → windows/string_util.cc} +0 -0
  678. /data/src/core/lib/gpr/{sync_windows.cc → windows/sync.cc} +0 -0
  679. /data/src/core/lib/gpr/{time_windows.cc → windows/time.cc} +0 -0
  680. /data/src/core/lib/gpr/{tmpfile_windows.cc → windows/tmpfile.cc} +0 -0
  681. /data/src/core/lib/gprpp/{env_linux.cc → linux/env.cc} +0 -0
  682. /data/src/core/lib/gprpp/{env_posix.cc → posix/env.cc} +0 -0
  683. /data/src/core/lib/gprpp/{stat_posix.cc → posix/stat.cc} +0 -0
  684. /data/src/core/lib/gprpp/{env_windows.cc → windows/env.cc} +0 -0
  685. /data/src/core/lib/gprpp/{stat_windows.cc → windows/stat.cc} +0 -0
@@ -21,21 +21,16 @@
21
21
  #include "src/core/lib/channel/connected_channel.h"
22
22
 
23
23
  #include <inttypes.h>
24
- #include <string.h>
25
24
 
26
- #include <algorithm>
27
25
  #include <functional>
28
26
  #include <initializer_list>
29
27
  #include <memory>
30
28
  #include <string>
29
+ #include <type_traits>
31
30
  #include <utility>
32
- #include <vector>
33
31
 
34
- #include "absl/base/thread_annotations.h"
35
- #include "absl/container/inlined_vector.h"
36
32
  #include "absl/status/status.h"
37
- #include "absl/strings/str_cat.h"
38
- #include "absl/strings/str_join.h"
33
+ #include "absl/status/statusor.h"
39
34
  #include "absl/types/optional.h"
40
35
  #include "absl/types/variant.h"
41
36
 
@@ -47,39 +42,48 @@
47
42
  #include "src/core/lib/channel/channel_args.h"
48
43
  #include "src/core/lib/channel/channel_fwd.h"
49
44
  #include "src/core/lib/channel/channel_stack.h"
50
- #include "src/core/lib/channel/context.h"
51
45
  #include "src/core/lib/debug/trace.h"
52
46
  #include "src/core/lib/experiments/experiments.h"
53
47
  #include "src/core/lib/gpr/alloc.h"
54
48
  #include "src/core/lib/gprpp/debug_location.h"
55
- #include "src/core/lib/gprpp/match.h"
56
49
  #include "src/core/lib/gprpp/orphanable.h"
57
- #include "src/core/lib/gprpp/status_helper.h"
58
- #include "src/core/lib/gprpp/sync.h"
50
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
51
+ #include "src/core/lib/gprpp/time.h"
59
52
  #include "src/core/lib/iomgr/call_combiner.h"
60
53
  #include "src/core/lib/iomgr/closure.h"
61
54
  #include "src/core/lib/iomgr/error.h"
62
- #include "src/core/lib/iomgr/exec_ctx.h"
63
55
  #include "src/core/lib/iomgr/polling_entity.h"
64
56
  #include "src/core/lib/promise/activity.h"
65
57
  #include "src/core/lib/promise/arena_promise.h"
66
58
  #include "src/core/lib/promise/context.h"
59
+ #include "src/core/lib/promise/detail/basic_join.h"
67
60
  #include "src/core/lib/promise/detail/basic_seq.h"
61
+ #include "src/core/lib/promise/for_each.h"
62
+ #include "src/core/lib/promise/if.h"
63
+ #include "src/core/lib/promise/latch.h"
64
+ #include "src/core/lib/promise/loop.h"
65
+ #include "src/core/lib/promise/map.h"
66
+ #include "src/core/lib/promise/party.h"
68
67
  #include "src/core/lib/promise/pipe.h"
69
68
  #include "src/core/lib/promise/poll.h"
69
+ #include "src/core/lib/promise/promise.h"
70
+ #include "src/core/lib/promise/race.h"
71
+ #include "src/core/lib/promise/seq.h"
72
+ #include "src/core/lib/promise/try_join.h"
73
+ #include "src/core/lib/promise/try_seq.h"
70
74
  #include "src/core/lib/resource_quota/arena.h"
71
75
  #include "src/core/lib/slice/slice.h"
72
76
  #include "src/core/lib/slice/slice_buffer.h"
73
77
  #include "src/core/lib/surface/call.h"
74
78
  #include "src/core/lib/surface/call_trace.h"
75
79
  #include "src/core/lib/surface/channel_stack_type.h"
80
+ #include "src/core/lib/transport/batch_builder.h"
81
+ #include "src/core/lib/transport/error_utils.h"
76
82
  #include "src/core/lib/transport/metadata_batch.h"
77
83
  #include "src/core/lib/transport/transport.h"
78
84
  #include "src/core/lib/transport/transport_fwd.h"
79
85
  #include "src/core/lib/transport/transport_impl.h"
80
86
 
81
- #define MAX_BUFFER_LENGTH 8192
82
-
83
87
  typedef struct connected_channel_channel_data {
84
88
  grpc_transport* transport;
85
89
  } channel_data;
@@ -252,10 +256,24 @@ namespace {
252
256
  defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL)
253
257
  class ConnectedChannelStream : public Orphanable {
254
258
  public:
259
+ explicit ConnectedChannelStream(grpc_transport* transport)
260
+ : transport_(transport), stream_(nullptr, StreamDeleter(this)) {
261
+ GRPC_STREAM_REF_INIT(
262
+ &stream_refcount_, 1,
263
+ [](void* p, grpc_error_handle) {
264
+ static_cast<ConnectedChannelStream*>(p)->BeginDestroy();
265
+ },
266
+ this, "ConnectedChannelStream");
267
+ }
268
+
255
269
  grpc_transport* transport() { return transport_; }
256
270
  grpc_closure* stream_destroyed_closure() { return &stream_destroyed_; }
257
271
 
258
- void IncrementRefCount(const char* reason) {
272
+ BatchBuilder::Target batch_target() {
273
+ return BatchBuilder::Target{transport_, stream_.get(), &stream_refcount_};
274
+ }
275
+
276
+ void IncrementRefCount(const char* reason = "smartptr") {
259
277
  #ifndef NDEBUG
260
278
  grpc_stream_ref(&stream_refcount_, reason);
261
279
  #else
@@ -264,7 +282,7 @@ class ConnectedChannelStream : public Orphanable {
264
282
  #endif
265
283
  }
266
284
 
267
- void Unref(const char* reason) {
285
+ void Unref(const char* reason = "smartptr") {
268
286
  #ifndef NDEBUG
269
287
  grpc_stream_unref(&stream_refcount_, reason);
270
288
  #else
@@ -273,234 +291,48 @@ class ConnectedChannelStream : public Orphanable {
273
291
  #endif
274
292
  }
275
293
 
294
+ RefCountedPtr<ConnectedChannelStream> InternalRef() {
295
+ IncrementRefCount("smartptr");
296
+ return RefCountedPtr<ConnectedChannelStream>(this);
297
+ }
298
+
276
299
  void Orphan() final {
277
- bool finished;
278
- {
279
- MutexLock lock(mu());
280
- if (grpc_call_trace.enabled()) {
281
- gpr_log(GPR_INFO, "%s[connected] DropStream: %s finished=%s",
282
- Activity::current()->DebugTag().c_str(),
283
- ActiveOpsString().c_str(), finished_ ? "true" : "false");
284
- }
285
- finished = finished_;
300
+ bool finished = finished_.IsSet();
301
+ if (grpc_call_trace.enabled()) {
302
+ gpr_log(GPR_DEBUG, "%s[connected] Orphan stream, finished: %d",
303
+ party_->DebugTag().c_str(), finished);
286
304
  }
287
305
  // If we hadn't already observed the stream to be finished, we need to
288
306
  // cancel it at the transport.
289
307
  if (!finished) {
290
- IncrementRefCount("shutdown client stream");
291
- auto* cancel_op =
292
- GetContext<Arena>()->New<grpc_transport_stream_op_batch>();
293
- cancel_op->cancel_stream = true;
294
- cancel_op->payload = batch_payload();
295
- auto* s = stream();
296
- cancel_op->on_complete = NewClosure(
297
- [this](grpc_error_handle) { Unref("shutdown client stream"); });
298
- batch_payload()->cancel_stream.cancel_error = absl::CancelledError();
299
- grpc_transport_perform_stream_op(transport(), s, cancel_op);
308
+ party_->Spawn(
309
+ "finish",
310
+ [self = InternalRef()]() {
311
+ if (!self->finished_.IsSet()) {
312
+ self->finished_.Set();
313
+ }
314
+ return Empty{};
315
+ },
316
+ [](Empty) {});
317
+ GetContext<BatchBuilder>()->Cancel(batch_target(),
318
+ absl::CancelledError());
300
319
  }
301
- Unref("orphan client stream");
320
+ Unref("orphan connected stream");
302
321
  }
303
322
 
304
- protected:
305
- explicit ConnectedChannelStream(grpc_transport* transport)
306
- : transport_(transport), stream_(nullptr, StreamDeleter(this)) {
307
- call_context_->IncrementRefCount("connected_channel_stream");
308
- GRPC_STREAM_REF_INIT(
309
- &stream_refcount_, 1,
310
- [](void* p, grpc_error_handle) {
311
- static_cast<ConnectedChannelStream*>(p)->BeginDestroy();
312
- },
313
- this, "client_stream");
314
- }
323
+ // Returns a promise that implements the receive message loop.
324
+ auto RecvMessages(PipeSender<MessageHandle>* incoming_messages);
325
+ // Returns a promise that implements the send message loop.
326
+ auto SendMessages(PipeReceiver<MessageHandle>* outgoing_messages);
315
327
 
316
- grpc_stream* stream() { return stream_.get(); }
317
328
  void SetStream(grpc_stream* stream) { stream_.reset(stream); }
329
+ grpc_stream* stream() { return stream_.get(); }
318
330
  grpc_stream_refcount* stream_refcount() { return &stream_refcount_; }
319
- Mutex* mu() const ABSL_LOCK_RETURNED(mu_) { return &mu_; }
320
- grpc_transport_stream_op_batch_payload* batch_payload() {
321
- return &batch_payload_;
322
- }
323
- bool finished() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { return finished_; }
324
- void set_finished() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { finished_ = true; }
325
- virtual std::string ActiveOpsString() const
326
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) = 0;
327
331
 
328
- void SchedulePush(grpc_transport_stream_op_batch* batch)
329
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
330
- if (grpc_call_trace.enabled()) {
331
- gpr_log(GPR_DEBUG, "%s[connected] Push batch to transport: %s",
332
- Activity::current()->DebugTag().c_str(),
333
- grpc_transport_stream_op_batch_string(batch).c_str());
334
- }
335
- if (push_batches_.empty()) {
336
- IncrementRefCount("push");
337
- ExecCtx::Run(DEBUG_LOCATION, &push_, absl::OkStatus());
338
- }
339
- push_batches_.push_back(batch);
340
- }
341
-
342
- void PollSendMessage(PipeReceiver<MessageHandle>* outgoing_messages,
343
- ClientMetadataHandle* client_trailing_metadata)
344
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
345
- if (absl::holds_alternative<Closed>(send_message_state_)) {
346
- message_to_send_.reset();
347
- }
348
- if (absl::holds_alternative<Idle>(send_message_state_)) {
349
- message_to_send_.reset();
350
- send_message_state_.emplace<PipeReceiverNextType<MessageHandle>>(
351
- outgoing_messages->Next());
352
- }
353
- if (auto* next = absl::get_if<PipeReceiverNextType<MessageHandle>>(
354
- &send_message_state_)) {
355
- auto r = (*next)();
356
- if (auto* p = r.value_if_ready()) {
357
- memset(&send_message_, 0, sizeof(send_message_));
358
- send_message_.payload = batch_payload();
359
- send_message_.on_complete = &send_message_batch_done_;
360
- // No value => half close from above.
361
- if (p->has_value()) {
362
- message_to_send_ = std::move(*p);
363
- send_message_state_ = SendMessageToTransport{};
364
- send_message_.send_message = true;
365
- batch_payload()->send_message.send_message =
366
- (*message_to_send_)->payload();
367
- batch_payload()->send_message.flags = (*message_to_send_)->flags();
368
- } else {
369
- if (grpc_call_trace.enabled()) {
370
- gpr_log(GPR_INFO, "%s[connected] PollConnectedChannel: half close",
371
- Activity::current()->DebugTag().c_str());
372
- }
373
- GPR_ASSERT(!absl::holds_alternative<Closed>(send_message_state_));
374
- send_message_state_ = Closed{};
375
- send_message_.send_trailing_metadata = true;
376
- if (client_trailing_metadata != nullptr) {
377
- *client_trailing_metadata =
378
- GetContext<Arena>()->MakePooled<ClientMetadata>(
379
- GetContext<Arena>());
380
- batch_payload()->send_trailing_metadata.send_trailing_metadata =
381
- client_trailing_metadata->get();
382
- batch_payload()->send_trailing_metadata.sent = nullptr;
383
- } else {
384
- return; // Skip rest of function for server
385
- }
386
- }
387
- IncrementRefCount("send_message");
388
- send_message_waker_ = Activity::current()->MakeOwningWaker();
389
- SchedulePush(&send_message_);
390
- }
391
- }
392
- }
393
-
394
- void PollRecvMessage(PipeSender<MessageHandle>*& incoming_messages)
395
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
396
- if (auto* pending =
397
- absl::get_if<PendingReceiveMessage>(&recv_message_state_)) {
398
- if (pending->received) {
399
- if (pending->payload.has_value()) {
400
- if (grpc_call_trace.enabled()) {
401
- gpr_log(GPR_INFO,
402
- "%s[connected] PollRecvMessage: received payload of "
403
- "%" PRIdPTR " bytes",
404
- recv_message_waker_.ActivityDebugTag().c_str(),
405
- pending->payload->Length());
406
- }
407
- recv_message_state_ =
408
- incoming_messages->Push(GetContext<Arena>()->MakePooled<Message>(
409
- std::move(*pending->payload), pending->flags));
410
- } else {
411
- if (grpc_call_trace.enabled()) {
412
- gpr_log(GPR_INFO,
413
- "%s[connected] PollRecvMessage: received no payload",
414
- recv_message_waker_.ActivityDebugTag().c_str());
415
- }
416
- recv_message_state_ = Closed{};
417
- std::exchange(incoming_messages, nullptr)->Close();
418
- }
419
- }
420
- }
421
- if (absl::holds_alternative<Idle>(recv_message_state_)) {
422
- if (grpc_call_trace.enabled()) {
423
- gpr_log(GPR_INFO, "%s[connected] PollRecvMessage: requesting message",
424
- Activity::current()->DebugTag().c_str());
425
- }
426
- PushRecvMessage();
427
- }
428
- if (auto* push = absl::get_if<PipeSender<MessageHandle>::PushType>(
429
- &recv_message_state_)) {
430
- auto r = (*push)();
431
- if (bool* result = r.value_if_ready()) {
432
- if (*result) {
433
- if (!finished_) {
434
- if (grpc_call_trace.enabled()) {
435
- gpr_log(GPR_INFO,
436
- "%s[connected] PollRecvMessage: pushed message; "
437
- "requesting next",
438
- Activity::current()->DebugTag().c_str());
439
- }
440
- PushRecvMessage();
441
- } else {
442
- if (grpc_call_trace.enabled()) {
443
- gpr_log(GPR_INFO,
444
- "%s[connected] PollRecvMessage: pushed message "
445
- "and finished; "
446
- "marking closed",
447
- Activity::current()->DebugTag().c_str());
448
- }
449
- recv_message_state_ = Closed{};
450
- std::exchange(incoming_messages, nullptr)->Close();
451
- }
452
- } else {
453
- if (grpc_call_trace.enabled()) {
454
- gpr_log(GPR_INFO,
455
- "%s[connected] PollRecvMessage: failed to push "
456
- "message; marking "
457
- "closed",
458
- Activity::current()->DebugTag().c_str());
459
- }
460
- recv_message_state_ = Closed{};
461
- std::exchange(incoming_messages, nullptr)->Close();
462
- }
463
- }
464
- }
465
- }
466
-
467
- std::string SendMessageString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
468
- return Match(
469
- send_message_state_, [](Idle) -> std::string { return "IDLE"; },
470
- [](Closed) -> std::string { return "CLOSED"; },
471
- [](const PipeReceiverNextType<MessageHandle>&) -> std::string {
472
- return "WAITING";
473
- },
474
- [](SendMessageToTransport) -> std::string { return "SENDING"; });
475
- }
476
-
477
- std::string RecvMessageString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
478
- return Match(
479
- recv_message_state_, [](Idle) -> std::string { return "IDLE"; },
480
- [](Closed) -> std::string { return "CLOSED"; },
481
- [](const PendingReceiveMessage&) -> std::string { return "WAITING"; },
482
- [](const absl::optional<MessageHandle>& message) -> std::string {
483
- return absl::StrCat(
484
- "READY:", message.has_value()
485
- ? absl::StrCat((*message)->payload()->Length(), "b")
486
- : "EOS");
487
- },
488
- [](const PipeSender<MessageHandle>::PushType&) -> std::string {
489
- return "PUSHING";
490
- });
491
- }
492
-
493
- bool IsPromiseReceiving() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
494
- return absl::holds_alternative<PipeSender<MessageHandle>::PushType>(
495
- recv_message_state_) ||
496
- absl::holds_alternative<PendingReceiveMessage>(recv_message_state_);
497
- }
332
+ void set_finished() { finished_.Set(); }
333
+ auto WaitFinished() { return finished_.Wait(); }
498
334
 
499
335
  private:
500
- struct SendMessageToTransport {};
501
- struct Idle {};
502
- struct Closed {};
503
-
504
336
  class StreamDeleter {
505
337
  public:
506
338
  explicit StreamDeleter(ConnectedChannelStream* impl) : impl_(impl) {}
@@ -516,11 +348,7 @@ class ConnectedChannelStream : public Orphanable {
516
348
  using StreamPtr = std::unique_ptr<grpc_stream, StreamDeleter>;
517
349
 
518
350
  void StreamDestroyed() {
519
- call_context_->RunInContext([this] {
520
- auto* cc = call_context_;
521
- this->~ConnectedChannelStream();
522
- cc->Unref("child_stream");
523
- });
351
+ call_context_->RunInContext([this] { this->~ConnectedChannelStream(); });
524
352
  }
525
353
 
526
354
  void BeginDestroy() {
@@ -531,828 +359,434 @@ class ConnectedChannelStream : public Orphanable {
531
359
  }
532
360
  }
533
361
 
534
- // Called from outside the activity to push work down to the transport.
535
- void Push() {
536
- PushBatches push_batches;
537
- {
538
- MutexLock lock(&mu_);
539
- push_batches.swap(push_batches_);
540
- }
541
- for (auto* batch : push_batches) {
542
- if (stream() != nullptr) {
543
- grpc_transport_perform_stream_op(transport(), stream(), batch);
544
- } else {
545
- grpc_transport_stream_op_batch_finish_with_failure_from_transport(
546
- batch, absl::CancelledError());
547
- }
548
- }
549
- Unref("push");
550
- }
551
-
552
- void SendMessageBatchDone(grpc_error_handle error) {
553
- {
554
- MutexLock lock(&mu_);
555
- if (error != absl::OkStatus()) {
556
- // Note that we're in error here, the call will be closed by the
557
- // transport in a moment, and we'll return from the promise with an
558
- // error - so we don't need to do any extra work to close out pipes or
559
- // the like.
560
- send_message_state_ = Closed{};
561
- }
562
- if (!absl::holds_alternative<Closed>(send_message_state_)) {
563
- send_message_state_ = Idle{};
564
- }
565
- send_message_waker_.Wakeup();
566
- }
567
- Unref("send_message");
568
- }
569
-
570
- void RecvMessageBatchDone(grpc_error_handle error) {
571
- {
572
- MutexLock lock(mu());
573
- if (error != absl::OkStatus()) {
574
- if (grpc_call_trace.enabled()) {
575
- gpr_log(GPR_INFO, "%s[connected] RecvMessageBatchDone: error=%s",
576
- recv_message_waker_.ActivityDebugTag().c_str(),
577
- StatusToString(error).c_str());
578
- }
579
- } else if (absl::holds_alternative<Closed>(recv_message_state_)) {
580
- if (grpc_call_trace.enabled()) {
581
- gpr_log(GPR_INFO,
582
- "%s[connected] RecvMessageBatchDone: already closed, "
583
- "ignoring",
584
- recv_message_waker_.ActivityDebugTag().c_str());
585
- }
586
- } else {
587
- if (grpc_call_trace.enabled()) {
588
- gpr_log(GPR_INFO,
589
- "%s[connected] RecvMessageBatchDone: received message",
590
- recv_message_waker_.ActivityDebugTag().c_str());
591
- }
592
- auto pending =
593
- absl::get_if<PendingReceiveMessage>(&recv_message_state_);
594
- GPR_ASSERT(pending != nullptr);
595
- GPR_ASSERT(pending->received == false);
596
- pending->received = true;
597
- }
598
- recv_message_waker_.Wakeup();
599
- }
600
- Unref("recv_message");
601
- }
602
-
603
- void PushRecvMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
604
- recv_message_state_ = PendingReceiveMessage{};
605
- auto& pending_recv_message =
606
- absl::get<PendingReceiveMessage>(recv_message_state_);
607
- memset(&recv_message_, 0, sizeof(recv_message_));
608
- recv_message_.payload = batch_payload();
609
- recv_message_.on_complete = nullptr;
610
- recv_message_.recv_message = true;
611
- batch_payload()->recv_message.recv_message = &pending_recv_message.payload;
612
- batch_payload()->recv_message.flags = &pending_recv_message.flags;
613
- batch_payload()->recv_message.call_failed_before_recv_message = nullptr;
614
- batch_payload()->recv_message.recv_message_ready =
615
- &recv_message_batch_done_;
616
- IncrementRefCount("recv_message");
617
- recv_message_waker_ = Activity::current()->MakeOwningWaker();
618
- SchedulePush(&recv_message_);
619
- }
620
-
621
- mutable Mutex mu_;
622
362
  grpc_transport* const transport_;
623
- CallContext* const call_context_{GetContext<CallContext>()};
363
+ RefCountedPtr<CallContext> const call_context_{
364
+ GetContext<CallContext>()->Ref()};
624
365
  grpc_closure stream_destroyed_ =
625
366
  MakeMemberClosure<ConnectedChannelStream,
626
367
  &ConnectedChannelStream::StreamDestroyed>(
627
368
  this, DEBUG_LOCATION);
628
369
  grpc_stream_refcount stream_refcount_;
629
370
  StreamPtr stream_;
630
- using PushBatches = absl::InlinedVector<grpc_transport_stream_op_batch*, 3>;
631
- PushBatches push_batches_ ABSL_GUARDED_BY(mu_);
632
- grpc_closure push_ =
633
- MakeMemberClosure<ConnectedChannelStream, &ConnectedChannelStream::Push>(
634
- this, DEBUG_LOCATION);
635
-
636
- NextResult<MessageHandle> message_to_send_ ABSL_GUARDED_BY(mu_);
637
- absl::variant<Idle, Closed, PipeReceiverNextType<MessageHandle>,
638
- SendMessageToTransport>
639
- send_message_state_ ABSL_GUARDED_BY(mu_);
640
- grpc_transport_stream_op_batch send_message_;
641
- grpc_closure send_message_batch_done_ =
642
- MakeMemberClosure<ConnectedChannelStream,
643
- &ConnectedChannelStream::SendMessageBatchDone>(
644
- this, DEBUG_LOCATION);
645
-
646
- struct PendingReceiveMessage {
647
- absl::optional<SliceBuffer> payload;
648
- uint32_t flags;
649
- bool received = false;
650
- };
651
- absl::variant<Idle, PendingReceiveMessage, Closed,
652
- PipeSender<MessageHandle>::PushType>
653
- recv_message_state_ ABSL_GUARDED_BY(mu_);
654
- grpc_closure recv_message_batch_done_ =
655
- MakeMemberClosure<ConnectedChannelStream,
656
- &ConnectedChannelStream::RecvMessageBatchDone>(
657
- this, DEBUG_LOCATION);
658
- grpc_transport_stream_op_batch recv_message_;
659
-
660
- Waker send_message_waker_ ABSL_GUARDED_BY(mu_);
661
- Waker recv_message_waker_ ABSL_GUARDED_BY(mu_);
662
- bool finished_ ABSL_GUARDED_BY(mu_) = false;
663
-
664
- grpc_transport_stream_op_batch_payload batch_payload_{
665
- GetContext<grpc_call_context_element>()};
666
- };
667
- #endif
668
-
669
- #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
670
- class ClientStream : public ConnectedChannelStream {
671
- public:
672
- ClientStream(grpc_transport* transport, CallArgs call_args)
673
- : ConnectedChannelStream(transport),
674
- server_initial_metadata_pipe_(call_args.server_initial_metadata),
675
- client_to_server_messages_(call_args.client_to_server_messages),
676
- server_to_client_messages_(call_args.server_to_client_messages),
677
- client_initial_metadata_(std::move(call_args.client_initial_metadata)) {
678
- if (grpc_call_trace.enabled()) {
679
- gpr_log(GPR_INFO, "%s[connected] InitImpl: intitial_metadata=%s",
680
- Activity::current()->DebugTag().c_str(),
681
- client_initial_metadata_->DebugString().c_str());
682
- }
683
- }
684
-
685
- Poll<ServerMetadataHandle> PollOnce() {
686
- MutexLock lock(mu());
687
- GPR_ASSERT(!finished());
688
-
689
- if (grpc_call_trace.enabled()) {
690
- gpr_log(GPR_INFO, "%s[connected] PollConnectedChannel: %s",
691
- Activity::current()->DebugTag().c_str(),
692
- ActiveOpsString().c_str());
693
- }
694
-
695
- if (!std::exchange(requested_metadata_, true)) {
696
- if (grpc_call_trace.enabled()) {
697
- gpr_log(GPR_INFO,
698
- "%s[connected] PollConnectedChannel: requesting metadata",
699
- Activity::current()->DebugTag().c_str());
700
- }
701
- SetStream(static_cast<grpc_stream*>(
702
- GetContext<Arena>()->Alloc(transport()->vtable->sizeof_stream)));
703
- grpc_transport_init_stream(transport(), stream(), stream_refcount(),
704
- nullptr, GetContext<Arena>());
705
- grpc_transport_set_pops(transport(), stream(),
706
- GetContext<CallContext>()->polling_entity());
707
- memset(&metadata_, 0, sizeof(metadata_));
708
- metadata_.send_initial_metadata = true;
709
- metadata_.recv_initial_metadata = true;
710
- metadata_.recv_trailing_metadata = true;
711
- metadata_.payload = batch_payload();
712
- metadata_.on_complete = &metadata_batch_done_;
713
- batch_payload()->send_initial_metadata.send_initial_metadata =
714
- client_initial_metadata_.get();
715
- batch_payload()->send_initial_metadata.peer_string =
716
- GetContext<CallContext>()->peer_string_atm_ptr();
717
- server_initial_metadata_ =
718
- GetContext<Arena>()->MakePooled<ServerMetadata>(GetContext<Arena>());
719
- batch_payload()->recv_initial_metadata.recv_initial_metadata =
720
- server_initial_metadata_.get();
721
- batch_payload()->recv_initial_metadata.recv_initial_metadata_ready =
722
- &recv_initial_metadata_ready_;
723
- batch_payload()->recv_initial_metadata.trailing_metadata_available =
724
- nullptr;
725
- batch_payload()->recv_initial_metadata.peer_string = nullptr;
726
- server_trailing_metadata_ =
727
- GetContext<Arena>()->MakePooled<ServerMetadata>(GetContext<Arena>());
728
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata =
729
- server_trailing_metadata_.get();
730
- batch_payload()->recv_trailing_metadata.collect_stats =
731
- &GetContext<CallContext>()->call_stats()->transport_stream_stats;
732
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata_ready =
733
- &recv_trailing_metadata_ready_;
734
- IncrementRefCount("metadata_batch_done");
735
- IncrementRefCount("initial_metadata_ready");
736
- IncrementRefCount("trailing_metadata_ready");
737
- initial_metadata_waker_ = Activity::current()->MakeOwningWaker();
738
- trailing_metadata_waker_ = Activity::current()->MakeOwningWaker();
739
- SchedulePush(&metadata_);
740
- }
741
- if (server_initial_metadata_state_ ==
742
- ServerInitialMetadataState::kReceivedButNotPushed) {
743
- server_initial_metadata_state_ = ServerInitialMetadataState::kPushing;
744
- server_initial_metadata_push_promise_ =
745
- server_initial_metadata_pipe_->Push(
746
- std::move(server_initial_metadata_));
747
- }
748
- if (server_initial_metadata_state_ ==
749
- ServerInitialMetadataState::kPushing) {
750
- auto r = (*server_initial_metadata_push_promise_)();
751
- if (r.ready()) {
752
- server_initial_metadata_state_ = ServerInitialMetadataState::kPushed;
753
- server_initial_metadata_push_promise_.reset();
754
- }
755
- }
756
- PollSendMessage(client_to_server_messages_, &client_trailing_metadata_);
757
- PollRecvMessage(server_to_client_messages_);
758
- if (server_initial_metadata_state_ == ServerInitialMetadataState::kPushed &&
759
- !IsPromiseReceiving() &&
760
- std::exchange(queued_trailing_metadata_, false)) {
761
- if (grpc_call_trace.enabled()) {
762
- gpr_log(GPR_INFO,
763
- "%s[connected] PollConnectedChannel: finished request, "
764
- "returning: {%s}; "
765
- "active_ops: %s",
766
- Activity::current()->DebugTag().c_str(),
767
- server_trailing_metadata_->DebugString().c_str(),
768
- ActiveOpsString().c_str());
769
- }
770
- set_finished();
771
- return ServerMetadataHandle(std::move(server_trailing_metadata_));
772
- }
773
- return Pending{};
774
- }
775
-
776
- void RecvInitialMetadataReady(grpc_error_handle error) {
777
- GPR_ASSERT(error == absl::OkStatus());
778
- {
779
- MutexLock lock(mu());
780
- server_initial_metadata_state_ =
781
- ServerInitialMetadataState::kReceivedButNotPushed;
782
- initial_metadata_waker_.Wakeup();
783
- }
784
- Unref("initial_metadata_ready");
785
- }
786
-
787
- void RecvTrailingMetadataReady(grpc_error_handle error) {
788
- GPR_ASSERT(error == absl::OkStatus());
789
- {
790
- MutexLock lock(mu());
791
- queued_trailing_metadata_ = true;
792
- if (grpc_call_trace.enabled()) {
793
- gpr_log(GPR_DEBUG,
794
- "%s[connected] RecvTrailingMetadataReady: "
795
- "queued_trailing_metadata_ "
796
- "set to true; active_ops: %s",
797
- trailing_metadata_waker_.ActivityDebugTag().c_str(),
798
- ActiveOpsString().c_str());
799
- }
800
- trailing_metadata_waker_.Wakeup();
801
- }
802
- Unref("trailing_metadata_ready");
803
- }
804
-
805
- void MetadataBatchDone(grpc_error_handle error) {
806
- GPR_ASSERT(error == absl::OkStatus());
807
- Unref("metadata_batch_done");
808
- }
809
-
810
- private:
811
- enum class ServerInitialMetadataState : uint8_t {
812
- // Initial metadata has not been received from the server.
813
- kNotReceived,
814
- // Initial metadata has been received from the server via the transport, but
815
- // has not yet been pushed onto the pipe to publish it up the call stack.
816
- kReceivedButNotPushed,
817
- // Initial metadata has been received from the server via the transport and
818
- // has been pushed on the pipe to publish it up the call stack.
819
- // It's still in the pipe and has not been removed by the call at the top
820
- // yet.
821
- kPushing,
822
- // Initial metadata has been received from the server via the transport and
823
- // has been pushed on the pipe to publish it up the call stack AND removed
824
- // by the call at the top.
825
- kPushed,
826
- };
827
-
828
- std::string ActiveOpsString() const override
829
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
830
- std::vector<std::string> ops;
831
- if (finished()) ops.push_back("FINISHED");
832
- // Outstanding Operations on Transport
833
- std::vector<std::string> waiting;
834
- if (initial_metadata_waker_ != Waker()) {
835
- waiting.push_back("initial_metadata");
836
- }
837
- if (trailing_metadata_waker_ != Waker()) {
838
- waiting.push_back("trailing_metadata");
839
- }
840
- if (!waiting.empty()) {
841
- ops.push_back(absl::StrCat("waiting:", absl::StrJoin(waiting, ",")));
842
- }
843
- // Results from transport
844
- std::vector<std::string> queued;
845
- if (server_initial_metadata_state_ ==
846
- ServerInitialMetadataState::kReceivedButNotPushed) {
847
- queued.push_back("initial_metadata");
848
- }
849
- if (queued_trailing_metadata_) queued.push_back("trailing_metadata");
850
- if (!queued.empty()) {
851
- ops.push_back(absl::StrCat("queued:", absl::StrJoin(queued, ",")));
852
- }
853
- // Send message
854
- std::string send_message_state = SendMessageString();
855
- if (send_message_state != "WAITING") {
856
- ops.push_back(absl::StrCat("send_message:", send_message_state));
857
- }
858
- // Receive message
859
- std::string recv_message_state = RecvMessageString();
860
- if (recv_message_state != "IDLE") {
861
- ops.push_back(absl::StrCat("recv_message:", recv_message_state));
862
- }
863
- return absl::StrJoin(ops, " ");
864
- }
865
-
866
- bool requested_metadata_ = false;
867
- ServerInitialMetadataState server_initial_metadata_state_
868
- ABSL_GUARDED_BY(mu()) = ServerInitialMetadataState::kNotReceived;
869
- bool queued_trailing_metadata_ ABSL_GUARDED_BY(mu()) = false;
870
- Waker initial_metadata_waker_ ABSL_GUARDED_BY(mu());
871
- Waker trailing_metadata_waker_ ABSL_GUARDED_BY(mu());
872
- PipeSender<ServerMetadataHandle>* server_initial_metadata_pipe_;
873
- PipeReceiver<MessageHandle>* client_to_server_messages_;
874
- PipeSender<MessageHandle>* server_to_client_messages_;
875
- grpc_closure recv_initial_metadata_ready_ =
876
- MakeMemberClosure<ClientStream, &ClientStream::RecvInitialMetadataReady>(
877
- this, DEBUG_LOCATION);
878
- grpc_closure recv_trailing_metadata_ready_ =
879
- MakeMemberClosure<ClientStream, &ClientStream::RecvTrailingMetadataReady>(
880
- this, DEBUG_LOCATION);
881
- ClientMetadataHandle client_initial_metadata_;
882
- ClientMetadataHandle client_trailing_metadata_;
883
- ServerMetadataHandle server_initial_metadata_;
884
- ServerMetadataHandle server_trailing_metadata_;
885
- absl::optional<PipeSender<ServerMetadataHandle>::PushType>
886
- server_initial_metadata_push_promise_;
887
- grpc_transport_stream_op_batch metadata_;
888
- grpc_closure metadata_batch_done_ =
889
- MakeMemberClosure<ClientStream, &ClientStream::MetadataBatchDone>(
890
- this, DEBUG_LOCATION);
371
+ Arena* arena_ = GetContext<Arena>();
372
+ Party* const party_ = static_cast<Party*>(Activity::current());
373
+ ExternallyObservableLatch<void> finished_;
891
374
  };
892
375
 
893
- class ClientConnectedCallPromise {
894
- public:
895
- ClientConnectedCallPromise(grpc_transport* transport, CallArgs call_args)
896
- : impl_(GetContext<Arena>()->New<ClientStream>(transport,
897
- std::move(call_args))) {}
898
-
899
- ClientConnectedCallPromise(const ClientConnectedCallPromise&) = delete;
900
- ClientConnectedCallPromise& operator=(const ClientConnectedCallPromise&) =
901
- delete;
902
- ClientConnectedCallPromise(ClientConnectedCallPromise&& other) noexcept
903
- : impl_(std::exchange(other.impl_, nullptr)) {}
904
- ClientConnectedCallPromise& operator=(
905
- ClientConnectedCallPromise&& other) noexcept {
906
- impl_ = std::move(other.impl_);
907
- return *this;
908
- }
909
-
910
- static ArenaPromise<ServerMetadataHandle> Make(grpc_transport* transport,
911
- CallArgs call_args,
912
- NextPromiseFactory) {
913
- return ClientConnectedCallPromise(transport, std::move(call_args));
914
- }
376
+ auto ConnectedChannelStream::RecvMessages(
377
+ PipeSender<MessageHandle>* incoming_messages) {
378
+ return Loop([self = InternalRef(),
379
+ incoming_messages = std::move(*incoming_messages)]() mutable {
380
+ return Seq(
381
+ GetContext<BatchBuilder>()->ReceiveMessage(self->batch_target()),
382
+ [&incoming_messages](
383
+ absl::StatusOr<absl::optional<MessageHandle>> status) mutable {
384
+ bool has_message = status.ok() && status->has_value();
385
+ auto publish_message = [&incoming_messages, &status]() {
386
+ auto pending_message = std::move(**status);
387
+ if (grpc_call_trace.enabled()) {
388
+ gpr_log(GPR_INFO,
389
+ "%s[connected] RecvMessage: received payload of %" PRIdPTR
390
+ " bytes",
391
+ Activity::current()->DebugTag().c_str(),
392
+ pending_message->payload()->Length());
393
+ }
394
+ return Map(incoming_messages.Push(std::move(pending_message)),
395
+ [](bool ok) -> LoopCtl<absl::Status> {
396
+ if (!ok) {
397
+ if (grpc_call_trace.enabled()) {
398
+ gpr_log(GPR_INFO,
399
+ "%s[connected] RecvMessage: failed to "
400
+ "push message towards the application",
401
+ Activity::current()->DebugTag().c_str());
402
+ }
403
+ return absl::OkStatus();
404
+ }
405
+ return Continue{};
406
+ });
407
+ };
408
+ auto publish_close = [&status]() mutable {
409
+ if (grpc_call_trace.enabled()) {
410
+ gpr_log(GPR_INFO,
411
+ "%s[connected] RecvMessage: reached end of stream with "
412
+ "status:%s",
413
+ Activity::current()->DebugTag().c_str(),
414
+ status.status().ToString().c_str());
415
+ }
416
+ return Immediate(LoopCtl<absl::Status>(status.status()));
417
+ };
418
+ return If(has_message, std::move(publish_message),
419
+ std::move(publish_close));
420
+ });
421
+ });
422
+ }
915
423
 
916
- Poll<ServerMetadataHandle> operator()() { return impl_->PollOnce(); }
424
+ auto ConnectedChannelStream::SendMessages(
425
+ PipeReceiver<MessageHandle>* outgoing_messages) {
426
+ return ForEach(std::move(*outgoing_messages),
427
+ [self = InternalRef()](MessageHandle message) {
428
+ return GetContext<BatchBuilder>()->SendMessage(
429
+ self->batch_target(), std::move(message));
430
+ });
431
+ }
432
+ #endif // defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL) ||
433
+ // defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL)
917
434
 
918
- private:
919
- OrphanablePtr<ClientStream> impl_;
920
- };
435
+ #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
436
+ ArenaPromise<ServerMetadataHandle> MakeClientCallPromise(
437
+ grpc_transport* transport, CallArgs call_args, NextPromiseFactory) {
438
+ OrphanablePtr<ConnectedChannelStream> stream(
439
+ GetContext<Arena>()->New<ConnectedChannelStream>(transport));
440
+ stream->SetStream(static_cast<grpc_stream*>(
441
+ GetContext<Arena>()->Alloc(transport->vtable->sizeof_stream)));
442
+ grpc_transport_init_stream(transport, stream->stream(),
443
+ stream->stream_refcount(), nullptr,
444
+ GetContext<Arena>());
445
+ grpc_transport_set_pops(transport, stream->stream(),
446
+ GetContext<CallContext>()->polling_entity());
447
+ auto* party = static_cast<Party*>(Activity::current());
448
+ // Start a loop to send messages from client_to_server_messages to the
449
+ // transport. When the pipe closes and the loop completes, send a trailing
450
+ // metadata batch to close the stream.
451
+ party->Spawn(
452
+ "send_messages",
453
+ TrySeq(stream->SendMessages(call_args.client_to_server_messages),
454
+ [stream = stream->InternalRef()]() {
455
+ return GetContext<BatchBuilder>()->SendClientTrailingMetadata(
456
+ stream->batch_target());
457
+ }),
458
+ [](absl::Status) {});
459
+ // Start a promise to receive server initial metadata and then forward it up
460
+ // through the receiving pipe.
461
+ auto server_initial_metadata =
462
+ GetContext<Arena>()->MakePooled<ServerMetadata>(GetContext<Arena>());
463
+ party->Spawn(
464
+ "recv_initial_metadata",
465
+ TrySeq(GetContext<BatchBuilder>()->ReceiveServerInitialMetadata(
466
+ stream->batch_target()),
467
+ [pipe = call_args.server_initial_metadata](
468
+ ServerMetadataHandle server_initial_metadata) {
469
+ if (grpc_call_trace.enabled()) {
470
+ gpr_log(GPR_DEBUG,
471
+ "%s[connected] Publish client initial metadata: %s",
472
+ Activity::current()->DebugTag().c_str(),
473
+ server_initial_metadata->DebugString().c_str());
474
+ }
475
+ return Map(pipe->Push(std::move(server_initial_metadata)),
476
+ [](bool r) {
477
+ if (r) return absl::OkStatus();
478
+ return absl::CancelledError();
479
+ });
480
+ }),
481
+ [](absl::Status) {});
482
+
483
+ // Build up the rest of the main call promise:
484
+
485
+ // Create a promise that will send initial metadata and then signal completion
486
+ // of that via the token.
487
+ auto send_initial_metadata = Seq(
488
+ GetContext<BatchBuilder>()->SendClientInitialMetadata(
489
+ stream->batch_target(), std::move(call_args.client_initial_metadata)),
490
+ [sent_initial_metadata_token =
491
+ std::move(call_args.client_initial_metadata_outstanding)](
492
+ absl::Status status) mutable {
493
+ sent_initial_metadata_token.Complete(status.ok());
494
+ return status;
495
+ });
496
+ // Create a promise that will receive server trailing metadata.
497
+ // If this fails, we massage the error into metadata that we can report
498
+ // upwards.
499
+ auto server_trailing_metadata =
500
+ GetContext<Arena>()->MakePooled<ServerMetadata>(GetContext<Arena>());
501
+ auto recv_trailing_metadata =
502
+ Map(GetContext<BatchBuilder>()->ReceiveServerTrailingMetadata(
503
+ stream->batch_target()),
504
+ [](absl::StatusOr<ServerMetadataHandle> status) mutable {
505
+ if (!status.ok()) {
506
+ auto server_trailing_metadata =
507
+ GetContext<Arena>()->MakePooled<ServerMetadata>(
508
+ GetContext<Arena>());
509
+ grpc_status_code status_code = GRPC_STATUS_UNKNOWN;
510
+ std::string message;
511
+ grpc_error_get_status(status.status(), Timestamp::InfFuture(),
512
+ &status_code, &message, nullptr, nullptr);
513
+ server_trailing_metadata->Set(GrpcStatusMetadata(), status_code);
514
+ server_trailing_metadata->Set(GrpcMessageMetadata(),
515
+ Slice::FromCopiedString(message));
516
+ return server_trailing_metadata;
517
+ } else {
518
+ return std::move(*status);
519
+ }
520
+ });
521
+ // Finally the main call promise.
522
+ // Concurrently: send initial metadata and receive messages, until BOTH
523
+ // complete (or one fails).
524
+ // Next: receive trailing metadata, and return that up the stack.
525
+ auto recv_messages =
526
+ stream->RecvMessages(call_args.server_to_client_messages);
527
+ return Map(TrySeq(TryJoin(std::move(send_initial_metadata),
528
+ std::move(recv_messages)),
529
+ std::move(recv_trailing_metadata)),
530
+ [stream = std::move(stream)](ServerMetadataHandle result) {
531
+ stream->set_finished();
532
+ return result;
533
+ });
534
+ }
921
535
  #endif
922
536
 
923
537
  #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
924
- class ServerStream final : public ConnectedChannelStream {
925
- public:
926
- ServerStream(grpc_transport* transport,
927
- NextPromiseFactory next_promise_factory)
928
- : ConnectedChannelStream(transport) {
929
- SetStream(static_cast<grpc_stream*>(
930
- GetContext<Arena>()->Alloc(transport->vtable->sizeof_stream)));
931
- grpc_transport_init_stream(
932
- transport, stream(), stream_refcount(),
933
- GetContext<CallContext>()->server_call_context()->server_stream_data(),
934
- GetContext<Arena>());
935
- grpc_transport_set_pops(transport, stream(),
936
- GetContext<CallContext>()->polling_entity());
937
-
938
- // Fetch initial metadata
939
- auto& gim = call_state_.emplace<GettingInitialMetadata>(this);
940
- gim.recv_initial_metadata_ready_waker =
941
- Activity::current()->MakeOwningWaker();
942
- memset(&gim.recv_initial_metadata, 0, sizeof(gim.recv_initial_metadata));
943
- gim.recv_initial_metadata.payload = batch_payload();
944
- gim.recv_initial_metadata.on_complete = nullptr;
945
- gim.recv_initial_metadata.recv_initial_metadata = true;
946
- gim.next_promise_factory = std::move(next_promise_factory);
947
- batch_payload()->recv_initial_metadata.recv_initial_metadata =
948
- gim.client_initial_metadata.get();
949
- batch_payload()->recv_initial_metadata.recv_initial_metadata_ready =
950
- &gim.recv_initial_metadata_ready;
951
- SchedulePush(&gim.recv_initial_metadata);
952
-
953
- // Fetch trailing metadata (to catch cancellations)
954
- auto& gtm =
955
- client_trailing_metadata_state_.emplace<WaitingForTrailingMetadata>();
956
- gtm.recv_trailing_metadata_ready =
957
- MakeMemberClosure<ServerStream,
958
- &ServerStream::RecvTrailingMetadataReady>(this);
959
- memset(&gtm.recv_trailing_metadata, 0, sizeof(gtm.recv_trailing_metadata));
960
- gtm.recv_trailing_metadata.payload = batch_payload();
961
- gtm.recv_trailing_metadata.recv_trailing_metadata = true;
962
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata =
963
- gtm.result.get();
964
- batch_payload()->recv_trailing_metadata.collect_stats =
965
- &GetContext<CallContext>()->call_stats()->transport_stream_stats;
966
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata_ready =
967
- &gtm.recv_trailing_metadata_ready;
968
- SchedulePush(&gtm.recv_trailing_metadata);
969
- gtm.waker = Activity::current()->MakeOwningWaker();
970
- }
971
-
972
- Poll<ServerMetadataHandle> PollOnce() {
973
- MutexLock lock(mu());
974
-
975
- auto poll_send_initial_metadata = [this]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
976
- mu()) {
977
- if (auto* promise =
978
- absl::get_if<PipeReceiverNextType<ServerMetadataHandle>>(
979
- &server_initial_metadata_)) {
980
- auto r = (*promise)();
981
- if (auto* md = r.value_if_ready()) {
982
- if (grpc_call_trace.enabled()) {
983
- gpr_log(
984
- GPR_INFO, "%s[connected] got initial metadata %s",
985
- Activity::current()->DebugTag().c_str(),
986
- (md->has_value() ? (**md)->DebugString() : "<trailers-only>")
987
- .c_str());
988
- }
989
- memset(&send_initial_metadata_, 0, sizeof(send_initial_metadata_));
990
- send_initial_metadata_.send_initial_metadata = true;
991
- send_initial_metadata_.payload = batch_payload();
992
- send_initial_metadata_.on_complete = &send_initial_metadata_done_;
993
- batch_payload()->send_initial_metadata.send_initial_metadata =
994
- server_initial_metadata_
995
- .emplace<ServerMetadataHandle>(std::move(**md))
996
- .get();
997
- batch_payload()->send_initial_metadata.peer_string = nullptr;
998
- SchedulePush(&send_initial_metadata_);
999
- return true;
1000
- } else {
1001
- return false;
1002
- }
1003
- } else {
1004
- return true;
1005
- }
1006
- };
1007
-
1008
- if (grpc_call_trace.enabled()) {
1009
- gpr_log(GPR_INFO, "%s[connected] PollConnectedChannel: %s",
1010
- Activity::current()->DebugTag().c_str(),
1011
- ActiveOpsString().c_str());
1012
- }
1013
-
1014
- poll_send_initial_metadata();
1015
-
1016
- if (auto* p = absl::get_if<GotClientHalfClose>(
1017
- &client_trailing_metadata_state_)) {
1018
- pipes_.client_to_server.sender.Close();
1019
- if (!p->result.ok()) {
1020
- // client cancelled, we should cancel too
1021
- if (absl::holds_alternative<absl::monostate>(call_state_) ||
1022
- absl::holds_alternative<GotInitialMetadata>(call_state_) ||
1023
- absl::holds_alternative<MessageLoop>(call_state_)) {
1024
- if (!absl::holds_alternative<ServerMetadataHandle>(
1025
- server_initial_metadata_)) {
1026
- // pretend we've sent initial metadata to stop that op from
1027
- // progressing if it's stuck somewhere above us in the stack
1028
- server_initial_metadata_.emplace<ServerMetadataHandle>();
1029
- }
1030
- // cancel the call - this status will be returned to the server bottom
1031
- // promise
1032
- call_state_.emplace<Complete>(
1033
- Complete{ServerMetadataFromStatus(p->result)});
1034
- }
1035
- }
1036
- }
1037
-
1038
- if (auto* p = absl::get_if<GotInitialMetadata>(&call_state_)) {
1039
- incoming_messages_ = &pipes_.client_to_server.sender;
1040
- auto promise = p->next_promise_factory(CallArgs{
1041
- std::move(p->client_initial_metadata),
1042
- &pipes_.server_initial_metadata.sender,
1043
- &pipes_.client_to_server.receiver, &pipes_.server_to_client.sender});
1044
- call_state_.emplace<MessageLoop>(
1045
- MessageLoop{&pipes_.server_to_client.receiver, std::move(promise)});
1046
- server_initial_metadata_
1047
- .emplace<PipeReceiverNextType<ServerMetadataHandle>>(
1048
- pipes_.server_initial_metadata.receiver.Next());
1049
- }
1050
- if (incoming_messages_ != nullptr) {
1051
- PollRecvMessage(incoming_messages_);
1052
- }
1053
- if (auto* p = absl::get_if<MessageLoop>(&call_state_)) {
1054
- if (absl::holds_alternative<ServerMetadataHandle>(
1055
- server_initial_metadata_)) {
1056
- PollSendMessage(p->outgoing_messages, nullptr);
1057
- }
1058
- auto poll = p->promise();
1059
- if (auto* r = poll.value_if_ready()) {
1060
- if (grpc_call_trace.enabled()) {
1061
- gpr_log(GPR_INFO, "%s[connected] got trailing metadata %s; %s",
1062
- Activity::current()->DebugTag().c_str(),
1063
- (*r)->DebugString().c_str(), ActiveOpsString().c_str());
1064
- }
1065
- auto& completing = call_state_.emplace<Completing>();
1066
- completing.server_trailing_metadata = std::move(*r);
1067
- completing.on_complete =
1068
- MakeMemberClosure<ServerStream,
1069
- &ServerStream::SendTrailingMetadataDone>(this);
1070
- completing.waker = Activity::current()->MakeOwningWaker();
1071
- auto& op = completing.send_trailing_metadata;
1072
- memset(&op, 0, sizeof(op));
1073
- op.payload = batch_payload();
1074
- op.on_complete = &completing.on_complete;
1075
- // If we've gotten initial server metadata, we can send trailing
1076
- // metadata.
1077
- // Otherwise we need to cancel the call.
1078
- // There could be an unlucky ordering, so we poll here to make sure.
1079
- if (poll_send_initial_metadata()) {
1080
- op.send_trailing_metadata = true;
1081
- batch_payload()->send_trailing_metadata.send_trailing_metadata =
1082
- completing.server_trailing_metadata.get();
1083
- batch_payload()->send_trailing_metadata.sent = &completing.sent;
1084
- } else {
1085
- op.cancel_stream = true;
1086
- const auto status_code =
1087
- completing.server_trailing_metadata->get(GrpcStatusMetadata())
1088
- .value_or(GRPC_STATUS_UNKNOWN);
1089
- batch_payload()->cancel_stream.cancel_error = grpc_error_set_int(
1090
- absl::Status(static_cast<absl::StatusCode>(status_code),
1091
- completing.server_trailing_metadata
1092
- ->GetOrCreatePointer(GrpcMessageMetadata())
1093
- ->as_string_view()),
1094
- StatusIntProperty::kRpcStatus, status_code);
1095
- }
1096
- SchedulePush(&op);
1097
- }
1098
- }
1099
- if (auto* p = absl::get_if<Complete>(&call_state_)) {
1100
- set_finished();
1101
- return std::move(p->result);
1102
- }
1103
- return Pending{};
1104
- }
1105
-
1106
- private:
1107
- // Call state: we've asked the transport for initial metadata and are
1108
- // waiting for it before proceeding.
1109
- struct GettingInitialMetadata {
1110
- explicit GettingInitialMetadata(ServerStream* stream)
1111
- : recv_initial_metadata_ready(
1112
- MakeMemberClosure<ServerStream,
1113
- &ServerStream::RecvInitialMetadataReady>(
1114
- stream)) {}
1115
- // The batch we're using to get initial metadata.
1116
- grpc_transport_stream_op_batch recv_initial_metadata;
1117
- // Waker to re-enter the activity once the transport returns.
1118
- Waker recv_initial_metadata_ready_waker;
1119
- // Initial metadata storage for the transport.
1120
- ClientMetadataHandle client_initial_metadata =
1121
- GetContext<Arena>()->MakePooled<ClientMetadata>(GetContext<Arena>());
1122
- // Closure for the transport to call when it's ready.
1123
- grpc_closure recv_initial_metadata_ready;
1124
- // Next promise factory to use once we have initial metadata.
1125
- NextPromiseFactory next_promise_factory;
1126
- };
1127
-
1128
- // Call state: transport has returned initial metadata, we're waiting to
1129
- // re-enter the activity to process it.
1130
- struct GotInitialMetadata {
1131
- ClientMetadataHandle client_initial_metadata;
1132
- NextPromiseFactory next_promise_factory;
1133
- };
1134
-
1135
- // Call state: we're sending/receiving messages and processing the filter
1136
- // stack.
1137
- struct MessageLoop {
1138
- PipeReceiver<MessageHandle>* outgoing_messages;
1139
- ArenaPromise<ServerMetadataHandle> promise;
1140
- };
1141
-
1142
- // Call state: promise stack has returned trailing metadata, we're sending it
1143
- // to the transport to communicate.
1144
- struct Completing {
1145
- ServerMetadataHandle server_trailing_metadata;
1146
- grpc_transport_stream_op_batch send_trailing_metadata;
1147
- grpc_closure on_complete;
1148
- bool sent = false;
1149
- Waker waker;
1150
- };
1151
-
1152
- // Call state: server metadata has been communicated to the transport and sent
1153
- // to the client.
1154
- // The metadata will be returned down to the server call to tick the
1155
- // cancellation bit or not on the originating batch.
1156
- struct Complete {
1157
- ServerMetadataHandle result;
1158
- };
1159
-
1160
- // Trailing metadata state: we've asked the transport for trailing metadata
1161
- // and are waiting for it before proceeding.
1162
- struct WaitingForTrailingMetadata {
1163
- ClientMetadataHandle result =
1164
- GetContext<Arena>()->MakePooled<ClientMetadata>(GetContext<Arena>());
1165
- grpc_transport_stream_op_batch recv_trailing_metadata;
1166
- grpc_closure recv_trailing_metadata_ready;
1167
- Waker waker;
1168
- };
1169
-
1170
- // We've received trailing metadata from the transport - which indicates reads
1171
- // are closed.
1172
- // We convert to an absl::Status here and use that to drive a decision to
1173
- // cancel the call (on error) or not.
1174
- struct GotClientHalfClose {
1175
- absl::Status result;
1176
- };
1177
-
1178
- void RecvInitialMetadataReady(absl::Status status) {
1179
- MutexLock lock(mu());
1180
- auto& getting = absl::get<GettingInitialMetadata>(call_state_);
1181
- auto waker = std::move(getting.recv_initial_metadata_ready_waker);
1182
- if (grpc_call_trace.enabled()) {
1183
- gpr_log(GPR_DEBUG, "%sGOT INITIAL METADATA: err=%s %s",
1184
- waker.ActivityDebugTag().c_str(), status.ToString().c_str(),
1185
- getting.client_initial_metadata->DebugString().c_str());
1186
- }
1187
- GotInitialMetadata got{std::move(getting.client_initial_metadata),
1188
- std::move(getting.next_promise_factory)};
1189
- call_state_.emplace<GotInitialMetadata>(std::move(got));
1190
- waker.Wakeup();
1191
- }
1192
-
1193
- void SendTrailingMetadataDone(absl::Status result) {
1194
- MutexLock lock(mu());
1195
- auto& completing = absl::get<Completing>(call_state_);
1196
- auto md = std::move(completing.server_trailing_metadata);
1197
- auto waker = std::move(completing.waker);
1198
- if (grpc_call_trace.enabled()) {
1199
- gpr_log(GPR_DEBUG, "%sSEND TRAILING METADATA DONE: err=%s sent=%s %s",
1200
- waker.ActivityDebugTag().c_str(), result.ToString().c_str(),
1201
- completing.sent ? "true" : "false", md->DebugString().c_str());
1202
- }
1203
- md->Set(GrpcStatusFromWire(), completing.sent);
1204
- if (!result.ok()) {
1205
- md->Clear();
1206
- md->Set(GrpcStatusMetadata(),
1207
- static_cast<grpc_status_code>(result.code()));
1208
- md->Set(GrpcMessageMetadata(), Slice::FromCopiedString(result.message()));
1209
- md->Set(GrpcStatusFromWire(), false);
1210
- }
1211
- call_state_.emplace<Complete>(Complete{std::move(md)});
1212
- waker.Wakeup();
1213
- }
1214
-
1215
- std::string ActiveOpsString() const override
1216
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
1217
- std::vector<std::string> ops;
1218
- ops.push_back(absl::StrCat(
1219
- "call_state:",
1220
- Match(
1221
- call_state_,
1222
- [](const absl::monostate&) { return "absl::monostate"; },
1223
- [](const GettingInitialMetadata&) { return "GETTING"; },
1224
- [](const GotInitialMetadata&) { return "GOT"; },
1225
- [](const MessageLoop&) { return "RUNNING"; },
1226
- [](const Completing&) { return "COMPLETING"; },
1227
- [](const Complete&) { return "COMPLETE"; })));
1228
- ops.push_back(
1229
- absl::StrCat("client_trailing_metadata_state:",
1230
- Match(
1231
- client_trailing_metadata_state_,
1232
- [](const absl::monostate&) -> std::string {
1233
- return "absl::monostate";
1234
- },
1235
- [](const WaitingForTrailingMetadata&) -> std::string {
1236
- return "WAITING";
1237
- },
1238
- [](const GotClientHalfClose& got) -> std::string {
1239
- return absl::StrCat("GOT:", got.result.ToString());
1240
- })));
1241
- // Send initial metadata
1242
- ops.push_back(absl::StrCat(
1243
- "server_initial_metadata_state:",
1244
- Match(
1245
- server_initial_metadata_,
1246
- [](const absl::monostate&) { return "absl::monostate"; },
1247
- [](const PipeReceiverNextType<ServerMetadataHandle>&) {
1248
- return "WAITING";
1249
- },
1250
- [](const ServerMetadataHandle&) { return "GOT"; })));
1251
- // Send message
1252
- std::string send_message_state = SendMessageString();
1253
- if (send_message_state != "WAITING") {
1254
- ops.push_back(absl::StrCat("send_message:", send_message_state));
1255
- }
1256
- // Receive message
1257
- std::string recv_message_state = RecvMessageString();
1258
- if (recv_message_state != "IDLE") {
1259
- ops.push_back(absl::StrCat("recv_message:", recv_message_state));
1260
- }
1261
- return absl::StrJoin(ops, " ");
1262
- }
1263
-
1264
- void SendInitialMetadataDone() {}
1265
-
1266
- void RecvTrailingMetadataReady(absl::Status error) {
1267
- MutexLock lock(mu());
1268
- auto& state =
1269
- absl::get<WaitingForTrailingMetadata>(client_trailing_metadata_state_);
1270
- if (grpc_call_trace.enabled()) {
1271
- gpr_log(GPR_INFO,
1272
- "%sRecvTrailingMetadataReady: error:%s metadata:%s state:%s",
1273
- state.waker.ActivityDebugTag().c_str(), error.ToString().c_str(),
1274
- state.result->DebugString().c_str(), ActiveOpsString().c_str());
1275
- }
1276
- auto waker = std::move(state.waker);
1277
- ServerMetadataHandle result = std::move(state.result);
1278
- if (error.ok()) {
1279
- auto* message = result->get_pointer(GrpcMessageMetadata());
1280
- error = absl::Status(
1281
- static_cast<absl::StatusCode>(
1282
- result->get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN)),
1283
- message == nullptr ? "" : message->as_string_view());
1284
- }
1285
- client_trailing_metadata_state_.emplace<GotClientHalfClose>(
1286
- GotClientHalfClose{error});
1287
- waker.Wakeup();
1288
- }
1289
-
1290
- struct Pipes {
538
+ ArenaPromise<ServerMetadataHandle> MakeServerCallPromise(
539
+ grpc_transport* transport, CallArgs,
540
+ NextPromiseFactory next_promise_factory) {
541
+ OrphanablePtr<ConnectedChannelStream> stream(
542
+ GetContext<Arena>()->New<ConnectedChannelStream>(transport));
543
+
544
+ stream->SetStream(static_cast<grpc_stream*>(
545
+ GetContext<Arena>()->Alloc(transport->vtable->sizeof_stream)));
546
+ grpc_transport_init_stream(
547
+ transport, stream->stream(), stream->stream_refcount(),
548
+ GetContext<CallContext>()->server_call_context()->server_stream_data(),
549
+ GetContext<Arena>());
550
+ grpc_transport_set_pops(transport, stream->stream(),
551
+ GetContext<CallContext>()->polling_entity());
552
+
553
+ auto* party = static_cast<Party*>(Activity::current());
554
+
555
+ // Arifacts we need for the lifetime of the call.
556
+ struct CallData {
1291
557
  Pipe<MessageHandle> server_to_client;
1292
558
  Pipe<MessageHandle> client_to_server;
1293
559
  Pipe<ServerMetadataHandle> server_initial_metadata;
560
+ Latch<ServerMetadataHandle> failure_latch;
561
+ bool sent_initial_metadata = false;
562
+ bool sent_trailing_metadata = false;
1294
563
  };
1295
-
1296
- using CallState =
1297
- absl::variant<absl::monostate, GettingInitialMetadata, GotInitialMetadata,
1298
- MessageLoop, Completing, Complete>;
1299
- CallState call_state_ ABSL_GUARDED_BY(mu()) = absl::monostate{};
1300
- using ClientTrailingMetadataState =
1301
- absl::variant<absl::monostate, WaitingForTrailingMetadata,
1302
- GotClientHalfClose>;
1303
- ClientTrailingMetadataState client_trailing_metadata_state_
1304
- ABSL_GUARDED_BY(mu()) = absl::monostate{};
1305
- absl::variant<absl::monostate, PipeReceiverNextType<ServerMetadataHandle>,
1306
- ServerMetadataHandle>
1307
- ABSL_GUARDED_BY(mu()) server_initial_metadata_ = absl::monostate{};
1308
- PipeSender<MessageHandle>* incoming_messages_ = nullptr;
1309
- grpc_transport_stream_op_batch send_initial_metadata_;
1310
- grpc_closure send_initial_metadata_done_ =
1311
- MakeMemberClosure<ServerStream, &ServerStream::SendInitialMetadataDone>(
1312
- this);
1313
- Pipes pipes_ ABSL_GUARDED_BY(mu());
1314
- };
1315
-
1316
- class ServerConnectedCallPromise {
1317
- public:
1318
- ServerConnectedCallPromise(grpc_transport* transport,
1319
- NextPromiseFactory next_promise_factory)
1320
- : impl_(GetContext<Arena>()->New<ServerStream>(
1321
- transport, std::move(next_promise_factory))) {}
1322
-
1323
- ServerConnectedCallPromise(const ServerConnectedCallPromise&) = delete;
1324
- ServerConnectedCallPromise& operator=(const ServerConnectedCallPromise&) =
1325
- delete;
1326
- ServerConnectedCallPromise(ServerConnectedCallPromise&& other) noexcept
1327
- : impl_(std::exchange(other.impl_, nullptr)) {}
1328
- ServerConnectedCallPromise& operator=(
1329
- ServerConnectedCallPromise&& other) noexcept {
1330
- impl_ = std::move(other.impl_);
1331
- return *this;
1332
- }
1333
-
1334
- static ArenaPromise<ServerMetadataHandle> Make(grpc_transport* transport,
1335
- CallArgs,
1336
- NextPromiseFactory next) {
1337
- return ServerConnectedCallPromise(transport, std::move(next));
1338
- }
1339
-
1340
- Poll<ServerMetadataHandle> operator()() { return impl_->PollOnce(); }
1341
-
1342
- private:
1343
- OrphanablePtr<ServerStream> impl_;
1344
- };
564
+ auto* call_data = GetContext<Arena>()->ManagedNew<CallData>();
565
+
566
+ auto server_to_client_empty =
567
+ call_data->server_to_client.receiver.AwaitEmpty();
568
+
569
+ // Create a promise that will receive client initial metadata, and then run
570
+ // the main stem of the call (calling next_promise_factory up through the
571
+ // filters).
572
+ // Race the main call with failure_latch, allowing us to forcefully complete
573
+ // the call in the case of a failure.
574
+ auto recv_initial_metadata_then_run_promise =
575
+ TrySeq(GetContext<BatchBuilder>()->ReceiveClientInitialMetadata(
576
+ stream->batch_target()),
577
+ [next_promise_factory = std::move(next_promise_factory),
578
+ server_to_client_empty = std::move(server_to_client_empty),
579
+ call_data](ClientMetadataHandle client_initial_metadata) {
580
+ auto call_promise = next_promise_factory(CallArgs{
581
+ std::move(client_initial_metadata),
582
+ ClientInitialMetadataOutstandingToken::Empty(),
583
+ &call_data->server_initial_metadata.sender,
584
+ &call_data->client_to_server.receiver,
585
+ &call_data->server_to_client.sender,
586
+ });
587
+ return Race(call_data->failure_latch.Wait(),
588
+ [call_promise = std::move(call_promise),
589
+ server_to_client_empty =
590
+ std::move(server_to_client_empty)]() mutable
591
+ -> Poll<ServerMetadataHandle> {
592
+ // TODO(ctiller): this is deeply weird and we need
593
+ // to clean this up.
594
+ //
595
+ // The following few lines check to ensure that
596
+ // there's no message currently pending in the
597
+ // outgoing message queue, and if (and only if)
598
+ // that's true decides to poll the main promise to
599
+ // see if there's a result.
600
+ //
601
+ // This essentially introduces a polling priority
602
+ // scheme that makes the current promise structure
603
+ // work out the way we want when talking to
604
+ // transports.
605
+ //
606
+ // The problem is that transports are going to need
607
+ // to replicate this structure when they convert to
608
+ // promises, and that becomes troubling as we'll be
609
+ // replicating weird throughout the stack.
610
+ //
611
+ // Instead we likely need to change the way we're
612
+ // composing promises through the stack.
613
+ //
614
+ // Proposed is to change filters from a promise
615
+ // that takes ClientInitialMetadata and returns
616
+ // ServerTrailingMetadata with three pipes for
617
+ // ServerInitialMetadata and
618
+ // ClientToServerMessages, ServerToClientMessages.
619
+ // Instead we'll have five pipes, moving
620
+ // ClientInitialMetadata and ServerTrailingMetadata
621
+ // to pipes that can be intercepted.
622
+ //
623
+ // The effect of this change will be to cripple the
624
+ // things that can be done in a filter (but cripple
625
+ // in line with what most filters actually do).
626
+ // We'll likely need to add a `CallContext::Cancel`
627
+ // to allow filters to cancel a request, but this
628
+ // would also have the advantage of centralizing
629
+ // our cancellation machinery which seems like an
630
+ // additional win - with the net effect that the
631
+ // shape of the call gets made explicit at the top
632
+ // & bottom of the stack.
633
+ //
634
+ // There's a small set of filters (retry, this one,
635
+ // lame client, clinet channel) that terminate
636
+ // stacks and need a richer set of semantics, but
637
+ // that ends up being fine because we can spawn
638
+ // tasks in parties to handle those edge cases, and
639
+ // keep the majority of filters simple: they just
640
+ // call InterceptAndMap on a handful of filters at
641
+ // call initialization time and then proceed to
642
+ // actually filter.
643
+ //
644
+ // So that's the plan, why isn't it enacted here?
645
+ //
646
+ // Well, the plan ends up being easy to implement
647
+ // in the promise based world (I did a prototype on
648
+ // a branch in an afternoon). It's heinous to
649
+ // implement in promise_based_filter, and that code
650
+ // is load bearing for us at the time of writing.
651
+ // It's not worth delaying promises for a further N
652
+ // months (N ~ 6) to make that change.
653
+ //
654
+ // Instead, we'll move forward with this, get
655
+ // promise_based_filter out of the picture, and
656
+ // then during the mop-up phase for promises tweak
657
+ // the compute structure to move to the magical
658
+ // five pipes (I'm reminded of an old Onion
659
+ // article), and end up in a good happy place.
660
+ if (server_to_client_empty().pending()) {
661
+ return Pending{};
662
+ }
663
+ return call_promise();
664
+ });
665
+ });
666
+
667
+ // Promise factory that accepts a ServerMetadataHandle, and sends it as the
668
+ // trailing metadata for this call.
669
+ auto send_trailing_metadata =
670
+ [call_data, stream = stream->InternalRef()](
671
+ ServerMetadataHandle server_trailing_metadata) {
672
+ return GetContext<BatchBuilder>()->SendServerTrailingMetadata(
673
+ stream->batch_target(), std::move(server_trailing_metadata),
674
+ !std::exchange(call_data->sent_initial_metadata, true));
675
+ };
676
+
677
+ // Runs the receive message loop, either until all the messages
678
+ // are received or the server call is complete.
679
+ party->Spawn(
680
+ "recv_messages",
681
+ Race(
682
+ Map(stream->WaitFinished(), [](Empty) { return absl::OkStatus(); }),
683
+ Map(stream->RecvMessages(&call_data->client_to_server.sender),
684
+ [failure_latch = &call_data->failure_latch](absl::Status status) {
685
+ if (!status.ok() && !failure_latch->is_set()) {
686
+ failure_latch->Set(ServerMetadataFromStatus(status));
687
+ }
688
+ return status;
689
+ })),
690
+ [](absl::Status) {});
691
+
692
+ // Run a promise that will send initial metadata (if that pipe sends some).
693
+ // And then run the send message loop until that completes.
694
+
695
+ auto send_initial_metadata = Seq(
696
+ Race(Map(stream->WaitFinished(),
697
+ [](Empty) { return NextResult<ServerMetadataHandle>(true); }),
698
+ call_data->server_initial_metadata.receiver.Next()),
699
+ [call_data, stream = stream->InternalRef()](
700
+ NextResult<ServerMetadataHandle> next_result) mutable {
701
+ auto md = !call_data->sent_initial_metadata && next_result.has_value()
702
+ ? std::move(next_result.value())
703
+ : nullptr;
704
+ if (md != nullptr) {
705
+ call_data->sent_initial_metadata = true;
706
+ auto* party = static_cast<Party*>(Activity::current());
707
+ party->Spawn("connected/send_initial_metadata",
708
+ GetContext<BatchBuilder>()->SendServerInitialMetadata(
709
+ stream->batch_target(), std::move(md)),
710
+ [](absl::Status) {});
711
+ return Immediate(absl::OkStatus());
712
+ }
713
+ return Immediate(absl::CancelledError());
714
+ });
715
+ party->Spawn(
716
+ "send_initial_metadata_then_messages",
717
+ Race(Map(stream->WaitFinished(), [](Empty) { return absl::OkStatus(); }),
718
+ TrySeq(std::move(send_initial_metadata),
719
+ stream->SendMessages(&call_data->server_to_client.receiver))),
720
+ [](absl::Status) {});
721
+
722
+ // Spawn a job to fetch the "client trailing metadata" - if this is OK then
723
+ // it's client done, otherwise it's a signal of cancellation from the client
724
+ // which we'll use failure_latch to signal.
725
+
726
+ party->Spawn(
727
+ "recv_trailing_metadata",
728
+ Seq(GetContext<BatchBuilder>()->ReceiveClientTrailingMetadata(
729
+ stream->batch_target()),
730
+ [failure_latch = &call_data->failure_latch](
731
+ absl::StatusOr<ClientMetadataHandle> status) mutable {
732
+ if (grpc_call_trace.enabled()) {
733
+ gpr_log(
734
+ GPR_DEBUG,
735
+ "%s[connected] Got trailing metadata; status=%s metadata=%s",
736
+ Activity::current()->DebugTag().c_str(),
737
+ status.status().ToString().c_str(),
738
+ status.ok() ? (*status)->DebugString().c_str() : "<none>");
739
+ }
740
+ ClientMetadataHandle trailing_metadata;
741
+ if (status.ok()) {
742
+ trailing_metadata = std::move(*status);
743
+ } else {
744
+ trailing_metadata =
745
+ GetContext<Arena>()->MakePooled<ClientMetadata>(
746
+ GetContext<Arena>());
747
+ grpc_status_code status_code = GRPC_STATUS_UNKNOWN;
748
+ std::string message;
749
+ grpc_error_get_status(status.status(), Timestamp::InfFuture(),
750
+ &status_code, &message, nullptr, nullptr);
751
+ trailing_metadata->Set(GrpcStatusMetadata(), status_code);
752
+ trailing_metadata->Set(GrpcMessageMetadata(),
753
+ Slice::FromCopiedString(message));
754
+ }
755
+ if (trailing_metadata->get(GrpcStatusMetadata())
756
+ .value_or(GRPC_STATUS_UNKNOWN) != GRPC_STATUS_OK) {
757
+ if (!failure_latch->is_set()) {
758
+ failure_latch->Set(std::move(trailing_metadata));
759
+ }
760
+ }
761
+ return Empty{};
762
+ }),
763
+ [](Empty) {});
764
+
765
+ // Finally assemble the main call promise:
766
+ // Receive initial metadata from the client and start the promise up the
767
+ // filter stack.
768
+ // Upon completion, send trailing metadata to the client and then return it
769
+ // (allowing the call code to decide on what signalling to give the
770
+ // application).
771
+
772
+ return Map(Seq(std::move(recv_initial_metadata_then_run_promise),
773
+ std::move(send_trailing_metadata)),
774
+ [stream = std::move(stream)](ServerMetadataHandle md) {
775
+ stream->set_finished();
776
+ return md;
777
+ });
778
+ }
1345
779
  #endif
1346
780
 
1347
781
  template <ArenaPromise<ServerMetadataHandle> (*make_call_promise)(
1348
782
  grpc_transport*, CallArgs, NextPromiseFactory)>
1349
783
  grpc_channel_filter MakeConnectedFilter() {
1350
784
  // Create a vtable that contains both the legacy call methods (for filter
1351
- // stack based calls) and the new promise based method for creating promise
1352
- // based calls (the latter iff make_call_promise != nullptr).
1353
- // In this way the filter can be inserted into either kind of channel stack,
1354
- // and only if all the filters in the stack are promise based will the call
1355
- // be promise based.
785
+ // stack based calls) and the new promise based method for creating
786
+ // promise based calls (the latter iff make_call_promise != nullptr). In
787
+ // this way the filter can be inserted into either kind of channel stack,
788
+ // and only if all the filters in the stack are promise based will the
789
+ // call be promise based.
1356
790
  auto make_call_wrapper = +[](grpc_channel_element* elem, CallArgs call_args,
1357
791
  NextPromiseFactory next) {
1358
792
  grpc_transport* transport =
@@ -1370,12 +804,11 @@ grpc_channel_filter MakeConnectedFilter() {
1370
804
  sizeof(channel_data),
1371
805
  connected_channel_init_channel_elem,
1372
806
  +[](grpc_channel_stack* channel_stack, grpc_channel_element* elem) {
1373
- // HACK(ctiller): increase call stack size for the channel to make space
1374
- // for channel data. We need a cleaner (but performant) way to do this,
1375
- // and I'm not sure what that is yet.
1376
- // This is only "safe" because call stacks place no additional data
1377
- // after the last call element, and the last call element MUST be the
1378
- // connected channel.
807
+ // HACK(ctiller): increase call stack size for the channel to make
808
+ // space for channel data. We need a cleaner (but performant) way to
809
+ // do this, and I'm not sure what that is yet. This is only "safe"
810
+ // because call stacks place no additional data after the last call
811
+ // element, and the last call element MUST be the connected channel.
1379
812
  channel_stack->call_stack_size += grpc_transport_stream_size(
1380
813
  static_cast<channel_data*>(elem->channel_data)->transport);
1381
814
  },
@@ -1395,7 +828,7 @@ const grpc_channel_filter kPromiseBasedTransportFilter =
1395
828
 
1396
829
  #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
1397
830
  const grpc_channel_filter kClientEmulatedFilter =
1398
- MakeConnectedFilter<ClientConnectedCallPromise::Make>();
831
+ MakeConnectedFilter<MakeClientCallPromise>();
1399
832
  #else
1400
833
  const grpc_channel_filter kClientEmulatedFilter =
1401
834
  MakeConnectedFilter<nullptr>();
@@ -1403,7 +836,7 @@ const grpc_channel_filter kClientEmulatedFilter =
1403
836
 
1404
837
  #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
1405
838
  const grpc_channel_filter kServerEmulatedFilter =
1406
- MakeConnectedFilter<ServerConnectedCallPromise::Make>();
839
+ MakeConnectedFilter<MakeServerCallPromise>();
1407
840
  #else
1408
841
  const grpc_channel_filter kServerEmulatedFilter =
1409
842
  MakeConnectedFilter<nullptr>();
@@ -1419,20 +852,20 @@ bool grpc_add_connected_filter(grpc_core::ChannelStackBuilder* builder) {
1419
852
  // We can't know promise based call or not here (that decision needs the
1420
853
  // collaboration of all of the filters on the channel, and we don't want
1421
854
  // ordering constraints on when we add filters).
1422
- // We can know if this results in a promise based call how we'll create our
1423
- // promise (if indeed we can), and so that is the choice made here.
855
+ // We can know if this results in a promise based call how we'll create
856
+ // our promise (if indeed we can), and so that is the choice made here.
1424
857
  if (t->vtable->make_call_promise != nullptr) {
1425
- // Option 1, and our ideal: the transport supports promise based calls, and
1426
- // so we simply use the transport directly.
858
+ // Option 1, and our ideal: the transport supports promise based calls,
859
+ // and so we simply use the transport directly.
1427
860
  builder->AppendFilter(&grpc_core::kPromiseBasedTransportFilter);
1428
861
  } else if (grpc_channel_stack_type_is_client(builder->channel_stack_type())) {
1429
- // Option 2: the transport does not support promise based calls, but we're
1430
- // on the client and so we have an implementation that we can use to convert
1431
- // to batches.
862
+ // Option 2: the transport does not support promise based calls, but
863
+ // we're on the client and so we have an implementation that we can use
864
+ // to convert to batches.
1432
865
  builder->AppendFilter(&grpc_core::kClientEmulatedFilter);
1433
866
  } else {
1434
- // Option 3: the transport does not support promise based calls, and we're
1435
- // on the server so we use the server filter.
867
+ // Option 3: the transport does not support promise based calls, and
868
+ // we're on the server so we use the server filter.
1436
869
  builder->AppendFilter(&grpc_core::kServerEmulatedFilter);
1437
870
  }
1438
871
  return true;