grpc 1.75.0 → 1.78.1
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 +24 -5
- data/include/grpc/credentials.h +27 -6
- data/include/grpc/event_engine/memory_allocator.h +2 -0
- data/include/grpc/event_engine/memory_request.h +2 -0
- data/include/grpc/impl/channel_arg_names.h +5 -0
- data/include/grpc/support/metrics.h +7 -1
- data/src/core/call/call_filters.cc +5 -5
- data/src/core/call/call_filters.h +211 -37
- data/src/core/call/call_spine.cc +1 -1
- data/src/core/call/call_spine.h +54 -32
- data/src/core/call/channelz_context.h +30 -0
- data/src/core/call/client_call.cc +49 -10
- data/src/core/call/client_call.h +6 -3
- data/src/core/call/filter_fusion.h +9 -9
- data/src/core/call/interception_chain.h +7 -6
- data/src/core/call/metadata_batch.cc +49 -55
- data/src/core/call/metadata_batch.h +10 -9
- data/src/core/call/metadata_info.cc +1 -1
- data/src/core/call/parsed_metadata.h +2 -2
- data/src/core/call/request_buffer.cc +1 -1
- data/src/core/call/security_context.cc +2 -2
- data/src/core/call/security_context.h +1 -1
- data/src/core/call/server_call.cc +5 -5
- data/src/core/call/server_call.h +6 -4
- data/src/core/call/simple_slice_based_metadata.h +1 -1
- data/src/core/call/status_util.cc +1 -1
- data/src/core/channelz/channel_trace.cc +1 -1
- data/src/core/channelz/channel_trace.h +3 -3
- data/src/core/channelz/channelz.cc +25 -29
- data/src/core/channelz/channelz.h +73 -22
- data/src/core/channelz/channelz_registry.cc +2 -2
- data/src/core/channelz/channelz_registry.h +53 -2
- data/src/core/channelz/property_list.cc +18 -0
- data/src/core/channelz/property_list.h +15 -4
- data/src/core/channelz/text_encode.cc +66 -0
- data/src/core/channelz/text_encode.h +29 -0
- data/src/core/channelz/v2tov1/convert.cc +17 -6
- data/src/core/channelz/v2tov1/legacy_api.cc +18 -12
- data/src/core/channelz/v2tov1/property_list.cc +2 -1
- data/src/core/channelz/ztrace_collector.h +260 -87
- data/src/core/client_channel/backup_poller.cc +7 -8
- data/src/core/client_channel/buffered_call.cc +140 -0
- data/src/core/client_channel/buffered_call.h +104 -0
- data/src/core/client_channel/client_channel.cc +144 -84
- data/src/core/client_channel/client_channel.h +8 -11
- data/src/core/client_channel/client_channel_factory.h +1 -1
- data/src/core/client_channel/client_channel_filter.cc +424 -686
- data/src/core/client_channel/client_channel_filter.h +57 -150
- data/src/core/client_channel/client_channel_internal.h +8 -5
- data/src/core/client_channel/client_channel_service_config.cc +43 -3
- data/src/core/client_channel/client_channel_service_config.h +12 -1
- data/src/core/client_channel/config_selector.h +5 -5
- data/src/core/client_channel/connector.h +2 -0
- data/src/core/client_channel/dynamic_filters.cc +5 -5
- data/src/core/client_channel/global_subchannel_pool.cc +0 -37
- data/src/core/client_channel/global_subchannel_pool.h +1 -28
- data/src/core/client_channel/lb_metadata.h +1 -1
- data/src/core/client_channel/load_balanced_call_destination.cc +10 -12
- data/src/core/client_channel/load_balanced_call_destination.h +1 -1
- data/src/core/client_channel/local_subchannel_pool.cc +4 -4
- data/src/core/client_channel/retry_filter.cc +2 -2
- data/src/core/client_channel/retry_filter.h +3 -3
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +11 -12
- data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
- data/src/core/client_channel/retry_service_config.cc +3 -3
- data/src/core/client_channel/retry_service_config.h +1 -1
- data/src/core/client_channel/subchannel.cc +114 -25
- data/src/core/client_channel/subchannel.h +24 -8
- data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
- data/src/core/client_channel/subchannel_pool_interface.h +1 -1
- data/src/core/client_channel/subchannel_stream_client.cc +5 -5
- data/src/core/client_channel/subchannel_stream_client.h +3 -3
- data/src/core/config/config_vars.cc +38 -3
- data/src/core/config/config_vars.h +26 -0
- data/src/core/config/core_configuration.cc +5 -5
- data/src/core/config/core_configuration.h +8 -8
- data/src/core/config/load_config.cc +13 -1
- data/src/core/config/load_config.h +2 -0
- data/src/core/credentials/call/call_credentials.h +4 -4
- data/src/core/credentials/call/call_creds_registry.h +1 -1
- data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
- data/src/core/credentials/call/call_creds_util.cc +7 -6
- data/src/core/credentials/call/composite/composite_call_credentials.cc +6 -6
- data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
- data/src/core/credentials/call/external/aws_external_account_credentials.cc +9 -9
- data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
- data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
- data/src/core/credentials/call/external/external_account_credentials.h +1 -1
- data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
- data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
- data/src/core/credentials/call/external/url_external_account_credentials.cc +7 -7
- data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
- data/src/core/credentials/call/iam/iam_credentials.cc +6 -6
- data/src/core/credentials/call/iam/iam_credentials.h +1 -1
- data/src/core/credentials/call/json_util.cc +1 -1
- data/src/core/credentials/call/jwt/json_token.cc +7 -7
- data/src/core/credentials/call/jwt/jwt_credentials.cc +5 -5
- data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
- data/src/core/credentials/call/jwt/jwt_verifier.cc +19 -18
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
- data/src/core/credentials/call/jwt_util.cc +3 -3
- data/src/core/credentials/call/jwt_util.h +1 -1
- data/src/core/credentials/call/oauth2/oauth2_credentials.cc +49 -72
- data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
- data/src/core/credentials/call/plugin/plugin_credentials.cc +6 -6
- data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
- data/src/core/credentials/transport/alts/alts_credentials.cc +5 -5
- data/src/core/credentials/transport/alts/alts_security_connector.cc +17 -15
- data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
- data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +23 -3
- data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
- data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
- data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
- data/src/core/credentials/transport/channel_creds_registry.h +1 -1
- data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
- data/src/core/credentials/transport/composite/composite_channel_credentials.cc +7 -7
- data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
- data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
- data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
- data/src/core/credentials/transport/fake/fake_security_connector.cc +7 -7
- data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +83 -39
- data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
- data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
- data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
- data/src/core/credentials/transport/local/local_security_connector.cc +13 -13
- data/src/core/credentials/transport/security_connector.cc +6 -6
- data/src/core/credentials/transport/security_connector.h +2 -2
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +13 -13
- data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -8
- data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
- data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
- data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -25
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +8 -8
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -5
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +4 -4
- data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +18 -18
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
- data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
- data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
- data/src/core/credentials/transport/tls/ssl_utils.cc +18 -13
- data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
- data/src/core/credentials/transport/tls/tls_credentials.cc +3 -3
- data/src/core/credentials/transport/tls/tls_security_connector.cc +15 -15
- data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
- data/src/core/credentials/transport/transport_credentials.cc +3 -3
- data/src/core/credentials/transport/transport_credentials.h +4 -4
- data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
- data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +6 -4
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
- data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
- data/src/core/ext/filters/http/client_authority_filter.h +4 -1
- data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +11 -11
- data/src/core/ext/filters/http/message_compress/compression_filter.h +24 -5
- data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
- data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
- data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
- data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
- data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +14 -14
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +58 -44
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +25 -24
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +306 -148
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -7
- data/src/core/ext/transport/chttp2/transport/flow_control.h +223 -83
- data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +105 -0
- data/src/core/ext/transport/chttp2/transport/frame.cc +175 -27
- data/src/core/ext/transport/chttp2/transport/frame.h +58 -10
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
- data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +194 -54
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +5 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +34 -34
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +6 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1475 -632
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +384 -373
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -5
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +417 -0
- data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +337 -30
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +196 -21
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +172 -72
- data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
- data/src/core/ext/transport/chttp2/transport/internal.h +31 -19
- data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
- data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +30 -21
- data/src/core/ext/transport/chttp2/transport/parsing.cc +25 -23
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +70 -28
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +63 -23
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
- data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
- data/src/core/ext/transport/chttp2/transport/stream.h +287 -0
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +476 -208
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.h +57 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
- data/src/core/ext/transport/chttp2/transport/writable_streams.h +202 -84
- data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
- data/src/core/ext/transport/inproc/inproc_transport.cc +9 -3
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +11 -8
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
- data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
- data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
- data/src/core/filter/auth/auth_filters.h +7 -1
- data/src/core/filter/auth/client_auth_filter.cc +2 -2
- data/src/core/filter/auth/server_auth_filter.cc +5 -5
- data/src/core/filter/blackboard.h +2 -2
- data/src/core/filter/filter_args.h +40 -2
- data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
- data/src/core/handshaker/handshaker.cc +8 -8
- data/src/core/handshaker/handshaker.h +2 -2
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +12 -12
- data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
- data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
- data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
- data/src/core/handshaker/proxy_mapper.h +1 -1
- data/src/core/handshaker/proxy_mapper_registry.h +1 -1
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -6
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +38 -15
- data/src/core/handshaker/security/secure_endpoint.cc +31 -11
- data/src/core/handshaker/security/security_handshaker.cc +11 -8
- data/src/core/handshaker/security/security_handshaker.h +1 -1
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +6 -6
- data/src/core/lib/address_utils/parse_address.cc +5 -5
- data/src/core/lib/address_utils/parse_address.h +2 -2
- data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
- data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
- data/src/core/lib/channel/channel_args.cc +1 -1
- data/src/core/lib/channel/channel_args.h +2 -2
- data/src/core/lib/channel/channel_stack.cc +29 -25
- data/src/core/lib/channel/channel_stack.h +8 -3
- data/src/core/lib/channel/channel_stack_builder.cc +8 -4
- data/src/core/lib/channel/channel_stack_builder.h +10 -9
- data/src/core/lib/channel/channel_stack_builder_impl.cc +8 -13
- data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +4 -4
- data/src/core/lib/channel/promise_based_filter.cc +132 -72
- data/src/core/lib/channel/promise_based_filter.h +39 -23
- data/src/core/lib/compression/compression_internal.cc +6 -6
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/message_compress.cc +8 -8
- data/src/core/lib/debug/trace.cc +2 -5
- data/src/core/lib/debug/trace.h +10 -0
- data/src/core/lib/debug/trace_flags.cc +2 -2
- data/src/core/lib/debug/trace_flags.h +1 -1
- data/src/core/lib/event_engine/ares_resolver.cc +30 -28
- data/src/core/lib/event_engine/ares_resolver.h +4 -4
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -3
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +4 -4
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +3 -3
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
- data/src/core/lib/event_engine/default_event_engine.cc +1 -1
- data/src/core/lib/event_engine/event_engine.cc +1 -1
- data/src/core/lib/event_engine/extensions/channelz.h +3 -3
- data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
- data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
- data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
- data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
- data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -12
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -15
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
- data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +28 -27
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +17 -17
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +175 -177
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +40 -61
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +11 -7
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +9 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +2 -2
- data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
- data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -4
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
- data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
- data/src/core/lib/event_engine/resolved_address.cc +3 -3
- data/src/core/lib/event_engine/shim.cc +8 -11
- data/src/core/lib/event_engine/shim.h +2 -1
- data/src/core/lib/event_engine/slice.cc +2 -2
- data/src/core/lib/event_engine/tcp_socket_utils.cc +15 -15
- data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
- data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +11 -11
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
- data/src/core/lib/event_engine/utils.cc +3 -3
- data/src/core/lib/event_engine/utils.h +1 -1
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +32 -32
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
- data/src/core/lib/event_engine/windows/iocp.cc +11 -11
- data/src/core/lib/event_engine/windows/iocp.h +1 -1
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
- data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
- data/src/core/lib/event_engine/windows/win_socket.h +2 -2
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +16 -16
- data/src/core/lib/event_engine/windows/windows_engine.cc +20 -18
- data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
- data/src/core/lib/event_engine/windows/windows_listener.cc +10 -10
- data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
- data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
- data/src/core/lib/experiments/config.cc +4 -4
- data/src/core/lib/experiments/experiments.cc +255 -42
- data/src/core/lib/experiments/experiments.h +105 -21
- data/src/core/lib/iomgr/buffer_list.cc +1 -1
- data/src/core/lib/iomgr/call_combiner.cc +4 -4
- data/src/core/lib/iomgr/call_combiner.h +2 -2
- data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
- data/src/core/lib/iomgr/closure.h +2 -2
- data/src/core/lib/iomgr/combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -7
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +6 -6
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +16 -15
- data/src/core/lib/iomgr/error.cc +1 -1
- data/src/core/lib/iomgr/error.h +2 -2
- data/src/core/lib/iomgr/error_cfstream.cc +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
- data/src/core/lib/iomgr/ev_poll_posix.cc +14 -14
- data/src/core/lib/iomgr/ev_posix.cc +3 -3
- data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
- data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +10 -9
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +3 -3
- data/src/core/lib/iomgr/exec_ctx.h +1 -1
- data/src/core/lib/iomgr/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
- data/src/core/lib/iomgr/iocp_windows.cc +9 -9
- data/src/core/lib/iomgr/iomgr.cc +1 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
- data/src/core/lib/iomgr/lockfree_event.cc +3 -3
- data/src/core/lib/iomgr/polling_entity.cc +4 -4
- data/src/core/lib/iomgr/resolve_address.cc +1 -1
- data/src/core/lib/iomgr/resolve_address.h +2 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -4
- data/src/core/lib/iomgr/socket_windows.cc +6 -6
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +7 -7
- data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
- data/src/core/lib/iomgr/tcp_posix.cc +47 -47
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +7 -0
- data/src/core/lib/iomgr/tcp_server_posix.cc +62 -31
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +4 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +70 -31
- data/src/core/lib/iomgr/tcp_windows.cc +8 -8
- data/src/core/lib/iomgr/timer_generic.cc +5 -5
- data/src/core/lib/iomgr/timer_manager.cc +3 -3
- data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
- data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
- data/src/core/lib/iomgr/vsock.cc +1 -1
- data/src/core/lib/iomgr/vsock.h +1 -1
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
- data/src/core/lib/promise/activity.cc +3 -3
- data/src/core/lib/promise/activity.h +11 -10
- data/src/core/lib/promise/all_ok.h +3 -3
- data/src/core/lib/promise/arena_promise.h +47 -6
- data/src/core/lib/promise/context.h +3 -3
- data/src/core/lib/promise/detail/join_state.h +10 -10
- data/src/core/lib/promise/detail/promise_factory.h +1 -1
- data/src/core/lib/promise/detail/promise_like.h +1 -1
- data/src/core/lib/promise/detail/seq_state.h +16 -16
- data/src/core/lib/promise/detail/status.h +2 -2
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
- data/src/core/lib/promise/for_each.h +8 -8
- data/src/core/lib/promise/if.h +1 -1
- data/src/core/lib/promise/inter_activity_latch.h +3 -3
- data/src/core/lib/promise/inter_activity_mutex.h +1 -1
- data/src/core/lib/promise/interceptor_list.h +5 -5
- data/src/core/lib/promise/latch.h +9 -9
- data/src/core/lib/promise/loop.h +2 -2
- data/src/core/lib/promise/map.h +2 -2
- data/src/core/lib/promise/mpsc.cc +31 -30
- data/src/core/lib/promise/mpsc.h +2 -2
- data/src/core/lib/promise/observable.h +6 -6
- data/src/core/lib/promise/party.cc +43 -30
- data/src/core/lib/promise/party.h +27 -23
- data/src/core/lib/promise/pipe.h +31 -17
- data/src/core/lib/promise/poll.h +6 -5
- data/src/core/lib/promise/promise.h +2 -4
- data/src/core/lib/promise/sleep.cc +3 -1
- data/src/core/lib/promise/sleep.h +1 -1
- data/src/core/lib/promise/status_flag.h +8 -8
- data/src/core/lib/promise/try_join.h +5 -5
- data/src/core/lib/promise/try_seq.h +5 -5
- data/src/core/lib/promise/wait_set.h +2 -2
- data/src/core/lib/resource_quota/api.cc +1 -1
- data/src/core/lib/resource_quota/arena.cc +1 -1
- data/src/core/lib/resource_quota/arena.h +15 -2
- data/src/core/lib/resource_quota/connection_quota.cc +9 -7
- data/src/core/lib/resource_quota/connection_quota.h +1 -1
- data/src/core/lib/resource_quota/memory_quota.cc +48 -27
- data/src/core/lib/resource_quota/memory_quota.h +56 -20
- data/src/core/lib/resource_quota/periodic_update.h +1 -1
- data/src/core/lib/resource_quota/resource_quota.cc +8 -0
- data/src/core/lib/resource_quota/resource_quota.h +2 -1
- data/src/core/lib/resource_quota/stream_quota.cc +22 -0
- data/src/core/lib/resource_quota/stream_quota.h +31 -0
- data/src/core/lib/resource_quota/telemetry.h +55 -0
- data/src/core/lib/resource_quota/thread_quota.cc +2 -2
- data/src/core/lib/resource_quota/thread_quota.h +1 -1
- data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
- data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
- data/src/core/lib/security/authorization/audit_logging.cc +7 -7
- data/src/core/lib/security/authorization/audit_logging.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
- data/src/core/lib/security/authorization/evaluate_args.h +1 -1
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
- data/src/core/lib/security/authorization/matchers.cc +2 -2
- data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
- data/src/core/lib/slice/percent_encoding.cc +1 -1
- data/src/core/lib/slice/slice.cc +1 -1
- data/src/core/lib/slice/slice.h +2 -2
- data/src/core/lib/slice/slice_buffer.cc +1 -1
- data/src/core/lib/slice/slice_internal.h +1 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
- data/src/core/lib/surface/call.cc +58 -28
- data/src/core/lib/surface/call.h +13 -6
- data/src/core/lib/surface/call_log_batch.cc +2 -2
- data/src/core/lib/surface/call_utils.cc +7 -7
- data/src/core/lib/surface/call_utils.h +85 -20
- data/src/core/lib/surface/channel.cc +6 -5
- data/src/core/lib/surface/channel.h +13 -3
- data/src/core/lib/surface/channel_create.cc +12 -8
- data/src/core/lib/surface/channel_create.h +1 -1
- data/src/core/lib/surface/channel_init.cc +84 -27
- data/src/core/lib/surface/channel_init.h +30 -13
- data/src/core/lib/surface/completion_queue.cc +21 -20
- data/src/core/lib/surface/completion_queue_factory.cc +7 -7
- data/src/core/lib/surface/connection_context.h +45 -2
- data/src/core/lib/surface/filter_stack_call.cc +25 -31
- data/src/core/lib/surface/filter_stack_call.h +6 -7
- data/src/core/lib/surface/init.cc +4 -4
- data/src/core/lib/surface/lame_client.cc +2 -2
- data/src/core/lib/surface/lame_client.h +3 -3
- data/src/core/lib/surface/legacy_channel.cc +10 -10
- data/src/core/lib/surface/legacy_channel.h +1 -1
- data/src/core/lib/surface/validate_metadata.cc +2 -2
- data/src/core/lib/surface/validate_metadata.h +3 -3
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.h +5 -5
- data/src/core/lib/transport/connectivity_state.cc +1 -1
- data/src/core/lib/transport/connectivity_state.h +2 -2
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/promise_endpoint.cc +4 -4
- data/src/core/lib/transport/promise_endpoint.h +11 -11
- data/src/core/lib/transport/timeout_encoding.cc +4 -4
- data/src/core/lib/transport/transport.cc +3 -3
- data/src/core/lib/transport/transport.h +62 -4
- data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +2 -2
- data/src/core/load_balancing/address_filtering.cc +1 -1
- data/src/core/load_balancing/address_filtering.h +2 -2
- data/src/core/load_balancing/backend_metric_parser.cc +1 -1
- data/src/core/load_balancing/backend_metric_parser.h +1 -1
- data/src/core/load_balancing/child_policy_handler.cc +8 -8
- data/src/core/load_balancing/child_policy_handler.h +2 -2
- data/src/core/load_balancing/delegating_helper.h +2 -2
- data/src/core/load_balancing/endpoint_list.cc +6 -6
- data/src/core/load_balancing/endpoint_list.h +2 -2
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
- data/src/core/load_balancing/grpclb/grpclb.cc +37 -48
- data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
- data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
- data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
- data/src/core/load_balancing/health_check_client.cc +13 -9
- data/src/core/load_balancing/health_check_client_internal.h +5 -5
- data/src/core/load_balancing/lb_policy.h +11 -8
- data/src/core/load_balancing/lb_policy_factory.h +2 -2
- data/src/core/load_balancing/lb_policy_registry.cc +3 -3
- data/src/core/load_balancing/lb_policy_registry.h +2 -2
- data/src/core/load_balancing/oob_backend_metric.cc +11 -7
- data/src/core/load_balancing/oob_backend_metric_internal.h +4 -4
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +9 -17
- data/src/core/load_balancing/pick_first/pick_first.cc +62 -32
- data/src/core/load_balancing/priority/priority.cc +29 -30
- data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -11
- data/src/core/load_balancing/rls/rls.cc +23 -23
- data/src/core/load_balancing/round_robin/round_robin.cc +16 -16
- data/src/core/load_balancing/subchannel_interface.h +2 -2
- data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +42 -41
- data/src/core/load_balancing/weighted_target/weighted_target.cc +14 -14
- data/src/core/load_balancing/xds/cds.cc +81 -37
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +24 -41
- data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
- data/src/core/load_balancing/xds/xds_override_host.cc +14 -14
- data/src/core/load_balancing/xds/xds_override_host.h +1 -1
- data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +35 -35
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +16 -16
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
- data/src/core/resolver/dns/dns_resolver_plugin.cc +8 -5
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +10 -10
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
- data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
- data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
- data/src/core/resolver/endpoint_addresses.cc +6 -6
- data/src/core/resolver/endpoint_addresses.h +4 -1
- data/src/core/resolver/fake/fake_resolver.cc +3 -3
- data/src/core/resolver/fake/fake_resolver.h +3 -3
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +46 -59
- data/src/core/resolver/polling_resolver.cc +8 -8
- data/src/core/resolver/polling_resolver.h +1 -1
- data/src/core/resolver/resolver.h +2 -2
- data/src/core/resolver/resolver_factory.h +2 -2
- data/src/core/resolver/resolver_registry.cc +5 -4
- data/src/core/resolver/resolver_registry.h +1 -1
- data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
- data/src/core/resolver/xds/xds_config.cc +1 -1
- data/src/core/resolver/xds/xds_config.h +3 -3
- data/src/core/resolver/xds/xds_dependency_manager.cc +7 -7
- data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
- data/src/core/resolver/xds/xds_resolver.cc +25 -22
- data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
- data/src/core/server/add_port.cc +2 -2
- data/src/core/server/server.cc +47 -43
- data/src/core/server/server.h +8 -7
- data/src/core/server/server_call_tracer_filter.cc +1 -1
- data/src/core/server/server_call_tracer_filter.h +9 -5
- data/src/core/server/server_config_selector.h +2 -2
- data/src/core/server/server_config_selector_filter.cc +5 -5
- data/src/core/server/xds_channel_stack_modifier.cc +3 -2
- data/src/core/server/xds_channel_stack_modifier.h +1 -1
- data/src/core/server/xds_server_config_fetcher.cc +19 -18
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
- data/src/core/service_config/service_config_impl.cc +3 -3
- data/src/core/service_config/service_config_impl.h +4 -4
- data/src/core/service_config/service_config_parser.h +1 -1
- data/src/core/telemetry/call_tracer.cc +39 -49
- data/src/core/telemetry/call_tracer.h +201 -24
- data/src/core/telemetry/default_tcp_tracer.h +3 -3
- data/src/core/telemetry/histogram.h +205 -0
- data/src/core/telemetry/instrument.cc +999 -0
- data/src/core/telemetry/instrument.h +1105 -0
- data/src/core/telemetry/metrics.cc +15 -5
- data/src/core/telemetry/metrics.h +36 -5
- data/src/core/telemetry/stats.h +2 -2
- data/src/core/telemetry/stats_data.cc +1 -20
- data/src/core/telemetry/stats_data.h +2 -21
- data/src/core/transport/auth_context.cc +3 -3
- data/src/core/transport/auth_context.h +2 -1
- data/src/core/transport/auth_context_comparator_registry.h +1 -1
- data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +81 -48
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +46 -36
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +4 -4
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +4 -4
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +16 -8
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +18 -5
- data/src/core/tsi/fake_transport_security.cc +6 -5
- data/src/core/tsi/local_transport_security.cc +1 -1
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +10 -10
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +4 -4
- data/src/core/tsi/ssl_transport_security.cc +30 -30
- data/src/core/tsi/ssl_transport_security.h +1 -1
- data/src/core/tsi/ssl_transport_security_utils.cc +10 -10
- data/src/core/tsi/ssl_transport_security_utils.h +2 -2
- data/src/core/tsi/transport_security_grpc.cc +8 -0
- data/src/core/tsi/transport_security_grpc.h +15 -0
- data/src/core/util/alloc.cc +1 -1
- data/src/core/util/backoff.h +1 -1
- data/src/core/util/chunked_vector.h +4 -4
- data/src/core/util/crash.h +1 -1
- data/src/core/util/dual_ref_counted.h +2 -2
- data/src/core/util/event_log.cc +2 -2
- data/src/core/util/event_log.h +3 -3
- data/src/core/util/gcp_metadata_query.cc +7 -7
- data/src/core/util/gcp_metadata_query.h +2 -2
- data/src/core/util/glob.cc +2 -0
- data/src/core/util/grpc_check.cc +24 -0
- data/src/core/util/grpc_check.h +103 -0
- data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
- data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
- data/src/core/util/http_client/format_request.cc +1 -1
- data/src/core/util/http_client/httpcli.cc +6 -6
- data/src/core/util/http_client/httpcli.h +4 -4
- data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
- data/src/core/util/http_client/parser.cc +4 -4
- data/src/core/util/json/json_channel_args.h +1 -1
- data/src/core/util/json/json_object_loader.h +6 -6
- data/src/core/util/json/json_reader.cc +2 -2
- data/src/core/util/json/json_reader.h +1 -1
- data/src/core/util/json/json_util.h +3 -3
- data/src/core/util/json/json_writer.cc +1 -1
- data/src/core/util/latent_see.cc +45 -24
- data/src/core/util/latent_see.h +199 -28
- data/src/core/util/linux/cpu.cc +1 -1
- data/src/core/util/load_file.cc +1 -1
- data/src/core/util/load_file.h +1 -1
- data/src/core/util/log.cc +3 -3
- data/src/core/util/lru_cache.h +4 -4
- data/src/core/util/matchers.h +1 -1
- data/src/core/util/memory_usage.h +17 -1
- data/src/core/util/mpscq.h +1 -1
- data/src/core/util/notification.h +1 -1
- data/src/core/util/posix/cpu.cc +1 -1
- data/src/core/util/posix/directory_reader.cc +3 -2
- data/src/core/util/posix/stat.cc +2 -2
- data/src/core/util/posix/sync.cc +24 -24
- data/src/core/util/posix/thd.cc +2 -2
- data/src/core/util/posix/tmpfile.cc +2 -2
- data/src/core/util/postmortem_emit.cc +52 -0
- data/src/core/util/postmortem_emit.h +30 -0
- data/src/core/util/ref_counted.h +2 -2
- data/src/core/util/ref_counted_ptr.h +6 -1
- data/src/core/util/ref_counted_string.h +1 -1
- data/src/core/util/single_set_ptr.h +3 -1
- data/src/core/util/status_helper.cc +8 -8
- data/src/core/util/status_helper.h +1 -1
- data/src/core/util/string.cc +2 -2
- data/src/core/util/sync_abseil.cc +1 -1
- data/src/core/util/table.h +1 -1
- data/src/core/util/time.cc +1 -1
- data/src/core/util/time_precise.cc +1 -1
- data/src/core/util/trie_lookup.h +170 -0
- data/src/core/util/unique_ptr_with_bitset.h +5 -5
- data/src/core/util/unique_type_name.h +1 -1
- data/src/core/util/upb_utils.h +6 -1
- data/src/core/util/validation_errors.cc +2 -2
- data/src/core/util/validation_errors.h +2 -3
- data/src/core/util/wait_for_single_owner.h +2 -2
- data/src/core/util/windows/directory_reader.cc +1 -1
- data/src/core/util/windows/stat.cc +2 -2
- data/src/core/util/windows/thd.cc +2 -2
- data/src/core/util/windows/time.cc +1 -1
- data/src/core/util/work_serializer.cc +3 -3
- data/src/core/util/work_serializer.h +2 -2
- data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
- data/src/core/xds/grpc/certificate_provider_store.h +2 -2
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
- data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
- data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -3
- data/src/core/xds/grpc/xds_certificate_provider.cc +4 -4
- data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
- data/src/core/xds/grpc/xds_client_grpc.cc +39 -20
- data/src/core/xds/grpc/xds_client_grpc.h +6 -3
- data/src/core/xds/grpc/xds_cluster.cc +2 -2
- data/src/core/xds/grpc/xds_cluster.h +1 -1
- data/src/core/xds/grpc/xds_cluster_parser.cc +7 -7
- data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +4 -4
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
- data/src/core/xds/grpc/xds_common_types.cc +1 -1
- data/src/core/xds/grpc/xds_common_types.h +1 -1
- data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
- data/src/core/xds/grpc/xds_endpoint.h +2 -2
- data/src/core/xds/grpc/xds_endpoint_parser.cc +7 -7
- data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
- data/src/core/xds/grpc/xds_health_status.cc +1 -1
- data/src/core/xds/grpc/xds_health_status.h +1 -1
- data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
- data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
- data/src/core/xds/grpc/xds_http_filter.h +3 -3
- data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
- data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
- data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
- data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
- data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
- data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
- data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
- data/src/core/xds/grpc/xds_listener.cc +2 -2
- data/src/core/xds/grpc/xds_listener_parser.cc +9 -9
- data/src/core/xds/grpc/xds_listener_parser.h +1 -1
- data/src/core/xds/grpc/xds_matcher.cc +277 -0
- data/src/core/xds/grpc/xds_matcher.h +432 -0
- data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
- data/src/core/xds/grpc/xds_matcher_action.h +48 -0
- data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
- data/src/core/xds/grpc/xds_matcher_context.h +46 -0
- data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
- data/src/core/xds/grpc/xds_matcher_input.h +105 -0
- data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
- data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
- data/src/core/xds/grpc/xds_metadata.cc +4 -3
- data/src/core/xds/grpc/xds_metadata.h +3 -3
- data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
- data/src/core/xds/grpc/xds_route_config.cc +3 -3
- data/src/core/xds/grpc/xds_route_config_parser.cc +14 -14
- data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
- data/src/core/xds/grpc/xds_routing.cc +6 -6
- data/src/core/xds/grpc/xds_routing.h +2 -2
- data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
- data/src/core/xds/grpc/xds_transport_grpc.cc +11 -11
- data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
- data/src/core/xds/xds_client/lrs_client.cc +9 -9
- data/src/core/xds/xds_client/lrs_client.h +4 -4
- data/src/core/xds/xds_client/xds_api.h +1 -1
- data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
- data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
- data/src/core/xds/xds_client/xds_client.cc +17 -17
- data/src/core/xds/xds_client/xds_client.h +5 -5
- data/src/core/xds/xds_client/xds_locality.h +2 -2
- data/src/core/xds/xds_client/xds_resource_type.h +2 -2
- data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
- data/src/core/xds/xds_client/xds_transport.h +2 -2
- data/src/ruby/ext/grpc/extconf.rb +14 -12
- data/src/ruby/ext/grpc/rb_call.c +0 -1
- data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
- data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
- data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
- data/src/ruby/lib/grpc/grpc.rb +7 -9
- data/src/ruby/lib/grpc/version.rb +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
- data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
- data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
- metadata +67 -8
|
@@ -19,12 +19,35 @@
|
|
|
19
19
|
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_DATA_QUEUE_H
|
|
20
20
|
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_DATA_QUEUE_H
|
|
21
21
|
|
|
22
|
+
#include <grpc/support/port_platform.h>
|
|
23
|
+
|
|
24
|
+
#include <algorithm>
|
|
25
|
+
#include <cstddef>
|
|
26
|
+
#include <cstdint>
|
|
27
|
+
#include <limits>
|
|
28
|
+
#include <optional>
|
|
22
29
|
#include <queue>
|
|
30
|
+
#include <string>
|
|
31
|
+
#include <utility>
|
|
32
|
+
#include <variant>
|
|
33
|
+
#include <vector>
|
|
23
34
|
|
|
24
|
-
#include "
|
|
25
|
-
#include "
|
|
35
|
+
#include "src/core/call/message.h"
|
|
36
|
+
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
|
26
37
|
#include "src/core/ext/transport/chttp2/transport/header_assembler.h"
|
|
38
|
+
#include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
|
|
39
|
+
#include "src/core/ext/transport/chttp2/transport/http2_status.h"
|
|
27
40
|
#include "src/core/ext/transport/chttp2/transport/message_assembler.h"
|
|
41
|
+
#include "src/core/ext/transport/chttp2/transport/transport_common.h"
|
|
42
|
+
#include "src/core/lib/promise/activity.h"
|
|
43
|
+
#include "src/core/lib/promise/context.h"
|
|
44
|
+
#include "src/core/lib/promise/poll.h"
|
|
45
|
+
#include "src/core/lib/slice/slice_buffer.h"
|
|
46
|
+
#include "src/core/util/grpc_check.h"
|
|
47
|
+
#include "src/core/util/ref_counted.h"
|
|
48
|
+
#include "src/core/util/sync.h"
|
|
49
|
+
#include "absl/log/log.h"
|
|
50
|
+
#include "absl/status/status.h"
|
|
28
51
|
|
|
29
52
|
namespace grpc_core {
|
|
30
53
|
namespace http2 {
|
|
@@ -36,11 +59,6 @@ namespace http2 {
|
|
|
36
59
|
template <typename T>
|
|
37
60
|
class SimpleQueue {
|
|
38
61
|
public:
|
|
39
|
-
struct EnqueueResult {
|
|
40
|
-
absl::Status status;
|
|
41
|
-
bool became_non_empty;
|
|
42
|
-
};
|
|
43
|
-
|
|
44
62
|
explicit SimpleQueue(const uint32_t max_tokens) : max_tokens_(max_tokens) {}
|
|
45
63
|
SimpleQueue(SimpleQueue&& rhs) = delete;
|
|
46
64
|
SimpleQueue& operator=(SimpleQueue&& rhs) = delete;
|
|
@@ -54,10 +72,14 @@ class SimpleQueue {
|
|
|
54
72
|
// with tokens = 0. Enqueues with tokens = 0 are primarily for sending
|
|
55
73
|
// metadata as flow control does not apply to them. This function is NOT
|
|
56
74
|
// thread safe.
|
|
57
|
-
|
|
75
|
+
Poll<bool> Enqueue(T& data, const uint32_t tokens) {
|
|
58
76
|
return PollEnqueue(data, tokens);
|
|
59
77
|
}
|
|
60
78
|
|
|
79
|
+
absl::StatusOr<bool> ImmediateEnqueue(T data, const uint32_t tokens) {
|
|
80
|
+
return ImmediateEnqueueInternal(std::move(data), tokens);
|
|
81
|
+
}
|
|
82
|
+
|
|
61
83
|
// Sync function to dequeue the next entry. Returns nullopt if the queue is
|
|
62
84
|
// empty or if the front of the queue has more tokens than
|
|
63
85
|
// allowed_dequeue_tokens. When allow_oversized_dequeue parameter is set to
|
|
@@ -77,10 +99,17 @@ class SimpleQueue {
|
|
|
77
99
|
}
|
|
78
100
|
|
|
79
101
|
// Returns true if the queue is empty. This function is NOT thread safe.
|
|
80
|
-
bool
|
|
102
|
+
bool IsEmpty() const { return queue_.empty(); }
|
|
103
|
+
// Clears the queue. This function is NOT thread safe.
|
|
104
|
+
void Clear() { std::queue<Entry>().swap(queue_); }
|
|
105
|
+
|
|
106
|
+
inline std::optional<uint32_t> GetNextEntryTokens() const {
|
|
107
|
+
return queue_.empty() ? std::nullopt
|
|
108
|
+
: std::make_optional(queue_.front().tokens);
|
|
109
|
+
}
|
|
81
110
|
|
|
82
111
|
private:
|
|
83
|
-
Poll<
|
|
112
|
+
Poll<bool> PollEnqueue(T& data, const uint32_t tokens) {
|
|
84
113
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueueing data. Data tokens: " << tokens;
|
|
85
114
|
const uint32_t max_tokens_consumed_threshold =
|
|
86
115
|
max_tokens_ >= tokens ? max_tokens_ - tokens : 0;
|
|
@@ -91,8 +120,7 @@ class SimpleQueue {
|
|
|
91
120
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
92
121
|
<< "Enqueue successful. Data tokens: " << tokens
|
|
93
122
|
<< " Current tokens consumed: " << tokens_consumed_;
|
|
94
|
-
return
|
|
95
|
-
/*became_non_empty=*/queue_.size() == 1};
|
|
123
|
+
return /*became_non_empty=*/(queue_.size() == 1);
|
|
96
124
|
}
|
|
97
125
|
|
|
98
126
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
@@ -103,6 +131,21 @@ class SimpleQueue {
|
|
|
103
131
|
return Pending{};
|
|
104
132
|
}
|
|
105
133
|
|
|
134
|
+
inline absl::StatusOr<bool> ImmediateEnqueueInternal(T data,
|
|
135
|
+
const uint32_t tokens) {
|
|
136
|
+
GRPC_DCHECK_LE(tokens_consumed_,
|
|
137
|
+
std::numeric_limits<uint32_t>::max() - tokens);
|
|
138
|
+
if (tokens_consumed_ > std::numeric_limits<uint32_t>::max() - tokens) {
|
|
139
|
+
return absl::InternalError("Tokens consumed overflowed.");
|
|
140
|
+
}
|
|
141
|
+
tokens_consumed_ += tokens;
|
|
142
|
+
queue_.emplace(Entry{std::move(data), tokens});
|
|
143
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
144
|
+
<< "Immediate enqueue successful. Data tokens: " << tokens
|
|
145
|
+
<< " Current tokens consumed: " << tokens_consumed_;
|
|
146
|
+
return /*became_non_empty*/ (queue_.size() == 1);
|
|
147
|
+
}
|
|
148
|
+
|
|
106
149
|
std::optional<T> DequeueInternal(const uint32_t allowed_dequeue_tokens,
|
|
107
150
|
const bool allow_oversized_dequeue) {
|
|
108
151
|
if (queue_.empty() || (queue_.front().tokens > allowed_dequeue_tokens &&
|
|
@@ -133,8 +176,6 @@ class SimpleQueue {
|
|
|
133
176
|
return std::move(entry.data);
|
|
134
177
|
}
|
|
135
178
|
|
|
136
|
-
bool IsEmpty() const { return queue_.empty(); }
|
|
137
|
-
|
|
138
179
|
struct Entry {
|
|
139
180
|
T data;
|
|
140
181
|
uint32_t tokens;
|
|
@@ -148,10 +189,10 @@ class SimpleQueue {
|
|
|
148
189
|
// exception to this rule: if the sender tries to enqueue an item when the
|
|
149
190
|
// queue has 0 tokens, the enqueue will always go through regardless of the
|
|
150
191
|
// number of tokens.
|
|
151
|
-
|
|
192
|
+
const uint64_t max_tokens_;
|
|
152
193
|
// The number of tokens that have been enqueued in the queue but not yet
|
|
153
194
|
// dequeued.
|
|
154
|
-
|
|
195
|
+
uint64_t tokens_consumed_ = 0;
|
|
155
196
|
Waker waker_;
|
|
156
197
|
};
|
|
157
198
|
|
|
@@ -161,15 +202,12 @@ class SimpleQueue {
|
|
|
161
202
|
template <typename MetadataHandle>
|
|
162
203
|
class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
163
204
|
public:
|
|
164
|
-
explicit StreamDataQueue(const bool is_client, const uint32_t
|
|
165
|
-
|
|
166
|
-
: stream_id_(stream_id),
|
|
205
|
+
explicit StreamDataQueue(const bool is_client, const uint32_t queue_size)
|
|
206
|
+
: stream_id_(0),
|
|
167
207
|
is_client_(is_client),
|
|
168
208
|
queue_(queue_size),
|
|
169
|
-
initial_metadata_disassembler_(
|
|
170
|
-
|
|
171
|
-
trailing_metadata_disassembler_(stream_id,
|
|
172
|
-
/*is_trailing_metadata=*/true) {};
|
|
209
|
+
initial_metadata_disassembler_(/*is_trailing_metadata=*/false),
|
|
210
|
+
trailing_metadata_disassembler_(/*is_trailing_metadata=*/true) {};
|
|
173
211
|
~StreamDataQueue() = default;
|
|
174
212
|
|
|
175
213
|
StreamDataQueue(StreamDataQueue&& rhs) = delete;
|
|
@@ -177,6 +215,17 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
177
215
|
StreamDataQueue(const StreamDataQueue&) = delete;
|
|
178
216
|
StreamDataQueue& operator=(const StreamDataQueue&) = delete;
|
|
179
217
|
|
|
218
|
+
void SetStreamId(const uint32_t stream_id,
|
|
219
|
+
const bool allow_true_binary_metadata_peer) {
|
|
220
|
+
GRPC_DCHECK_EQ(stream_id_, 0u);
|
|
221
|
+
GRPC_DCHECK_NE(stream_id, 0u);
|
|
222
|
+
stream_id_ = stream_id;
|
|
223
|
+
initial_metadata_disassembler_.Initialize(stream_id,
|
|
224
|
+
allow_true_binary_metadata_peer);
|
|
225
|
+
trailing_metadata_disassembler_.Initialize(stream_id,
|
|
226
|
+
allow_true_binary_metadata_peer);
|
|
227
|
+
}
|
|
228
|
+
|
|
180
229
|
//////////////////////////////////////////////////////////////////////////////
|
|
181
230
|
// Enqueue Helpers
|
|
182
231
|
// These enqueue helpers are based on following assumptions:
|
|
@@ -194,66 +243,66 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
194
243
|
// end_stream set. If the stream needs to be half closed, the client should
|
|
195
244
|
// enqueue a half close message.
|
|
196
245
|
|
|
246
|
+
struct StreamWritabilityUpdate {
|
|
247
|
+
bool became_writable;
|
|
248
|
+
WritableStreamPriority priority;
|
|
249
|
+
};
|
|
250
|
+
|
|
197
251
|
// Enqueue Initial Metadata.
|
|
198
252
|
// 1. MUST be called at most once.
|
|
199
253
|
// 2. This MUST be called before any messages are enqueued.
|
|
200
254
|
// 3. MUST not be called after trailing metadata is enqueued.
|
|
201
255
|
// 4. This function is thread safe.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
256
|
+
absl::StatusOr<StreamWritabilityUpdate> EnqueueInitialMetadata(
|
|
257
|
+
MetadataHandle&& metadata) {
|
|
258
|
+
MutexLock lock(&mu_);
|
|
259
|
+
GRPC_DCHECK(!is_initial_metadata_queued_);
|
|
260
|
+
GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
|
|
261
|
+
GRPC_DCHECK(metadata != nullptr);
|
|
262
|
+
GRPC_DCHECK(reset_stream_state_ == RstStreamState::kNotQueued);
|
|
207
263
|
|
|
208
264
|
is_initial_metadata_queued_ = true;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
DCHECK(result.value().became_non_empty);
|
|
220
|
-
return self->UpdateWritableStateLocked(
|
|
221
|
-
result.value().became_non_empty);
|
|
222
|
-
}
|
|
223
|
-
return result.value().status;
|
|
224
|
-
}
|
|
225
|
-
return Pending{};
|
|
226
|
-
};
|
|
265
|
+
absl::StatusOr<bool> result = queue_.ImmediateEnqueue(
|
|
266
|
+
QueueEntry{InitialMetadataType{std::move(metadata)}}, /*tokens=*/0);
|
|
267
|
+
if (GPR_UNLIKELY(!result.ok())) {
|
|
268
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
269
|
+
<< "Immediate enqueueing initial metadata failed with status: "
|
|
270
|
+
<< result.status();
|
|
271
|
+
return result.status();
|
|
272
|
+
}
|
|
273
|
+
return UpdateWritableStateAndPriorityEnqueueLocked(
|
|
274
|
+
/*became_non_empty*/ result.value(), WritableStreamPriority::kDefault);
|
|
227
275
|
}
|
|
228
276
|
|
|
229
277
|
// Enqueue Trailing Metadata.
|
|
230
278
|
// 1. MUST be called at most once.
|
|
231
279
|
// 2. MUST be called only for a server.
|
|
232
280
|
// 3. This function is thread safe.
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
281
|
+
absl::StatusOr<StreamWritabilityUpdate> EnqueueTrailingMetadata(
|
|
282
|
+
MetadataHandle&& metadata) {
|
|
283
|
+
MutexLock lock(&mu_);
|
|
284
|
+
GRPC_DCHECK(metadata != nullptr);
|
|
285
|
+
GRPC_DCHECK(!is_client_);
|
|
286
|
+
GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
|
|
287
|
+
|
|
288
|
+
if (GPR_UNLIKELY(IsEnqueueClosed())) {
|
|
289
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed.";
|
|
290
|
+
return StreamWritabilityUpdate{/*became_writable=*/false,
|
|
291
|
+
WritableStreamPriority::kStreamClosed};
|
|
292
|
+
}
|
|
238
293
|
|
|
239
294
|
is_trailing_metadata_or_half_close_queued_ = true;
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
result.value().became_non_empty);
|
|
252
|
-
}
|
|
253
|
-
return result.value().status;
|
|
254
|
-
}
|
|
255
|
-
return Pending{};
|
|
256
|
-
};
|
|
295
|
+
absl::StatusOr<bool> result = queue_.ImmediateEnqueue(
|
|
296
|
+
QueueEntry{TrailingMetadataType{std::move(metadata)}}, /*tokens=*/0);
|
|
297
|
+
if (GPR_UNLIKELY(!result.ok())) {
|
|
298
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
299
|
+
<< "Immediate enqueueing trailing metadata failed with status: "
|
|
300
|
+
<< result.status();
|
|
301
|
+
return result.status();
|
|
302
|
+
}
|
|
303
|
+
return UpdateWritableStateAndPriorityEnqueueLocked(
|
|
304
|
+
/*became_non_empty*/ result.value(),
|
|
305
|
+
WritableStreamPriority::kStreamClosed);
|
|
257
306
|
}
|
|
258
307
|
|
|
259
308
|
// Returns a promise that resolves when the message is enqueued. There may be
|
|
@@ -261,30 +310,33 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
261
310
|
// 1. MUST be called after initial metadata is enqueued.
|
|
262
311
|
// 2. MUST not be called after trailing metadata is enqueued.
|
|
263
312
|
// 3. This function is thread safe.
|
|
264
|
-
auto EnqueueMessage(MessageHandle message) {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
313
|
+
auto EnqueueMessage(MessageHandle&& message) {
|
|
314
|
+
GRPC_DCHECK(is_initial_metadata_queued_);
|
|
315
|
+
GRPC_DCHECK(message != nullptr);
|
|
316
|
+
GRPC_DCHECK_LE(
|
|
317
|
+
message->payload()->Length(),
|
|
318
|
+
std::numeric_limits<uint32_t>::max() - kGrpcHeaderSizeInBytes);
|
|
319
|
+
GRPC_DCHECK(!is_trailing_metadata_or_half_close_queued_);
|
|
271
320
|
|
|
272
321
|
const uint32_t tokens =
|
|
273
322
|
message->payload()->Length() + kGrpcHeaderSizeInBytes;
|
|
274
323
|
return [self = this->Ref(), entry = QueueEntry{std::move(message)},
|
|
275
|
-
tokens]() mutable -> Poll<absl::StatusOr<
|
|
324
|
+
tokens]() mutable -> Poll<absl::StatusOr<StreamWritabilityUpdate>> {
|
|
276
325
|
MutexLock lock(&self->mu_);
|
|
277
|
-
|
|
326
|
+
if (GPR_UNLIKELY(self->IsEnqueueClosed())) {
|
|
327
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed";
|
|
328
|
+
return StreamWritabilityUpdate{/*became_writable=*/false,
|
|
329
|
+
WritableStreamPriority::kStreamClosed};
|
|
330
|
+
}
|
|
331
|
+
Poll<bool> result = self->queue_.Enqueue(entry, tokens);
|
|
278
332
|
if (result.ready()) {
|
|
279
333
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
280
|
-
<< "Enqueued message
|
|
281
|
-
<< "
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
287
|
-
return result.value().status;
|
|
334
|
+
<< "Enqueued message with tokens: " << tokens
|
|
335
|
+
<< "became_non_empty: " << result.value();
|
|
336
|
+
|
|
337
|
+
return self->UpdateWritableStateAndPriorityEnqueueLocked(
|
|
338
|
+
/*became_non_empty=*/result.value(),
|
|
339
|
+
WritableStreamPriority::kDefault);
|
|
288
340
|
}
|
|
289
341
|
return Pending{};
|
|
290
342
|
};
|
|
@@ -294,66 +346,97 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
294
346
|
// 1. MUST be called at most once.
|
|
295
347
|
// 2. MUST be called only for a client.
|
|
296
348
|
// 3. This function is thread safe.
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
349
|
+
absl::StatusOr<StreamWritabilityUpdate> EnqueueHalfClosed() {
|
|
350
|
+
MutexLock lock(&mu_);
|
|
351
|
+
GRPC_DCHECK(is_initial_metadata_queued_);
|
|
352
|
+
GRPC_DCHECK(is_client_);
|
|
353
|
+
|
|
354
|
+
if (GPR_UNLIKELY(IsEnqueueClosed() ||
|
|
355
|
+
is_trailing_metadata_or_half_close_queued_)) {
|
|
356
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
357
|
+
<< "Enqueue closed or trailing metadata/half close queued "
|
|
358
|
+
<< " is_trailing_metadata_or_half_close_queued_ = "
|
|
359
|
+
<< is_trailing_metadata_or_half_close_queued_;
|
|
360
|
+
return StreamWritabilityUpdate{/*became_writable=*/false,
|
|
361
|
+
WritableStreamPriority::kStreamClosed};
|
|
362
|
+
}
|
|
302
363
|
|
|
303
364
|
is_trailing_metadata_or_half_close_queued_ = true;
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
return result.value().status;
|
|
317
|
-
}
|
|
318
|
-
return Pending{};
|
|
319
|
-
};
|
|
365
|
+
absl::StatusOr<bool> result =
|
|
366
|
+
queue_.ImmediateEnqueue(QueueEntry{HalfClosed{}}, /*tokens=*/0);
|
|
367
|
+
if (GPR_UNLIKELY(!result.ok())) {
|
|
368
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
369
|
+
<< "Immediate enqueueing half closed failed with status: "
|
|
370
|
+
<< result.status();
|
|
371
|
+
return result.status();
|
|
372
|
+
}
|
|
373
|
+
return UpdateWritableStateAndPriorityEnqueueLocked(
|
|
374
|
+
/*became_non_empty*/ result.value(),
|
|
375
|
+
WritableStreamPriority::kStreamClosed);
|
|
320
376
|
}
|
|
321
377
|
|
|
322
378
|
// Enqueue Reset Stream.
|
|
323
379
|
// 1. MUST be called at most once.
|
|
324
380
|
// 3. This function is thread safe.
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
381
|
+
absl::StatusOr<StreamWritabilityUpdate> EnqueueResetStream(
|
|
382
|
+
const uint32_t error_code) {
|
|
383
|
+
MutexLock lock(&mu_);
|
|
384
|
+
GRPC_DCHECK(is_initial_metadata_queued_);
|
|
385
|
+
|
|
386
|
+
// This can happen when the transport tries to close the stream and the
|
|
387
|
+
// stream is cancelled from the call stack.
|
|
388
|
+
if (GPR_UNLIKELY(IsEnqueueClosed())) {
|
|
389
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG << "Enqueue closed";
|
|
390
|
+
return StreamWritabilityUpdate{/*became_writable=*/false,
|
|
391
|
+
WritableStreamPriority::kStreamClosed};
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
395
|
+
<< "Immediate enqueueing reset stream with error code: " << error_code;
|
|
396
|
+
reset_stream_state_ = RstStreamState::kQueued;
|
|
397
|
+
reset_stream_error_code_ = error_code;
|
|
398
|
+
|
|
399
|
+
// became_non_empty is set to true if the queue is empty because we are not
|
|
400
|
+
// enqueueing reset stream to the queue. In this case, if the queue is
|
|
401
|
+
// empty, enqueuing reset stream to StreamDataQueue will make the stream
|
|
402
|
+
// writable.
|
|
403
|
+
return UpdateWritableStateAndPriorityEnqueueLocked(
|
|
404
|
+
/*became_non_empty*/ queue_.IsEmpty(),
|
|
405
|
+
WritableStreamPriority::kStreamClosed);
|
|
347
406
|
}
|
|
348
407
|
|
|
349
408
|
//////////////////////////////////////////////////////////////////////////////
|
|
350
409
|
// Dequeue Helpers
|
|
351
410
|
|
|
352
|
-
|
|
353
|
-
|
|
411
|
+
static constexpr uint8_t kResetStreamDequeued = 0x1;
|
|
412
|
+
static constexpr uint8_t kHalfCloseDequeued = 0x2;
|
|
413
|
+
static constexpr uint8_t kInitialMetadataDequeued = 0x4;
|
|
414
|
+
|
|
354
415
|
struct DequeueResult {
|
|
355
416
|
std::vector<Http2Frame> frames;
|
|
356
417
|
bool is_writable;
|
|
418
|
+
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
|
+
size_t flow_control_tokens_consumed = 0u;
|
|
423
|
+
// Bitmask of the dequeue flags.
|
|
424
|
+
uint8_t flags = 0u;
|
|
425
|
+
|
|
426
|
+
// Returns true if the reset stream was dequeued.
|
|
427
|
+
bool ResetStreamDequeued() const {
|
|
428
|
+
return (flags & kResetStreamDequeued) != 0u;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Returns true if the half close was dequeued.
|
|
432
|
+
bool HalfCloseDequeued() const {
|
|
433
|
+
return (flags & kHalfCloseDequeued) != 0u;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Returns true if the initial metadata was dequeued.
|
|
437
|
+
bool InitialMetadataDequeued() const {
|
|
438
|
+
return (flags & kInitialMetadataDequeued) != 0u;
|
|
439
|
+
}
|
|
357
440
|
};
|
|
358
441
|
|
|
359
442
|
// TODO(akshitpatel) : [PH2][P4] : Measure the performance of this function
|
|
@@ -375,16 +458,29 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
375
458
|
// the partial first message (sum of payload of all returned frames <=
|
|
376
459
|
// max_fc_tokens).
|
|
377
460
|
// This function is thread safe.
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
461
|
+
DequeueResult DequeueFrames(const uint32_t max_fc_tokens,
|
|
462
|
+
const uint32_t max_frame_length,
|
|
463
|
+
const uint32_t stream_fc_tokens,
|
|
464
|
+
HPackCompressor& encoder,
|
|
465
|
+
const bool can_send_reset_stream) {
|
|
381
466
|
MutexLock lock(&mu_);
|
|
382
|
-
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
467
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
468
|
+
<< "Dequeueing frames. Max fc tokens: " << max_fc_tokens
|
|
469
|
+
<< " Max frame length: " << max_frame_length
|
|
470
|
+
<< " Message disassembler buffered length: "
|
|
471
|
+
<< message_disassembler_.GetBufferedLength()
|
|
472
|
+
<< " Can send reset stream: " << can_send_reset_stream
|
|
473
|
+
<< " Reset stream state: " << static_cast<uint8_t>(reset_stream_state_);
|
|
474
|
+
GRPC_DCHECK_GT(stream_id_, 0u)
|
|
475
|
+
<< "Stream id must be set before dequeueing frames.";
|
|
476
|
+
|
|
477
|
+
// If a reset stream is queued, we do not want to send any more frames. Any
|
|
478
|
+
// metadata enqueued has not reached HPACK encoder, so it is safe to drop
|
|
479
|
+
// all frames.
|
|
480
|
+
if (std::optional<DequeueResult> result =
|
|
481
|
+
HandleResetStreamLocked(can_send_reset_stream)) {
|
|
482
|
+
return std::move(*result);
|
|
483
|
+
}
|
|
388
484
|
|
|
389
485
|
HandleDequeue handle_dequeue(max_fc_tokens, max_frame_length, encoder,
|
|
390
486
|
*this);
|
|
@@ -403,18 +499,41 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
403
499
|
std::visit(handle_dequeue, std::move(*queue_entry));
|
|
404
500
|
}
|
|
405
501
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
502
|
+
GRPC_DCHECK_GE(stream_fc_tokens,
|
|
503
|
+
handle_dequeue.GetFlowControlTokensConsumed());
|
|
504
|
+
|
|
505
|
+
return DequeueResult{
|
|
506
|
+
handle_dequeue.GetFrames(),
|
|
507
|
+
UpdateWritableStateDequeueLocked(
|
|
508
|
+
stream_fc_tokens - handle_dequeue.GetFlowControlTokensConsumed()),
|
|
509
|
+
priority_,
|
|
510
|
+
handle_dequeue.GetTotalBytesConsumed(),
|
|
511
|
+
handle_dequeue.GetFlowControlTokensConsumed(),
|
|
512
|
+
handle_dequeue.GetDequeueFlags()};
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// TODO(tjagtap) : [PH2][P1][FlowControl] : Call this while processing
|
|
516
|
+
// window update frame.
|
|
517
|
+
// Needs to be invoked when the peer sends stream flow control window update.
|
|
518
|
+
// stream_fc_tokens represents the stream flow control (delta) window +
|
|
519
|
+
// intial_window_size.
|
|
520
|
+
StreamWritabilityUpdate ReceivedFlowControlWindowUpdate(
|
|
521
|
+
const uint32_t stream_fc_tokens) {
|
|
522
|
+
MutexLock lock(&mu_);
|
|
523
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
524
|
+
<< "Received flow control window update. stream_fc_tokens: "
|
|
525
|
+
<< stream_fc_tokens;
|
|
526
|
+
const bool old_writable_state = is_writable_;
|
|
527
|
+
const bool new_writable_state =
|
|
528
|
+
UpdateWritableStateDequeueLocked(stream_fc_tokens);
|
|
529
|
+
return {/*became_writable=*/(!old_writable_state && new_writable_state),
|
|
530
|
+
priority_};
|
|
412
531
|
}
|
|
413
532
|
|
|
414
533
|
// Returns true if the queue is empty. This function is thread safe.
|
|
415
534
|
bool TestOnlyIsEmpty() {
|
|
416
535
|
MutexLock lock(&mu_);
|
|
417
|
-
return queue_.
|
|
536
|
+
return queue_.IsEmpty();
|
|
418
537
|
}
|
|
419
538
|
|
|
420
539
|
private:
|
|
@@ -425,26 +544,24 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
425
544
|
MetadataHandle metadata;
|
|
426
545
|
};
|
|
427
546
|
struct HalfClosed {};
|
|
428
|
-
struct ResetStream {
|
|
429
|
-
uint32_t error_code;
|
|
430
|
-
};
|
|
431
547
|
using QueueEntry = std::variant<InitialMetadataType, TrailingMetadataType,
|
|
432
|
-
MessageHandle, HalfClosed
|
|
548
|
+
MessageHandle, HalfClosed>;
|
|
433
549
|
|
|
434
550
|
class HandleDequeue {
|
|
435
551
|
public:
|
|
436
|
-
HandleDequeue(uint32_t max_tokens, uint32_t max_frame_length,
|
|
552
|
+
HandleDequeue(const uint32_t max_tokens, const uint32_t max_frame_length,
|
|
437
553
|
HPackCompressor& encoder, StreamDataQueue& queue)
|
|
438
554
|
: queue_(queue),
|
|
439
555
|
max_frame_length_(max_frame_length),
|
|
440
|
-
|
|
441
|
-
|
|
556
|
+
max_tokens_available_(max_tokens),
|
|
557
|
+
flow_control_tokens_consumed_(0),
|
|
442
558
|
encoder_(encoder) {}
|
|
443
559
|
|
|
444
560
|
void operator()(InitialMetadataType initial_metadata) {
|
|
445
561
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing initial metadata for sending";
|
|
446
562
|
queue_.initial_metadata_disassembler_.PrepareForSending(
|
|
447
563
|
std::move(initial_metadata.metadata), encoder_);
|
|
564
|
+
dequeue_flags_ |= kInitialMetadataDequeued;
|
|
448
565
|
MaybeAppendInitialMetadataFrames();
|
|
449
566
|
}
|
|
450
567
|
|
|
@@ -462,13 +579,7 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
462
579
|
|
|
463
580
|
void operator()(GRPC_UNUSED HalfClosed half_closed) {
|
|
464
581
|
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing end of stream for sending";
|
|
465
|
-
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
void operator()(ResetStream reset_stream) {
|
|
469
|
-
GRPC_STREAM_DATA_QUEUE_DEBUG << "Preparing reset stream for sending";
|
|
470
|
-
is_reset_stream_ = true;
|
|
471
|
-
error_code_ = reset_stream.error_code;
|
|
582
|
+
dequeue_flags_ |= kHalfCloseDequeued;
|
|
472
583
|
}
|
|
473
584
|
|
|
474
585
|
std::vector<Http2Frame> GetFrames() {
|
|
@@ -483,117 +594,274 @@ class StreamDataQueue : public RefCounted<StreamDataQueue<MetadataHandle>> {
|
|
|
483
594
|
MaybeAppendMessageFrames();
|
|
484
595
|
MaybeAppendEndOfStreamFrame();
|
|
485
596
|
MaybeAppendTrailingMetadataFrames();
|
|
486
|
-
MaybeAppendResetStreamFrame();
|
|
487
597
|
return std::move(frames_);
|
|
488
598
|
}
|
|
489
599
|
|
|
600
|
+
size_t GetTotalBytesConsumed() const { return total_bytes_consumed_; }
|
|
601
|
+
size_t GetFlowControlTokensConsumed() const {
|
|
602
|
+
return flow_control_tokens_consumed_;
|
|
603
|
+
}
|
|
604
|
+
uint8_t GetDequeueFlags() const { return dequeue_flags_; }
|
|
605
|
+
|
|
490
606
|
private:
|
|
491
607
|
inline void MaybeAppendInitialMetadataFrames() {
|
|
492
608
|
while (queue_.initial_metadata_disassembler_.HasMoreData()) {
|
|
493
|
-
|
|
494
|
-
|
|
609
|
+
GRPC_DCHECK(!(dequeue_flags_ & kHalfCloseDequeued));
|
|
610
|
+
GRPC_DCHECK(!(dequeue_flags_ & kResetStreamDequeued));
|
|
495
611
|
// TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
|
|
496
612
|
// HasMoreData() should be enough.
|
|
497
613
|
bool is_end_headers = false;
|
|
498
|
-
|
|
614
|
+
AppendFrame(queue_.initial_metadata_disassembler_.GetNextFrame(
|
|
499
615
|
max_frame_length_, is_end_headers));
|
|
500
616
|
}
|
|
501
617
|
}
|
|
502
618
|
|
|
503
619
|
inline void MaybeAppendTrailingMetadataFrames() {
|
|
504
620
|
while (queue_.trailing_metadata_disassembler_.HasMoreData()) {
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
621
|
+
GRPC_DCHECK(!(dequeue_flags_ & kHalfCloseDequeued));
|
|
622
|
+
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
623
|
+
GRPC_DCHECK_EQ(
|
|
624
|
+
queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
509
625
|
// TODO(akshitpatel) : [PH2][P2] : I do not think we need this.
|
|
510
626
|
// HasMoreData() should be enough.
|
|
511
627
|
bool is_end_headers = false;
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
max_frame_length_, is_end_headers));
|
|
628
|
+
AppendFrame(queue_.trailing_metadata_disassembler_.GetNextFrame(
|
|
629
|
+
max_frame_length_, is_end_headers));
|
|
515
630
|
}
|
|
516
631
|
}
|
|
517
632
|
|
|
518
633
|
inline void MaybeAppendEndOfStreamFrame() {
|
|
519
|
-
if (
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
634
|
+
if (dequeue_flags_ & kHalfCloseDequeued) {
|
|
635
|
+
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
636
|
+
GRPC_DCHECK_EQ(
|
|
637
|
+
queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
638
|
+
GRPC_DCHECK_EQ(
|
|
639
|
+
queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
640
|
+
AppendFrame(Http2DataFrame{/*stream_id=*/queue_.stream_id_,
|
|
641
|
+
/*end_stream=*/true,
|
|
642
|
+
/*payload=*/SliceBuffer()});
|
|
528
643
|
}
|
|
529
644
|
}
|
|
530
645
|
|
|
531
646
|
inline void MaybeAppendMessageFrames() {
|
|
532
647
|
while (queue_.message_disassembler_.GetBufferedLength() > 0 &&
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
648
|
+
(max_tokens_available_ - flow_control_tokens_consumed_) > 0) {
|
|
649
|
+
GRPC_DCHECK_EQ(
|
|
650
|
+
queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
536
651
|
Http2DataFrame frame = queue_.message_disassembler_.GenerateNextFrame(
|
|
537
652
|
queue_.stream_id_,
|
|
538
|
-
std::min(
|
|
539
|
-
|
|
653
|
+
std::min(max_tokens_available_ - flow_control_tokens_consumed_,
|
|
654
|
+
max_frame_length_));
|
|
655
|
+
flow_control_tokens_consumed_ += frame.payload.Length();
|
|
540
656
|
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
541
657
|
<< "Appending message frame with length " << frame.payload.Length()
|
|
542
|
-
<< "
|
|
543
|
-
|
|
658
|
+
<< " Consumed tokens: " << flow_control_tokens_consumed_
|
|
659
|
+
<< " Max tokens: " << max_tokens_available_;
|
|
660
|
+
AppendFrame(std::move(frame));
|
|
544
661
|
}
|
|
545
662
|
}
|
|
546
663
|
|
|
547
664
|
inline void MaybeAppendResetStreamFrame() {
|
|
548
|
-
if (
|
|
665
|
+
if (dequeue_flags_ & kResetStreamDequeued) {
|
|
549
666
|
// TODO(akshitpatel) : [PH2][P2] : Consider if we can send reset stream
|
|
550
667
|
// frame without flushing all the messages enqueued until now.
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
Http2RstStreamFrame{queue_.stream_id_, error_code_});
|
|
668
|
+
GRPC_DCHECK_EQ(queue_.message_disassembler_.GetBufferedLength(), 0u);
|
|
669
|
+
GRPC_DCHECK_EQ(
|
|
670
|
+
queue_.initial_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
671
|
+
GRPC_DCHECK_EQ(
|
|
672
|
+
queue_.trailing_metadata_disassembler_.GetBufferedLength(), 0u);
|
|
673
|
+
AppendFrame(Http2RstStreamFrame{queue_.stream_id_, error_code_});
|
|
558
674
|
}
|
|
559
675
|
}
|
|
560
676
|
|
|
677
|
+
inline void AppendFrame(Http2Frame&& frame) {
|
|
678
|
+
total_bytes_consumed_ += GetFrameMemoryUsage(frame);
|
|
679
|
+
frames_.emplace_back(std::move(frame));
|
|
680
|
+
}
|
|
681
|
+
|
|
561
682
|
StreamDataQueue& queue_;
|
|
562
683
|
const uint32_t max_frame_length_;
|
|
563
|
-
const uint32_t
|
|
564
|
-
uint32_t
|
|
565
|
-
bool is_half_closed_ = false;
|
|
566
|
-
bool is_reset_stream_ = false;
|
|
684
|
+
const uint32_t max_tokens_available_;
|
|
685
|
+
uint32_t flow_control_tokens_consumed_;
|
|
567
686
|
uint32_t error_code_ = static_cast<uint32_t>(Http2ErrorCode::kNoError);
|
|
568
687
|
std::vector<Http2Frame> frames_;
|
|
569
688
|
HPackCompressor& encoder_;
|
|
689
|
+
size_t total_bytes_consumed_ = 0u;
|
|
690
|
+
uint8_t dequeue_flags_ = 0u;
|
|
570
691
|
};
|
|
571
692
|
|
|
572
|
-
//
|
|
573
|
-
//
|
|
574
|
-
|
|
693
|
+
// Updates the writable state and priority of the stream. MUST only be called
|
|
694
|
+
// from the enqueue functions.
|
|
695
|
+
// became_non_empty: True if the queue was empty and became non-empty as a
|
|
696
|
+
// result of this enqueue operation.
|
|
697
|
+
// priority: The new priority of the stream after this enqueue operation.
|
|
698
|
+
// Returns the result of the enqueue operation
|
|
699
|
+
//
|
|
700
|
+
// High level flow:
|
|
701
|
+
// Priority is simply updated to the new priority.
|
|
702
|
+
// Writable state is updated as follows:
|
|
703
|
+
// 1. If the stream was not writable before and became non-empty as a result
|
|
704
|
+
// of this enqueue operation, then the stream is marked as writable.
|
|
705
|
+
// 2. If the stream was already writable before, it remains writable.
|
|
706
|
+
// 3. The case where the stream was not writable before and the queue already
|
|
707
|
+
// contained data implies that the stream is blocked on stream flow control
|
|
708
|
+
// tokens. When the transport receives stream flow control window update,
|
|
709
|
+
// the stream is marked as writable.
|
|
710
|
+
// For enqueue operations there is no easy way to query
|
|
711
|
+
// stream_flow_control_tokens. So it is assumed that flow control tokens are
|
|
712
|
+
// always available for an enqueue operation. This can cause a stream to be
|
|
713
|
+
// marked as writable when it is not but this will correct itself in the next
|
|
714
|
+
// dequeue operation (which returns an accurate is_writable).
|
|
715
|
+
StreamWritabilityUpdate UpdateWritableStateAndPriorityEnqueueLocked(
|
|
716
|
+
const bool became_non_empty, const WritableStreamPriority priority)
|
|
575
717
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
|
718
|
+
// Update priority.
|
|
719
|
+
priority_ = priority;
|
|
720
|
+
|
|
721
|
+
// Update writable state.
|
|
576
722
|
if (!is_writable_ && became_non_empty) {
|
|
577
|
-
GRPC_STREAM_DATA_QUEUE_DEBUG << "Stream id: " << stream_id_
|
|
578
|
-
<< " writeable state changed to true";
|
|
579
723
|
is_writable_ = true;
|
|
580
|
-
|
|
724
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
725
|
+
<< "UpdateWritableStateLocked became writable with priority: "
|
|
726
|
+
<< GetWritableStreamPriorityString(priority_);
|
|
727
|
+
return StreamWritabilityUpdate{/*became_writable=*/true, priority_};
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
731
|
+
<< "UpdateWritableStateAndPriorityEnqueueLocked with priority: "
|
|
732
|
+
<< GetWritableStreamPriorityString(priority_)
|
|
733
|
+
<< " is_writable: " << is_writable_;
|
|
734
|
+
return StreamWritabilityUpdate{/*became_writable=*/false, priority_};
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Updates the writable state of the stream. Returns true if the
|
|
738
|
+
// stream became writable.
|
|
739
|
+
// Writable state is updated as follows:
|
|
740
|
+
// 1. If the next message to dequeue is a grpc message, then the stream is
|
|
741
|
+
// writable if and only if we have available stream flow control tokens.
|
|
742
|
+
// 2. If the next message to dequeue is not a grpc message, then the stream is
|
|
743
|
+
// writable if and only if the queue is not empty.
|
|
744
|
+
// Unlike UpdateWritableStateAndPriorityEnqueueLocked, this function the
|
|
745
|
+
// become_writable returned by this function is `accurate` as it considers
|
|
746
|
+
// the whether the stream has bytes to write and the flow control tokens
|
|
747
|
+
// available.
|
|
748
|
+
bool UpdateWritableStateDequeueLocked(
|
|
749
|
+
const uint32_t available_stream_fc_tokens)
|
|
750
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
|
751
|
+
// The stream is writable if the queue is not empty. If the next bytes to
|
|
752
|
+
// write are part of a gRPC message, then check if we have stream flow
|
|
753
|
+
// control tokens.
|
|
754
|
+
is_writable_ = (!queue_.IsEmpty());
|
|
755
|
+
|
|
756
|
+
// Next bytes to write are part of a gRPC message.
|
|
757
|
+
if (message_disassembler_.GetBufferedLength() > 0 ||
|
|
758
|
+
IsNextQueueEntryMessage()) {
|
|
759
|
+
is_writable_ = (available_stream_fc_tokens > 0);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG << "UpdateWritableStateLocked with priority: "
|
|
763
|
+
<< GetWritableStreamPriorityString(priority_)
|
|
764
|
+
<< " is_writable: " << is_writable_;
|
|
765
|
+
return is_writable_;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
inline bool IsNextQueueEntryMessage() const {
|
|
769
|
+
return (!queue_.IsEmpty() && queue_.GetNextEntryTokens().value() > 0);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
// Handles the case where a reset stream is queued.
|
|
773
|
+
// If a reset stream is queued or has been dequeued, this function returns a
|
|
774
|
+
// DequeueResult. Otherwise, it returns std::nullopt.
|
|
775
|
+
// This function must be called with mu_ held.
|
|
776
|
+
std::optional<DequeueResult> HandleResetStreamLocked(
|
|
777
|
+
const bool can_send_reset_stream) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
|
778
|
+
switch (reset_stream_state_) {
|
|
779
|
+
case RstStreamState::kDequeued:
|
|
780
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
781
|
+
<< "Reset stream is already dequeued. Returning empty frames.";
|
|
782
|
+
GRPC_DCHECK(queue_.IsEmpty());
|
|
783
|
+
is_writable_ = false;
|
|
784
|
+
return DequeueResult{
|
|
785
|
+
std::vector<Http2Frame>(), is_writable_, priority_,
|
|
786
|
+
/*total_bytes_consumed=*/0u,
|
|
787
|
+
/*flow_control_tokens_consumed=*/0u, /*flags=*/0u};
|
|
788
|
+
case RstStreamState::kQueued: {
|
|
789
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG
|
|
790
|
+
<< "Reset stream is queued. Skipping all frames (if any) for "
|
|
791
|
+
"dequeuing.";
|
|
792
|
+
is_writable_ = false;
|
|
793
|
+
std::vector<Http2Frame> frames;
|
|
794
|
+
uint8_t flags = 0u;
|
|
795
|
+
if (can_send_reset_stream) {
|
|
796
|
+
frames.emplace_back(
|
|
797
|
+
Http2RstStreamFrame{stream_id_, reset_stream_error_code_});
|
|
798
|
+
flags = kResetStreamDequeued;
|
|
799
|
+
}
|
|
800
|
+
queue_.Clear();
|
|
801
|
+
reset_stream_state_ = RstStreamState::kDequeued;
|
|
802
|
+
return DequeueResult{std::move(frames),
|
|
803
|
+
is_writable_,
|
|
804
|
+
priority_,
|
|
805
|
+
/*total_bytes_consumed=*/0u,
|
|
806
|
+
/*flow_control_tokens_consumed=*/0u,
|
|
807
|
+
flags};
|
|
808
|
+
}
|
|
809
|
+
case RstStreamState::kNotQueued:
|
|
810
|
+
return std::nullopt;
|
|
811
|
+
default:
|
|
812
|
+
GRPC_CHECK(false) << "Invalid reset stream state: "
|
|
813
|
+
<< static_cast<uint8_t>(reset_stream_state_);
|
|
814
|
+
return std::nullopt;
|
|
581
815
|
}
|
|
582
|
-
return false;
|
|
583
816
|
}
|
|
584
817
|
|
|
585
|
-
const
|
|
818
|
+
bool IsEnqueueClosed() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
|
819
|
+
switch (reset_stream_state_) {
|
|
820
|
+
case RstStreamState::kNotQueued:
|
|
821
|
+
return false;
|
|
822
|
+
case RstStreamState::kQueued:
|
|
823
|
+
case RstStreamState::kDequeued:
|
|
824
|
+
// This can happen when the transport tries to close the stream and the
|
|
825
|
+
// stream is cancelled from the call stack.
|
|
826
|
+
GRPC_STREAM_DATA_QUEUE_DEBUG << "Reset stream already queued.";
|
|
827
|
+
return true;
|
|
828
|
+
default:
|
|
829
|
+
GRPC_CHECK(false) << "Invalid reset stream state: "
|
|
830
|
+
<< static_cast<uint8_t>(reset_stream_state_);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
GPR_UNREACHABLE_CODE(return false);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
uint32_t stream_id_;
|
|
837
|
+
|
|
838
|
+
// This is only used for DCHECKs. Not actually used for any business logic.
|
|
586
839
|
const bool is_client_;
|
|
587
840
|
|
|
841
|
+
enum class RstStreamState : uint8_t {
|
|
842
|
+
kNotQueued = 0,
|
|
843
|
+
kQueued,
|
|
844
|
+
kDequeued,
|
|
845
|
+
};
|
|
846
|
+
|
|
588
847
|
// Accessed only during enqueue.
|
|
589
848
|
bool is_initial_metadata_queued_ = false;
|
|
590
849
|
bool is_trailing_metadata_or_half_close_queued_ = false;
|
|
591
|
-
bool is_reset_stream_queued_ = false;
|
|
592
850
|
|
|
593
851
|
// Access both during enqueue and dequeue.
|
|
594
852
|
Mutex mu_;
|
|
853
|
+
// This variable tracks whether the stream is writable. 'Writable' represents
|
|
854
|
+
// that the stream has bytes to send and the stream has flow control tokens
|
|
855
|
+
// (if needed) to send them. This variable also has 1-1 correspondence with
|
|
856
|
+
// whether the stream is in the list of writable streams in the transport.
|
|
595
857
|
bool is_writable_ ABSL_GUARDED_BY(mu_) = false;
|
|
858
|
+
RstStreamState reset_stream_state_ ABSL_GUARDED_BY(mu_) =
|
|
859
|
+
RstStreamState::kNotQueued;
|
|
596
860
|
SimpleQueue<QueueEntry> queue_;
|
|
861
|
+
WritableStreamPriority priority_ ABSL_GUARDED_BY(mu_) =
|
|
862
|
+
WritableStreamPriority::kDefault;
|
|
863
|
+
uint32_t reset_stream_error_code_ ABSL_GUARDED_BY(mu_) =
|
|
864
|
+
static_cast<uint32_t>(Http2ErrorCode::kNoError);
|
|
597
865
|
|
|
598
866
|
// Accessed only during dequeue.
|
|
599
867
|
HeaderDisassembler initial_metadata_disassembler_;
|