grpc 1.78.0 → 1.80.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +22 -8
- data/include/grpc/credentials.h +47 -37
- data/include/grpc/credentials_cpp.h +39 -0
- data/include/grpc/event_engine/event_engine.h +8 -3
- data/include/grpc/grpc.h +4 -0
- data/include/grpc/impl/call.h +9 -0
- data/include/grpc/impl/channel_arg_names.h +7 -0
- data/include/grpc/module.modulemap +2 -0
- data/include/grpc/private_key_signer.h +104 -0
- data/include/grpc/support/port_platform.h +6 -0
- data/src/core/call/call_filters.h +101 -78
- data/src/core/call/call_spine.h +91 -68
- data/src/core/call/call_state.h +60 -4
- data/src/core/call/client_call.cc +9 -9
- data/src/core/call/client_call.h +1 -1
- data/src/core/call/metadata_batch.cc +2 -0
- data/src/core/call/metadata_batch.h +48 -1
- data/src/core/call/metadata_info.cc +35 -0
- data/src/core/call/metadata_info.h +2 -0
- data/src/core/call/simple_slice_based_metadata.h +2 -1
- data/src/core/channelz/channelz.cc +9 -6
- data/src/core/channelz/channelz.h +7 -4
- data/src/core/channelz/property_list.h +5 -0
- data/src/core/channelz/v2tov1/convert.cc +1 -1
- data/src/core/channelz/v2tov1/legacy_api.cc +164 -307
- data/src/core/client_channel/buffered_call.cc +7 -3
- data/src/core/client_channel/buffered_call.h +11 -5
- data/src/core/client_channel/client_channel.cc +106 -44
- data/src/core/client_channel/client_channel.h +3 -6
- data/src/core/client_channel/client_channel_filter.cc +90 -64
- data/src/core/client_channel/client_channel_filter.h +3 -6
- data/src/core/client_channel/client_channel_internal.h +5 -0
- data/src/core/client_channel/config_selector.h +17 -12
- data/src/core/client_channel/dynamic_filters.cc +8 -7
- data/src/core/client_channel/dynamic_filters.h +7 -5
- data/src/core/client_channel/retry_filter.cc +1 -1
- data/src/core/client_channel/retry_filter.h +2 -2
- data/src/core/client_channel/subchannel.cc +1682 -266
- data/src/core/client_channel/subchannel.h +411 -134
- data/src/core/client_channel/subchannel_stream_client.cc +22 -18
- data/src/core/client_channel/subchannel_stream_client.h +8 -9
- data/src/core/client_channel/subchannel_stream_limiter.cc +76 -0
- data/src/core/client_channel/subchannel_stream_limiter.h +51 -0
- data/src/core/config/config_vars.cc +9 -1
- data/src/core/config/config_vars.h +6 -0
- data/src/core/credentials/call/call_creds_registry.h +51 -22
- data/src/core/credentials/call/call_creds_registry_init.cc +86 -2
- data/src/core/credentials/call/external/aws_external_account_credentials.cc +2 -2
- data/src/core/credentials/call/external/external_account_credentials.cc +11 -4
- data/src/core/credentials/call/external/file_external_account_credentials.cc +2 -2
- data/src/core/credentials/transport/channel_creds_registry.h +71 -20
- data/src/core/credentials/transport/channel_creds_registry_init.cc +338 -29
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +43 -24
- data/src/core/credentials/transport/ssl/ssl_credentials.h +7 -1
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +2 -8
- data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -3
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -5
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +7 -5
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +181 -109
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +55 -42
- data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +28 -23
- data/src/core/credentials/transport/tls/grpc_tls_credentials_options.h +26 -23
- data/src/core/credentials/transport/tls/spiffe_utils.cc +2 -2
- data/src/core/credentials/transport/tls/ssl_utils.cc +18 -18
- data/src/core/credentials/transport/tls/ssl_utils.h +12 -10
- data/src/core/credentials/transport/tls/tls_security_connector.cc +106 -74
- data/src/core/credentials/transport/tls/tls_security_connector.h +12 -8
- data/src/core/credentials/transport/xds/xds_credentials.cc +76 -32
- data/src/core/credentials/transport/xds/xds_credentials.h +4 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +117 -35
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +42 -4
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +58 -29
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +19 -11
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +82 -25
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +28 -3
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +9 -7
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
- data/src/core/ext/transport/chttp2/transport/call_tracer_wrapper.h +7 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +117 -67
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -1
- data/src/core/ext/transport/chttp2/transport/frame.cc +2 -15
- data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
- data/src/core/ext/transport/chttp2/transport/goaway.cc +17 -2
- data/src/core/ext/transport/chttp2/transport/goaway.h +27 -6
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +8 -21
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +101 -40
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +923 -772
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +406 -423
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +8 -1
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +25 -13
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +71 -24
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +25 -49
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +29 -9
- data/src/core/ext/transport/chttp2/transport/internal.h +6 -2
- data/src/core/ext/transport/chttp2/transport/keepalive.cc +14 -20
- data/src/core/ext/transport/chttp2/transport/keepalive.h +9 -6
- data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +34 -74
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +123 -79
- data/src/core/ext/transport/chttp2/transport/security_frame.h +233 -3
- data/src/core/ext/transport/chttp2/transport/stream.h +152 -73
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +155 -85
- data/src/core/ext/transport/chttp2/transport/transport_common.h +0 -5
- data/src/core/ext/transport/chttp2/transport/writable_streams.h +8 -7
- data/src/core/ext/transport/chttp2/transport/write_cycle.cc +86 -0
- data/src/core/ext/transport/chttp2/transport/write_cycle.h +355 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +31 -29
- data/src/core/ext/upb-gen/cel/expr/checked.upb.h +1875 -0
- data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.c +409 -0
- data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.h +56 -0
- data/src/core/ext/upb-gen/cel/expr/syntax.upb.h +2223 -0
- data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.c +489 -0
- data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.h +60 -0
- data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +2 -1
- data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +130 -18
- data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +18 -13
- data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +70 -38
- data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +20 -17
- data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +26 -10
- data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +8 -7
- data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb.h +495 -0
- data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.c +114 -0
- data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.h +36 -0
- data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +26 -10
- data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +8 -7
- data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb.h +121 -0
- data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.c +54 -0
- data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.h +32 -0
- data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +143 -9
- data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +18 -6
- data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +112 -11
- data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +22 -9
- data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb.h +276 -0
- data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c +60 -5
- data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.h +4 -0
- data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +72 -0
- data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c +23 -2
- data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +129 -13
- data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c +36 -10
- data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +30 -0
- data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +5 -3
- data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb.h +16 -0
- data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c +4 -3
- data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +31 -0
- data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c +5 -3
- data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
- data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +63 -0
- data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +12 -7
- data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +97 -81
- data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +40 -23
- data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +604 -228
- data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +146 -100
- data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +30 -0
- data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +5 -3
- data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +35 -3
- data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +7 -4
- data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb.h +66 -14
- data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c +22 -11
- data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +87 -0
- data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c +29 -2
- data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +0 -1
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c +0 -1
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +20 -4
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +5 -4
- data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +239 -60
- data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +59 -28
- data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb.h +89 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.c +50 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.h +32 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb.h +135 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.c +53 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.h +32 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb.h +105 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.c +51 -0
- data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.h +32 -0
- data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +32 -0
- data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +6 -3
- data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +206 -0
- data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c +41 -8
- data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +64 -0
- data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +4 -3
- data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +64 -0
- data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c +31 -5
- data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +283 -14
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +48 -11
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb.h +144 -6
- data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c +35 -7
- data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +42 -21
- data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c +9 -8
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +164 -1
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +37 -6
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +2 -0
- data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +0 -1
- data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +0 -1
- data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb.h +0 -1
- data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c +0 -1
- data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +26 -11
- data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c +8 -8
- data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +33 -0
- data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c +14 -3
- data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +90 -10
- data/src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c +18 -7
- data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.c +248 -0
- data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.h +97 -0
- data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.c +283 -0
- data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.h +107 -0
- data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +213 -211
- data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +635 -614
- data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +1012 -1000
- data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +276 -273
- data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.c +152 -0
- data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.h +47 -0
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +149 -144
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +367 -370
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.c +63 -0
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.h +37 -0
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +297 -284
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +492 -469
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c +74 -43
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +60 -59
- data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +202 -184
- data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +354 -339
- data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +28 -19
- data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c +30 -27
- data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c +71 -66
- data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +94 -91
- data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +386 -369
- data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +60 -57
- data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +1974 -1884
- data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +119 -112
- data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +62 -51
- data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +109 -88
- data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +54 -36
- data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +78 -84
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +48 -46
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +1041 -984
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +304 -290
- data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +94 -77
- data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +246 -193
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c +37 -23
- data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c +5 -3
- data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.c +4 -4
- data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c +4 -5
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +113 -87
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c +5 -5
- data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c +6 -5
- data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c +5 -5
- data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c +5 -5
- data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c +5 -5
- data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +25 -30
- data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c +14 -20
- data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c +180 -183
- data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c +56 -47
- data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c +69 -47
- data/src/core/filter/filter_chain.h +95 -0
- data/src/core/handshaker/http_connect/{http_connect_handshaker.cc → http_connect_client_handshaker.cc} +32 -31
- data/src/core/handshaker/http_connect/{http_connect_handshaker.h → http_connect_client_handshaker.h} +4 -4
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +1 -1
- data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +14 -13
- data/src/core/handshaker/security/secure_endpoint.cc +282 -68
- data/src/core/handshaker/security/secure_endpoint.h +0 -7
- data/src/core/lib/channel/channel_args.h +1 -1
- data/src/core/lib/channel/promise_based_filter.cc +17 -4
- data/src/core/lib/channel/promise_based_filter.h +3 -2
- data/src/core/lib/debug/trace_flags.cc +2 -0
- data/src/core/lib/debug/trace_flags.h +1 -0
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +35 -8
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -2
- data/src/core/lib/event_engine/event_engine.cc +9 -0
- data/src/core/lib/event_engine/extensions/tcp_trace.h +0 -3
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +34 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +24 -2
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -3
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +141 -14
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +19 -2
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +7 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +21 -3
- data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +16 -0
- data/src/core/lib/experiments/experiments.cc +309 -201
- data/src/core/lib/experiments/experiments.h +141 -80
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
- data/src/core/lib/iomgr/resolve_address.h +0 -2
- data/src/core/lib/iomgr/resolved_address.h +0 -2
- data/src/core/lib/iomgr/tcp_posix.cc +13 -5
- data/src/core/lib/iomgr/tcp_server.cc +0 -5
- data/src/core/lib/iomgr/tcp_server.h +0 -7
- data/src/core/lib/iomgr/tcp_server_posix.cc +0 -17
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -3
- data/src/core/lib/iomgr/tcp_server_windows.cc +12 -51
- data/src/core/lib/promise/all_ok.h +17 -12
- data/src/core/lib/promise/cancel_callback.h +12 -13
- data/src/core/lib/promise/detail/join_state.h +626 -0
- data/src/core/lib/promise/detail/promise_factory.h +14 -14
- data/src/core/lib/promise/for_each.h +32 -8
- data/src/core/lib/promise/if.h +9 -7
- data/src/core/lib/promise/loop.h +18 -16
- data/src/core/lib/promise/map.h +54 -47
- data/src/core/lib/promise/mpsc.h +11 -10
- data/src/core/lib/promise/observable.h +6 -6
- data/src/core/lib/promise/party.h +25 -19
- data/src/core/lib/promise/poll.h +5 -5
- data/src/core/lib/promise/prioritized_race.h +10 -7
- data/src/core/lib/promise/promise.h +16 -11
- data/src/core/lib/promise/race.h +6 -5
- data/src/core/lib/promise/seq.h +109 -74
- data/src/core/lib/promise/try_join.h +14 -6
- data/src/core/lib/promise/try_seq.h +76 -60
- data/src/core/lib/resource_quota/api.cc +7 -0
- data/src/core/lib/resource_quota/arena.h +1 -1
- data/src/core/lib/resource_quota/memory_quota.cc +4 -1
- data/src/core/lib/resource_quota/resource_quota.cc +2 -1
- data/src/core/lib/resource_quota/resource_quota.h +3 -0
- data/src/core/lib/resource_quota/stream_quota.cc +77 -1
- data/src/core/lib/resource_quota/stream_quota.h +64 -1
- data/src/core/lib/resource_quota/telemetry.h +1 -1
- data/src/core/lib/surface/call.cc +13 -0
- data/src/core/lib/surface/call_utils.h +58 -43
- data/src/core/lib/surface/channel.h +1 -4
- data/src/core/lib/surface/completion_queue.cc +13 -6
- data/src/core/lib/surface/validate_metadata.cc +20 -15
- data/src/core/lib/surface/validate_metadata.h +3 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.cc +1 -1
- data/src/core/lib/transport/promise_endpoint.h +1 -1
- data/src/core/lib/transport/transport.h +5 -0
- data/src/core/load_balancing/health_check_client.cc +1 -15
- data/src/core/load_balancing/health_check_client_internal.h +0 -2
- data/src/core/load_balancing/oob_backend_metric.cc +1 -5
- data/src/core/load_balancing/oob_backend_metric_internal.h +0 -1
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +12 -9
- data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -2
- data/src/core/resolver/xds/xds_resolver.cc +162 -116
- data/src/core/server/server.cc +18 -1
- data/src/core/server/server.h +2 -0
- data/src/core/server/xds_server_config_fetcher.cc +4 -4
- data/src/core/telemetry/call_tracer.cc +87 -2
- data/src/core/telemetry/call_tracer.h +46 -8
- data/src/core/telemetry/instrument.cc +102 -40
- data/src/core/telemetry/instrument.h +246 -65
- data/src/core/tsi/fake_transport_security.cc +3 -1
- data/src/core/tsi/ssl_transport_security.cc +516 -137
- data/src/core/tsi/ssl_transport_security.h +28 -22
- data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
- data/src/core/tsi/ssl_transport_security_utils.h +2 -2
- data/src/core/util/bitset.h +6 -0
- data/src/core/util/function_signature.h +3 -1
- data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
- data/src/core/util/json/json_reader.cc +0 -4
- data/src/core/xds/grpc/certificate_provider_store.cc +2 -1
- data/src/core/xds/grpc/certificate_provider_store.h +3 -17
- data/src/core/xds/grpc/certificate_provider_store_interface.h +61 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +48 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +18 -0
- data/src/core/xds/grpc/xds_certificate_provider.cc +7 -2
- data/src/core/xds/grpc/xds_certificate_provider.h +13 -2
- data/src/core/xds/grpc/xds_client_grpc.cc +13 -6
- data/src/core/xds/grpc/xds_client_grpc.h +10 -7
- data/src/core/xds/grpc/xds_cluster.cc +18 -4
- data/src/core/xds/grpc/xds_cluster.h +17 -2
- data/src/core/xds/grpc/xds_cluster_parser.cc +36 -11
- data/src/core/xds/grpc/xds_common_types.cc +45 -0
- data/src/core/xds/grpc/xds_common_types.h +31 -0
- data/src/core/xds/grpc/xds_common_types_parser.cc +274 -16
- data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
- data/src/core/xds/grpc/xds_http_fault_filter.cc +128 -24
- data/src/core/xds/grpc/xds_http_fault_filter.h +19 -10
- data/src/core/xds/grpc/xds_http_filter.cc +38 -0
- data/src/core/xds/grpc/xds_http_filter.h +70 -47
- data/src/core/xds/grpc/xds_http_filter_registry.cc +48 -14
- data/src/core/xds/grpc/xds_http_filter_registry.h +29 -15
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +88 -22
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +22 -11
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +36 -20
- data/src/core/xds/grpc/xds_http_rbac_filter.h +19 -10
- data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +143 -26
- data/src/core/xds/grpc/xds_http_stateful_session_filter.h +19 -10
- data/src/core/xds/grpc/xds_listener.cc +4 -1
- data/src/core/xds/grpc/xds_listener.h +10 -2
- data/src/core/xds/grpc/xds_listener_parser.cc +23 -18
- data/src/core/xds/grpc/xds_matcher.cc +40 -5
- data/src/core/xds/grpc/xds_matcher.h +13 -0
- data/src/core/xds/grpc/xds_matcher_action.h +1 -1
- data/src/core/xds/grpc/xds_matcher_parse.cc +60 -40
- data/src/core/xds/grpc/xds_matcher_parse.h +2 -1
- data/src/core/xds/grpc/xds_route_config.cc +12 -1
- data/src/core/xds/grpc/xds_route_config.h +15 -2
- data/src/core/xds/grpc/xds_route_config_parser.cc +11 -5
- data/src/core/xds/grpc/xds_routing.cc +181 -6
- data/src/core/xds/grpc/xds_routing.h +57 -0
- data/src/core/xds/grpc/xds_server_grpc.cc +55 -43
- data/src/core/xds/grpc/xds_server_grpc.h +13 -6
- data/src/core/xds/grpc/xds_server_grpc_interface.h +3 -2
- data/src/core/xds/grpc/xds_transport_grpc.cc +12 -6
- data/src/core/xds/grpc/xds_transport_grpc.h +5 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -8
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +18 -12
- data/src/ruby/lib/grpc/grpc.rb +7 -9
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +1 -1
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
- data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
- data/src/ruby/spec/spec_helper.rb +1 -1
- metadata +64 -14
- data/src/core/ext/transport/chttp2/transport/security_frame.cc +0 -31
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +0 -597
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
#include <optional>
|
|
29
29
|
#include <queue>
|
|
30
30
|
#include <string>
|
|
31
|
+
#include <type_traits>
|
|
31
32
|
#include <utility>
|
|
32
33
|
#include <variant>
|
|
33
34
|
#include <vector>
|
|
@@ -39,9 +40,11 @@
|
|
|
39
40
|
#include "src/core/ext/transport/chttp2/transport/http2_status.h"
|
|
40
41
|
#include "src/core/ext/transport/chttp2/transport/message_assembler.h"
|
|
41
42
|
#include "src/core/ext/transport/chttp2/transport/transport_common.h"
|
|
43
|
+
#include "src/core/ext/transport/chttp2/transport/write_cycle.h"
|
|
42
44
|
#include "src/core/lib/promise/activity.h"
|
|
43
45
|
#include "src/core/lib/promise/context.h"
|
|
44
46
|
#include "src/core/lib/promise/poll.h"
|
|
47
|
+
#include "src/core/lib/resource_quota/arena.h"
|
|
45
48
|
#include "src/core/lib/slice/slice_buffer.h"
|
|
46
49
|
#include "src/core/util/grpc_check.h"
|
|
47
50
|
#include "src/core/util/ref_counted.h"
|
|
@@ -59,7 +62,8 @@ namespace http2 {
|
|
|
59
62
|
template <typename T>
|
|
60
63
|
class SimpleQueue {
|
|
61
64
|
public:
|
|
62
|
-
explicit SimpleQueue(const uint32_t max_tokens)
|
|
65
|
+
explicit SimpleQueue(Arena* arena, const uint32_t max_tokens)
|
|
66
|
+
: queue_(arena), max_tokens_(max_tokens) {}
|
|
63
67
|
SimpleQueue(SimpleQueue&& rhs) = delete;
|
|
64
68
|
SimpleQueue& operator=(SimpleQueue&& rhs) = delete;
|
|
65
69
|
SimpleQueue(const SimpleQueue&) = delete;
|
|
@@ -99,13 +103,18 @@ class SimpleQueue {
|
|
|
99
103
|
}
|
|
100
104
|
|
|
101
105
|
// Returns true if the queue is empty. This function is NOT thread safe.
|
|
102
|
-
bool IsEmpty()
|
|
106
|
+
inline bool IsEmpty() { return queue_.Peek() == nullptr; }
|
|
107
|
+
|
|
103
108
|
// Clears the queue. This function is NOT thread safe.
|
|
104
|
-
void Clear() {
|
|
109
|
+
void Clear() {
|
|
110
|
+
while (queue_.Pop().has_value()) {
|
|
111
|
+
}
|
|
112
|
+
GRPC_DCHECK(IsEmpty());
|
|
113
|
+
}
|
|
105
114
|
|
|
106
|
-
inline std::optional<uint32_t> GetNextEntryTokens()
|
|
107
|
-
|
|
108
|
-
|
|
115
|
+
inline std::optional<uint32_t> GetNextEntryTokens() {
|
|
116
|
+
Entry* front = queue_.Peek();
|
|
117
|
+
return front == nullptr ? std::nullopt : std::make_optional(front->tokens);
|
|
109
118
|
}
|
|
110
119
|
|
|
111
120
|
private:
|
|
@@ -116,11 +125,12 @@ class SimpleQueue {
|
|
|
116
125
|
if (tokens_consumed_ == 0 ||
|
|
117
126
|
tokens_consumed_ <= max_tokens_consumed_threshold) {
|
|
118
127
|
tokens_consumed_ += tokens;
|
|
119
|
-
|
|
128
|
+
const bool was_empty = IsEmpty();
|
|
129
|
+
queue_.Push(Entry{std::move(data), tokens});
|
|
120
130
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
121
131
|
<< "Enqueue successful. Data tokens: " << tokens
|
|
122
132
|
<< " Current tokens consumed: " << tokens_consumed_;
|
|
123
|
-
return /*became_non_empty=*/
|
|
133
|
+
return /*became_non_empty=*/was_empty;
|
|
124
134
|
}
|
|
125
135
|
|
|
126
136
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
@@ -139,33 +149,35 @@ class SimpleQueue {
|
|
|
139
149
|
return absl::InternalError("Tokens consumed overflowed.");
|
|
140
150
|
}
|
|
141
151
|
tokens_consumed_ += tokens;
|
|
142
|
-
|
|
152
|
+
const bool was_empty = IsEmpty();
|
|
153
|
+
queue_.Push(Entry{std::move(data), tokens});
|
|
143
154
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
144
155
|
<< "Immediate enqueue successful. Data tokens: " << tokens
|
|
145
156
|
<< " Current tokens consumed: " << tokens_consumed_;
|
|
146
|
-
return /*became_non_empty*/
|
|
157
|
+
return /*became_non_empty*/ was_empty;
|
|
147
158
|
}
|
|
148
159
|
|
|
149
160
|
std::optional<T> DequeueInternal(const uint32_t allowed_dequeue_tokens,
|
|
150
161
|
const bool allow_oversized_dequeue) {
|
|
151
|
-
|
|
152
|
-
|
|
162
|
+
Entry* front = queue_.Peek();
|
|
163
|
+
if (front == nullptr ||
|
|
164
|
+
(front->tokens > allowed_dequeue_tokens && !allow_oversized_dequeue)) {
|
|
153
165
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
154
|
-
<< "Dequeueing data.
|
|
166
|
+
<< "Dequeueing data."
|
|
155
167
|
<< " Max allowed dequeue tokens: " << allowed_dequeue_tokens
|
|
156
168
|
<< " Front tokens: "
|
|
157
|
-
<< (
|
|
158
|
-
|
|
169
|
+
<< (front != nullptr ? std::to_string(front->tokens)
|
|
170
|
+
: std::string("NA"))
|
|
159
171
|
<< " Allow oversized dequeue: " << allow_oversized_dequeue;
|
|
160
172
|
return std::nullopt;
|
|
161
173
|
}
|
|
162
174
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
tokens_consumed_ -= entry
|
|
175
|
+
std::optional<Entry> entry = queue_.Pop();
|
|
176
|
+
GRPC_DCHECK(entry.has_value());
|
|
177
|
+
tokens_consumed_ -= entry->tokens;
|
|
166
178
|
auto waker = std::move(waker_);
|
|
167
179
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
168
|
-
<< "Dequeue successful. Data tokens released: " << entry
|
|
180
|
+
<< "Dequeue successful. Data tokens released: " << entry->tokens
|
|
169
181
|
<< " Current tokens consumed: " << tokens_consumed_;
|
|
170
182
|
|
|
171
183
|
// TODO(akshitpatel) : [PH2][P2] : Investigate a mechanism to only wake up
|
|
@@ -173,7 +185,7 @@ class SimpleQueue {
|
|
|
173
185
|
// this queue is revamped soon and so not spending time on optimization
|
|
174
186
|
// right now.
|
|
175
187
|
waker.Wakeup();
|
|
176
|
-
return std::move(entry
|
|
188
|
+
return std::move(entry->data);
|
|
177
189
|
}
|
|
178
190
|
|
|
179
191
|
struct Entry {
|
|
@@ -181,7 +193,7 @@ class SimpleQueue {
|
|
|
181
193
|
uint32_t tokens;
|
|
182
194
|
};
|
|
183
195
|
|
|
184
|
-
|
|
196
|
+
ArenaSpsc<Entry> queue_;
|
|
185
197
|
// The maximum number of tokens that can be enqueued. This limit is used to
|
|
186
198
|
// exert back pressure on the sender. If the sender tries to enqueue more
|
|
187
199
|
// tokens than this limit, the enqueue promise will not resolve until the
|
|
@@ -196,16 +208,58 @@ class SimpleQueue {
|
|
|
196
208
|
Waker waker_;
|
|
197
209
|
};
|
|
198
210
|
|
|
211
|
+
// DequeueFlags is a wrapper class for the dequeue flags. The flags can only
|
|
212
|
+
// be set from within the StreamDataQueue class.
|
|
213
|
+
class DequeueFlags {
|
|
214
|
+
public:
|
|
215
|
+
static constexpr uint8_t kResetStreamDequeued = 0x01u;
|
|
216
|
+
static constexpr uint8_t kHalfCloseDequeued = 0x02u;
|
|
217
|
+
static constexpr uint8_t kInitialMetadataDequeued = 0x04u;
|
|
218
|
+
static constexpr uint8_t kMessageDequeued = 0x08u;
|
|
219
|
+
static constexpr uint8_t kTrailingMetadataDequeued = 0x10u;
|
|
220
|
+
|
|
221
|
+
DequeueFlags() = default;
|
|
222
|
+
|
|
223
|
+
bool IsResetStreamDequeued() const {
|
|
224
|
+
return (flags_ & kResetStreamDequeued) != 0u;
|
|
225
|
+
}
|
|
226
|
+
bool IsHalfCloseDequeued() const {
|
|
227
|
+
return (flags_ & kHalfCloseDequeued) != 0u;
|
|
228
|
+
}
|
|
229
|
+
bool IsInitialMetadataDequeued() const {
|
|
230
|
+
return (flags_ & kInitialMetadataDequeued) != 0u;
|
|
231
|
+
}
|
|
232
|
+
bool IsMessageDequeued() const { return (flags_ & kMessageDequeued) != 0u; }
|
|
233
|
+
bool IsTrailingMetadataDequeued() const {
|
|
234
|
+
return (flags_ & kTrailingMetadataDequeued) != 0u;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
bool operator==(uint8_t flags) const { return flags_ == flags; }
|
|
238
|
+
|
|
239
|
+
private:
|
|
240
|
+
template <typename MetadataHandle>
|
|
241
|
+
friend class StreamDataQueue;
|
|
242
|
+
|
|
243
|
+
void set_reset_stream_dequeued() { flags_ |= kResetStreamDequeued; }
|
|
244
|
+
void set_half_close_dequeued() { flags_ |= kHalfCloseDequeued; }
|
|
245
|
+
void set_initial_metadata_dequeued() { flags_ |= kInitialMetadataDequeued; }
|
|
246
|
+
void set_message_dequeued() { flags_ |= kMessageDequeued; }
|
|
247
|
+
void set_trailing_metadata_dequeued() { flags_ |= kTrailingMetadataDequeued; }
|
|
248
|
+
|
|
249
|
+
uint8_t flags_ = 0u;
|
|
250
|
+
};
|
|
251
|
+
|
|
199
252
|
// StreamDataQueue is a thread safe.
|
|
200
253
|
// Note: StreamDataQueue is a single producer single
|
|
201
254
|
// consumer queue.
|
|
202
255
|
template <typename MetadataHandle>
|
|
203
256
|
class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
204
257
|
public:
|
|
205
|
-
explicit StreamDataQueue(const bool is_client,
|
|
258
|
+
explicit StreamDataQueue(Arena* arena, const bool is_client,
|
|
259
|
+
const uint32_t queue_size)
|
|
206
260
|
: stream_id_(0),
|
|
207
261
|
is_client_(is_client),
|
|
208
|
-
queue_(queue_size),
|
|
262
|
+
queue_(arena, queue_size),
|
|
209
263
|
initial_metadata_disassembler_(/*is_trailing_metadata=*/false),
|
|
210
264
|
trailing_metadata_disassembler_(/*is_trailing_metadata=*/true) {};
|
|
211
265
|
~StreamDataQueue() = default;
|
|
@@ -259,7 +313,14 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
259
313
|
GRPC_DCHECK(!is_initial_metadata_queued_);
|
|
260
314
|
GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
|
|
261
315
|
GRPC_DCHECK(metadata != nullptr);
|
|
262
|
-
|
|
316
|
+
|
|
317
|
+
// Stream closed before initial metadata is enqueued. This is possible
|
|
318
|
+
// if the stream is cancelled between stream creation and
|
|
319
|
+
// PullClientInitialMetadata resolving.
|
|
320
|
+
if (IsEnqueueClosed()) {
|
|
321
|
+
return StreamWritabilityUpdate{/*became_writable=*/false,
|
|
322
|
+
WritableStreamPriority::kStreamClosed};
|
|
323
|
+
}
|
|
263
324
|
|
|
264
325
|
is_initial_metadata_queued_ = true;
|
|
265
326
|
absl::StatusOr<bool> result = queue_.ImmediateEnqueue(
|
|
@@ -376,12 +437,14 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
376
437
|
}
|
|
377
438
|
|
|
378
439
|
// Enqueue Reset Stream.
|
|
379
|
-
// 1.
|
|
380
|
-
//
|
|
440
|
+
// 1. This function is thread safe.
|
|
441
|
+
// 2. ResetStream frame can be enqueued at any point after the creation of the
|
|
442
|
+
// stream.
|
|
443
|
+
// 3. Once ResetStream is enqueued, any enqueue calls after this will be
|
|
444
|
+
// ignored.
|
|
381
445
|
absl::StatusOr<StreamWritabilityUpdate> EnqueueResetStream(
|
|
382
446
|
const uint32_t error_code) {
|
|
383
447
|
MutexLock lock(&mu_);
|
|
384
|
-
GRPC_DCHECK(is_initial_metadata_queued_);
|
|
385
448
|
|
|
386
449
|
// This can happen when the transport tries to close the stream and the
|
|
387
450
|
// stream is cancelled from the call stack.
|
|
@@ -407,35 +470,22 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
407
470
|
|
|
408
471
|
//////////////////////////////////////////////////////////////////////////////
|
|
409
472
|
// Dequeue Helpers
|
|
410
|
-
|
|
411
|
-
static constexpr uint8_t kResetStreamDequeued = 0x1;
|
|
412
|
-
static constexpr uint8_t kHalfCloseDequeued = 0x2;
|
|
413
|
-
static constexpr uint8_t kInitialMetadataDequeued = 0x4;
|
|
414
|
-
|
|
415
473
|
struct DequeueResult {
|
|
416
|
-
std::vector<Http2Frame> frames;
|
|
417
474
|
bool is_writable;
|
|
418
475
|
WritableStreamPriority priority;
|
|
419
|
-
// Maybe not be extremely accurate but should be good enough for our
|
|
420
|
-
// purposes.
|
|
421
|
-
size_t total_bytes_consumed = 0u;
|
|
422
476
|
size_t flow_control_tokens_consumed = 0u;
|
|
423
477
|
// Bitmask of the dequeue flags.
|
|
424
|
-
|
|
478
|
+
DequeueFlags flags;
|
|
425
479
|
|
|
426
480
|
// Returns true if the reset stream was dequeued.
|
|
427
|
-
bool
|
|
428
|
-
return (flags & kResetStreamDequeued) != 0u;
|
|
429
|
-
}
|
|
481
|
+
bool IsResetStreamDequeued() const { return flags.IsResetStreamDequeued(); }
|
|
430
482
|
|
|
431
483
|
// Returns true if the half close was dequeued.
|
|
432
|
-
bool
|
|
433
|
-
return (flags & kHalfCloseDequeued) != 0u;
|
|
434
|
-
}
|
|
484
|
+
bool IsHalfCloseDequeued() const { return flags.IsHalfCloseDequeued(); }
|
|
435
485
|
|
|
436
486
|
// Returns true if the initial metadata was dequeued.
|
|
437
|
-
bool
|
|
438
|
-
return (
|
|
487
|
+
bool IsInitialMetadataDequeued() const {
|
|
488
|
+
return flags.IsInitialMetadataDequeued();
|
|
439
489
|
}
|
|
440
490
|
};
|
|
441
491
|
|
|
@@ -462,6 +512,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
462
512
|
const uint32_t max_frame_length,
|
|
463
513
|
const uint32_t stream_fc_tokens,
|
|
464
514
|
HPackCompressor& encoder,
|
|
515
|
+
FrameSender& frame_sender,
|
|
465
516
|
const bool can_send_reset_stream) {
|
|
466
517
|
MutexLock lock(&mu_);
|
|
467
518
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
@@ -478,12 +529,12 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
478
529
|
// metadata enqueued has not reached HPACK encoder, so it is safe to drop
|
|
479
530
|
// all frames.
|
|
480
531
|
if (std::optional<DequeueResult> result =
|
|
481
|
-
HandleResetStreamLocked(can_send_reset_stream)) {
|
|
532
|
+
HandleResetStreamLocked(can_send_reset_stream, frame_sender)) {
|
|
482
533
|
return std::move(*result);
|
|
483
534
|
}
|
|
484
535
|
|
|
485
536
|
HandleDequeue handle_dequeue(max_fc_tokens, max_frame_length, encoder,
|
|
486
|
-
*this);
|
|
537
|
+
frame_sender, *this);
|
|
487
538
|
while (message_disassembler_.GetBufferedLength() <= max_fc_tokens) {
|
|
488
539
|
const uint32_t tokens_to_dequeue =
|
|
489
540
|
max_fc_tokens - message_disassembler_.GetBufferedLength();
|
|
@@ -502,14 +553,15 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
502
553
|
GRPC_DCHECK_GE(stream_fc_tokens,
|
|
503
554
|
handle_dequeue.GetFlowControlTokensConsumed());
|
|
504
555
|
|
|
556
|
+
handle_dequeue.AppendBufferedFrames();
|
|
557
|
+
|
|
505
558
|
return DequeueResult{
|
|
506
|
-
handle_dequeue.GetFrames(),
|
|
507
559
|
UpdateWritableStateDequeueLocked(
|
|
508
560
|
stream_fc_tokens - handle_dequeue.GetFlowControlTokensConsumed()),
|
|
509
561
|
priority_,
|
|
510
|
-
|
|
562
|
+
/*flow_control_tokens_consumed=*/
|
|
511
563
|
handle_dequeue.GetFlowControlTokensConsumed(),
|
|
512
|
-
handle_dequeue.GetDequeueFlags()};
|
|
564
|
+
/*flags=*/handle_dequeue.GetDequeueFlags()};
|
|
513
565
|
}
|
|
514
566
|
|
|
515
567
|
// TODO(tjagtap) : [PH2][P1][FlowControl] : Call this while processing
|
|
@@ -550,18 +602,20 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
550
602
|
class HandleDequeue {
|
|
551
603
|
public:
|
|
552
604
|
HandleDequeue(const uint32_t max_tokens, const uint32_t max_frame_length,
|
|
553
|
-
HPackCompressor& encoder,
|
|
605
|
+
HPackCompressor& encoder, FrameSender& frame_sender,
|
|
606
|
+
StreamDataQueue& queue)
|
|
554
607
|
: queue_(queue),
|
|
555
608
|
max_frame_length_(max_frame_length),
|
|
556
609
|
max_tokens_available_(max_tokens),
|
|
557
610
|
flow_control_tokens_consumed_(0),
|
|
558
|
-
encoder_(encoder)
|
|
611
|
+
encoder_(encoder),
|
|
612
|
+
frame_sender_(frame_sender) {}
|
|
559
613
|
|
|
560
614
|
void operator()(InitialMetadataType initial_metadata) {
|
|
561
615
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing initial metadata for sending";
|
|
562
616
|
queue_.initial_metadata_disassembler_.PrepareForSending(
|
|
563
617
|
std::move(initial_metadata.metadata), encoder_);
|
|
564
|
-
dequeue_flags_
|
|
618
|
+
dequeue_flags_.set_initial_metadata_dequeued();
|
|
565
619
|
MaybeAppendInitialMetadataFrames();
|
|
566
620
|
}
|
|
567
621
|
|
|
@@ -569,6 +623,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
569
623
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing trailing metadata for sending";
|
|
570
624
|
queue_.trailing_metadata_disassembler_.PrepareForSending(
|
|
571
625
|
std::move(trailing_metadata.metadata), encoder_);
|
|
626
|
+
dequeue_flags_.set_trailing_metadata_dequeued();
|
|
572
627
|
}
|
|
573
628
|
|
|
574
629
|
void operator()(MessageHandle message) {
|
|
@@ -579,10 +634,10 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
579
634
|
|
|
580
635
|
void operator()(GRPC_UNUSED HalfClosed half_closed) {
|
|
581
636
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing end of stream for sending";
|
|
582
|
-
dequeue_flags_
|
|
637
|
+
dequeue_flags_.set_half_close_dequeued();
|
|
583
638
|
}
|
|
584
639
|
|
|
585
|
-
|
|
640
|
+
void AppendBufferedFrames() {
|
|
586
641
|
// TODO(akshitpatel) : [PH2][P3] : There is a second option here. We can
|
|
587
642
|
// only append messages here. Additionally, when Trailing
|
|
588
643
|
// Metadata/HalfClose/ResetStream is dequeued, we can first flush the
|
|
@@ -594,20 +649,18 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
594
649
|
MaybeAppendMessageFrames();
|
|
595
650
|
MaybeAppendEndOfStreamFrame();
|
|
596
651
|
MaybeAppendTrailingMetadataFrames();
|
|
597
|
-
return std::move(frames_);
|
|
598
652
|
}
|
|
599
653
|
|
|
600
|
-
size_t GetTotalBytesConsumed() const { return total_bytes_consumed_; }
|
|
601
654
|
size_t GetFlowControlTokensConsumed() const {
|
|
602
655
|
return flow_control_tokens_consumed_;
|
|
603
656
|
}
|
|
604
|
-
|
|
657
|
+
DequeueFlags GetDequeueFlags() const { return dequeue_flags_; }
|
|
605
658
|
|
|
606
659
|
private:
|
|
607
660
|
inline void MaybeAppendInitialMetadataFrames() {
|
|
608
661
|
while (queue_.initial_metadata_disassembler_.HasMoreData()) {
|
|
609
|
-
GRPC_DCHECK(!(
|
|
610
|
-
GRPC_DCHECK(!(
|
|
662
|
+
GRPC_DCHECK(!dequeue_flags_.IsHalfCloseDequeued());
|
|
663
|
+
GRPC_DCHECK(!dequeue_flags_.IsResetStreamDequeued());
|
|
611
664
|
// TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
|
|
612
665
|
// HasMoreData() should be enough.
|
|
613
666
|
bool is_end_headers = false;
|
|
@@ -618,7 +671,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
618
671
|
|
|
619
672
|
inline void MaybeAppendTrailingMetadataFrames() {
|
|
620
673
|
while (queue_.trailing_metadata_disassembler_.HasMoreData()) {
|
|
621
|
-
GRPC_DCHECK(!(
|
|
674
|
+
GRPC_DCHECK(!dequeue_flags_.IsHalfCloseDequeued());
|
|
622
675
|
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
623
676
|
GRPC_DCHECK_EQ(
|
|
624
677
|
queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
@@ -631,12 +684,31 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
631
684
|
}
|
|
632
685
|
|
|
633
686
|
inline void MaybeAppendEndOfStreamFrame() {
|
|
634
|
-
if (dequeue_flags_
|
|
687
|
+
if (dequeue_flags_.IsHalfCloseDequeued()) {
|
|
635
688
|
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
636
689
|
GRPC_DCHECK_EQ(
|
|
637
690
|
queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
638
691
|
GRPC_DCHECK_EQ(
|
|
639
692
|
queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
693
|
+
Http2Frame* last_frame = frame_sender_.MutableLastRegularFrame();
|
|
694
|
+
|
|
695
|
+
// On the Server side, trailing metadata acts as end of stream and is
|
|
696
|
+
// always sent with END_STREAM flag set.
|
|
697
|
+
// To be inline with CHTTP2, InitialMetadata is always sent with
|
|
698
|
+
// END_STREAM flag false.
|
|
699
|
+
if (last_frame != nullptr && dequeue_flags_.IsMessageDequeued()) {
|
|
700
|
+
bool merged = std::visit(
|
|
701
|
+
[](auto& frame) -> bool {
|
|
702
|
+
using F = std::decay_t<decltype(frame)>;
|
|
703
|
+
if constexpr (std::is_same_v<F, Http2DataFrame>) {
|
|
704
|
+
frame.end_stream = true;
|
|
705
|
+
return true;
|
|
706
|
+
}
|
|
707
|
+
return false;
|
|
708
|
+
},
|
|
709
|
+
*last_frame);
|
|
710
|
+
if (merged) return;
|
|
711
|
+
}
|
|
640
712
|
AppendFrame(Http2DataFrame{/*stream_id=*/queue_.stream_id_,
|
|
641
713
|
/*end_stream=*/true,
|
|
642
714
|
/*payload=*/SliceBuffer()});
|
|
@@ -658,11 +730,12 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
658
730
|
<< " Consumed tokens: " << flow_control_tokens_consumed_
|
|
659
731
|
<< " Max tokens: " << max_tokens_available_;
|
|
660
732
|
AppendFrame(std::move(frame));
|
|
733
|
+
dequeue_flags_.set_message_dequeued();
|
|
661
734
|
}
|
|
662
735
|
}
|
|
663
736
|
|
|
664
737
|
inline void MaybeAppendResetStreamFrame() {
|
|
665
|
-
if (dequeue_flags_
|
|
738
|
+
if (dequeue_flags_.IsResetStreamDequeued()) {
|
|
666
739
|
// TODO(akshitpatel) : [PH2][P2] : Consider if we can send reset stream
|
|
667
740
|
// frame without flushing all the messages enqueued until now.
|
|
668
741
|
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
@@ -675,8 +748,10 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
675
748
|
}
|
|
676
749
|
|
|
677
750
|
inline void AppendFrame(Http2Frame&& frame) {
|
|
678
|
-
|
|
679
|
-
|
|
751
|
+
// FrameSender automatically accounts for the frame size in write quota.
|
|
752
|
+
// Maybe not be extremely accurate but should be good enough for our
|
|
753
|
+
// purposes.
|
|
754
|
+
frame_sender_.AddRegularFrame(std::forward<Http2Frame>(frame));
|
|
680
755
|
}
|
|
681
756
|
|
|
682
757
|
StreamDataQueue& queue_;
|
|
@@ -684,10 +759,9 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
684
759
|
const uint32_t max_tokens_available_;
|
|
685
760
|
uint32_t flow_control_tokens_consumed_;
|
|
686
761
|
uint32_t error_code_ = static_cast<uint32_t>(Http2ErrorCode::kNoError);
|
|
687
|
-
std::vector<Http2Frame> frames_;
|
|
688
762
|
HPackCompressor& encoder_;
|
|
689
|
-
|
|
690
|
-
|
|
763
|
+
FrameSender& frame_sender_;
|
|
764
|
+
DequeueFlags dequeue_flags_;
|
|
691
765
|
};
|
|
692
766
|
|
|
693
767
|
// Updates the writable state and priority of the stream. MUST only be called
|
|
@@ -765,8 +839,9 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
765
839
|
return is_writable_;
|
|
766
840
|
}
|
|
767
841
|
|
|
768
|
-
inline bool IsNextQueueEntryMessage()
|
|
769
|
-
|
|
842
|
+
inline bool IsNextQueueEntryMessage() {
|
|
843
|
+
std::optional<size_t> next_entry_tokens = queue_.GetNextEntryTokens();
|
|
844
|
+
return next_entry_tokens.has_value() && *next_entry_tokens > 0;
|
|
770
845
|
}
|
|
771
846
|
|
|
772
847
|
// Handles the case where a reset stream is queued.
|
|
@@ -774,37 +849,32 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
774
849
|
// DequeueResult. Otherwise, it returns std::nullopt.
|
|
775
850
|
// This function must be called with mu_ held.
|
|
776
851
|
std::optional<DequeueResult> HandleResetStreamLocked(
|
|
777
|
-
const bool can_send_reset_stream
|
|
852
|
+
const bool can_send_reset_stream, FrameSender& frame_sender)
|
|
853
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
|
778
854
|
switch (reset_stream_state_) {
|
|
779
855
|
case RstStreamState::kDequeued:
|
|
780
856
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
781
857
|
<< "Reset stream is already dequeued. Returning empty frames.";
|
|
782
858
|
GRPC_DCHECK(queue_.IsEmpty());
|
|
783
859
|
is_writable_ = false;
|
|
784
|
-
return DequeueResult{
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
/*flow_control_tokens_consumed=*/0u, /*flags=*/0u};
|
|
860
|
+
return DequeueResult{is_writable_, priority_,
|
|
861
|
+
/*flow_control_tokens_consumed=*/0u,
|
|
862
|
+
/*flags=*/DequeueFlags{}};
|
|
788
863
|
case RstStreamState::kQueued: {
|
|
789
864
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
790
865
|
<< "Reset stream is queued. Skipping all frames (if any) for "
|
|
791
866
|
"dequeuing.";
|
|
792
867
|
is_writable_ = false;
|
|
793
|
-
|
|
794
|
-
uint8_t flags = 0u;
|
|
868
|
+
DequeueFlags flags;
|
|
795
869
|
if (can_send_reset_stream) {
|
|
796
|
-
|
|
870
|
+
frame_sender.AddRegularFrame(
|
|
797
871
|
Http2RstStreamFrame{stream_id_, reset_stream_error_code_});
|
|
798
|
-
flags
|
|
872
|
+
flags.set_reset_stream_dequeued();
|
|
799
873
|
}
|
|
800
874
|
queue_.Clear();
|
|
801
875
|
reset_stream_state_ = RstStreamState::kDequeued;
|
|
802
|
-
return DequeueResult{
|
|
803
|
-
|
|
804
|
-
priority_,
|
|
805
|
-
/*total_bytes_consumed=*/0u,
|
|
806
|
-
/*flow_control_tokens_consumed=*/0u,
|
|
807
|
-
flags};
|
|
876
|
+
return DequeueResult{is_writable_, priority_,
|
|
877
|
+
/*flow_control_tokens_consumed=*/0u, flags};
|
|
808
878
|
}
|
|
809
879
|
case RstStreamState::kNotQueued:
|
|
810
880
|
return std::nullopt;
|
|
@@ -39,11 +39,6 @@
|
|
|
39
39
|
#define GRPC_ARG_MAX_CONCURRENT_STREAMS_OVERLOAD_PROTECTION \
|
|
40
40
|
"grpc.http.overload_protection"
|
|
41
41
|
|
|
42
|
-
// EXPERIMENTAL: Fail requests at the client if the client is over max
|
|
43
|
-
// concurrent streams, so they may be retried elsewhere.
|
|
44
|
-
#define GRPC_ARG_MAX_CONCURRENT_STREAMS_REJECT_ON_CLIENT \
|
|
45
|
-
"grpc.http.max_concurrent_streams_reject_on_client"
|
|
46
|
-
|
|
47
42
|
#define KEEPALIVE_TIME_BACKOFF_MULTIPLIER 2
|
|
48
43
|
|
|
49
44
|
#define GRPC_CHTTP2_PING_TIMEOUT_STR "ping timeout"
|
|
@@ -74,19 +74,19 @@ class WritableStreams {
|
|
|
74
74
|
WritableStreams(WritableStreams&&) = delete;
|
|
75
75
|
WritableStreams& operator=(WritableStreams&&) = delete;
|
|
76
76
|
|
|
77
|
-
absl::Status EnqueueWrapper(
|
|
77
|
+
absl::Status EnqueueWrapper(StreamPtr stream,
|
|
78
78
|
const WritableStreamPriority priority,
|
|
79
79
|
bool transport_tokens_available) {
|
|
80
80
|
if (transport_tokens_available) {
|
|
81
|
-
return Enqueue(stream, priority);
|
|
81
|
+
return Enqueue(std::move(stream), priority);
|
|
82
82
|
} else {
|
|
83
|
-
return BlockedOnTransportFlowControl(stream);
|
|
83
|
+
return BlockedOnTransportFlowControl(std::move(stream));
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
// Enqueues a stream id with the given priority.
|
|
88
88
|
// If this returns error, transport MUST be closed.
|
|
89
|
-
absl::Status Enqueue(
|
|
89
|
+
absl::Status Enqueue(StreamPtr stream,
|
|
90
90
|
const WritableStreamPriority priority) {
|
|
91
91
|
// Streams waiting for transport flow control MUST not be added to list of
|
|
92
92
|
// writable streams via this API, instead they MUST be added via
|
|
@@ -96,7 +96,7 @@ class WritableStreams {
|
|
|
96
96
|
GRPC_DCHECK(priority !=
|
|
97
97
|
WritableStreamPriority::kWaitForTransportFlowControl);
|
|
98
98
|
StatusFlag status = sender_.UnbufferedImmediateSend(
|
|
99
|
-
StreamIDAndPriority{stream, priority}, /*tokens*/ 1);
|
|
99
|
+
StreamIDAndPriority{std::move(stream), priority}, /*tokens*/ 1);
|
|
100
100
|
GRPC_WRITABLE_STREAMS_DEBUG
|
|
101
101
|
<< "UnbufferedImmediateEnqueue stream with priority "
|
|
102
102
|
<< GetWritableStreamPriorityString(priority) << " status " << status;
|
|
@@ -109,9 +109,10 @@ class WritableStreams {
|
|
|
109
109
|
|
|
110
110
|
// A synchronous function to add a stream id to the transport flow control
|
|
111
111
|
// wait list.
|
|
112
|
-
absl::Status BlockedOnTransportFlowControl(
|
|
112
|
+
absl::Status BlockedOnTransportFlowControl(StreamPtr stream) {
|
|
113
113
|
prioritized_queue_.Push(
|
|
114
|
-
stream,
|
|
114
|
+
std::move(stream),
|
|
115
|
+
WritableStreamPriority::kWaitForTransportFlowControl);
|
|
115
116
|
GRPC_WRITABLE_STREAMS_DEBUG << "Enqueuing a stream with priority "
|
|
116
117
|
"kWaitForTransportFlowControl ";
|
|
117
118
|
return absl::OkStatus();
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
//
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2026 gRPC authors.
|
|
4
|
+
//
|
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
// you may not use this file except in compliance with the License.
|
|
7
|
+
// You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
// See the License for the specific language governing permissions and
|
|
15
|
+
// limitations under the License.
|
|
16
|
+
//
|
|
17
|
+
//
|
|
18
|
+
|
|
19
|
+
#include "src/core/ext/transport/chttp2/transport/write_cycle.h"
|
|
20
|
+
|
|
21
|
+
#include <grpc/support/port_platform.h>
|
|
22
|
+
|
|
23
|
+
#include <string>
|
|
24
|
+
|
|
25
|
+
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
|
26
|
+
#include "src/core/ext/transport/chttp2/transport/http2_settings.h"
|
|
27
|
+
#include "src/core/lib/transport/promise_endpoint.h"
|
|
28
|
+
#include "absl/container/inlined_vector.h"
|
|
29
|
+
#include "absl/strings/str_cat.h"
|
|
30
|
+
|
|
31
|
+
namespace grpc_core {
|
|
32
|
+
namespace http2 {
|
|
33
|
+
|
|
34
|
+
// WriteQuota
|
|
35
|
+
|
|
36
|
+
std::string WriteQuota::DebugString() const {
|
|
37
|
+
return absl::StrCat("WriteQuota{target=", target_write_size_,
|
|
38
|
+
", consumed=", bytes_consumed_, "}");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// WriteBufferTracker
|
|
42
|
+
std::string WriteBufferTracker::DebugString() const {
|
|
43
|
+
return absl::StrCat(
|
|
44
|
+
"WriteBufferTracker{regular_frames_count=", regular_frames_.size(),
|
|
45
|
+
", urgent_frames_count=", urgent_frames_.size(),
|
|
46
|
+
", is_first_write=", is_first_write_, "}");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// WriteCycle
|
|
50
|
+
|
|
51
|
+
absl::InlinedVector<Http2Frame, WriteBufferTracker::kInlinedRegularFramesSize>&
|
|
52
|
+
WriteCycle::TestOnlyRegularFrames() {
|
|
53
|
+
return write_buffer_tracker_.TestOnlyRegularFrames();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
absl::InlinedVector<Http2Frame, WriteBufferTracker::kInlinedUrgentFramesSize>&
|
|
57
|
+
WriteCycle::TestOnlyUrgentFrames() {
|
|
58
|
+
return write_buffer_tracker_.TestOnlyUrgentFrames();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
std::string WriteCycle::DebugString() const {
|
|
62
|
+
return absl::StrCat("WriteCycle{quota=", write_quota_.DebugString(),
|
|
63
|
+
", tracker=", write_buffer_tracker_.DebugString(), "}");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// TransportWriteContext
|
|
67
|
+
|
|
68
|
+
std::string TransportWriteContext::DebugString() const {
|
|
69
|
+
return absl::StrCat("TransportWriteContext{is_first_write=", is_first_write_,
|
|
70
|
+
"} ",
|
|
71
|
+
write_cycle_ ? write_cycle_->DebugString() : "null");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
PromiseEndpoint::WriteArgs TransportWriteContext::GetWriteArgs(
|
|
75
|
+
const Http2Settings& peer_settings) {
|
|
76
|
+
PromiseEndpoint::WriteArgs args;
|
|
77
|
+
int max_frame_size = peer_settings.preferred_receive_crypto_message_size();
|
|
78
|
+
if (max_frame_size == 0) {
|
|
79
|
+
max_frame_size = INT_MAX;
|
|
80
|
+
}
|
|
81
|
+
args.set_max_frame_size(max_frame_size);
|
|
82
|
+
return args;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
} // namespace http2
|
|
86
|
+
} // namespace grpc_core
|