grpc 1.75.0.pre1 → 1.76.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +18 -5
- data/include/grpc/credentials.h +21 -5
- data/src/core/call/call_filters.cc +4 -4
- data/src/core/call/call_filters.h +36 -36
- data/src/core/call/call_spine.h +27 -27
- data/src/core/call/client_call.cc +6 -5
- data/src/core/call/filter_fusion.h +5 -5
- data/src/core/call/metadata_batch.h +3 -3
- data/src/core/call/security_context.cc +1 -1
- data/src/core/call/server_call.cc +4 -4
- data/src/core/call/server_call.h +1 -1
- data/src/core/channelz/channelz.cc +12 -18
- data/src/core/channelz/channelz.h +32 -16
- data/src/core/channelz/channelz_registry.h +11 -0
- data/src/core/channelz/property_list.cc +18 -0
- data/src/core/channelz/property_list.h +10 -1
- 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 +11 -0
- data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
- data/src/core/channelz/ztrace_collector.h +247 -86
- data/src/core/client_channel/backup_poller.cc +5 -6
- data/src/core/client_channel/client_channel.cc +20 -13
- data/src/core/client_channel/client_channel_filter.cc +53 -45
- data/src/core/client_channel/client_channel_filter.h +2 -2
- data/src/core/client_channel/client_channel_internal.h +3 -4
- data/src/core/client_channel/config_selector.h +3 -3
- data/src/core/client_channel/dynamic_filters.cc +3 -3
- data/src/core/client_channel/global_subchannel_pool.cc +0 -37
- data/src/core/client_channel/global_subchannel_pool.h +0 -27
- data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
- data/src/core/client_channel/local_subchannel_pool.cc +4 -4
- data/src/core/client_channel/retry_filter.h +3 -3
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
- data/src/core/client_channel/subchannel.cc +8 -8
- data/src/core/client_channel/subchannel_stream_client.cc +4 -4
- data/src/core/config/config_vars.cc +30 -1
- data/src/core/config/config_vars.h +21 -0
- data/src/core/config/core_configuration.cc +5 -5
- data/src/core/config/core_configuration.h +7 -7
- data/src/core/config/load_config.cc +12 -0
- data/src/core/config/load_config.h +2 -0
- data/src/core/credentials/call/call_credentials.h +2 -2
- data/src/core/credentials/call/call_creds_util.cc +4 -3
- data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
- data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
- data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
- data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
- data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
- data/src/core/credentials/call/jwt/json_token.cc +3 -3
- data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
- data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
- data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
- data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
- data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
- data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
- data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
- 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/composite/composite_channel_credentials.cc +5 -5
- data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
- data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
- data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
- data/src/core/credentials/transport/security_connector.cc +5 -5
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
- data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
- data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
- data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
- data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
- data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
- data/src/core/credentials/transport/transport_credentials.cc +2 -2
- data/src/core/credentials/transport/transport_credentials.h +2 -2
- data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
- data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
- data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
- data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
- data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
- data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
- data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
- data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
- data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
- data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
- 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/server_auth_filter.cc +2 -2
- data/src/core/handshaker/handshaker.cc +3 -3
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
- data/src/core/handshaker/security/secure_endpoint.cc +16 -6
- data/src/core/handshaker/security/security_handshaker.cc +3 -3
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
- data/src/core/lib/channel/channel_stack.cc +8 -5
- data/src/core/lib/channel/channel_stack.h +3 -0
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/promise_based_filter.cc +69 -64
- data/src/core/lib/channel/promise_based_filter.h +16 -15
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/message_compress.cc +7 -7
- data/src/core/lib/event_engine/ares_resolver.cc +22 -20
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
- data/src/core/lib/event_engine/extensions/channelz.h +2 -2
- data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/posix_interface.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/timer_manager.cc +3 -3
- 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 +11 -11
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
- data/src/core/lib/event_engine/windows/iocp.cc +10 -10
- data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
- data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
- data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
- data/src/core/lib/experiments/experiments.cc +105 -18
- data/src/core/lib/experiments/experiments.h +43 -11
- data/src/core/lib/iomgr/call_combiner.cc +3 -3
- data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
- data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
- data/src/core/lib/iomgr/iocp_windows.cc +8 -8
- data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
- data/src/core/lib/iomgr/lockfree_event.cc +2 -2
- data/src/core/lib/iomgr/polling_entity.cc +3 -3
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_windows.cc +4 -4
- data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
- data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
- data/src/core/lib/iomgr/tcp_posix.cc +42 -42
- 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 +47 -27
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
- data/src/core/lib/iomgr/tcp_windows.cc +7 -7
- data/src/core/lib/iomgr/timer_generic.cc +2 -2
- data/src/core/lib/iomgr/timer_manager.cc +2 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
- data/src/core/lib/promise/activity.cc +2 -2
- data/src/core/lib/promise/activity.h +6 -6
- data/src/core/lib/promise/context.h +2 -2
- data/src/core/lib/promise/detail/join_state.h +9 -9
- data/src/core/lib/promise/detail/seq_state.h +13 -13
- data/src/core/lib/promise/detail/status.h +2 -2
- data/src/core/lib/promise/for_each.h +5 -5
- data/src/core/lib/promise/interceptor_list.h +2 -2
- data/src/core/lib/promise/latch.h +7 -7
- data/src/core/lib/promise/mpsc.cc +26 -26
- data/src/core/lib/promise/mpsc.h +2 -2
- data/src/core/lib/promise/observable.h +4 -4
- data/src/core/lib/promise/party.cc +32 -25
- data/src/core/lib/promise/party.h +16 -19
- data/src/core/lib/promise/pipe.h +15 -15
- data/src/core/lib/promise/poll.h +5 -4
- data/src/core/lib/promise/promise.h +0 -2
- data/src/core/lib/promise/sleep.cc +3 -1
- data/src/core/lib/promise/status_flag.h +7 -7
- data/src/core/lib/promise/try_join.h +2 -2
- data/src/core/lib/promise/try_seq.h +2 -2
- 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/memory_quota.cc +45 -24
- data/src/core/lib/resource_quota/memory_quota.h +48 -16
- data/src/core/lib/resource_quota/telemetry.h +54 -0
- data/src/core/lib/resource_quota/thread_quota.cc +2 -2
- 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 +5 -5
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
- data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
- data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
- data/src/core/lib/surface/call.cc +16 -14
- data/src/core/lib/surface/call.h +1 -1
- data/src/core/lib/surface/call_utils.cc +2 -2
- data/src/core/lib/surface/call_utils.h +2 -2
- data/src/core/lib/surface/channel.cc +4 -4
- data/src/core/lib/surface/channel_create.cc +10 -6
- data/src/core/lib/surface/channel_init.cc +80 -23
- data/src/core/lib/surface/channel_init.h +26 -11
- data/src/core/lib/surface/completion_queue.cc +17 -16
- 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 +12 -23
- data/src/core/lib/surface/filter_stack_call.h +3 -4
- data/src/core/lib/surface/legacy_channel.cc +7 -7
- data/src/core/lib/surface/validate_metadata.h +2 -2
- 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 +3 -3
- data/src/core/lib/transport/promise_endpoint.cc +3 -3
- data/src/core/lib/transport/promise_endpoint.h +8 -8
- data/src/core/lib/transport/timeout_encoding.cc +4 -4
- data/src/core/load_balancing/child_policy_handler.cc +4 -4
- data/src/core/load_balancing/endpoint_list.cc +2 -2
- data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
- data/src/core/load_balancing/health_check_client.cc +4 -4
- data/src/core/load_balancing/health_check_client_internal.h +2 -2
- data/src/core/load_balancing/lb_policy_registry.cc +2 -2
- data/src/core/load_balancing/oob_backend_metric.cc +4 -4
- data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
- data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
- data/src/core/load_balancing/priority/priority.cc +23 -24
- data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
- data/src/core/load_balancing/rls/rls.cc +13 -13
- data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
- 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 +33 -26
- data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
- data/src/core/load_balancing/xds/cds.cc +76 -32
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
- data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
- data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
- data/src/core/resolver/endpoint_addresses.cc +3 -3
- data/src/core/resolver/endpoint_addresses.h +3 -0
- data/src/core/resolver/fake/fake_resolver.cc +2 -2
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
- data/src/core/resolver/polling_resolver.cc +3 -3
- data/src/core/resolver/resolver_registry.cc +5 -4
- data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
- data/src/core/resolver/xds/xds_resolver.cc +9 -9
- data/src/core/server/server.cc +38 -38
- data/src/core/server/server_call_tracer_filter.h +4 -4
- data/src/core/server/server_config_selector_filter.cc +2 -2
- data/src/core/server/xds_server_config_fetcher.cc +9 -8
- data/src/core/service_config/service_config_impl.h +2 -2
- data/src/core/telemetry/call_tracer.cc +39 -49
- data/src/core/telemetry/call_tracer.h +199 -22
- data/src/core/telemetry/histogram.h +205 -0
- data/src/core/telemetry/instrument.cc +719 -0
- data/src/core/telemetry/instrument.h +932 -0
- data/src/core/telemetry/metrics.cc +13 -5
- data/src/core/telemetry/metrics.h +3 -1
- data/src/core/telemetry/stats_data.cc +0 -19
- data/src/core/telemetry/stats_data.h +0 -19
- data/src/core/transport/auth_context.cc +2 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
- 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 +39 -31
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
- data/src/core/tsi/ssl_transport_security.cc +26 -25
- data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
- data/src/core/util/chunked_vector.h +4 -4
- data/src/core/util/event_log.cc +2 -2
- data/src/core/util/gcp_metadata_query.cc +2 -2
- data/src/core/util/grpc_check.cc +22 -0
- data/src/core/util/grpc_check.h +103 -0
- data/src/core/util/http_client/httpcli.cc +3 -3
- data/src/core/util/http_client/parser.cc +4 -4
- data/src/core/util/latent_see.h +7 -4
- data/src/core/util/lru_cache.h +4 -4
- data/src/core/util/memory_usage.h +16 -0
- data/src/core/util/posix/directory_reader.cc +3 -2
- data/src/core/util/posix/sync.cc +24 -24
- data/src/core/util/postmortem_emit.cc +52 -0
- data/src/core/util/postmortem_emit.h +30 -0
- data/src/core/util/ref_counted_ptr.h +5 -0
- data/src/core/util/trie_lookup.h +170 -0
- data/src/core/util/unique_ptr_with_bitset.h +5 -5
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
- data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
- data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
- data/src/core/xds/grpc/xds_client_grpc.h +4 -1
- data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
- data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
- data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
- data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
- 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_route_config_parser.cc +6 -6
- data/src/core/xds/grpc/xds_routing.cc +3 -3
- data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
- data/src/core/xds/xds_client/lrs_client.cc +6 -6
- data/src/core/xds/xds_client/xds_client.cc +9 -9
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
- data/src/ruby/lib/grpc/version.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 +37 -2
@@ -17,7 +17,6 @@
|
|
17
17
|
//
|
18
18
|
#include "src/core/ext/transport/chttp2/transport/ping_promise.h"
|
19
19
|
|
20
|
-
#include "src/core/lib/promise/if.h"
|
21
20
|
#include "src/core/lib/promise/latch.h"
|
22
21
|
#include "src/core/lib/promise/map.h"
|
23
22
|
#include "src/core/lib/promise/party.h"
|
@@ -29,7 +28,6 @@
|
|
29
28
|
|
30
29
|
namespace grpc_core {
|
31
30
|
namespace http2 {
|
32
|
-
using SendPingArgs = ::grpc_core::http2::PingInterface::SendPingArgs;
|
33
31
|
using Callback = absl::AnyInvocable<void()>;
|
34
32
|
using grpc_event_engine::experimental::EventEngine;
|
35
33
|
|
@@ -64,7 +62,7 @@ PingManager::PingManager(const ChannelArgs& channel_args,
|
|
64
62
|
ping_rate_policy_(channel_args, /*is_client=*/true),
|
65
63
|
ping_interface_(std::move(ping_interface)) {}
|
66
64
|
|
67
|
-
void PingManager::TriggerDelayedPing(Duration wait) {
|
65
|
+
void PingManager::TriggerDelayedPing(const Duration wait) {
|
68
66
|
// Spawn at most once.
|
69
67
|
if (delayed_ping_spawned_) {
|
70
68
|
return;
|
@@ -72,8 +70,10 @@ void PingManager::TriggerDelayedPing(Duration wait) {
|
|
72
70
|
delayed_ping_spawned_ = true;
|
73
71
|
GetContext<Party>()->Spawn(
|
74
72
|
"DelayedPing",
|
73
|
+
// TODO(akshitpatel) : [PH2][P2] : Verify if we need a RefCountedPtr for
|
74
|
+
// ping_manager.
|
75
75
|
[this, wait]() mutable {
|
76
|
-
|
76
|
+
GRPC_HTTP2_PING_LOG << "Scheduling delayed ping after wait=" << wait;
|
77
77
|
return AssertResultType<absl::Status>(TrySeq(
|
78
78
|
Sleep(wait),
|
79
79
|
[this]() mutable { return ping_interface_->TriggerWrite(); }));
|
@@ -81,7 +81,7 @@ void PingManager::TriggerDelayedPing(Duration wait) {
|
|
81
81
|
[this](auto) { delayed_ping_spawned_ = false; });
|
82
82
|
}
|
83
83
|
|
84
|
-
bool PingManager::NeedToPing(Duration next_allowed_ping_interval) {
|
84
|
+
bool PingManager::NeedToPing(const Duration next_allowed_ping_interval) {
|
85
85
|
if (!ping_callbacks_.PingRequested()) {
|
86
86
|
return false;
|
87
87
|
}
|
@@ -114,39 +114,75 @@ bool PingManager::NeedToPing(Duration next_allowed_ping_interval) {
|
|
114
114
|
});
|
115
115
|
}
|
116
116
|
|
117
|
-
void PingManager::SpawnTimeout(Duration ping_timeout,
|
117
|
+
void PingManager::SpawnTimeout(const Duration ping_timeout,
|
118
118
|
const uint64_t opaque_data) {
|
119
119
|
GetContext<Party>()->Spawn(
|
120
120
|
"PingTimeout",
|
121
|
+
// TODO(akshitpatel) : [PH2][P2] : Verify if we need a RefCountedPtr for
|
122
|
+
// ping_manager.
|
121
123
|
[this, ping_timeout, opaque_data]() {
|
122
124
|
return AssertResultType<absl::Status>(Race(
|
123
125
|
TrySeq(ping_callbacks_.PingTimeout(ping_timeout),
|
124
|
-
[this, opaque_data]() mutable {
|
125
|
-
|
126
|
-
|
127
|
-
|
126
|
+
[this, opaque_data](bool trigger_ping_timeout) mutable {
|
127
|
+
return If(
|
128
|
+
trigger_ping_timeout,
|
129
|
+
[this, opaque_data]() {
|
130
|
+
GRPC_HTTP2_PING_LOG
|
131
|
+
<< " Ping ack not received for id="
|
132
|
+
<< opaque_data << ". Ping timeout triggered.";
|
133
|
+
return ping_interface_->PingTimeout();
|
134
|
+
},
|
135
|
+
[]() { return absl::OkStatus(); });
|
128
136
|
}),
|
129
137
|
ping_callbacks_.WaitForPingAck()));
|
130
138
|
},
|
131
139
|
[](auto) {});
|
132
140
|
}
|
133
141
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
142
|
+
void PingManager::MaybeGetSerializedPingFrames(
|
143
|
+
SliceBuffer& output_buffer, const Duration next_allowed_ping_interval) {
|
144
|
+
GRPC_HTTP2_PING_LOG << "PingManager MaybeGetSerializedPingFrames "
|
145
|
+
"pending_ping_acks_ size: "
|
146
|
+
<< pending_ping_acks_.size()
|
147
|
+
<< " next_allowed_ping_interval: "
|
148
|
+
<< next_allowed_ping_interval;
|
149
|
+
DCHECK(!opaque_data_.has_value());
|
150
|
+
std::vector<Http2Frame> frames;
|
151
|
+
frames.reserve(pending_ping_acks_.size() + 1); // +1 for the ping frame.
|
152
|
+
|
153
|
+
// Get the serialized ping acks if needed.
|
154
|
+
for (uint64_t opaque_data : pending_ping_acks_) {
|
155
|
+
frames.emplace_back(GetHttp2PingFrame(/*ack=*/true, opaque_data));
|
156
|
+
}
|
157
|
+
pending_ping_acks_.clear();
|
158
|
+
|
159
|
+
// Get the serialized ping frame if needed.
|
160
|
+
if (NeedToPing(next_allowed_ping_interval)) {
|
161
|
+
const uint64_t opaque_data = ping_callbacks_.StartPing();
|
162
|
+
frames.emplace_back(GetHttp2PingFrame(/*ack=*/false, opaque_data));
|
163
|
+
opaque_data_ = opaque_data;
|
164
|
+
GRPC_HTTP2_PING_LOG << "Created ping frame for id= " << opaque_data;
|
165
|
+
}
|
166
|
+
|
167
|
+
// Serialize the frames if any.
|
168
|
+
if (!frames.empty()) {
|
169
|
+
Serialize(absl::Span<Http2Frame>(frames), output_buffer);
|
170
|
+
}
|
150
171
|
}
|
172
|
+
|
173
|
+
void PingManager::NotifyPingSent(const Duration ping_timeout) {
|
174
|
+
if (opaque_data_.has_value()) {
|
175
|
+
SpawnTimeout(ping_timeout, opaque_data_.value());
|
176
|
+
SentPing();
|
177
|
+
opaque_data_.reset();
|
178
|
+
}
|
179
|
+
}
|
180
|
+
|
181
|
+
void PingManager::AddPendingPingAck(const uint64_t opaque_data) {
|
182
|
+
GRPC_HTTP2_PING_LOG << "Adding pending ping ack for id=" << opaque_data
|
183
|
+
<< " to the list of pending ping acks.";
|
184
|
+
pending_ping_acks_.push_back(opaque_data);
|
185
|
+
}
|
186
|
+
|
151
187
|
} // namespace http2
|
152
188
|
} // namespace grpc_core
|
@@ -20,12 +20,15 @@
|
|
20
20
|
|
21
21
|
#include <memory>
|
22
22
|
|
23
|
+
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
23
24
|
#include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
|
24
25
|
#include "src/core/ext/transport/chttp2/transport/ping_callbacks.h"
|
25
26
|
#include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
|
27
|
+
#include "src/core/lib/promise/if.h"
|
26
28
|
#include "src/core/lib/promise/inter_activity_latch.h"
|
27
29
|
#include "src/core/lib/promise/map.h"
|
28
30
|
#include "src/core/lib/promise/promise.h"
|
31
|
+
#include "src/core/lib/slice/slice_buffer.h"
|
29
32
|
#include "src/core/util/shared_bit_gen.h"
|
30
33
|
#include "src/core/util/time.h"
|
31
34
|
|
@@ -55,17 +58,6 @@ namespace http2 {
|
|
55
58
|
|
56
59
|
class PingInterface {
|
57
60
|
public:
|
58
|
-
struct SendPingArgs {
|
59
|
-
bool ack = false;
|
60
|
-
// RFC9113: PING frames MUST contain 8 octets of opaque data in the frame
|
61
|
-
// payload. A sender can include any value it chooses and use those octets
|
62
|
-
// in any fashion.
|
63
|
-
uint64_t opaque_data = 0;
|
64
|
-
};
|
65
|
-
|
66
|
-
// Returns a promise that creates and sends a ping frame to the peer.
|
67
|
-
virtual Promise<absl::Status> SendPing(SendPingArgs args) = 0;
|
68
|
-
|
69
61
|
// Returns a promise that triggers a write cycle on the transport.
|
70
62
|
virtual Promise<absl::Status> TriggerWrite() = 0;
|
71
63
|
|
@@ -84,11 +76,14 @@ class PingManager {
|
|
84
76
|
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
|
85
77
|
event_engine);
|
86
78
|
|
87
|
-
//
|
88
|
-
//
|
89
|
-
|
90
|
-
|
91
|
-
|
79
|
+
// If there are any pending ping requests or ping acks, populates the output
|
80
|
+
// buffer with the serialized ping frames.
|
81
|
+
void MaybeGetSerializedPingFrames(SliceBuffer& output_buf,
|
82
|
+
Duration next_allowed_ping_interval);
|
83
|
+
|
84
|
+
// Notify the ping system that a ping has been sent. This will spawn a ping
|
85
|
+
// timeout promise.
|
86
|
+
void NotifyPingSent(Duration ping_timeout);
|
92
87
|
|
93
88
|
// Ping Rate policy wrapper
|
94
89
|
void ReceivedDataFrame() { ping_rate_policy_.ReceivedDataFrame(); }
|
@@ -131,6 +126,26 @@ class PingManager {
|
|
131
126
|
bool AckPing(uint64_t id) { return ping_callbacks_.AckPing(id); }
|
132
127
|
size_t CountPingInflight() { return ping_callbacks_.CountPingInflight(); }
|
133
128
|
|
129
|
+
Http2Frame GetHttp2PingFrame(uint64_t opaque_data) {
|
130
|
+
return Http2PingFrame{/*ack=*/false, opaque_data};
|
131
|
+
}
|
132
|
+
|
133
|
+
std::optional<uint64_t> TestOnlyMaybeGetSerializedPingFrames(
|
134
|
+
SliceBuffer& output_buffer, Duration next_allowed_ping_interval) {
|
135
|
+
DCHECK(!opaque_data_.has_value());
|
136
|
+
if (NeedToPing(next_allowed_ping_interval)) {
|
137
|
+
uint64_t opaque_data = ping_callbacks_.StartPing();
|
138
|
+
Http2Frame frame = GetHttp2PingFrame(/*ack*/ false, opaque_data);
|
139
|
+
Serialize(absl::Span<Http2Frame>(&frame, 1), output_buffer);
|
140
|
+
opaque_data_ = opaque_data;
|
141
|
+
return opaque_data;
|
142
|
+
}
|
143
|
+
|
144
|
+
return std::nullopt;
|
145
|
+
}
|
146
|
+
|
147
|
+
void AddPendingPingAck(uint64_t opaque_data);
|
148
|
+
|
134
149
|
private:
|
135
150
|
class PingPromiseCallbacks {
|
136
151
|
public:
|
@@ -160,12 +175,27 @@ class PingManager {
|
|
160
175
|
std::shared_ptr<InterActivityLatch<void>> latch =
|
161
176
|
std::make_shared<InterActivityLatch<void>>();
|
162
177
|
auto timeout_cb = [latch]() { latch->Set(); };
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
178
|
+
std::optional<uint64_t> id = ping_callbacks_.OnPingTimeout(
|
179
|
+
ping_timeout, event_engine_.get(), std::move(timeout_cb));
|
180
|
+
|
181
|
+
return AssertResultType<bool>(If(
|
182
|
+
// The scenario where OnPingTimeout returns an invalid id is when
|
183
|
+
// the ping ack is received before spawning the ping timeout.
|
184
|
+
// In such a case, we don't wait for the ping timeout.
|
185
|
+
id.has_value(),
|
186
|
+
[latch, id, ping_timeout]() {
|
187
|
+
VLOG(2) << "Ping timeout of duration: " << ping_timeout
|
188
|
+
<< " initiated for ping id: " << *id;
|
189
|
+
return Map(latch->Wait(), [latch](Empty) {
|
190
|
+
return /*trigger_ping_timeout*/ true;
|
191
|
+
});
|
192
|
+
},
|
193
|
+
[]() {
|
194
|
+
// This happens if for some reason the ping ack is received before
|
195
|
+
// the timeout timer is spawned.
|
196
|
+
VLOG(2) << "Ping ack received. Not waiting for ping timeout.";
|
197
|
+
return /*trigger_ping_timeout*/ false;
|
198
|
+
}));
|
169
199
|
}
|
170
200
|
|
171
201
|
private:
|
@@ -179,11 +209,17 @@ class PingManager {
|
|
179
209
|
bool important_ping_requested_ = false;
|
180
210
|
};
|
181
211
|
|
212
|
+
Http2Frame GetHttp2PingFrame(bool ack, uint64_t opaque_data) {
|
213
|
+
return Http2PingFrame{ack, opaque_data};
|
214
|
+
}
|
215
|
+
|
182
216
|
PingPromiseCallbacks ping_callbacks_;
|
183
217
|
Chttp2PingAbusePolicy ping_abuse_policy_;
|
184
218
|
Chttp2PingRatePolicy ping_rate_policy_;
|
185
219
|
bool delayed_ping_spawned_ = false;
|
220
|
+
std::optional<uint64_t> opaque_data_;
|
186
221
|
std::unique_ptr<PingInterface> ping_interface_;
|
222
|
+
std::vector<uint64_t> pending_ping_acks_;
|
187
223
|
|
188
224
|
void TriggerDelayedPing(Duration wait);
|
189
225
|
bool NeedToPing(Duration next_allowed_ping_interval);
|
@@ -0,0 +1,207 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2025 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_H
|
20
|
+
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_H
|
21
|
+
|
22
|
+
#include "src/core/call/call_spine.h"
|
23
|
+
#include "src/core/ext/transport/chttp2/transport/flow_control.h"
|
24
|
+
#include "src/core/ext/transport/chttp2/transport/http2_transport.h"
|
25
|
+
#include "src/core/ext/transport/chttp2/transport/stream_data_queue.h"
|
26
|
+
#include "src/core/util/ref_counted_ptr.h"
|
27
|
+
|
28
|
+
namespace grpc_core {
|
29
|
+
namespace http2 {
|
30
|
+
|
31
|
+
// Managing the streams
|
32
|
+
struct Stream : public RefCounted<Stream> {
|
33
|
+
explicit Stream(CallHandler call, const uint32_t stream_id1,
|
34
|
+
bool allow_true_binary_metadata_peer,
|
35
|
+
bool allow_true_binary_metadata_acked,
|
36
|
+
chttp2::TransportFlowControl& transport_flow_control)
|
37
|
+
: call(std::move(call)),
|
38
|
+
is_write_closed(false),
|
39
|
+
stream_state(HttpStreamState::kIdle),
|
40
|
+
stream_id(stream_id1),
|
41
|
+
header_assembler(stream_id1, allow_true_binary_metadata_acked),
|
42
|
+
did_push_initial_metadata(false),
|
43
|
+
did_push_trailing_metadata(false),
|
44
|
+
data_queue(MakeRefCounted<StreamDataQueue<ClientMetadataHandle>>(
|
45
|
+
/*is_client*/ true, /*stream_id*/ stream_id1,
|
46
|
+
/*queue_size*/ kStreamQueueSize, allow_true_binary_metadata_peer)),
|
47
|
+
flow_control(&transport_flow_control) {}
|
48
|
+
|
49
|
+
////////////////////////////////////////////////////////////////////////////
|
50
|
+
// Data Queue Helpers
|
51
|
+
// All enqueue methods are called from the call party.
|
52
|
+
|
53
|
+
auto EnqueueInitialMetadata(ClientMetadataHandle&& metadata) {
|
54
|
+
GRPC_HTTP2_CLIENT_DLOG
|
55
|
+
<< "Http2ClientTransport::Stream::EnqueueInitialMetadata stream_id="
|
56
|
+
<< stream_id;
|
57
|
+
return data_queue->EnqueueInitialMetadata(std::move(metadata));
|
58
|
+
}
|
59
|
+
|
60
|
+
auto EnqueueTrailingMetadata(ClientMetadataHandle&& metadata) {
|
61
|
+
GRPC_HTTP2_CLIENT_DLOG
|
62
|
+
<< "Http2ClientTransport::Stream::EnqueueTrailingMetadata stream_id="
|
63
|
+
<< stream_id;
|
64
|
+
return data_queue->EnqueueTrailingMetadata(std::move(metadata));
|
65
|
+
}
|
66
|
+
|
67
|
+
auto EnqueueMessage(MessageHandle&& message) {
|
68
|
+
GRPC_HTTP2_CLIENT_DLOG
|
69
|
+
<< "Http2ClientTransport::Stream::EnqueueMessage stream_id="
|
70
|
+
<< stream_id << " with payload size = " << message->payload()->Length();
|
71
|
+
return data_queue->EnqueueMessage(std::move(message));
|
72
|
+
}
|
73
|
+
|
74
|
+
auto EnqueueHalfClosed() {
|
75
|
+
GRPC_HTTP2_CLIENT_DLOG
|
76
|
+
<< "Http2ClientTransport::Stream::EnqueueHalfClosed stream_id="
|
77
|
+
<< stream_id;
|
78
|
+
return data_queue->EnqueueHalfClosed();
|
79
|
+
}
|
80
|
+
|
81
|
+
auto EnqueueResetStream(const uint32_t error_code) {
|
82
|
+
GRPC_HTTP2_CLIENT_DLOG
|
83
|
+
<< "Http2ClientTransport::Stream::EnqueueResetStream stream_id="
|
84
|
+
<< stream_id << " with error_code = " << error_code;
|
85
|
+
return data_queue->EnqueueResetStream(error_code);
|
86
|
+
}
|
87
|
+
|
88
|
+
// Called from the transport party
|
89
|
+
auto DequeueFrames(const uint32_t transport_tokens,
|
90
|
+
const uint32_t max_frame_length,
|
91
|
+
HPackCompressor& encoder) {
|
92
|
+
HttpStreamState state = GetStreamState();
|
93
|
+
// Reset stream MUST not be sent if the stream is idle or closed.
|
94
|
+
return data_queue->DequeueFrames(transport_tokens, max_frame_length,
|
95
|
+
encoder,
|
96
|
+
/*can_send_reset_stream=*/
|
97
|
+
!(state == HttpStreamState::kIdle ||
|
98
|
+
state == HttpStreamState::kClosed));
|
99
|
+
}
|
100
|
+
|
101
|
+
////////////////////////////////////////////////////////////////////////////
|
102
|
+
// Stream State Management
|
103
|
+
// All state management helpers MUST be called from the transport party.
|
104
|
+
|
105
|
+
// Modify the stream state
|
106
|
+
// The possible stream transitions are as follows:
|
107
|
+
// kIdle -> kOpen
|
108
|
+
// kOpen -> kClosed/kHalfClosedLocal/kHalfClosedRemote
|
109
|
+
// kHalfClosedLocal/kHalfClosedRemote -> kClosed
|
110
|
+
// kClosed -> kClosed
|
111
|
+
void SentInitialMetadata() {
|
112
|
+
GRPC_DCHECK(stream_state == HttpStreamState::kIdle);
|
113
|
+
stream_state = HttpStreamState::kOpen;
|
114
|
+
}
|
115
|
+
|
116
|
+
void MarkHalfClosedLocal() {
|
117
|
+
switch (stream_state) {
|
118
|
+
case HttpStreamState::kIdle:
|
119
|
+
GRPC_DCHECK(false) << "MarkHalfClosedLocal called for an idle stream";
|
120
|
+
break;
|
121
|
+
case HttpStreamState::kOpen:
|
122
|
+
GRPC_HTTP2_CLIENT_DLOG
|
123
|
+
<< "Http2ClientTransport::Stream::MarkHalfClosedLocal stream_id="
|
124
|
+
<< stream_id << " transitioning to kHalfClosedLocal";
|
125
|
+
stream_state = HttpStreamState::kHalfClosedLocal;
|
126
|
+
break;
|
127
|
+
case HttpStreamState::kHalfClosedRemote:
|
128
|
+
GRPC_HTTP2_CLIENT_DLOG
|
129
|
+
<< "Http2ClientTransport::Stream::MarkHalfClosedLocal stream_id="
|
130
|
+
<< stream_id << " transitioning to kClosed";
|
131
|
+
stream_state = HttpStreamState::kClosed;
|
132
|
+
break;
|
133
|
+
case HttpStreamState::kHalfClosedLocal:
|
134
|
+
break;
|
135
|
+
case HttpStreamState::kClosed:
|
136
|
+
GRPC_HTTP2_CLIENT_DLOG
|
137
|
+
<< "Http2ClientTransport::Stream::MarkHalfClosedLocal stream_id="
|
138
|
+
<< stream_id << " already closed";
|
139
|
+
break;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
void MarkHalfClosedRemote() {
|
144
|
+
switch (stream_state) {
|
145
|
+
case HttpStreamState::kIdle:
|
146
|
+
GRPC_DCHECK(false) << "MarkHalfClosedRemote called for an idle stream";
|
147
|
+
break;
|
148
|
+
case HttpStreamState::kOpen:
|
149
|
+
GRPC_HTTP2_CLIENT_DLOG
|
150
|
+
<< "Http2ClientTransport::Stream::MarkHalfClosedRemote stream_id="
|
151
|
+
<< stream_id << " transitioning to kHalfClosedRemote";
|
152
|
+
stream_state = HttpStreamState::kHalfClosedRemote;
|
153
|
+
break;
|
154
|
+
case HttpStreamState::kHalfClosedLocal:
|
155
|
+
GRPC_HTTP2_CLIENT_DLOG
|
156
|
+
<< "Http2ClientTransport::Stream::MarkHalfClosedRemote stream_id="
|
157
|
+
<< stream_id << " transitioning to kClosed";
|
158
|
+
stream_state = HttpStreamState::kClosed;
|
159
|
+
break;
|
160
|
+
case HttpStreamState::kHalfClosedRemote:
|
161
|
+
break;
|
162
|
+
case HttpStreamState::kClosed:
|
163
|
+
GRPC_HTTP2_CLIENT_DLOG
|
164
|
+
<< "Http2ClientTransport::Stream::MarkHalfClosedRemote stream_id="
|
165
|
+
<< stream_id << " already closed";
|
166
|
+
break;
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
170
|
+
inline HttpStreamState GetStreamState() const { return stream_state; }
|
171
|
+
inline uint32_t GetStreamId() const { return stream_id; }
|
172
|
+
|
173
|
+
inline bool IsClosedForWrites() const { return is_write_closed; }
|
174
|
+
inline void SetWriteClosed() { is_write_closed = true; }
|
175
|
+
|
176
|
+
CallHandler call;
|
177
|
+
// This flag is kept separate from the stream_state as the stream_state
|
178
|
+
// is inline with the HTTP2 spec, whereas this flag is an implementation
|
179
|
+
// detail of the PH2 transport. As far as PH2 is concerned, if a stream is
|
180
|
+
// closed for writes, it will not send any more frames on that stream.
|
181
|
+
// Similarly if a stream is closed for reads(this is achieved by removing the
|
182
|
+
// stream from the transport map), then all the frames read on that stream
|
183
|
+
// will be dropped.
|
184
|
+
bool is_write_closed;
|
185
|
+
// This MUST be accessed from the transport party.
|
186
|
+
HttpStreamState stream_state;
|
187
|
+
const uint32_t stream_id;
|
188
|
+
GrpcMessageAssembler assembler;
|
189
|
+
HeaderAssembler header_assembler;
|
190
|
+
// TODO(akshitpatel) : [PH2][P2] : StreamQ should maintain a flag that
|
191
|
+
// tracks if the half close has been sent for this stream. This flag is used
|
192
|
+
// to notify the mixer that this stream is closed for
|
193
|
+
// writes(HalfClosedLocal). When the mixer dequeues the last message for
|
194
|
+
// the streamQ, it will mark the stream as closed for writes and send a
|
195
|
+
// frame with end_stream or set the end_stream flag in the last data
|
196
|
+
// frame being sent out. This is done as the stream state should not
|
197
|
+
// transition to HalfClosedLocal till the end_stream frame is sent.
|
198
|
+
bool did_push_initial_metadata;
|
199
|
+
bool did_push_trailing_metadata;
|
200
|
+
RefCountedPtr<StreamDataQueue<ClientMetadataHandle>> data_queue;
|
201
|
+
chttp2::StreamFlowControl flow_control;
|
202
|
+
};
|
203
|
+
|
204
|
+
} // namespace http2
|
205
|
+
} // namespace grpc_core
|
206
|
+
|
207
|
+
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_H
|