grpc 1.53.1 → 1.54.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +78 -66
- data/include/grpc/event_engine/event_engine.h +30 -14
- data/include/grpc/grpc_security.h +4 -0
- data/include/grpc/support/port_platform.h +4 -4
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +11 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +6 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -11
- data/src/core/ext/filters/client_channel/backup_poller.h +0 -3
- data/src/core/ext/filters/client_channel/client_channel.cc +848 -813
- data/src/core/ext/filters/client_channel/client_channel.h +131 -173
- data/src/core/ext/filters/client_channel/client_channel_internal.h +114 -0
- data/src/core/ext/filters/client_channel/config_selector.h +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +17 -18
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +134 -151
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2 -16
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +14 -10
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +68 -30
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +2 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +30 -38
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +20 -26
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +31 -179
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +1 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +4 -2
- data/src/core/ext/filters/client_channel/retry_filter.cc +95 -102
- data/src/core/ext/filters/client_channel/subchannel.cc +2 -4
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +26 -27
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +8 -5
- data/src/core/ext/filters/http/client/http_client_filter.cc +3 -3
- data/src/core/ext/filters/http/http_filters_plugin.cc +1 -12
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +27 -11
- data/src/core/ext/filters/message_size/message_size_filter.cc +141 -224
- data/src/core/ext/filters/message_size/message_size_filter.h +48 -3
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -6
- data/src/core/ext/gcp/metadata_query.cc +142 -0
- data/src/core/ext/gcp/metadata_query.h +82 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +70 -55
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +8 -12
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +116 -58
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +5 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +4 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +222 -118
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +113 -295
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +0 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +277 -451
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -14
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -9
- data/src/core/ext/transport/chttp2/transport/internal.h +16 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/writing.cc +10 -5
- data/src/core/ext/transport/inproc/inproc_transport.cc +20 -14
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +22 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +22 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +23 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +94 -3
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +120 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +6 -3
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +22 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +24 -6
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +111 -12
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +9 -7
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +27 -9
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +11 -7
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +56 -12
- 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
- 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
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +24 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +49 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +24 -9
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +66 -12
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +139 -136
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +31 -15
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +12 -9
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +15 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +54 -45
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +135 -119
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +100 -97
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +15 -18
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +272 -264
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +117 -117
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +5 -5
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +5 -5
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +5 -5
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +12 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +5 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +1 -2
- data/src/core/ext/xds/xds_client_stats.cc +29 -15
- data/src/core/ext/xds/xds_client_stats.h +24 -20
- data/src/core/ext/xds/xds_endpoint.cc +5 -2
- data/src/core/ext/xds/xds_endpoint.h +9 -1
- data/src/core/ext/xds/xds_http_rbac_filter.cc +1 -1
- data/src/core/ext/xds/xds_lb_policy_registry.cc +13 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +1 -1
- data/src/core/lib/channel/call_finalization.h +1 -1
- data/src/core/lib/channel/call_tracer.cc +51 -0
- data/src/core/lib/channel/call_tracer.h +101 -38
- data/src/core/lib/channel/connected_channel.cc +483 -1050
- data/src/core/lib/channel/context.h +8 -1
- data/src/core/lib/channel/promise_based_filter.cc +106 -42
- data/src/core/lib/channel/promise_based_filter.h +27 -13
- data/src/core/lib/channel/server_call_tracer_filter.cc +110 -0
- data/src/core/lib/config/config_vars.cc +151 -0
- data/src/core/lib/config/config_vars.h +127 -0
- data/src/core/lib/config/config_vars_non_generated.cc +51 -0
- data/src/core/lib/config/load_config.cc +66 -0
- data/src/core/lib/config/load_config.h +49 -0
- data/src/core/lib/debug/trace.cc +5 -6
- data/src/core/lib/debug/trace.h +0 -5
- data/src/core/lib/event_engine/event_engine.cc +37 -2
- data/src/core/lib/event_engine/handle_containers.h +7 -22
- data/src/core/lib/event_engine/memory_allocator_factory.h +47 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +0 -4
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +3 -9
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +48 -15
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +8 -8
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -5
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +6 -3
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +27 -18
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +0 -3
- data/src/core/lib/event_engine/resolved_address.cc +2 -1
- data/src/core/lib/event_engine/windows/win_socket.cc +0 -1
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +129 -82
- data/src/core/lib/event_engine/windows/windows_endpoint.h +21 -5
- data/src/core/lib/event_engine/windows/windows_engine.cc +39 -18
- data/src/core/lib/event_engine/windows/windows_engine.h +2 -1
- data/src/core/lib/event_engine/windows/windows_listener.cc +370 -0
- data/src/core/lib/event_engine/windows/windows_listener.h +155 -0
- data/src/core/lib/experiments/config.cc +3 -10
- data/src/core/lib/experiments/experiments.cc +7 -0
- data/src/core/lib/experiments/experiments.h +9 -1
- data/src/core/lib/gpr/log.cc +15 -28
- data/src/core/lib/gprpp/fork.cc +8 -14
- data/src/core/lib/gprpp/orphanable.h +4 -3
- data/src/core/lib/gprpp/per_cpu.h +9 -3
- data/src/core/lib/gprpp/{thd_posix.cc → posix/thd.cc} +49 -37
- data/src/core/lib/gprpp/ref_counted.h +33 -34
- data/src/core/lib/gprpp/thd.h +16 -0
- data/src/core/lib/gprpp/time.cc +1 -0
- data/src/core/lib/gprpp/time.h +4 -4
- data/src/core/lib/gprpp/{thd_windows.cc → windows/thd.cc} +2 -2
- data/src/core/lib/iomgr/call_combiner.h +2 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +4 -2
- data/src/core/lib/iomgr/ev_posix.cc +13 -53
- data/src/core/lib/iomgr/ev_posix.h +0 -3
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +103 -76
- data/src/core/lib/iomgr/iomgr.cc +4 -8
- data/src/core/lib/iomgr/iomgr_windows.cc +8 -2
- data/src/core/lib/iomgr/pollset_set_windows.cc +9 -9
- data/src/core/lib/iomgr/pollset_windows.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +16 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_posix.cc +0 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +5 -16
- data/src/core/lib/iomgr/tcp_server_windows.cc +176 -9
- data/src/core/lib/iomgr/tcp_windows.cc +12 -8
- data/src/core/lib/load_balancing/lb_policy.cc +9 -13
- data/src/core/lib/load_balancing/lb_policy.h +4 -2
- data/src/core/lib/promise/activity.cc +22 -6
- data/src/core/lib/promise/activity.h +61 -24
- data/src/core/lib/promise/cancel_callback.h +77 -0
- data/src/core/lib/promise/detail/basic_seq.h +1 -1
- data/src/core/lib/promise/detail/promise_factory.h +4 -0
- data/src/core/lib/promise/for_each.h +176 -0
- data/src/core/lib/promise/if.h +9 -0
- data/src/core/lib/promise/interceptor_list.h +23 -2
- data/src/core/lib/promise/latch.h +89 -3
- data/src/core/lib/promise/loop.h +13 -9
- data/src/core/lib/promise/map.h +7 -0
- data/src/core/lib/promise/party.cc +286 -0
- data/src/core/lib/promise/party.h +499 -0
- data/src/core/lib/promise/pipe.h +197 -57
- data/src/core/lib/promise/poll.h +48 -0
- data/src/core/lib/promise/promise.h +2 -2
- data/src/core/lib/resource_quota/arena.cc +19 -3
- data/src/core/lib/resource_quota/arena.h +119 -5
- data/src/core/lib/resource_quota/memory_quota.cc +1 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +12 -35
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +0 -59
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +13 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +2 -0
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +5 -9
- data/src/core/lib/security/security_connector/ssl_utils.cc +11 -25
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +12 -0
- data/src/core/lib/security/transport/secure_endpoint.cc +4 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +20 -2
- data/src/core/lib/slice/slice.cc +1 -1
- data/src/core/lib/surface/builtins.cc +2 -0
- data/src/core/lib/surface/call.cc +926 -1024
- data/src/core/lib/surface/call.h +10 -0
- data/src/core/lib/surface/lame_client.cc +1 -0
- data/src/core/lib/surface/validate_metadata.cc +42 -43
- data/src/core/lib/surface/validate_metadata.h +0 -9
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/batch_builder.cc +179 -0
- data/src/core/lib/transport/batch_builder.h +468 -0
- data/src/core/lib/transport/bdp_estimator.cc +7 -7
- data/src/core/lib/transport/bdp_estimator.h +10 -6
- data/src/core/lib/transport/custom_metadata.h +30 -0
- data/src/core/lib/transport/metadata_batch.cc +5 -2
- data/src/core/lib/transport/metadata_batch.h +17 -113
- data/src/core/lib/transport/parsed_metadata.h +6 -16
- data/src/core/lib/transport/timeout_encoding.cc +6 -1
- data/src/core/lib/transport/transport.cc +30 -2
- data/src/core/lib/transport/transport.h +70 -14
- data/src/core/lib/transport/transport_impl.h +7 -0
- data/src/core/lib/transport/transport_op_string.cc +52 -42
- data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -2
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +1 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +21 -4
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +5 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +4 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/abseil-cpp/absl/base/config.h +1 -1
- data/third_party/abseil-cpp/absl/flags/commandlineflag.cc +34 -0
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +200 -0
- data/third_party/abseil-cpp/absl/flags/config.h +68 -0
- data/third_party/abseil-cpp/absl/flags/declare.h +73 -0
- data/third_party/abseil-cpp/absl/flags/flag.cc +38 -0
- data/third_party/abseil-cpp/absl/flags/flag.h +310 -0
- data/{src/core/lib/gprpp/global_config_custom.h → third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc} +11 -14
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +68 -0
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +615 -0
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +800 -0
- data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +116 -0
- data/third_party/abseil-cpp/absl/flags/internal/path_util.h +62 -0
- data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.cc +65 -0
- data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.h +61 -0
- data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +60 -0
- data/third_party/abseil-cpp/absl/flags/internal/program_name.h +50 -0
- data/third_party/abseil-cpp/absl/flags/internal/registry.h +97 -0
- data/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h +187 -0
- data/third_party/abseil-cpp/absl/flags/marshalling.cc +241 -0
- data/third_party/abseil-cpp/absl/flags/marshalling.h +356 -0
- data/third_party/abseil-cpp/absl/flags/reflection.cc +354 -0
- data/third_party/abseil-cpp/absl/flags/reflection.h +90 -0
- data/third_party/abseil-cpp/absl/flags/usage_config.cc +165 -0
- data/third_party/abseil-cpp/absl/flags/usage_config.h +135 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +12 -8
- data/third_party/boringssl-with-bazel/err_data.c +728 -712
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +177 -177
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +28 -55
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +21 -23
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c +20 -23
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +66 -185
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c +18 -21
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +356 -311
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +174 -194
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +146 -210
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +6 -9
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +346 -526
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +110 -131
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +130 -116
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +93 -60
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +93 -181
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +242 -305
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +41 -18
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +30 -33
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +36 -33
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +29 -26
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +133 -88
- data/third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.c +230 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +791 -791
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +526 -526
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +114 -135
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +201 -207
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +21 -26
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +55 -68
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +11 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +15 -9
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +17 -10
- data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/bio/printf.c +0 -13
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +9 -5
- data/third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c +10 -23
- data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +2 -6
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +29 -28
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +161 -201
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +254 -39
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +37 -75
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +8 -10
- data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/cipher → cipher_extra}/e_des.c +100 -78
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +6 -12
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -11
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +6 -10
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +12 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +74 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +62 -0
- data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-fuchsia.c → cpu_aarch64_fuchsia.c} +8 -7
- data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-linux.c → cpu_aarch64_linux.c} +6 -4
- data/third_party/boringssl-with-bazel/src/crypto/{cpu-aarch64-win.c → cpu_aarch64_win.c} +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm.c → cpu_arm.c} +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +55 -0
- data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.c → cpu_arm_linux.c} +11 -90
- data/third_party/boringssl-with-bazel/src/crypto/{cpu-arm-linux.h → cpu_arm_linux.h} +0 -38
- data/third_party/boringssl-with-bazel/src/crypto/{cpu-intel.c → cpu_intel.c} +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/crypto.c +25 -20
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +16 -27
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +17 -32
- data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/des.c +232 -232
- data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/des → des}/internal.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +232 -29
- data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +0 -3
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +39 -16
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +37 -7
- data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +11 -36
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +214 -99
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +21 -5
- data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +83 -60
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +46 -12
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c +25 -23
- data/third_party/boringssl-with-bazel/src/crypto/evp/internal.h +43 -9
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +75 -44
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +19 -25
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +96 -45
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c +7 -8
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c +26 -23
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.c +233 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +5 -5
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c +42 -25
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c +4 -5
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +35 -47
- data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +135 -244
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/evp/sign.c +15 -10
- data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +29 -15
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +13 -14
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +3 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c +13 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +9 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +35 -27
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +16 -26
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c +88 -60
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c +4 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +99 -113
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +5 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c +112 -168
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +86 -31
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +11 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +4 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +4 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c +13 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +19 -108
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h +19 -15
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c +15 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +22 -21
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c +3 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +79 -19
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +102 -99
- data/third_party/boringssl-with-bazel/src/crypto/{cipher_extra → fipsmodule/cipher}/e_aesccm.c +52 -46
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/{cmac → fipsmodule/cmac}/cmac.c +55 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +2 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +21 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +56 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +5 -3
- data/third_party/boringssl-with-bazel/src/crypto/{evp → fipsmodule/digestsign}/digestsign.c +51 -15
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +25 -25
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +91 -17
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +5 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +34 -12
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +54 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +44 -60
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64-table.h → p256-nistz-table.h} +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.c → p256-nistz.c} +60 -53
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-x86_64.h → p256-nistz.h} +5 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +48 -36
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +2 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +2 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +42 -14
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +6 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c +52 -24
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +9 -15
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +1 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +71 -43
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +14 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c +31 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +16 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +3 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +9 -38
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +73 -59
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -45
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +22 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +63 -52
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +107 -62
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +58 -31
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +41 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +523 -422
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/internal.h +89 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +334 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +3 -12
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +12 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +14 -12
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +19 -6
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +32 -14
- data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +65 -29
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +373 -18
- data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +61 -0
- data/third_party/boringssl-with-bazel/src/crypto/kyber/keccak.c +205 -0
- data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +13 -1
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +220 -13
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -7
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +13 -1
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +81 -90
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +150 -245
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +629 -613
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +17 -17
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +142 -149
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +99 -131
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +0 -3
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -66
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +31 -38
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +18 -31
- data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +8 -1
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +129 -5
- data/third_party/boringssl-with-bazel/src/crypto/refcount_c11.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/refcount_lock.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +8 -11
- data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +61 -27
- data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +10 -13
- data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +10 -13
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +66 -34
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +190 -77
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +81 -284
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +109 -42
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c +22 -24
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +54 -55
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +32 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +465 -704
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +284 -331
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +183 -178
- data/third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c +11 -15
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +67 -50
- data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +153 -150
- data/third_party/boringssl-with-bazel/src/crypto/x509/policy.c +786 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +95 -102
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +72 -57
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +12 -10
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +227 -252
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +52 -47
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +230 -224
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +161 -327
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +37 -33
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c +14 -31
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +55 -85
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +534 -618
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +129 -122
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +116 -182
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +132 -132
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +181 -202
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +64 -79
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +175 -160
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1865 -2050
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +433 -462
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +156 -163
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +267 -263
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +40 -15
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +59 -63
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +63 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +114 -144
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +25 -26
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +326 -415
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +8 -7
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_info.c +30 -28
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +354 -370
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +37 -32
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +116 -119
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +36 -26
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c +10 -13
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +419 -261
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +113 -105
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +11 -15
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +78 -170
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +126 -131
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +465 -469
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c +56 -54
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +46 -49
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +309 -346
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +341 -365
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +429 -393
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +29 -24
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c +65 -59
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +125 -121
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +43 -42
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +122 -125
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c +50 -20
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +247 -253
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +386 -389
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c +45 -32
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c +57 -54
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c +63 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +143 -136
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +664 -707
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +83 -75
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1062 -1146
- data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +8 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +28 -48
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +211 -187
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +26 -78
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +19 -14
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +21 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +49 -17
- data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +99 -29
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +49 -60
- data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +2 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +16 -200
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +34 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +82 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +32 -30
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +7 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +48 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +37 -8
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/err.h +33 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +22 -30
- data/third_party/boringssl-with-bazel/src/include/openssl/ex_data.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/hmac.h +7 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +41 -16
- data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +91 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +74 -8
- data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +13 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +11 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +8 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +12 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +7 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/service_indicator.h +96 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +13 -21
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +139 -75
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +1 -6
- data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +384 -286
- data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +5 -6
- data/third_party/boringssl-with-bazel/src/include/openssl/time.h +41 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +18 -7
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +49 -23
- data/third_party/boringssl-with-bazel/src/include/openssl/type_check.h +0 -11
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1592 -1074
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +202 -205
- data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +6 -13
- data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +17 -18
- data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +4 -5
- data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +25 -33
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +34 -20
- data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +65 -34
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +198 -54
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +5 -5
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +32 -28
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +76 -44
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +130 -98
- data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +27 -11
- data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +91 -75
- data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +8 -10
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +39 -65
- data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +1 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +5 -9
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +30 -33
- data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +77 -100
- data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +120 -107
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +164 -30
- data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +150 -60
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +22 -11
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +22 -6
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +15 -13
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +5 -43
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +7 -4
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +22 -34
- data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +16 -98
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +1241 -657
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +751 -398
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3551 -1938
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1272 -487
- metadata +103 -70
- data/src/core/ext/filters/client_channel/lb_call_state_internal.h +0 -39
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +0 -30
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +0 -29
- data/src/core/lib/gprpp/global_config.h +0 -93
- data/src/core/lib/gprpp/global_config_env.cc +0 -140
- data/src/core/lib/gprpp/global_config_env.h +0 -133
- data/src/core/lib/gprpp/global_config_generic.h +0 -40
- data/src/core/lib/promise/intra_activity_waiter.h +0 -55
- data/src/core/lib/security/security_connector/ssl_utils_config.cc +0 -32
- data/src/core/lib/security/security_connector/ssl_utils_config.h +0 -29
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +0 -195
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +0 -83
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +0 -236
- data/third_party/boringssl-with-bazel/src/crypto/asn1/charmap.h +0 -15
- data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +0 -206
- data/third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c +0 -38
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c +0 -361
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +0 -287
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +0 -132
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +0 -155
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +0 -131
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +0 -189
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +0 -843
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +0 -289
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c +0 -57
- /data/src/core/lib/gpr/{log_android.cc → android/log.cc} +0 -0
- /data/src/core/lib/gpr/{cpu_iphone.cc → iphone/cpu.cc} +0 -0
- /data/src/core/lib/gpr/{cpu_linux.cc → linux/cpu.cc} +0 -0
- /data/src/core/lib/gpr/{log_linux.cc → linux/log.cc} +0 -0
- /data/src/core/lib/gpr/{tmpfile_msys.cc → msys/tmpfile.cc} +0 -0
- /data/src/core/lib/gpr/{cpu_posix.cc → posix/cpu.cc} +0 -0
- /data/src/core/lib/gpr/{log_posix.cc → posix/log.cc} +0 -0
- /data/src/core/lib/gpr/{string_posix.cc → posix/string.cc} +0 -0
- /data/src/core/lib/gpr/{sync_posix.cc → posix/sync.cc} +0 -0
- /data/src/core/lib/gpr/{time_posix.cc → posix/time.cc} +0 -0
- /data/src/core/lib/gpr/{tmpfile_posix.cc → posix/tmpfile.cc} +0 -0
- /data/src/core/lib/gpr/{cpu_windows.cc → windows/cpu.cc} +0 -0
- /data/src/core/lib/gpr/{log_windows.cc → windows/log.cc} +0 -0
- /data/src/core/lib/gpr/{string_windows.cc → windows/string.cc} +0 -0
- /data/src/core/lib/gpr/{string_util_windows.cc → windows/string_util.cc} +0 -0
- /data/src/core/lib/gpr/{sync_windows.cc → windows/sync.cc} +0 -0
- /data/src/core/lib/gpr/{time_windows.cc → windows/time.cc} +0 -0
- /data/src/core/lib/gpr/{tmpfile_windows.cc → windows/tmpfile.cc} +0 -0
- /data/src/core/lib/gprpp/{env_linux.cc → linux/env.cc} +0 -0
- /data/src/core/lib/gprpp/{env_posix.cc → posix/env.cc} +0 -0
- /data/src/core/lib/gprpp/{stat_posix.cc → posix/stat.cc} +0 -0
- /data/src/core/lib/gprpp/{env_windows.cc → windows/env.cc} +0 -0
- /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/
|
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/
|
58
|
-
#include "src/core/lib/gprpp/
|
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
|
-
|
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
|
-
|
280
|
-
|
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
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
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
|
320
|
+
Unref("orphan connected stream");
|
302
321
|
}
|
303
322
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
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
|
329
|
-
|
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
|
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
|
-
|
631
|
-
|
632
|
-
|
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
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
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
|
-
|
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
|
-
|
919
|
-
|
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
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
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(>m.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
|
-
>m.recv_trailing_metadata_ready;
|
968
|
-
SchedulePush(>m.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
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
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
|
1352
|
-
// based calls (the latter iff make_call_promise != nullptr).
|
1353
|
-
//
|
1354
|
-
// and only if all the filters in the stack are promise based will the
|
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
|
1374
|
-
// for channel data. We need a cleaner (but performant) way to
|
1375
|
-
// and I'm not sure what that is yet.
|
1376
|
-
//
|
1377
|
-
//
|
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<
|
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<
|
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
|
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,
|
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
|
1430
|
-
// on the client and so we have an implementation that we can use
|
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
|
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;
|