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,52 +19,75 @@
|
|
|
19
19
|
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_CLIENT_TRANSPORT_H
|
|
20
20
|
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_CLIENT_TRANSPORT_H
|
|
21
21
|
|
|
22
|
+
#include <grpc/event_engine/event_engine.h>
|
|
23
|
+
#include <grpc/grpc.h>
|
|
24
|
+
#include <grpc/support/port_platform.h>
|
|
25
|
+
|
|
26
|
+
#include <cstddef>
|
|
22
27
|
#include <cstdint>
|
|
28
|
+
#include <memory>
|
|
29
|
+
#include <optional>
|
|
30
|
+
#include <string>
|
|
23
31
|
#include <utility>
|
|
32
|
+
#include <vector>
|
|
24
33
|
|
|
25
34
|
#include "src/core/call/call_spine.h"
|
|
35
|
+
#include "src/core/call/metadata.h"
|
|
36
|
+
#include "src/core/channelz/channelz.h"
|
|
37
|
+
#include "src/core/ext/transport/chttp2/transport/flow_control.h"
|
|
26
38
|
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
|
27
|
-
#include "src/core/ext/transport/chttp2/transport/
|
|
39
|
+
#include "src/core/ext/transport/chttp2/transport/goaway.h"
|
|
28
40
|
#include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
|
|
29
41
|
#include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
|
|
30
|
-
#include "src/core/ext/transport/chttp2/transport/
|
|
42
|
+
#include "src/core/ext/transport/chttp2/transport/http2_settings_promises.h"
|
|
31
43
|
#include "src/core/ext/transport/chttp2/transport/http2_status.h"
|
|
32
44
|
#include "src/core/ext/transport/chttp2/transport/http2_transport.h"
|
|
45
|
+
#include "src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h"
|
|
46
|
+
#include "src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h"
|
|
33
47
|
#include "src/core/ext/transport/chttp2/transport/keepalive.h"
|
|
34
|
-
#include "src/core/ext/transport/chttp2/transport/message_assembler.h"
|
|
35
48
|
#include "src/core/ext/transport/chttp2/transport/ping_promise.h"
|
|
49
|
+
#include "src/core/ext/transport/chttp2/transport/stream.h"
|
|
36
50
|
#include "src/core/ext/transport/chttp2/transport/stream_data_queue.h"
|
|
37
51
|
#include "src/core/ext/transport/chttp2/transport/writable_streams.h"
|
|
38
|
-
#include "src/core/lib/
|
|
39
|
-
#include "src/core/lib/
|
|
40
|
-
#include "src/core/lib/
|
|
52
|
+
#include "src/core/lib/channel/channel_args.h"
|
|
53
|
+
#include "src/core/lib/iomgr/closure.h"
|
|
54
|
+
#include "src/core/lib/iomgr/iomgr_fwd.h"
|
|
55
|
+
#include "src/core/lib/promise/activity.h"
|
|
56
|
+
#include "src/core/lib/promise/context.h"
|
|
57
|
+
#include "src/core/lib/promise/if.h"
|
|
58
|
+
#include "src/core/lib/promise/latch.h"
|
|
59
|
+
#include "src/core/lib/promise/map.h"
|
|
41
60
|
#include "src/core/lib/promise/party.h"
|
|
61
|
+
#include "src/core/lib/promise/poll.h"
|
|
62
|
+
#include "src/core/lib/promise/promise.h"
|
|
63
|
+
#include "src/core/lib/promise/race.h"
|
|
64
|
+
#include "src/core/lib/promise/try_seq.h"
|
|
65
|
+
#include "src/core/lib/resource_quota/memory_quota.h"
|
|
66
|
+
#include "src/core/lib/slice/slice.h"
|
|
67
|
+
#include "src/core/lib/slice/slice_buffer.h"
|
|
42
68
|
#include "src/core/lib/transport/connectivity_state.h"
|
|
43
69
|
#include "src/core/lib/transport/promise_endpoint.h"
|
|
44
70
|
#include "src/core/lib/transport/transport.h"
|
|
71
|
+
#include "src/core/util/check_class_size.h"
|
|
72
|
+
#include "src/core/util/debug_location.h"
|
|
73
|
+
#include "src/core/util/grpc_check.h"
|
|
45
74
|
#include "src/core/util/orphanable.h"
|
|
46
75
|
#include "src/core/util/ref_counted_ptr.h"
|
|
47
76
|
#include "src/core/util/sync.h"
|
|
77
|
+
#include "src/core/util/time.h"
|
|
78
|
+
#include "absl/base/thread_annotations.h"
|
|
79
|
+
#include "absl/container/flat_hash_map.h"
|
|
80
|
+
#include "absl/container/flat_hash_set.h"
|
|
81
|
+
#include "absl/functional/any_invocable.h"
|
|
82
|
+
#include "absl/log/log.h"
|
|
83
|
+
#include "absl/status/status.h"
|
|
84
|
+
#include "absl/status/statusor.h"
|
|
85
|
+
#include "absl/strings/string_view.h"
|
|
86
|
+
#include "absl/types/span.h"
|
|
48
87
|
|
|
49
88
|
namespace grpc_core {
|
|
50
89
|
namespace http2 {
|
|
51
90
|
|
|
52
|
-
// All Promise Based HTTP2 Transport TODOs have the tag
|
|
53
|
-
// [PH2][Pn] where n = 0 to 5.
|
|
54
|
-
// This helps to maintain the uniformity for quick lookup and fixing.
|
|
55
|
-
//
|
|
56
|
-
// [PH2][P0] MUST be fixed before the current PR is submitted.
|
|
57
|
-
// [PH2][P1] MUST be fixed before the current sub-project is considered
|
|
58
|
-
// complete.
|
|
59
|
-
// [PH2][P2] MUST be fixed before the current Milestone is considered
|
|
60
|
-
// complete.
|
|
61
|
-
// [PH2][P3] MUST be fixed before Milestone 3 is considered complete.
|
|
62
|
-
// [PH2][P4] Can be fixed after roll out begins. Evaluate these during
|
|
63
|
-
// Milestone 4. Either do the TODOs or delete them.
|
|
64
|
-
// [PH2][P5] This MUST be a separate standalone project.
|
|
65
|
-
// [PH2][EXT] This is a TODO related to a project unrelated to PH2 but happening
|
|
66
|
-
// in parallel.
|
|
67
|
-
|
|
68
91
|
// Http2 Client Transport Spawns Overview
|
|
69
92
|
|
|
70
93
|
// | Promise Spawn | Max Duration | Promise Resolution | Max Spawns |
|
|
@@ -78,22 +101,21 @@ namespace http2 {
|
|
|
78
101
|
// Max Party Slots (Always): 3
|
|
79
102
|
// Max Promise Slots (Worst Case): 4
|
|
80
103
|
|
|
81
|
-
// Experimental :
|
|
82
|
-
// and it is functions. The code will be written iteratively.
|
|
104
|
+
// Experimental : The code will be written iteratively.
|
|
83
105
|
// Do not use or edit any of these functions unless you are
|
|
84
106
|
// familiar with the PH2 project (Moving chttp2 to promises.)
|
|
85
107
|
// TODO(tjagtap) : [PH2][P3] : Update the experimental status of the code before
|
|
86
108
|
// http2 rollout begins.
|
|
87
|
-
class Http2ClientTransport final : public ClientTransport
|
|
88
|
-
|
|
89
|
-
//
|
|
90
|
-
//
|
|
109
|
+
class Http2ClientTransport final : public ClientTransport,
|
|
110
|
+
public channelz::DataSource {
|
|
111
|
+
// TODO(akshitpatel) [PH2][P1] : Functions that need a mutex to be held should
|
|
112
|
+
// have "locked" suffix in function name.
|
|
91
113
|
public:
|
|
92
114
|
Http2ClientTransport(
|
|
93
115
|
PromiseEndpoint endpoint, GRPC_UNUSED const ChannelArgs& channel_args,
|
|
94
116
|
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
|
|
95
117
|
event_engine,
|
|
96
|
-
|
|
118
|
+
absl::AnyInvocable<void(absl::StatusOr<uint32_t>)> on_receive_settings);
|
|
97
119
|
|
|
98
120
|
Http2ClientTransport(const Http2ClientTransport&) = delete;
|
|
99
121
|
Http2ClientTransport& operator=(const Http2ClientTransport&) = delete;
|
|
@@ -120,36 +142,56 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
120
142
|
OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
|
|
121
143
|
void StopConnectivityWatch(ConnectivityStateWatcherInterface* watcher);
|
|
122
144
|
|
|
145
|
+
void StartWatch(RefCountedPtr<StateWatcher> watcher) override;
|
|
146
|
+
void StopWatch(RefCountedPtr<StateWatcher> watcher) override;
|
|
147
|
+
|
|
123
148
|
void Orphan() override;
|
|
124
|
-
void AbortWithError();
|
|
125
149
|
|
|
126
150
|
RefCountedPtr<channelz::SocketNode> GetSocketNode() const override {
|
|
151
|
+
return const_cast<channelz::BaseNode*>(
|
|
152
|
+
channelz::DataSource::channelz_node())
|
|
153
|
+
->RefAsSubclass<channelz::SocketNode>();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
std::unique_ptr<channelz::ZTrace> GetZTrace(absl::string_view name) override {
|
|
157
|
+
if (name == "transport_frames") return ztrace_collector_->MakeZTrace();
|
|
127
158
|
return nullptr;
|
|
128
159
|
}
|
|
129
160
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
GRPC_HTTP2_CLIENT_DLOG
|
|
137
|
-
<< "Http2ClientTransport::TestOnlyEnqueueOutgoingFrame status="
|
|
138
|
-
<< status;
|
|
139
|
-
return (status.ok()) ? absl::OkStatus()
|
|
140
|
-
: absl::InternalError("Failed to enqueue frame");
|
|
141
|
-
}));
|
|
161
|
+
void AddData(channelz::DataSink sink) override;
|
|
162
|
+
void SpawnAddChannelzData(RefCountedPtr<Party> party,
|
|
163
|
+
channelz::DataSink sink);
|
|
164
|
+
|
|
165
|
+
auto TestOnlyTriggerWriteCycle() {
|
|
166
|
+
return Immediate(writable_stream_list_.ForceReadyForWrite());
|
|
142
167
|
}
|
|
143
168
|
|
|
144
169
|
auto TestOnlySendPing(absl::AnyInvocable<void()> on_initiate,
|
|
145
170
|
bool important = false) {
|
|
146
|
-
return ping_manager_
|
|
171
|
+
return ping_manager_->RequestPing(std::move(on_initiate), important);
|
|
147
172
|
}
|
|
148
173
|
|
|
149
174
|
template <typename Factory>
|
|
150
|
-
|
|
151
|
-
|
|
175
|
+
void TestOnlySpawnPromise(absl::string_view name, Factory&& factory) {
|
|
176
|
+
general_party_->Spawn(name, std::forward<Factory>(factory), [](Empty) {});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
int64_t TestOnlyTransportFlowControlWindow() {
|
|
180
|
+
return flow_control_.remote_window();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
int64_t TestOnlyGetStreamFlowControlWindow(const uint32_t stream_id) {
|
|
184
|
+
RefCountedPtr<Stream> stream = LookupStream(stream_id);
|
|
185
|
+
if (stream == nullptr) {
|
|
186
|
+
return -1;
|
|
187
|
+
}
|
|
188
|
+
return stream->flow_control.remote_window_delta();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
bool AreTransportFlowControlTokensAvailable() {
|
|
192
|
+
return flow_control_.remote_window() > 0;
|
|
152
193
|
}
|
|
194
|
+
void SpawnTransportLoops();
|
|
153
195
|
|
|
154
196
|
private:
|
|
155
197
|
// Promise factory for processing each type of frame
|
|
@@ -162,10 +204,7 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
162
204
|
Http2Status ProcessHttp2WindowUpdateFrame(Http2WindowUpdateFrame frame);
|
|
163
205
|
Http2Status ProcessHttp2ContinuationFrame(Http2ContinuationFrame frame);
|
|
164
206
|
Http2Status ProcessHttp2SecurityFrame(Http2SecurityFrame frame);
|
|
165
|
-
Http2Status ProcessMetadata(
|
|
166
|
-
CallHandler& call,
|
|
167
|
-
bool& did_push_initial_metadata,
|
|
168
|
-
bool& did_push_trailing_metadata);
|
|
207
|
+
Http2Status ProcessMetadata(RefCountedPtr<Stream> stream);
|
|
169
208
|
|
|
170
209
|
// Reading from the endpoint.
|
|
171
210
|
|
|
@@ -179,204 +218,89 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
179
218
|
// Returns a promise that will process one HTTP2 frame.
|
|
180
219
|
auto ProcessOneFrame(Http2Frame frame);
|
|
181
220
|
|
|
182
|
-
// Returns a promise that will do the cleanup after the ReadLoop ends.
|
|
183
|
-
auto OnReadLoopEnded();
|
|
184
|
-
|
|
185
221
|
// Writing to the endpoint.
|
|
186
222
|
|
|
187
|
-
//
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
//
|
|
191
|
-
//
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
auto OnWriteLoopEnded();
|
|
223
|
+
// Write time sensitive control frames to the endpoint. Frames sent from here
|
|
224
|
+
// will be GOAWAY, SETTINGS, PING and PING acks, WINDOW_UPDATE and
|
|
225
|
+
// Custom gRPC security frame.
|
|
226
|
+
// These frames are written to the endpoint in a single endpoint write. If any
|
|
227
|
+
// module needs to take action after the write (for cases like spawning
|
|
228
|
+
// timeout promises), they MUST plug the call in the
|
|
229
|
+
// NotifyControlFramesWriteDone.
|
|
230
|
+
auto ProcessAndWriteControlFrames();
|
|
196
231
|
|
|
197
|
-
//
|
|
198
|
-
|
|
199
|
-
// continuation and reset stream frames.
|
|
200
|
-
auto StreamMultiplexerLoop();
|
|
232
|
+
// Notify the control frames modules that the endpoint write is done.
|
|
233
|
+
void NotifyControlFramesWriteDone();
|
|
201
234
|
|
|
202
|
-
// Returns a promise
|
|
203
|
-
//
|
|
204
|
-
auto
|
|
235
|
+
// Returns a promise to keep draining control frames and data frames from all
|
|
236
|
+
// the writable streams and write to the endpoint.
|
|
237
|
+
auto MultiplexerLoop();
|
|
205
238
|
|
|
206
239
|
// Returns a promise to fetch data from the callhandler and pass it further
|
|
207
240
|
// down towards the endpoint.
|
|
208
|
-
auto CallOutboundLoop(CallHandler call_handler,
|
|
209
|
-
InterActivityMutex<uint32_t>::Lock lock,
|
|
241
|
+
auto CallOutboundLoop(CallHandler call_handler, RefCountedPtr<Stream> stream,
|
|
210
242
|
ClientMetadataHandle metadata);
|
|
211
243
|
|
|
212
|
-
//
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return AssertResultType<absl::Status>(Map(
|
|
217
|
-
outgoing_frames_.MakeSender().Send(std::move(frame), 1),
|
|
218
|
-
[self = RefAsSubclass<Http2ClientTransport>()](StatusFlag status) {
|
|
219
|
-
GRPC_HTTP2_CLIENT_DLOG
|
|
220
|
-
<< "Http2ClientTransport::EnqueueOutgoingFrame status=" << status;
|
|
221
|
-
return (status.ok())
|
|
222
|
-
? absl::OkStatus()
|
|
223
|
-
: self->HandleError(Http2Status::AbslConnectionError(
|
|
224
|
-
absl::StatusCode::kInternal,
|
|
225
|
-
"Failed to enqueue frame"));
|
|
226
|
-
}));
|
|
244
|
+
// TODO(akshitpatel) : [PH2][P1] : Make this a synchronous function.
|
|
245
|
+
// Force triggers a transport write cycle
|
|
246
|
+
auto TriggerWriteCycle() {
|
|
247
|
+
return Immediate(writable_stream_list_.ForceReadyForWrite());
|
|
227
248
|
}
|
|
228
249
|
|
|
229
|
-
|
|
230
|
-
|
|
250
|
+
auto FlowControlPeriodicUpdateLoop();
|
|
251
|
+
// TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
|
|
252
|
+
void AddPeriodicUpdatePromiseWaker() {
|
|
253
|
+
periodic_updates_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
|
|
254
|
+
}
|
|
255
|
+
// TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
|
|
256
|
+
void WakeupPeriodicUpdatePromise() { periodic_updates_waker_.Wakeup(); }
|
|
257
|
+
|
|
258
|
+
// Processes the flow control action and take necessary steps.
|
|
259
|
+
void ActOnFlowControlAction(const chttp2::FlowControlAction& action,
|
|
260
|
+
RefCountedPtr<Stream> stream);
|
|
261
|
+
|
|
262
|
+
void NotifyStateWatcherOnDisconnectLocked(
|
|
263
|
+
absl::Status status, StateWatcher::DisconnectInfo disconnect_info)
|
|
264
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&transport_mutex_);
|
|
231
265
|
|
|
232
266
|
RefCountedPtr<Party> general_party_;
|
|
267
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
|
|
233
268
|
|
|
234
269
|
PromiseEndpoint endpoint_;
|
|
235
|
-
|
|
236
|
-
Duration settings_timeout_;
|
|
270
|
+
RefCountedPtr<SettingsPromiseManager> settings_;
|
|
237
271
|
|
|
238
272
|
Http2FrameHeader current_frame_header_;
|
|
273
|
+
// Returns the number of active streams. A stream is removed from the `active`
|
|
274
|
+
// list once both client and server agree to close the stream. The count of
|
|
275
|
+
// stream_list_(even though stream list represents streams open for reads)
|
|
276
|
+
// works here because of the following cases where the stream is closed:
|
|
277
|
+
// 1. Reading a RST stream frame: In this case, the stream is immediately
|
|
278
|
+
// closed for reads and writes and removed from the stream_list_
|
|
279
|
+
// (effectively tracking the number of active streams).
|
|
280
|
+
// 2. Reading a Trailing Metadata frame: In this case, the stream MAY be
|
|
281
|
+
// closed for reads and writes immediately which follows the above case. In
|
|
282
|
+
// other cases, the transport either reads RST stream frame from the server
|
|
283
|
+
// (and follows case 1) or sends a half close frame and closes the stream
|
|
284
|
+
// for reads and writes (in the multiplexer loop).
|
|
285
|
+
// 3. Hitting error condition in the transport: In this case, RST stream is
|
|
286
|
+
// is enqueued and the stream is closed for reads immediately. This means
|
|
287
|
+
// we effectively reduce the number of active streams inline (because we
|
|
288
|
+
// remove the stream from the stream_list_). This is fine because the
|
|
289
|
+
// priority logic in list of writable streams ensures that the RST stream
|
|
290
|
+
// frame is given priority over any new streams being created by the
|
|
291
|
+
// client.
|
|
292
|
+
// 4. Application abort: In this case, multiplexer loop will write RST stream
|
|
293
|
+
// frame to the endpoint and close the stream from reads and writes. This
|
|
294
|
+
// then follows the same reasoning as case 1.
|
|
295
|
+
inline uint32_t GetActiveStreamCountLocked() const
|
|
296
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(transport_mutex_) {
|
|
297
|
+
return stream_list_.size();
|
|
298
|
+
}
|
|
239
299
|
|
|
240
|
-
//
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
stream_state(HttpStreamState::kIdle),
|
|
245
|
-
stream_id(stream_id1),
|
|
246
|
-
header_assembler(stream_id1),
|
|
247
|
-
did_push_initial_metadata(false),
|
|
248
|
-
did_push_trailing_metadata(false),
|
|
249
|
-
data_queue(MakeRefCounted<StreamDataQueue<ClientMetadataHandle>>(
|
|
250
|
-
/*is_client*/ true, /*stream_id*/ stream_id1,
|
|
251
|
-
/*queue_size*/ kStreamQueueSize)) {}
|
|
252
|
-
|
|
253
|
-
////////////////////////////////////////////////////////////////////////////
|
|
254
|
-
// Data Queue Helpers
|
|
255
|
-
|
|
256
|
-
auto EnqueueInitialMetadata(ClientMetadataHandle&& metadata) {
|
|
257
|
-
GRPC_HTTP2_CLIENT_DLOG
|
|
258
|
-
<< "Http2ClientTransport::Stream::EnqueueInitialMetadata stream_id="
|
|
259
|
-
<< stream_id;
|
|
260
|
-
return data_queue->EnqueueInitialMetadata(std::move(metadata));
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
auto EnqueueTrailingMetadata(ClientMetadataHandle&& metadata) {
|
|
264
|
-
GRPC_HTTP2_CLIENT_DLOG
|
|
265
|
-
<< "Http2ClientTransport::Stream::EnqueueTrailingMetadata stream_id="
|
|
266
|
-
<< stream_id;
|
|
267
|
-
return data_queue->EnqueueTrailingMetadata(std::move(metadata));
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
auto EnqueueMessage(MessageHandle&& message) {
|
|
271
|
-
GRPC_HTTP2_CLIENT_DLOG
|
|
272
|
-
<< "Http2ClientTransport::Stream::EnqueueMessage stream_id="
|
|
273
|
-
<< stream_id
|
|
274
|
-
<< " with payload size = " << message->payload()->Length();
|
|
275
|
-
return data_queue->EnqueueMessage(std::move(message));
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
auto EnqueueHalfClosed() {
|
|
279
|
-
GRPC_HTTP2_CLIENT_DLOG
|
|
280
|
-
<< "Http2ClientTransport::Stream::EnqueueHalfClosed stream_id="
|
|
281
|
-
<< stream_id;
|
|
282
|
-
return data_queue->EnqueueHalfClosed();
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
auto EnqueueResetStream(const uint32_t error_code) {
|
|
286
|
-
GRPC_HTTP2_CLIENT_DLOG
|
|
287
|
-
<< "Http2ClientTransport::Stream::EnqueueResetStream stream_id="
|
|
288
|
-
<< stream_id << " with error_code = " << error_code;
|
|
289
|
-
return data_queue->EnqueueResetStream(error_code);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
auto DequeueFrames(const uint32_t transport_tokens,
|
|
293
|
-
const uint32_t max_frame_length,
|
|
294
|
-
HPackCompressor& encoder) {
|
|
295
|
-
return data_queue->DequeueFrames(transport_tokens, max_frame_length,
|
|
296
|
-
encoder);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
////////////////////////////////////////////////////////////////////////////
|
|
300
|
-
// Stream State Management
|
|
301
|
-
|
|
302
|
-
// Modify the stream state
|
|
303
|
-
// The possible stream transitions are as follows:
|
|
304
|
-
// kIdle -> kOpen
|
|
305
|
-
// kOpen -> kClosed/kHalfClosedLocal/kHalfClosedRemote
|
|
306
|
-
// kHalfClosedLocal/kHalfClosedRemote -> kClosed
|
|
307
|
-
// kClosed -> kClosed
|
|
308
|
-
void SentInitialMetadata() {
|
|
309
|
-
DCHECK(stream_state == HttpStreamState::kIdle);
|
|
310
|
-
stream_state = HttpStreamState::kOpen;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
void MarkHalfClosedLocal() {
|
|
314
|
-
switch (stream_state) {
|
|
315
|
-
case HttpStreamState::kIdle:
|
|
316
|
-
DCHECK(false) << "MarkHalfClosedLocal called for an idle stream";
|
|
317
|
-
break;
|
|
318
|
-
case HttpStreamState::kOpen:
|
|
319
|
-
stream_state = HttpStreamState::kHalfClosedLocal;
|
|
320
|
-
break;
|
|
321
|
-
case HttpStreamState::kHalfClosedRemote:
|
|
322
|
-
stream_state = HttpStreamState::kClosed;
|
|
323
|
-
break;
|
|
324
|
-
case HttpStreamState::kHalfClosedLocal:
|
|
325
|
-
break;
|
|
326
|
-
case HttpStreamState::kClosed:
|
|
327
|
-
DCHECK(false) << "MarkHalfClosedLocal called for a closed stream";
|
|
328
|
-
break;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
void MarkHalfClosedRemote() {
|
|
333
|
-
switch (stream_state) {
|
|
334
|
-
case HttpStreamState::kIdle:
|
|
335
|
-
DCHECK(false) << "MarkHalfClosedRemote called for an idle stream";
|
|
336
|
-
break;
|
|
337
|
-
case HttpStreamState::kOpen:
|
|
338
|
-
stream_state = HttpStreamState::kHalfClosedRemote;
|
|
339
|
-
break;
|
|
340
|
-
case HttpStreamState::kHalfClosedLocal:
|
|
341
|
-
stream_state = HttpStreamState::kClosed;
|
|
342
|
-
break;
|
|
343
|
-
case HttpStreamState::kHalfClosedRemote:
|
|
344
|
-
break;
|
|
345
|
-
case HttpStreamState::kClosed:
|
|
346
|
-
DCHECK(false) << "MarkHalfClosedRemote called for a closed stream";
|
|
347
|
-
break;
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
HttpStreamState GetStreamState() const { return stream_state; }
|
|
352
|
-
|
|
353
|
-
inline bool IsClosed() const {
|
|
354
|
-
return stream_state == HttpStreamState::kClosed;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
CallHandler call;
|
|
358
|
-
// TODO(akshitpatel) : [PH2][P3] : Investigate if this needs to be atomic.
|
|
359
|
-
HttpStreamState stream_state;
|
|
360
|
-
const uint32_t stream_id;
|
|
361
|
-
GrpcMessageAssembler assembler;
|
|
362
|
-
HeaderAssembler header_assembler;
|
|
363
|
-
// TODO(akshitpatel) : [PH2][P2] : StreamQ should maintain a flag that
|
|
364
|
-
// tracks if the half close has been sent for this stream. This flag is used
|
|
365
|
-
// to notify the mixer that this stream is closed for
|
|
366
|
-
// writes(HalfClosedLocal). When the mixer dequeues the last message for
|
|
367
|
-
// the streamQ, it will mark the stream as closed for writes and send a
|
|
368
|
-
// frame with end_stream or set the end_stream flag in the last data
|
|
369
|
-
// frame being sent out. This is done as the stream state should not
|
|
370
|
-
// transition to HalfClosedLocal till the end_stream frame is sent.
|
|
371
|
-
bool did_push_initial_metadata;
|
|
372
|
-
bool did_push_trailing_metadata;
|
|
373
|
-
RefCountedPtr<StreamDataQueue<ClientMetadataHandle>> data_queue;
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
uint32_t NextStreamId(
|
|
377
|
-
InterActivityMutex<uint32_t>::Lock& next_stream_id_lock) {
|
|
378
|
-
const uint32_t stream_id = *next_stream_id_lock;
|
|
379
|
-
if (stream_id > RFC9113::kMaxStreamId31Bit) {
|
|
300
|
+
// Returns the next stream id. If the next stream id is not available, it
|
|
301
|
+
// returns std::nullopt. MUST be called from the transport party.
|
|
302
|
+
absl::StatusOr<uint32_t> NextStreamId() {
|
|
303
|
+
if (next_stream_id_ > GetMaxAllowedStreamId()) {
|
|
380
304
|
// TODO(tjagtap) : [PH2][P3] : Handle case if transport runs out of stream
|
|
381
305
|
// ids
|
|
382
306
|
// RFC9113 : Stream identifiers cannot be reused. Long-lived connections
|
|
@@ -386,75 +310,109 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
386
310
|
// that is unable to establish a new stream identifier can send a GOAWAY
|
|
387
311
|
// frame so that the client is forced to open a new connection for new
|
|
388
312
|
// streams.
|
|
313
|
+
return absl::ResourceExhaustedError("No more stream ids available");
|
|
314
|
+
}
|
|
315
|
+
// TODO(akshitpatel) : [PH2][P3] : There is a channel arg to delay
|
|
316
|
+
// starting new streams instead of failing them. This needs to be
|
|
317
|
+
// implemented.
|
|
318
|
+
{
|
|
319
|
+
MutexLock lock(&transport_mutex_);
|
|
320
|
+
if (GetActiveStreamCountLocked() >=
|
|
321
|
+
settings_->peer().max_concurrent_streams()) {
|
|
322
|
+
return absl::ResourceExhaustedError("Reached max concurrent streams");
|
|
323
|
+
}
|
|
389
324
|
}
|
|
325
|
+
|
|
390
326
|
// RFC9113 : Streams initiated by a client MUST use odd-numbered stream
|
|
391
327
|
// identifiers.
|
|
392
|
-
|
|
393
|
-
|
|
328
|
+
uint32_t new_stream_id =
|
|
329
|
+
std::exchange(next_stream_id_, next_stream_id_ + 2);
|
|
330
|
+
if (GPR_UNLIKELY(next_stream_id_ > GetMaxAllowedStreamId())) {
|
|
331
|
+
ReportDisconnection(
|
|
332
|
+
absl::ResourceExhaustedError("Transport Stream IDs exhausted"),
|
|
333
|
+
{}, // TODO(tjagtap) : [PH2][P2] : Report better disconnect info.
|
|
334
|
+
"no_more_stream_ids");
|
|
335
|
+
}
|
|
336
|
+
return new_stream_id;
|
|
394
337
|
}
|
|
395
338
|
|
|
396
|
-
|
|
339
|
+
// Returns the next stream id without incrementing it. MUST be called from the
|
|
340
|
+
// transport party.
|
|
341
|
+
uint32_t PeekNextStreamId() const { return next_stream_id_; }
|
|
342
|
+
|
|
343
|
+
// Returns the last stream id sent by the transport. If no streams were sent,
|
|
344
|
+
// returns 0. MUST be called from the transport party.
|
|
345
|
+
uint32_t GetLastStreamId() const {
|
|
346
|
+
const uint32_t next_stream_id = PeekNextStreamId();
|
|
347
|
+
return (next_stream_id > 1) ? (next_stream_id - 2) : 0;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
absl::Status InitializeStream(RefCountedPtr<Stream> stream);
|
|
351
|
+
|
|
352
|
+
void AddToStreamList(RefCountedPtr<Stream> stream);
|
|
397
353
|
|
|
398
354
|
Mutex transport_mutex_;
|
|
399
|
-
|
|
400
|
-
// mapping up in the on_done of the CallInitiator or CallHandler
|
|
355
|
+
|
|
401
356
|
absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list_
|
|
402
357
|
ABSL_GUARDED_BY(transport_mutex_);
|
|
403
358
|
|
|
404
|
-
|
|
405
|
-
// This also tracks the stream_id for creating new streams.
|
|
406
|
-
InterActivityMutex<uint32_t> stream_id_mutex_;
|
|
359
|
+
uint32_t next_stream_id_;
|
|
407
360
|
HPackCompressor encoder_;
|
|
408
361
|
HPackParser parser_;
|
|
409
362
|
bool is_transport_closed_ ABSL_GUARDED_BY(transport_mutex_) = false;
|
|
363
|
+
Latch<void> transport_closed_latch_;
|
|
364
|
+
|
|
365
|
+
template <typename Promise>
|
|
366
|
+
auto UntilTransportClosed(Promise promise) {
|
|
367
|
+
return Race(Map(transport_closed_latch_.Wait(),
|
|
368
|
+
[](Empty) {
|
|
369
|
+
GRPC_HTTP2_CLIENT_DLOG << "Transport closed";
|
|
370
|
+
return absl::CancelledError("Transport closed");
|
|
371
|
+
}),
|
|
372
|
+
std::move(promise));
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Spawns an infallible promise on the given party.
|
|
376
|
+
template <typename Factory>
|
|
377
|
+
void SpawnInfallible(RefCountedPtr<Party> party, absl::string_view name,
|
|
378
|
+
Factory&& factory);
|
|
379
|
+
|
|
380
|
+
// Spawns an infallible promise on the transport party.
|
|
381
|
+
template <typename Factory>
|
|
382
|
+
void SpawnInfallibleTransportParty(absl::string_view name, Factory&& factory);
|
|
383
|
+
|
|
384
|
+
// Spawns a promise on the transport party. If the promise returns a non-ok
|
|
385
|
+
// status, it is handled by closing the transport with the corresponding
|
|
386
|
+
// status.
|
|
387
|
+
template <typename Factory>
|
|
388
|
+
void SpawnGuardedTransportParty(absl::string_view name, Factory&& factory);
|
|
410
389
|
|
|
411
390
|
ConnectivityStateTracker state_tracker_ ABSL_GUARDED_BY(transport_mutex_){
|
|
412
391
|
"http2_client", GRPC_CHANNEL_READY};
|
|
413
392
|
|
|
414
|
-
|
|
393
|
+
RefCountedPtr<StateWatcher> watcher_ ABSL_GUARDED_BY(transport_mutex_);
|
|
415
394
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
bool close_writes;
|
|
419
|
-
bool send_rst_stream;
|
|
420
|
-
bool push_trailing_metadata;
|
|
421
|
-
};
|
|
395
|
+
// Runs on the call party.
|
|
396
|
+
std::optional<RefCountedPtr<Stream>> MakeStream(CallHandler call_handler);
|
|
422
397
|
|
|
423
398
|
// This function MUST be idempotent.
|
|
424
|
-
void CloseStream(
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
RefCountedPtr<Http2ClientTransport::Stream> LookupStream(uint32_t stream_id);
|
|
428
|
-
|
|
429
|
-
auto EndpointReadSlice(const size_t num_bytes) {
|
|
430
|
-
return Map(endpoint_.ReadSlice(num_bytes),
|
|
431
|
-
[self = RefAsSubclass<Http2ClientTransport>()](
|
|
432
|
-
absl::StatusOr<Slice> status) {
|
|
433
|
-
// We are ignoring the case where the read fails and call
|
|
434
|
-
// GotData() regardless. Reasoning:
|
|
435
|
-
// 1. It is expected that if the read fails, the transport will
|
|
436
|
-
// close and the keepalive loop will be stopped.
|
|
437
|
-
// 2. It does not seem worth to have an extra condition for the
|
|
438
|
-
// success cases which would be way more common.
|
|
439
|
-
self->keepalive_manager_.GotData();
|
|
440
|
-
return status;
|
|
441
|
-
});
|
|
442
|
-
}
|
|
399
|
+
void CloseStream(RefCountedPtr<Stream> stream, CloseStreamArgs args,
|
|
400
|
+
DebugLocation whence = {});
|
|
443
401
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
402
|
+
void BeginCloseStream(RefCountedPtr<Stream> stream,
|
|
403
|
+
std::optional<uint32_t> reset_stream_error_code,
|
|
404
|
+
ServerMetadataHandle&& metadata,
|
|
405
|
+
DebugLocation whence = {});
|
|
406
|
+
|
|
407
|
+
RefCountedPtr<Stream> LookupStream(uint32_t stream_id);
|
|
408
|
+
|
|
409
|
+
auto EndpointReadSlice(const size_t num_bytes);
|
|
410
|
+
auto EndpointRead(const size_t num_bytes);
|
|
411
|
+
|
|
412
|
+
// HTTP2 Settings
|
|
413
|
+
auto WaitForSettingsTimeoutOnDone();
|
|
414
|
+
void MaybeSpawnWaitForSettingsTimeout();
|
|
415
|
+
void EnforceLatestIncomingSettings();
|
|
458
416
|
|
|
459
417
|
// This function MUST run on the transport party.
|
|
460
418
|
void CloseTransport();
|
|
@@ -470,23 +428,25 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
470
428
|
// should not be cancelled in case of stream errors.
|
|
471
429
|
// If the error is a connection error, it closes the transport and returns the
|
|
472
430
|
// corresponding (failed) absl status.
|
|
473
|
-
absl::Status HandleError(
|
|
431
|
+
absl::Status HandleError(const std::optional<uint32_t> stream_id,
|
|
432
|
+
Http2Status status, DebugLocation whence = {}) {
|
|
474
433
|
auto error_type = status.GetType();
|
|
475
|
-
|
|
434
|
+
GRPC_DCHECK(error_type != Http2Status::Http2ErrorType::kOk);
|
|
476
435
|
|
|
477
436
|
if (error_type == Http2Status::Http2ErrorType::kStreamError) {
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
437
|
+
GRPC_HTTP2_CLIENT_ERROR_DLOG << "Stream Error: " << status.DebugString();
|
|
438
|
+
GRPC_DCHECK(stream_id.has_value());
|
|
439
|
+
// Passing a cancelled server metadata handle to propagate the error
|
|
440
|
+
// to the upper layers.
|
|
441
|
+
BeginCloseStream(
|
|
442
|
+
LookupStream(stream_id.value()),
|
|
443
|
+
Http2ErrorCodeToFrameErrorCode(status.GetStreamErrorCode()),
|
|
444
|
+
CancelledServerMetadataFromStatus(status.GetAbslStreamError()),
|
|
445
|
+
whence);
|
|
487
446
|
return absl::OkStatus();
|
|
488
447
|
} else if (error_type == Http2Status::Http2ErrorType::kConnectionError) {
|
|
489
|
-
|
|
448
|
+
GRPC_HTTP2_CLIENT_ERROR_DLOG << "Connection Error: "
|
|
449
|
+
<< status.DebugString();
|
|
490
450
|
absl::Status absl_status = status.GetAbslConnectionError();
|
|
491
451
|
MaybeSpawnCloseTransport(std::move(status), whence);
|
|
492
452
|
return absl_status;
|
|
@@ -494,79 +454,81 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
494
454
|
GPR_UNREACHABLE_CODE(return absl::InternalError("Invalid error type"));
|
|
495
455
|
}
|
|
496
456
|
|
|
497
|
-
bool
|
|
498
|
-
bool incoming_header_in_progress_;
|
|
499
|
-
bool incoming_header_end_stream_;
|
|
457
|
+
bool should_reset_ping_clock_;
|
|
500
458
|
bool is_first_write_;
|
|
501
|
-
|
|
502
|
-
|
|
459
|
+
IncomingMetadataTracker incoming_headers_;
|
|
460
|
+
|
|
461
|
+
// The target number of bytes to write in a single write cycle. We may not
|
|
462
|
+
// always honour this max_write_size. We MAY overshoot it at most once per
|
|
463
|
+
// write cycle.
|
|
464
|
+
size_t max_write_size_;
|
|
465
|
+
// The number of bytes remaining to be written in the current write cycle.
|
|
466
|
+
size_t write_bytes_remaining_;
|
|
467
|
+
|
|
468
|
+
// The max_write_size will be decided dynamically based on the available
|
|
469
|
+
// bandwidth on the wire. We aim to keep the time spent in the write loop to
|
|
470
|
+
// about 100ms.
|
|
471
|
+
void SetMaxWriteSize(const size_t max_write_size) {
|
|
472
|
+
GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport SetMaxWriteSize "
|
|
473
|
+
<< " max_write_size changed: " << max_write_size_
|
|
474
|
+
<< " -> " << max_write_size;
|
|
475
|
+
max_write_size_ = max_write_size;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
size_t GetMaxWriteSize() const { return max_write_size_; }
|
|
479
|
+
|
|
480
|
+
auto SerializeAndWrite(std::vector<Http2Frame>&& frames);
|
|
481
|
+
// Tracks the max allowed stream id. Currently this is only set on receiving a
|
|
482
|
+
// graceful GOAWAY frame.
|
|
483
|
+
uint32_t max_allowed_stream_id_ = RFC9113::kMaxStreamId31Bit;
|
|
484
|
+
|
|
485
|
+
uint32_t GetMaxAllowedStreamId() const;
|
|
503
486
|
|
|
504
|
-
uint32_t
|
|
487
|
+
void SetMaxAllowedStreamId(uint32_t max_allowed_stream_id);
|
|
488
|
+
|
|
489
|
+
bool CanCloseTransportLocked() const
|
|
490
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(transport_mutex_);
|
|
505
491
|
|
|
506
492
|
// Ping related members
|
|
507
|
-
|
|
508
|
-
//
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
const Duration keepalive_timeout_;
|
|
514
|
-
// Duration to wait for ping ack before triggering timeout
|
|
515
|
-
const Duration ping_timeout_;
|
|
516
|
-
PingManager ping_manager_;
|
|
517
|
-
std::vector<uint64_t> pending_ping_acks_;
|
|
518
|
-
KeepaliveManager keepalive_manager_;
|
|
493
|
+
|
|
494
|
+
// Duration between two consecutive keepalive pings.
|
|
495
|
+
Duration keepalive_time_;
|
|
496
|
+
bool test_only_ack_pings_;
|
|
497
|
+
std::optional<PingManager> ping_manager_;
|
|
498
|
+
std::optional<KeepaliveManager> keepalive_manager_;
|
|
519
499
|
|
|
520
500
|
// Flags
|
|
521
501
|
bool keepalive_permit_without_calls_;
|
|
522
502
|
|
|
523
503
|
auto SendPing(absl::AnyInvocable<void()> on_initiate, bool important) {
|
|
524
|
-
return ping_manager_
|
|
504
|
+
return ping_manager_->RequestPing(std::move(on_initiate), important);
|
|
525
505
|
}
|
|
526
|
-
auto WaitForPingAck() { return ping_manager_
|
|
506
|
+
auto WaitForPingAck() { return ping_manager_->WaitForPingAck(); }
|
|
527
507
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
SliceBuffer output_buf;
|
|
534
|
-
Serialize(absl::Span<Http2Frame>(&frame, 1), output_buf);
|
|
535
|
-
return endpoint_.Write(std::move(output_buf), {});
|
|
536
|
-
}
|
|
508
|
+
void MaybeGetWindowUpdateFrames(SliceBuffer& output_buf);
|
|
509
|
+
|
|
510
|
+
void ReportDisconnection(const absl::Status& status,
|
|
511
|
+
StateWatcher::DisconnectInfo disconnect_info,
|
|
512
|
+
const char* reason);
|
|
537
513
|
|
|
514
|
+
void ReportDisconnectionLocked(const absl::Status& status,
|
|
515
|
+
StateWatcher::DisconnectInfo disconnect_info,
|
|
516
|
+
const char* reason)
|
|
517
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&transport_mutex_);
|
|
518
|
+
|
|
519
|
+
// Ping Helper functions
|
|
538
520
|
Duration NextAllowedPingInterval() {
|
|
539
521
|
MutexLock lock(&transport_mutex_);
|
|
540
|
-
return (!keepalive_permit_without_calls_ &&
|
|
522
|
+
return (!keepalive_permit_without_calls_ &&
|
|
523
|
+
GetActiveStreamCountLocked() == 0)
|
|
541
524
|
? Duration::Hours(2)
|
|
542
525
|
: Duration::Seconds(1);
|
|
543
526
|
}
|
|
544
527
|
|
|
545
|
-
auto MaybeSendPing() {
|
|
546
|
-
return ping_manager_.MaybeSendPing(NextAllowedPingInterval(),
|
|
547
|
-
ping_timeout_);
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
auto MaybeSendPingAcks() {
|
|
551
|
-
return AssertResultType<absl::Status>(If(
|
|
552
|
-
pending_ping_acks_.empty(), [] { return absl::OkStatus(); },
|
|
553
|
-
[this] {
|
|
554
|
-
std::vector<Http2Frame> frames;
|
|
555
|
-
frames.reserve(pending_ping_acks_.size());
|
|
556
|
-
for (auto& opaque_data : pending_ping_acks_) {
|
|
557
|
-
frames.emplace_back(Http2PingFrame{true, opaque_data});
|
|
558
|
-
}
|
|
559
|
-
pending_ping_acks_.clear();
|
|
560
|
-
SliceBuffer output_buf;
|
|
561
|
-
Serialize(absl::Span<Http2Frame>(frames), output_buf);
|
|
562
|
-
return endpoint_.Write(std::move(output_buf), {});
|
|
563
|
-
}));
|
|
564
|
-
}
|
|
565
|
-
|
|
566
528
|
auto AckPing(uint64_t opaque_data) {
|
|
567
529
|
bool valid_ping_ack_received = true;
|
|
568
530
|
|
|
569
|
-
if (!ping_manager_
|
|
531
|
+
if (!ping_manager_->AckPing(opaque_data)) {
|
|
570
532
|
GRPC_HTTP2_CLIENT_DLOG << "Unknown ping response received for ping id="
|
|
571
533
|
<< opaque_data;
|
|
572
534
|
valid_ping_ack_received = false;
|
|
@@ -578,13 +540,10 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
578
540
|
// When this happens, it becomes important to ensure that if a ping ack
|
|
579
541
|
// is received and there is an "important" outstanding ping request, we
|
|
580
542
|
// should retry to send it out now.
|
|
581
|
-
valid_ping_ack_received && ping_manager_
|
|
543
|
+
valid_ping_ack_received && ping_manager_->ImportantPingRequested(),
|
|
582
544
|
[self = RefAsSubclass<Http2ClientTransport>()] {
|
|
583
545
|
return Map(self->TriggerWriteCycle(), [](const absl::Status status) {
|
|
584
|
-
return (status
|
|
585
|
-
? Http2Status::Ok()
|
|
586
|
-
: Http2Status::AbslConnectionError(
|
|
587
|
-
status.code(), std::string(status.message()));
|
|
546
|
+
return ToHttpOkOrConnError(status);
|
|
588
547
|
});
|
|
589
548
|
},
|
|
590
549
|
[] { return Immediate(Http2Status::Ok()); });
|
|
@@ -598,29 +557,22 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
598
557
|
PingSystemInterfaceImpl(transport));
|
|
599
558
|
}
|
|
600
559
|
|
|
601
|
-
// Returns a promise that resolves once a ping frame is written to the
|
|
602
|
-
// endpoint.
|
|
603
|
-
Promise<absl::Status> SendPing(SendPingArgs args) override {
|
|
604
|
-
return transport_->CreateAndWritePing(args.ack, args.opaque_data);
|
|
605
|
-
}
|
|
606
|
-
|
|
607
560
|
Promise<absl::Status> TriggerWrite() override {
|
|
608
561
|
return transport_->TriggerWriteCycle();
|
|
609
562
|
}
|
|
610
563
|
|
|
611
564
|
Promise<absl::Status> PingTimeout() override {
|
|
612
|
-
|
|
613
|
-
// Returns a promise that resolves once goaway is sent.
|
|
614
|
-
LOG(INFO) << "Ping timeout at time: " << Timestamp::Now();
|
|
565
|
+
GRPC_HTTP2_CLIENT_DLOG << "Ping timeout at time: " << Timestamp::Now();
|
|
615
566
|
|
|
616
567
|
// TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
|
|
617
568
|
// based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
|
|
618
569
|
// to kRefusedStream). However looking at RFC9113, definition of
|
|
619
570
|
// kRefusedStream doesn't seem to fit this case. We should revisit this
|
|
620
571
|
// and update the error code.
|
|
621
|
-
return Immediate(
|
|
622
|
-
|
|
623
|
-
|
|
572
|
+
return Immediate(transport_->HandleError(
|
|
573
|
+
std::nullopt,
|
|
574
|
+
Http2Status::Http2ConnectionError(Http2ErrorCode::kRefusedStream,
|
|
575
|
+
GRPC_CHTTP2_PING_TIMEOUT_STR)));
|
|
624
576
|
}
|
|
625
577
|
|
|
626
578
|
private:
|
|
@@ -650,17 +602,17 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
650
602
|
});
|
|
651
603
|
}
|
|
652
604
|
Promise<absl::Status> OnKeepAliveTimeout() override {
|
|
653
|
-
|
|
654
|
-
LOG(INFO) << "Keepalive timeout triggered";
|
|
605
|
+
GRPC_HTTP2_CLIENT_DLOG << "Keepalive timeout triggered";
|
|
655
606
|
|
|
656
607
|
// TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
|
|
657
608
|
// based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
|
|
658
609
|
// to kRefusedStream). However looking at RFC9113, definition of
|
|
659
610
|
// kRefusedStream doesn't seem to fit this case. We should revisit this
|
|
660
611
|
// and update the error code.
|
|
661
|
-
return Immediate(
|
|
662
|
-
|
|
663
|
-
|
|
612
|
+
return Immediate(transport_->HandleError(
|
|
613
|
+
std::nullopt, Http2Status::Http2ConnectionError(
|
|
614
|
+
Http2ErrorCode::kRefusedStream,
|
|
615
|
+
GRPC_CHTTP2_KEEPALIVE_TIMEOUT_STR)));
|
|
664
616
|
}
|
|
665
617
|
|
|
666
618
|
bool NeedToSendKeepAlivePing() override {
|
|
@@ -668,7 +620,7 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
668
620
|
{
|
|
669
621
|
MutexLock lock(&transport_->transport_mutex_);
|
|
670
622
|
need_to_send_ping = (transport_->keepalive_permit_without_calls_ ||
|
|
671
|
-
|
|
623
|
+
transport_->GetActiveStreamCountLocked() > 0);
|
|
672
624
|
}
|
|
673
625
|
return need_to_send_ping;
|
|
674
626
|
}
|
|
@@ -680,24 +632,83 @@ class Http2ClientTransport final : public ClientTransport {
|
|
|
680
632
|
Http2ClientTransport* transport_;
|
|
681
633
|
};
|
|
682
634
|
|
|
683
|
-
|
|
635
|
+
class GoawayInterfaceImpl : public GoawayInterface {
|
|
636
|
+
public:
|
|
637
|
+
static std::unique_ptr<GoawayInterface> Make(
|
|
638
|
+
Http2ClientTransport* transport) {
|
|
639
|
+
return std::make_unique<GoawayInterfaceImpl>(
|
|
640
|
+
GoawayInterfaceImpl(transport));
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
Promise<absl::Status> SendPingAndWaitForAck() override {
|
|
644
|
+
return transport_->ping_manager_->RequestPing(/*on_initiate=*/[] {},
|
|
645
|
+
/*important=*/true);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
void TriggerWriteCycle() override { transport_->TriggerWriteCycle(); }
|
|
649
|
+
|
|
650
|
+
uint32_t GetLastAcceptedStreamId() override {
|
|
651
|
+
GRPC_DCHECK(false)
|
|
652
|
+
<< "GetLastAcceptedStreamId is not implemented for client transport.";
|
|
653
|
+
LOG(ERROR) << "GetLastAcceptedStreamId is not implemented for client "
|
|
654
|
+
"transport.";
|
|
655
|
+
return 0;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
private:
|
|
659
|
+
explicit GoawayInterfaceImpl(Http2ClientTransport* transport)
|
|
660
|
+
: transport_(transport) {}
|
|
661
|
+
|
|
662
|
+
Http2ClientTransport* transport_;
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
GoawayManager goaway_manager_;
|
|
666
|
+
|
|
667
|
+
WritableStreams<RefCountedPtr<Stream>> writable_stream_list_;
|
|
684
668
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
669
|
+
absl::Status MaybeAddStreamToWritableStreamList(
|
|
670
|
+
const RefCountedPtr<Stream> stream,
|
|
671
|
+
const StreamDataQueue<ClientMetadataHandle>::StreamWritabilityUpdate
|
|
672
|
+
result) {
|
|
673
|
+
if (result.became_writable) {
|
|
688
674
|
GRPC_HTTP2_CLIENT_DLOG
|
|
689
675
|
<< "Http2ClientTransport MaybeAddStreamToWritableStreamList "
|
|
690
676
|
" Stream id: "
|
|
691
|
-
<<
|
|
692
|
-
absl::Status status =
|
|
693
|
-
|
|
677
|
+
<< stream->GetStreamId() << " became writable";
|
|
678
|
+
absl::Status status =
|
|
679
|
+
writable_stream_list_.Enqueue(stream, result.priority);
|
|
694
680
|
if (!status.ok()) {
|
|
695
|
-
return HandleError(
|
|
696
|
-
|
|
681
|
+
return HandleError(
|
|
682
|
+
std::nullopt,
|
|
683
|
+
Http2Status::Http2ConnectionError(
|
|
684
|
+
Http2ErrorCode::kRefusedStream,
|
|
685
|
+
"Failed to enqueue stream to writable stream list"));
|
|
697
686
|
}
|
|
698
687
|
}
|
|
699
688
|
return absl::OkStatus();
|
|
700
689
|
}
|
|
690
|
+
bool SetOnDone(CallHandler call_handler, RefCountedPtr<Stream> stream);
|
|
691
|
+
absl::StatusOr<std::vector<Http2Frame>> DequeueStreamFrames(
|
|
692
|
+
RefCountedPtr<Stream> stream);
|
|
693
|
+
|
|
694
|
+
/// Based on channel args, preferred_rx_crypto_frame_sizes are advertised to
|
|
695
|
+
/// the peer
|
|
696
|
+
bool enable_preferred_rx_crypto_frame_advertisement_;
|
|
697
|
+
MemoryOwner memory_owner_;
|
|
698
|
+
chttp2::TransportFlowControl flow_control_;
|
|
699
|
+
std::shared_ptr<PromiseHttp2ZTraceCollector> ztrace_collector_;
|
|
700
|
+
absl::flat_hash_set<uint32_t> window_update_list_;
|
|
701
|
+
|
|
702
|
+
// TODO(tjagtap) [PH2][P2][BDP] Remove this when the BDP code is done.
|
|
703
|
+
Waker periodic_updates_waker_;
|
|
704
|
+
|
|
705
|
+
Http2ReadContext reader_state_;
|
|
706
|
+
Http2Status ParseAndDiscardHeaders(SliceBuffer&& buffer, bool is_end_headers,
|
|
707
|
+
RefCountedPtr<Stream> stream,
|
|
708
|
+
Http2Status&& original_status,
|
|
709
|
+
DebugLocation whence = {});
|
|
710
|
+
void ReadChannelArgs(const ChannelArgs& channel_args,
|
|
711
|
+
TransportChannelArgs& args);
|
|
701
712
|
};
|
|
702
713
|
|
|
703
714
|
// Since the corresponding class in CHTTP2 is about 3.9KB, our goal is to
|