grpc 1.53.0 → 1.54.2

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 (695) 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 +2 -16
  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 +11 -3
  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 +137 -0
  44. data/src/core/ext/gcp/metadata_query.h +87 -0
  45. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +70 -55
  46. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +12 -8
  47. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +5 -1
  48. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +149 -60
  49. data/src/core/ext/transport/chttp2/transport/flow_control.cc +5 -2
  50. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -1
  51. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +4 -1
  52. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +118 -222
  53. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +295 -113
  54. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -0
  55. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  56. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +466 -273
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +7 -3
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +14 -12
  59. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +9 -1
  60. data/src/core/ext/transport/chttp2/transport/internal.h +18 -3
  61. data/src/core/ext/transport/chttp2/transport/parsing.cc +9 -2
  62. data/src/core/ext/transport/chttp2/transport/writing.cc +10 -5
  63. data/src/core/ext/transport/inproc/inproc_transport.cc +20 -14
  64. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +5 -3
  65. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +22 -0
  66. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +5 -3
  67. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +22 -0
  68. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +23 -5
  69. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +94 -3
  70. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -2
  71. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +120 -0
  72. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +6 -3
  73. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +22 -0
  74. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +24 -6
  75. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +111 -12
  76. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +9 -7
  77. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +27 -9
  78. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +0 -1
  79. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +11 -7
  80. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +56 -12
  81. 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
  82. 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
  83. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +5 -3
  84. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +24 -0
  85. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +13 -2
  86. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +49 -0
  87. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +24 -9
  88. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +66 -12
  89. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
  90. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +139 -136
  91. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +31 -15
  92. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +5 -0
  93. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +12 -9
  94. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +15 -0
  95. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +54 -45
  96. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +135 -119
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +100 -97
  99. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +15 -18
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +272 -264
  101. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +117 -117
  102. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +5 -5
  103. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +5 -5
  104. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +5 -5
  105. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +12 -9
  106. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +5 -0
  107. data/src/core/ext/xds/xds_channel_stack_modifier.cc +1 -2
  108. data/src/core/ext/xds/xds_client_stats.cc +29 -15
  109. data/src/core/ext/xds/xds_client_stats.h +24 -20
  110. data/src/core/ext/xds/xds_endpoint.cc +5 -2
  111. data/src/core/ext/xds/xds_endpoint.h +9 -1
  112. data/src/core/ext/xds/xds_http_rbac_filter.cc +1 -1
  113. data/src/core/ext/xds/xds_lb_policy_registry.cc +13 -0
  114. data/src/core/ext/xds/xds_transport_grpc.cc +1 -1
  115. data/src/core/{ext/filters/client_channel/resolver/dns/dns_resolver_selection.h → lib/backoff/random_early_detection.cc} +14 -12
  116. data/src/core/lib/backoff/random_early_detection.h +59 -0
  117. data/src/core/lib/channel/call_finalization.h +1 -1
  118. data/src/core/lib/channel/call_tracer.cc +51 -0
  119. data/src/core/lib/channel/call_tracer.h +101 -38
  120. data/src/core/lib/channel/connected_channel.cc +483 -1050
  121. data/src/core/lib/channel/context.h +8 -1
  122. data/src/core/lib/channel/promise_based_filter.cc +106 -42
  123. data/src/core/lib/channel/promise_based_filter.h +27 -13
  124. data/src/core/lib/channel/server_call_tracer_filter.cc +110 -0
  125. data/src/core/lib/config/config_vars.cc +151 -0
  126. data/src/core/lib/config/config_vars.h +127 -0
  127. data/src/core/lib/config/config_vars_non_generated.cc +51 -0
  128. data/src/core/lib/config/load_config.cc +66 -0
  129. data/src/core/lib/config/load_config.h +49 -0
  130. data/src/core/lib/debug/trace.cc +5 -6
  131. data/src/core/lib/debug/trace.h +0 -5
  132. data/src/core/lib/event_engine/event_engine.cc +37 -2
  133. data/src/core/lib/event_engine/handle_containers.h +7 -22
  134. data/src/core/lib/event_engine/memory_allocator_factory.h +47 -0
  135. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +0 -4
  136. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +3 -9
  137. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +48 -15
  138. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +8 -8
  139. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -5
  140. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +6 -3
  141. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +27 -18
  142. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +0 -3
  143. data/src/core/lib/event_engine/resolved_address.cc +2 -1
  144. data/src/core/lib/event_engine/windows/win_socket.cc +0 -1
  145. data/src/core/lib/event_engine/windows/windows_endpoint.cc +129 -82
  146. data/src/core/lib/event_engine/windows/windows_endpoint.h +21 -5
  147. data/src/core/lib/event_engine/windows/windows_engine.cc +39 -18
  148. data/src/core/lib/event_engine/windows/windows_engine.h +2 -1
  149. data/src/core/lib/event_engine/windows/windows_listener.cc +370 -0
  150. data/src/core/lib/event_engine/windows/windows_listener.h +155 -0
  151. data/src/core/lib/experiments/config.cc +3 -10
  152. data/src/core/lib/experiments/experiments.cc +7 -0
  153. data/src/core/lib/experiments/experiments.h +9 -1
  154. data/src/core/lib/gpr/log.cc +15 -28
  155. data/src/core/lib/gprpp/fork.cc +8 -14
  156. data/src/core/lib/gprpp/orphanable.h +4 -3
  157. data/src/core/lib/gprpp/per_cpu.h +9 -3
  158. data/src/core/lib/gprpp/{thd_posix.cc → posix/thd.cc} +49 -37
  159. data/src/core/lib/gprpp/ref_counted.h +33 -34
  160. data/src/core/lib/gprpp/thd.h +16 -0
  161. data/src/core/lib/gprpp/time.cc +1 -0
  162. data/src/core/lib/gprpp/time.h +4 -4
  163. data/src/core/lib/gprpp/{thd_windows.cc → windows/thd.cc} +2 -2
  164. data/src/core/lib/iomgr/call_combiner.h +2 -2
  165. data/src/core/lib/iomgr/endpoint_cfstream.cc +4 -2
  166. data/src/core/lib/iomgr/endpoint_pair.h +2 -2
  167. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  168. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  169. data/src/core/lib/iomgr/ev_posix.cc +13 -53
  170. data/src/core/lib/iomgr/ev_posix.h +0 -3
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +103 -76
  172. data/src/core/lib/iomgr/iomgr.cc +4 -8
  173. data/src/core/lib/iomgr/iomgr_windows.cc +8 -2
  174. data/src/core/lib/iomgr/pollset_set_windows.cc +9 -9
  175. data/src/core/lib/iomgr/pollset_windows.cc +1 -1
  176. data/src/core/lib/iomgr/socket_utils_common_posix.cc +16 -3
  177. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -2
  178. data/src/core/lib/iomgr/tcp_posix.cc +0 -1
  179. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -16
  180. data/src/core/lib/iomgr/tcp_server_windows.cc +176 -9
  181. data/src/core/lib/iomgr/tcp_windows.cc +12 -8
  182. data/src/core/lib/load_balancing/lb_policy.cc +9 -13
  183. data/src/core/lib/load_balancing/lb_policy.h +4 -2
  184. data/src/core/lib/promise/activity.cc +22 -6
  185. data/src/core/lib/promise/activity.h +61 -24
  186. data/src/core/lib/promise/cancel_callback.h +77 -0
  187. data/src/core/lib/promise/detail/basic_seq.h +1 -1
  188. data/src/core/lib/promise/detail/promise_factory.h +4 -0
  189. data/src/core/lib/promise/for_each.h +176 -0
  190. data/src/core/lib/promise/if.h +9 -0
  191. data/src/core/lib/promise/interceptor_list.h +23 -2
  192. data/src/core/lib/promise/latch.h +89 -3
  193. data/src/core/lib/promise/loop.h +13 -9
  194. data/src/core/lib/promise/map.h +7 -0
  195. data/src/core/lib/promise/party.cc +286 -0
  196. data/src/core/lib/promise/party.h +499 -0
  197. data/src/core/lib/promise/pipe.h +197 -57
  198. data/src/core/lib/promise/poll.h +48 -0
  199. data/src/core/lib/promise/promise.h +2 -2
  200. data/src/core/lib/resource_quota/arena.cc +19 -3
  201. data/src/core/lib/resource_quota/arena.h +119 -5
  202. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  203. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +12 -35
  204. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
  205. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +0 -59
  206. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -5
  207. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  208. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +13 -0
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +2 -0
  210. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +5 -9
  211. data/src/core/lib/security/security_connector/ssl_utils.cc +11 -25
  212. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +12 -0
  213. data/src/core/lib/security/transport/secure_endpoint.cc +4 -2
  214. data/src/core/lib/security/transport/server_auth_filter.cc +20 -2
  215. data/src/core/lib/slice/slice.cc +1 -1
  216. data/src/core/lib/surface/builtins.cc +2 -0
  217. data/src/core/lib/surface/call.cc +926 -1024
  218. data/src/core/lib/surface/call.h +10 -0
  219. data/src/core/lib/surface/lame_client.cc +1 -0
  220. data/src/core/lib/surface/validate_metadata.cc +43 -42
  221. data/src/core/lib/surface/validate_metadata.h +9 -0
  222. data/src/core/lib/surface/version.cc +2 -2
  223. data/src/core/lib/transport/batch_builder.cc +179 -0
  224. data/src/core/lib/transport/batch_builder.h +468 -0
  225. data/src/core/lib/transport/bdp_estimator.cc +7 -7
  226. data/src/core/lib/transport/bdp_estimator.h +10 -6
  227. data/src/core/lib/transport/custom_metadata.h +30 -0
  228. data/src/core/lib/transport/metadata_batch.cc +9 -6
  229. data/src/core/lib/transport/metadata_batch.h +168 -18
  230. data/src/core/lib/transport/parsed_metadata.h +19 -9
  231. data/src/core/lib/transport/timeout_encoding.cc +6 -1
  232. data/src/core/lib/transport/transport.cc +30 -2
  233. data/src/core/lib/transport/transport.h +70 -14
  234. data/src/core/lib/transport/transport_impl.h +7 -0
  235. data/src/core/lib/transport/transport_op_string.cc +52 -42
  236. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -2
  237. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +1 -0
  238. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +21 -4
  239. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +5 -0
  240. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  241. data/src/core/tsi/ssl_transport_security.cc +4 -2
  242. data/src/ruby/lib/grpc/version.rb +1 -1
  243. data/third_party/abseil-cpp/absl/base/config.h +1 -1
  244. data/third_party/abseil-cpp/absl/flags/commandlineflag.cc +34 -0
  245. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +200 -0
  246. data/third_party/abseil-cpp/absl/flags/config.h +68 -0
  247. data/third_party/abseil-cpp/absl/flags/declare.h +73 -0
  248. data/third_party/abseil-cpp/absl/flags/flag.cc +38 -0
  249. data/third_party/abseil-cpp/absl/flags/flag.h +310 -0
  250. data/{src/core/lib/gprpp/global_config_custom.h → third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc} +11 -14
  251. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +68 -0
  252. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +615 -0
  253. data/third_party/abseil-cpp/absl/flags/internal/flag.h +800 -0
  254. data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +116 -0
  255. data/third_party/abseil-cpp/absl/flags/internal/path_util.h +62 -0
  256. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.cc +65 -0
  257. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.h +61 -0
  258. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +60 -0
  259. data/third_party/abseil-cpp/absl/flags/internal/program_name.h +50 -0
  260. data/third_party/abseil-cpp/absl/flags/internal/registry.h +97 -0
  261. data/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h +187 -0
  262. data/third_party/abseil-cpp/absl/flags/marshalling.cc +241 -0
  263. data/third_party/abseil-cpp/absl/flags/marshalling.h +356 -0
  264. data/third_party/abseil-cpp/absl/flags/reflection.cc +354 -0
  265. data/third_party/abseil-cpp/absl/flags/reflection.h +90 -0
  266. data/third_party/abseil-cpp/absl/flags/usage_config.cc +165 -0
  267. data/third_party/abseil-cpp/absl/flags/usage_config.h +135 -0
  268. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +12 -8
  269. data/third_party/boringssl-with-bazel/err_data.c +728 -712
  270. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +177 -177
  271. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +28 -55
  272. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +21 -23
  273. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c +20 -23
  274. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +66 -185
  275. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c +18 -21
  276. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +356 -311
  277. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +174 -194
  278. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +146 -210
  279. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +6 -9
  280. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +346 -526
  281. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +110 -131
  282. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +130 -116
  283. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +93 -60
  284. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +93 -181
  285. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +242 -305
  286. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +41 -18
  287. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +30 -33
  288. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +36 -33
  289. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +29 -26
  290. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +133 -88
  291. data/third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.c +230 -0
  292. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +791 -791
  293. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +526 -526
  294. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +114 -135
  295. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +201 -207
  296. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +21 -26
  297. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +55 -68
  298. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +2 -4
  299. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +11 -7
  300. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +4 -4
  301. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +15 -9
  302. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -4
  303. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +17 -10
  304. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -3
  305. data/third_party/boringssl-with-bazel/src/crypto/bio/printf.c +0 -13
  306. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -6
  307. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -0
  308. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +9 -5
  309. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c +10 -23
  310. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +2 -6
  311. data/third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c +2 -1
  312. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +29 -28
  313. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +161 -201
  314. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +254 -39
  315. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +2 -2
  316. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +0 -2
  317. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +4 -4
  318. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c +9 -8
  319. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +37 -75
  320. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +8 -10
  321. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/cipher → cipher_extra}/e_des.c +100 -78
  322. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c +1 -0
  323. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c +1 -0
  324. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c +2 -0
  325. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +6 -12
  326. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -11
  327. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +6 -10
  328. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -1
  329. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +12 -0
  330. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +74 -0
  331. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +62 -0
  332. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-fuchsia.c → cpu_aarch64_fuchsia.c} +8 -7
  333. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-linux.c → cpu_aarch64_linux.c} +6 -4
  334. data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-win.c → cpu_aarch64_win.c} +4 -4
  335. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm.c → cpu_arm.c} +1 -1
  336. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +55 -0
  337. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.c → cpu_arm_linux.c} +11 -90
  338. data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.h → cpu_arm_linux.h} +0 -38
  339. data/third_party/boringssl-with-bazel/src/crypto/{cpu-intel.c → cpu_intel.c} +1 -2
  340. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +25 -20
  341. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +16 -27
  342. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +17 -32
  343. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/des.c +232 -232
  344. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/internal.h +1 -1
  345. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +1 -0
  346. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +232 -29
  347. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +0 -3
  348. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +39 -16
  349. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +37 -7
  350. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +3 -3
  351. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +11 -36
  352. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +214 -99
  353. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +21 -5
  354. data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c +2 -4
  355. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +83 -60
  356. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +46 -12
  357. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +3 -3
  358. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c +25 -23
  359. data/third_party/boringssl-with-bazel/src/crypto/evp/internal.h +43 -9
  360. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +75 -44
  361. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +19 -25
  362. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +96 -45
  363. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c +7 -8
  364. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c +26 -23
  365. data/third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.c +233 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +5 -5
  367. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c +42 -25
  368. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c +4 -5
  369. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +35 -47
  370. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +135 -244
  371. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +2 -4
  372. data/third_party/boringssl-with-bazel/src/crypto/evp/sign.c +15 -10
  373. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +29 -15
  374. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +0 -2
  375. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +13 -14
  376. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +3 -13
  377. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c +13 -7
  378. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +9 -7
  379. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +35 -27
  380. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +16 -26
  381. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c +88 -60
  382. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c +4 -3
  383. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c +0 -2
  384. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +1 -1
  385. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c +1 -1
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +99 -113
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +0 -1
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +5 -3
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c +112 -168
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +86 -31
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +11 -6
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +4 -5
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +4 -5
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +13 -0
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c +13 -5
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +19 -108
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h +19 -15
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c +15 -16
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +22 -21
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c +3 -0
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +79 -19
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +102 -99
  403. data/third_party/boringssl-with-bazel/src/crypto/{cipher_extra → fipsmodule/cipher}/e_aesccm.c +52 -46
  404. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h +39 -0
  405. data/third_party/boringssl-with-bazel/src/crypto/{cmac → fipsmodule/cmac}/cmac.c +55 -11
  406. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +2 -3
  407. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +21 -6
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +56 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +5 -3
  410. data/third_party/boringssl-with-bazel/src/crypto/{evp → fipsmodule/digestsign}/digestsign.c +51 -15
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +25 -25
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +91 -17
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +5 -5
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +34 -12
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +54 -23
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +44 -60
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64-table.h → p256-nistz-table.h} +1 -1
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.c → p256-nistz.c} +60 -53
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.h → p256-nistz.h} +5 -13
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +48 -36
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +2 -8
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +2 -7
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -3
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +0 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +8 -0
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +42 -14
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +6 -0
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c +52 -24
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +9 -15
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +1 -4
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +2 -4
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +71 -43
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +14 -16
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -4
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c +31 -13
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +16 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +3 -2
  438. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +2 -2
  439. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +9 -38
  440. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +73 -59
  441. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -45
  442. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +0 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +22 -0
  444. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +63 -52
  445. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +107 -62
  446. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +58 -31
  447. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +41 -0
  448. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +523 -422
  449. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/internal.h +89 -0
  450. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +334 -0
  451. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +3 -12
  452. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +2 -0
  453. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +12 -8
  454. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +14 -12
  455. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +19 -6
  456. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +32 -14
  457. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +65 -29
  458. data/third_party/boringssl-with-bazel/src/crypto/internal.h +373 -18
  459. data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +61 -0
  460. data/third_party/boringssl-with-bazel/src/crypto/kyber/keccak.c +205 -0
  461. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +13 -1
  462. data/third_party/boringssl-with-bazel/src/crypto/mem.c +220 -13
  463. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -7
  464. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +13 -1
  465. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +81 -90
  466. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +150 -245
  467. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +629 -613
  468. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +17 -17
  469. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +142 -149
  470. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +99 -131
  471. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c +0 -1
  472. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c +0 -1
  473. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +0 -1
  474. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +0 -3
  475. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -66
  476. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +31 -38
  477. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +2 -1
  478. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +18 -31
  479. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  480. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +8 -1
  481. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +129 -5
  482. data/third_party/boringssl-with-bazel/src/crypto/refcount_c11.c +0 -2
  483. data/third_party/boringssl-with-bazel/src/crypto/refcount_lock.c +3 -4
  484. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +8 -11
  485. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +61 -27
  486. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +10 -13
  487. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +10 -13
  488. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +66 -34
  489. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +190 -77
  490. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +81 -284
  491. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +109 -42
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c +22 -24
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +54 -55
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +32 -34
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +32 -16
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +465 -704
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +284 -331
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +183 -178
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c +11 -15
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +67 -50
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +153 -150
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/policy.c +786 -0
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +95 -102
  504. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +72 -57
  505. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +12 -10
  506. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +227 -252
  507. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +52 -47
  508. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +3 -4
  509. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +230 -224
  510. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +161 -327
  511. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +37 -33
  512. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c +14 -31
  513. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +55 -85
  514. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +534 -618
  515. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +129 -122
  516. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +116 -182
  517. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +132 -132
  518. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +181 -202
  519. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +64 -79
  520. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +175 -160
  521. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1865 -2050
  522. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +433 -462
  523. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +156 -163
  524. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +267 -263
  525. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +40 -15
  526. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +59 -63
  527. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +63 -67
  528. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +114 -144
  529. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +25 -26
  530. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +326 -415
  531. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +8 -7
  532. data/third_party/boringssl-with-bazel/src/crypto/x509/x_info.c +30 -28
  533. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +354 -370
  534. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +37 -32
  535. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +116 -119
  536. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +36 -26
  537. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +3 -4
  538. data/third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c +10 -13
  539. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +3 -4
  540. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +419 -261
  541. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +113 -105
  542. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +11 -15
  543. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +78 -170
  544. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +126 -131
  545. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c +3 -4
  546. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +465 -469
  547. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c +56 -54
  548. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +46 -49
  549. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +309 -346
  550. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +341 -365
  551. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +429 -393
  552. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +29 -24
  553. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c +65 -59
  554. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +125 -121
  555. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +43 -42
  556. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +122 -125
  557. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c +50 -20
  558. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +247 -253
  559. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +386 -389
  560. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c +45 -32
  561. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c +57 -54
  562. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c +63 -67
  563. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +143 -136
  564. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +664 -707
  565. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +83 -75
  566. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1062 -1146
  567. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +8 -4
  568. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +28 -48
  569. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +211 -187
  570. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +26 -78
  571. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +19 -14
  572. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +21 -2
  573. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +49 -17
  574. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +99 -29
  575. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +49 -60
  576. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +2 -15
  577. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +16 -200
  578. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +34 -0
  579. data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +82 -0
  580. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +32 -30
  581. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +7 -0
  582. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +4 -0
  583. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +48 -5
  584. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +37 -8
  585. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +1 -0
  586. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +33 -5
  587. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +22 -30
  588. data/third_party/boringssl-with-bazel/src/include/openssl/ex_data.h +1 -1
  589. data/third_party/boringssl-with-bazel/src/include/openssl/hmac.h +7 -0
  590. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +41 -16
  591. data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +91 -0
  592. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +74 -8
  593. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +13 -0
  594. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -0
  595. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +11 -15
  596. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +8 -0
  597. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +12 -1
  598. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +7 -4
  599. data/third_party/boringssl-with-bazel/src/include/openssl/service_indicator.h +96 -0
  600. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +13 -21
  601. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +139 -75
  602. data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +1 -6
  603. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +384 -286
  604. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +5 -6
  605. data/third_party/boringssl-with-bazel/src/include/openssl/time.h +41 -0
  606. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +18 -7
  607. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +49 -23
  608. data/third_party/boringssl-with-bazel/src/include/openssl/type_check.h +0 -11
  609. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1592 -1074
  610. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +202 -205
  611. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +2 -2
  612. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +6 -13
  613. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +17 -18
  614. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +4 -5
  615. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +25 -33
  616. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +34 -20
  617. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +65 -34
  618. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +198 -54
  619. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +5 -5
  620. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +32 -28
  621. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +76 -44
  622. data/third_party/boringssl-with-bazel/src/ssl/internal.h +130 -98
  623. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +27 -11
  624. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  625. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +91 -75
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +8 -10
  627. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +39 -65
  628. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +1 -0
  629. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +5 -9
  630. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +30 -33
  631. data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +77 -100
  632. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +120 -107
  633. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +164 -30
  634. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +150 -60
  635. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +22 -11
  636. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +22 -6
  637. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +15 -13
  638. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +5 -43
  639. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +7 -4
  640. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +2 -2
  641. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +22 -34
  642. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +2 -2
  643. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +16 -98
  644. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +1241 -657
  645. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +751 -398
  646. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3551 -1938
  647. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1272 -487
  648. metadata +105 -70
  649. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +0 -39
  650. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +0 -30
  651. data/src/core/lib/gprpp/global_config.h +0 -93
  652. data/src/core/lib/gprpp/global_config_env.cc +0 -140
  653. data/src/core/lib/gprpp/global_config_env.h +0 -133
  654. data/src/core/lib/gprpp/global_config_generic.h +0 -40
  655. data/src/core/lib/promise/intra_activity_waiter.h +0 -55
  656. data/src/core/lib/security/security_connector/ssl_utils_config.cc +0 -32
  657. data/src/core/lib/security/security_connector/ssl_utils_config.h +0 -29
  658. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +0 -195
  659. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +0 -83
  660. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +0 -236
  661. data/third_party/boringssl-with-bazel/src/crypto/asn1/charmap.h +0 -15
  662. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +0 -206
  663. data/third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c +0 -38
  664. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c +0 -361
  665. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +0 -287
  666. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +0 -132
  667. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +0 -155
  668. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +0 -131
  669. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +0 -189
  670. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +0 -843
  671. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +0 -289
  672. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c +0 -57
  673. /data/src/core/lib/gpr/{log_android.cc → android/log.cc} +0 -0
  674. /data/src/core/lib/gpr/{cpu_iphone.cc → iphone/cpu.cc} +0 -0
  675. /data/src/core/lib/gpr/{cpu_linux.cc → linux/cpu.cc} +0 -0
  676. /data/src/core/lib/gpr/{log_linux.cc → linux/log.cc} +0 -0
  677. /data/src/core/lib/gpr/{tmpfile_msys.cc → msys/tmpfile.cc} +0 -0
  678. /data/src/core/lib/gpr/{cpu_posix.cc → posix/cpu.cc} +0 -0
  679. /data/src/core/lib/gpr/{log_posix.cc → posix/log.cc} +0 -0
  680. /data/src/core/lib/gpr/{string_posix.cc → posix/string.cc} +0 -0
  681. /data/src/core/lib/gpr/{sync_posix.cc → posix/sync.cc} +0 -0
  682. /data/src/core/lib/gpr/{time_posix.cc → posix/time.cc} +0 -0
  683. /data/src/core/lib/gpr/{tmpfile_posix.cc → posix/tmpfile.cc} +0 -0
  684. /data/src/core/lib/gpr/{cpu_windows.cc → windows/cpu.cc} +0 -0
  685. /data/src/core/lib/gpr/{log_windows.cc → windows/log.cc} +0 -0
  686. /data/src/core/lib/gpr/{string_windows.cc → windows/string.cc} +0 -0
  687. /data/src/core/lib/gpr/{string_util_windows.cc → windows/string_util.cc} +0 -0
  688. /data/src/core/lib/gpr/{sync_windows.cc → windows/sync.cc} +0 -0
  689. /data/src/core/lib/gpr/{time_windows.cc → windows/time.cc} +0 -0
  690. /data/src/core/lib/gpr/{tmpfile_windows.cc → windows/tmpfile.cc} +0 -0
  691. /data/src/core/lib/gprpp/{env_linux.cc → linux/env.cc} +0 -0
  692. /data/src/core/lib/gprpp/{env_posix.cc → posix/env.cc} +0 -0
  693. /data/src/core/lib/gprpp/{stat_posix.cc → posix/stat.cc} +0 -0
  694. /data/src/core/lib/gprpp/{env_windows.cc → windows/env.cc} +0 -0
  695. /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;