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
@@ -20,13 +20,13 @@
|
|
20
20
|
|
21
21
|
#include <grpc/support/port_platform.h>
|
22
22
|
|
23
|
-
#include "absl/log/check.h"
|
24
23
|
#include "absl/log/log.h"
|
25
24
|
#include "src/core/ext/transport/chttp2/transport/internal.h"
|
26
25
|
#include "src/core/ext/transport/chttp2/transport/legacy_frame.h"
|
27
26
|
#include "src/core/lib/debug/trace.h"
|
28
27
|
#include "src/core/lib/experiments/experiments.h"
|
29
28
|
#include "src/core/util/bitset.h"
|
29
|
+
#include "src/core/util/grpc_check.h"
|
30
30
|
|
31
31
|
static const char* stream_list_id_string(grpc_chttp2_stream_list_id id) {
|
32
32
|
switch (id) {
|
@@ -59,7 +59,7 @@ static bool stream_list_pop(grpc_chttp2_transport* t,
|
|
59
59
|
grpc_chttp2_stream* s = t->lists[id].head;
|
60
60
|
if (s) {
|
61
61
|
grpc_chttp2_stream* new_head = s->links[id].next;
|
62
|
-
|
62
|
+
GRPC_CHECK(s->included.is_set(id));
|
63
63
|
if (new_head) {
|
64
64
|
t->lists[id].head = new_head;
|
65
65
|
new_head->links[id].prev = nullptr;
|
@@ -79,12 +79,12 @@ static bool stream_list_pop(grpc_chttp2_transport* t,
|
|
79
79
|
|
80
80
|
static void stream_list_remove(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
81
81
|
grpc_chttp2_stream_list_id id) {
|
82
|
-
|
82
|
+
GRPC_CHECK(s->included.is_set(id));
|
83
83
|
s->included.clear(id);
|
84
84
|
if (s->links[id].prev) {
|
85
85
|
s->links[id].prev->links[id].next = s->links[id].next;
|
86
86
|
} else {
|
87
|
-
|
87
|
+
GRPC_CHECK(t->lists[id].head == s);
|
88
88
|
t->lists[id].head = s->links[id].next;
|
89
89
|
}
|
90
90
|
if (s->links[id].next) {
|
@@ -112,7 +112,7 @@ static void stream_list_add_tail(grpc_chttp2_transport* t,
|
|
112
112
|
grpc_chttp2_stream* s,
|
113
113
|
grpc_chttp2_stream_list_id id) {
|
114
114
|
grpc_chttp2_stream* old_tail;
|
115
|
-
|
115
|
+
GRPC_CHECK(!s->included.is_set(id));
|
116
116
|
old_tail = t->lists[id].tail;
|
117
117
|
s->links[id].next = nullptr;
|
118
118
|
s->links[id].prev = old_tail;
|
@@ -132,7 +132,7 @@ static void stream_list_add_head(grpc_chttp2_transport* t,
|
|
132
132
|
grpc_chttp2_stream* s,
|
133
133
|
grpc_chttp2_stream_list_id id) {
|
134
134
|
grpc_chttp2_stream* old_head;
|
135
|
-
|
135
|
+
GRPC_CHECK(!s->included.is_set(id));
|
136
136
|
old_head = t->lists[id].head;
|
137
137
|
s->links[id].next = old_head;
|
138
138
|
s->links[id].prev = nullptr;
|
@@ -170,7 +170,7 @@ static bool stream_list_prepend(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
|
170
170
|
|
171
171
|
bool grpc_chttp2_list_add_writable_stream(grpc_chttp2_transport* t,
|
172
172
|
grpc_chttp2_stream* s) {
|
173
|
-
|
173
|
+
GRPC_CHECK_NE(s->id, 0u);
|
174
174
|
if (grpc_core::IsPrioritizeFinishedRequestsEnabled() &&
|
175
175
|
s->send_trailing_metadata != nullptr) {
|
176
176
|
return stream_list_prepend(t, s, GRPC_CHTTP2_LIST_WRITABLE);
|
@@ -16,4 +16,20 @@
|
|
16
16
|
//
|
17
17
|
//
|
18
18
|
|
19
|
-
|
19
|
+
#include "src/core/ext/transport/chttp2/transport/transport_common.h"
|
20
|
+
|
21
|
+
#include <cstdint>
|
22
|
+
|
23
|
+
#include "absl/random/random.h"
|
24
|
+
#include "src/core/util/shared_bit_gen.h"
|
25
|
+
#include "src/core/util/time.h"
|
26
|
+
|
27
|
+
namespace grpc_core {
|
28
|
+
|
29
|
+
Duration TarpitDuration(const int min_tarpit_duration_ms,
|
30
|
+
const int max_tarpit_duration_ms) {
|
31
|
+
return Duration::Milliseconds(absl::LogUniform<int>(
|
32
|
+
SharedBitGen(), min_tarpit_duration_ms, max_tarpit_duration_ms));
|
33
|
+
}
|
34
|
+
|
35
|
+
} // namespace grpc_core
|
@@ -19,9 +19,61 @@
|
|
19
19
|
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_TRANSPORT_COMMON_H
|
20
20
|
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_TRANSPORT_COMMON_H
|
21
21
|
|
22
|
+
#include <cstdint>
|
23
|
+
|
24
|
+
#include "src/core/util/time.h"
|
25
|
+
|
22
26
|
// For an HTTP2 connection, this must be sent before the settings frame is sent.
|
23
27
|
#define GRPC_CHTTP2_CLIENT_CONNECT_STRING "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
|
24
28
|
#define GRPC_CHTTP2_CLIENT_CONNECT_STRLEN \
|
25
29
|
(sizeof(GRPC_CHTTP2_CLIENT_CONNECT_STRING) - 1)
|
26
30
|
|
31
|
+
// EXPERIMENTAL: control tarpitting in chttp2
|
32
|
+
#define GRPC_ARG_HTTP_ALLOW_TARPIT "grpc.http.tarpit"
|
33
|
+
#define GRPC_ARG_HTTP_TARPIT_MIN_DURATION_MS "grpc.http.tarpit_min_duration_ms"
|
34
|
+
#define GRPC_ARG_HTTP_TARPIT_MAX_DURATION_MS "grpc.http.tarpit_max_duration_ms"
|
35
|
+
|
36
|
+
// EXPERIMENTAL: provide protection against overloading a server with too many
|
37
|
+
// requests: wait for streams to be deallocated before they stop counting
|
38
|
+
// against MAX_CONCURRENT_STREAMS
|
39
|
+
#define GRPC_ARG_MAX_CONCURRENT_STREAMS_OVERLOAD_PROTECTION \
|
40
|
+
"grpc.http.overload_protection"
|
41
|
+
|
42
|
+
// EXPERIMENTAL: Fail requests at the client if the client is over max
|
43
|
+
// concurrent streams, so they may be retried elsewhere.
|
44
|
+
#define GRPC_ARG_MAX_CONCURRENT_STREAMS_REJECT_ON_CLIENT \
|
45
|
+
"grpc.http.max_concurrent_streams_reject_on_client"
|
46
|
+
|
47
|
+
namespace grpc_core {
|
48
|
+
|
49
|
+
Duration TarpitDuration(int min_tarpit_duration_ms, int max_tarpit_duration_ms);
|
50
|
+
|
51
|
+
namespace http2 {
|
52
|
+
enum class WritableStreamPriority : uint8_t {
|
53
|
+
// Highest priority
|
54
|
+
kStreamClosed = 0,
|
55
|
+
kWaitForTransportFlowControl,
|
56
|
+
// Lowest Priority
|
57
|
+
kDefault,
|
58
|
+
kLastPriority
|
59
|
+
};
|
60
|
+
|
61
|
+
// Debug helper function to convert a WritableStreamPriority to a string.
|
62
|
+
inline std::string GetWritableStreamPriorityString(
|
63
|
+
const WritableStreamPriority priority) {
|
64
|
+
switch (priority) {
|
65
|
+
case WritableStreamPriority::kStreamClosed:
|
66
|
+
return "StreamClosed";
|
67
|
+
case WritableStreamPriority::kWaitForTransportFlowControl:
|
68
|
+
return "WaitForTransportFlowControl";
|
69
|
+
case WritableStreamPriority::kDefault:
|
70
|
+
return "Default";
|
71
|
+
default:
|
72
|
+
return "unknown";
|
73
|
+
}
|
74
|
+
}
|
75
|
+
} // namespace http2
|
76
|
+
|
77
|
+
} // namespace grpc_core
|
78
|
+
|
27
79
|
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_TRANSPORT_COMMON_H
|
@@ -23,7 +23,7 @@
|
|
23
23
|
#include <stdint.h>
|
24
24
|
#include <stdlib.h>
|
25
25
|
|
26
|
-
#include "
|
26
|
+
#include "src/core/util/grpc_check.h"
|
27
27
|
|
28
28
|
// Helpers for hpack varint encoding
|
29
29
|
|
@@ -49,7 +49,7 @@ class VarintWriter {
|
|
49
49
|
explicit VarintWriter(size_t value)
|
50
50
|
: value_(value),
|
51
51
|
length_(value < kMaxInPrefix ? 1 : VarintLength(value - kMaxInPrefix)) {
|
52
|
-
|
52
|
+
GRPC_CHECK(value <= UINT32_MAX);
|
53
53
|
}
|
54
54
|
|
55
55
|
size_t value() const { return value_; }
|
@@ -21,28 +21,42 @@
|
|
21
21
|
|
22
22
|
#include <queue>
|
23
23
|
|
24
|
-
#include "absl/log/check.h"
|
25
24
|
#include "absl/log/log.h"
|
25
|
+
#include "src/core/ext/transport/chttp2/transport/transport_common.h"
|
26
26
|
#include "src/core/lib/promise/if.h"
|
27
27
|
#include "src/core/lib/promise/mpsc.h"
|
28
28
|
#include "src/core/lib/promise/race.h"
|
29
29
|
#include "src/core/lib/promise/try_seq.h"
|
30
|
+
#include "src/core/util/grpc_check.h"
|
30
31
|
|
31
32
|
namespace grpc_core {
|
32
33
|
namespace http2 {
|
33
34
|
|
35
|
+
namespace writable_streams_internal {
|
36
|
+
template <typename StreamPtr, typename = void>
|
37
|
+
struct HasGetStreamId {
|
38
|
+
static constexpr bool value = false;
|
39
|
+
};
|
40
|
+
|
41
|
+
template <typename StreamPtr>
|
42
|
+
struct HasGetStreamId<
|
43
|
+
StreamPtr,
|
44
|
+
absl::void_t<decltype(std::declval<StreamPtr>()->GetStreamId())>> {
|
45
|
+
static constexpr bool value =
|
46
|
+
std::is_same_v<decltype(std::declval<StreamPtr>()->GetStreamId()),
|
47
|
+
uint32_t>;
|
48
|
+
};
|
49
|
+
|
50
|
+
} // namespace writable_streams_internal
|
51
|
+
|
34
52
|
#define GRPC_WRITABLE_STREAMS_DEBUG VLOG(2)
|
35
53
|
|
54
|
+
template <typename StreamPtr>
|
36
55
|
class WritableStreams {
|
56
|
+
static_assert(writable_streams_internal::HasGetStreamId<StreamPtr>::value,
|
57
|
+
"StreamPtr must have a GetStreamId() function");
|
58
|
+
|
37
59
|
public:
|
38
|
-
enum class StreamPriority : uint8_t {
|
39
|
-
// Highest priority
|
40
|
-
kStreamClosed = 0,
|
41
|
-
kWaitForTransportFlowControl,
|
42
|
-
// Lowest Priority
|
43
|
-
kDefault,
|
44
|
-
kLastPriority
|
45
|
-
};
|
46
60
|
explicit WritableStreams(
|
47
61
|
const uint32_t max_queue_size = std::numeric_limits<uint32_t>::max())
|
48
62
|
: queue_(max_queue_size), sender_(queue_.MakeSender()) {}
|
@@ -55,32 +69,35 @@ class WritableStreams {
|
|
55
69
|
|
56
70
|
// Enqueues a stream id with the given priority.
|
57
71
|
// If this returns error, transport MUST be closed.
|
58
|
-
absl::Status Enqueue(const
|
59
|
-
const
|
72
|
+
absl::Status Enqueue(const StreamPtr stream,
|
73
|
+
const WritableStreamPriority priority) {
|
60
74
|
// Streams waiting for transport flow control MUST not be added to list of
|
61
75
|
// writable streams via this API, instead they MUST be added via
|
62
76
|
// BlockedOnTransportFlowControl. The reason being there is no merit in
|
63
77
|
// re-adding the stream to mpsc queue while it can be immediately enqueued
|
64
78
|
// to the prioritized queue.
|
65
|
-
|
79
|
+
GRPC_DCHECK(priority !=
|
80
|
+
WritableStreamPriority::kWaitForTransportFlowControl);
|
66
81
|
StatusFlag status = sender_.UnbufferedImmediateSend(
|
67
|
-
StreamIDAndPriority{
|
68
|
-
GRPC_WRITABLE_STREAMS_DEBUG
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
82
|
+
StreamIDAndPriority{stream, priority}, /*tokens*/ 1);
|
83
|
+
GRPC_WRITABLE_STREAMS_DEBUG
|
84
|
+
<< "UnbufferedImmediateEnqueue stream id: " << stream->GetStreamId()
|
85
|
+
<< " with priority " << GetWritableStreamPriorityString(priority)
|
86
|
+
<< " status " << status;
|
87
|
+
|
88
|
+
return (status.ok())
|
89
|
+
? absl::OkStatus()
|
90
|
+
: absl::InternalError(absl::StrCat(
|
91
|
+
"Failed to enqueue stream id: ", stream->GetStreamId()));
|
75
92
|
}
|
76
93
|
|
77
94
|
// A synchronous function to add a stream id to the transport flow control
|
78
95
|
// wait list.
|
79
|
-
absl::Status BlockedOnTransportFlowControl(const
|
80
|
-
prioritized_queue_.Push(
|
81
|
-
|
82
|
-
GRPC_WRITABLE_STREAMS_DEBUG << "BlockedOnTransportFlowControl stream id "
|
83
|
-
<<
|
96
|
+
absl::Status BlockedOnTransportFlowControl(const StreamPtr stream) {
|
97
|
+
prioritized_queue_.Push(
|
98
|
+
stream, WritableStreamPriority::kWaitForTransportFlowControl);
|
99
|
+
GRPC_WRITABLE_STREAMS_DEBUG << "BlockedOnTransportFlowControl stream id: "
|
100
|
+
<< stream->GetStreamId();
|
84
101
|
return absl::OkStatus();
|
85
102
|
}
|
86
103
|
|
@@ -100,29 +117,33 @@ class WritableStreams {
|
|
100
117
|
// prioritized queue.
|
101
118
|
// 6. Return the stream id with the highest priority.
|
102
119
|
// If this returns error, transport MUST be closed.
|
120
|
+
// TODO(akshitpatel) : [PH2][P2] - This will be deprecated in favor of
|
121
|
+
// WaitForReady.
|
103
122
|
auto Next(const bool transport_tokens_available) {
|
104
123
|
// TODO(akshitpatel) : [PH2][P2] - Need to add an immediate dequeue option
|
105
124
|
// for the mpsc queue in favor of the race.
|
106
125
|
|
107
|
-
return AssertResultType<absl::StatusOr<
|
126
|
+
return AssertResultType<absl::StatusOr<StreamPtr>>(TrySeq(
|
108
127
|
// The current MPSC queue does not have a version of NextBatch that
|
109
128
|
// resolves immediately. So we made this Race to ensure that the
|
110
129
|
// "Dequeue" from the mpsc resolves immediately - Either with data , or
|
111
130
|
// empty.
|
112
|
-
Race(
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
131
|
+
Race(
|
132
|
+
queue_.NextBatch(kMaxBatchSize),
|
133
|
+
Immediate(
|
134
|
+
ValueOrFailure<std::vector<std::optional<StreamIDAndPriority>>>(
|
135
|
+
std::vector<std::optional<StreamIDAndPriority>>()))),
|
136
|
+
[this, transport_tokens_available](
|
137
|
+
std::vector<std::optional<StreamIDAndPriority>> batch) {
|
117
138
|
AddToPrioritizedQueue(batch);
|
118
|
-
std::optional<
|
139
|
+
std::optional<StreamPtr> stream =
|
119
140
|
prioritized_queue_.Pop(transport_tokens_available);
|
120
141
|
return If(
|
121
|
-
|
122
|
-
[
|
123
|
-
GRPC_WRITABLE_STREAMS_DEBUG << "Next stream id "
|
124
|
-
<<
|
125
|
-
return
|
142
|
+
stream.has_value(),
|
143
|
+
[stream]() -> absl::StatusOr<StreamPtr> {
|
144
|
+
GRPC_WRITABLE_STREAMS_DEBUG << "Next stream id: "
|
145
|
+
<< (*stream)->GetStreamId();
|
146
|
+
return stream.value();
|
126
147
|
},
|
127
148
|
[this, transport_tokens_available] {
|
128
149
|
GRPC_WRITABLE_STREAMS_DEBUG << "Query queue for next batch";
|
@@ -131,22 +152,24 @@ class WritableStreams {
|
|
131
152
|
// on mpsc queue to get a new batch of stream ids.
|
132
153
|
queue_.NextBatch(kMaxBatchSize),
|
133
154
|
[this, transport_tokens_available](
|
134
|
-
ValueOrFailure<
|
135
|
-
|
155
|
+
ValueOrFailure<
|
156
|
+
std::vector<std::optional<StreamIDAndPriority>>>
|
157
|
+
batch) -> absl::StatusOr<StreamPtr> {
|
136
158
|
if (batch.ok()) {
|
137
159
|
GRPC_WRITABLE_STREAMS_DEBUG << "Next batch size "
|
138
160
|
<< batch.value().size();
|
139
161
|
AddToPrioritizedQueue(batch.value());
|
140
|
-
std::optional<
|
162
|
+
std::optional<StreamPtr> stream =
|
141
163
|
prioritized_queue_.Pop(transport_tokens_available);
|
142
164
|
// TODO(akshitpatel) : [PH2][P4] - This DCHECK should
|
143
165
|
// ideally be fine. But in case if queue_.NextBatch
|
144
166
|
// spuriously returns an empty batch, move to a Loop
|
145
167
|
// to avoid this.
|
146
|
-
|
147
|
-
GRPC_WRITABLE_STREAMS_DEBUG
|
148
|
-
|
149
|
-
|
168
|
+
GRPC_DCHECK(stream.has_value());
|
169
|
+
GRPC_WRITABLE_STREAMS_DEBUG
|
170
|
+
<< "Next stream id: "
|
171
|
+
<< stream.value()->GetStreamId();
|
172
|
+
return stream.value();
|
150
173
|
}
|
151
174
|
return absl::InternalError("Failed to read from queue");
|
152
175
|
});
|
@@ -154,18 +177,55 @@ class WritableStreams {
|
|
154
177
|
}));
|
155
178
|
}
|
156
179
|
|
157
|
-
//
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
180
|
+
// Wait for a stream to be ready to be dequeued. This is a blocking call.
|
181
|
+
// This returns a promise that resolves when there is a writeable stream ready
|
182
|
+
// to be dequeued or ForceReadyForWrite() is called.
|
183
|
+
auto WaitForReady(const bool transport_tokens_available) {
|
184
|
+
return TrySeq(
|
185
|
+
If(
|
186
|
+
PrioritizedQueueHasWritableStreams(transport_tokens_available),
|
187
|
+
[this]() {
|
188
|
+
// TODO(akshitpatel) : [PH2][P3] - This is temporary. Replace with
|
189
|
+
// native MPSC::ImmediateNextBatch.
|
190
|
+
// We already have writable streams in the prioritized queue.
|
191
|
+
// We check for any newly added streams to the un-prioritised
|
192
|
+
// queue. We dequeue to honor the priority of any newly enqueued
|
193
|
+
// streams.
|
194
|
+
return Race(
|
195
|
+
queue_.NextBatch(kMaxBatchSize),
|
196
|
+
Immediate(ValueOrFailure<
|
197
|
+
std::vector<std::optional<StreamIDAndPriority>>>(
|
198
|
+
std::vector<std::optional<StreamIDAndPriority>>())));
|
199
|
+
},
|
200
|
+
// The prioritised queue is empty. So we wait for something to
|
201
|
+
// enter the un-prioritised queue and then dequeue it.
|
202
|
+
[this]() { return queue_.NextBatch(kMaxBatchSize); }),
|
203
|
+
[this](std::vector<std::optional<StreamIDAndPriority>> batch) {
|
204
|
+
AddToPrioritizedQueue(batch);
|
205
|
+
return Empty{};
|
206
|
+
});
|
207
|
+
}
|
208
|
+
|
209
|
+
// Synchronously drain the prioritized queue.
|
210
|
+
std::optional<StreamPtr> ImmediateNext(
|
211
|
+
const bool transport_tokens_available) {
|
212
|
+
return prioritized_queue_.Pop(transport_tokens_available);
|
213
|
+
}
|
214
|
+
|
215
|
+
// Force resolve WaitForReady. This is used to induce a write cycle on the
|
216
|
+
// transport.
|
217
|
+
absl::Status ForceReadyForWrite() {
|
218
|
+
StatusFlag status =
|
219
|
+
sender_.UnbufferedImmediateSend(std::nullopt, /*tokens*/ 1);
|
220
|
+
GRPC_WRITABLE_STREAMS_DEBUG << "ForceReadyForWrite status " << status;
|
221
|
+
return (status.ok()) ? absl::OkStatus()
|
222
|
+
: absl::InternalError(
|
223
|
+
"Failed to enqueue to list of writable streams");
|
224
|
+
}
|
225
|
+
|
226
|
+
bool TestOnlyPriorityQueueHasWritableStreams(
|
227
|
+
const bool transport_tokens_available) const {
|
228
|
+
return !prioritized_queue_.HasNoWritableStreams(transport_tokens_available);
|
169
229
|
}
|
170
230
|
|
171
231
|
private:
|
@@ -176,21 +236,26 @@ class WritableStreams {
|
|
176
236
|
// Pushes a stream id with the given priority to the queue. Sorting is done
|
177
237
|
// based on the priority. If the priority is higher than the max priority,
|
178
238
|
// it will be set to the default priority.
|
179
|
-
void Push(const
|
180
|
-
if (priority >=
|
181
|
-
priority =
|
239
|
+
void Push(const StreamPtr stream, WritableStreamPriority priority) {
|
240
|
+
if (priority >= WritableStreamPriority::kLastPriority) {
|
241
|
+
priority = WritableStreamPriority::kDefault;
|
182
242
|
}
|
183
243
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
244
|
+
total_streams_++;
|
245
|
+
GRPC_WRITABLE_STREAMS_DEBUG
|
246
|
+
<< "Pushing stream id: " << stream->GetStreamId() << " with priority "
|
247
|
+
<< GetWritableStreamPriorityString(priority) << " with total streams "
|
248
|
+
<< total_streams_;
|
249
|
+
buckets_[static_cast<uint8_t>(priority)].push(stream);
|
188
250
|
}
|
189
251
|
|
190
252
|
// Pops a stream id from the queue based on the priority. If the priority is
|
191
253
|
// kWaitForTransportFlowControl, transport_tokens_available is checked to
|
192
254
|
// see if the stream id can be popped.
|
193
|
-
std::optional<
|
255
|
+
std::optional<StreamPtr> Pop(const bool transport_tokens_available) {
|
256
|
+
if (HasNoWritableStreams(transport_tokens_available)) {
|
257
|
+
return std::nullopt;
|
258
|
+
}
|
194
259
|
for (uint8_t i = 0; i < buckets_.size(); ++i) {
|
195
260
|
auto& bucket = buckets_[i];
|
196
261
|
if (!bucket.empty()) {
|
@@ -202,36 +267,73 @@ class WritableStreams {
|
|
202
267
|
continue;
|
203
268
|
}
|
204
269
|
|
205
|
-
|
270
|
+
StreamPtr stream = bucket.front();
|
206
271
|
bucket.pop();
|
272
|
+
total_streams_--;
|
207
273
|
GRPC_WRITABLE_STREAMS_DEBUG
|
208
|
-
<< "Popping stream id " <<
|
209
|
-
<<
|
210
|
-
|
274
|
+
<< "Popping stream id: " << stream->GetStreamId()
|
275
|
+
<< " from priority "
|
276
|
+
<< GetWritableStreamPriorityString(
|
277
|
+
static_cast<WritableStreamPriority>(i))
|
278
|
+
<< " with " << total_streams_ << " streams remaining";
|
279
|
+
return stream;
|
211
280
|
}
|
212
281
|
}
|
213
282
|
return std::nullopt;
|
214
283
|
}
|
215
284
|
|
285
|
+
// Returns true if the queue does not have any stream that can be popped.
|
286
|
+
// If transport_tokens_available is false, streams with priority of
|
287
|
+
// kWaitForTransportFlowControl are not considered.
|
288
|
+
inline bool HasNoWritableStreams(
|
289
|
+
const bool transport_tokens_available) const {
|
290
|
+
return (transport_tokens_available)
|
291
|
+
? (total_streams_ == 0)
|
292
|
+
: (total_streams_ -
|
293
|
+
buckets_[kWaitForTransportFlowControlIndex].size() ==
|
294
|
+
0);
|
295
|
+
}
|
296
|
+
|
216
297
|
static constexpr uint8_t kLastPriority =
|
217
|
-
static_cast<uint8_t>(
|
298
|
+
static_cast<uint8_t>(WritableStreamPriority::kLastPriority);
|
218
299
|
static constexpr uint8_t kWaitForTransportFlowControlIndex =
|
219
|
-
static_cast<uint8_t>(
|
220
|
-
|
300
|
+
static_cast<uint8_t>(
|
301
|
+
WritableStreamPriority::kWaitForTransportFlowControl);
|
302
|
+
std::vector<std::queue<StreamPtr>> buckets_;
|
303
|
+
uint32_t total_streams_ = 0u;
|
221
304
|
};
|
222
305
|
|
223
306
|
struct StreamIDAndPriority {
|
224
|
-
const
|
225
|
-
const
|
307
|
+
const StreamPtr stream;
|
308
|
+
const WritableStreamPriority priority;
|
226
309
|
};
|
227
310
|
|
228
|
-
void AddToPrioritizedQueue(
|
229
|
-
|
230
|
-
|
231
|
-
|
311
|
+
void AddToPrioritizedQueue(
|
312
|
+
const std::vector<std::optional<StreamIDAndPriority>>& batch) {
|
313
|
+
GRPC_WRITABLE_STREAMS_DEBUG << "AddToPrioritizedQueue batch size "
|
314
|
+
<< batch.size();
|
315
|
+
for (const std::optional<StreamIDAndPriority>& stream_id_priority : batch) {
|
316
|
+
// Ignore stream id kInvalidStreamID. These are used to force resolve
|
317
|
+
// WaitForReady().
|
318
|
+
if (!stream_id_priority.has_value()) {
|
319
|
+
GRPC_WRITABLE_STREAMS_DEBUG << "Skipping nullopt from batch";
|
320
|
+
continue;
|
321
|
+
}
|
322
|
+
prioritized_queue_.Push(stream_id_priority->stream,
|
323
|
+
stream_id_priority->priority);
|
232
324
|
}
|
233
325
|
}
|
234
326
|
|
327
|
+
// Returns true if the prioritized queue has any stream that can be popped.
|
328
|
+
bool PrioritizedQueueHasWritableStreams(
|
329
|
+
const bool transport_tokens_available) const {
|
330
|
+
GRPC_WRITABLE_STREAMS_DEBUG
|
331
|
+
<< "PrioritizedQueueHasWritableStreams "
|
332
|
+
<< !prioritized_queue_.HasNoWritableStreams(transport_tokens_available)
|
333
|
+
<< " transport_tokens_available " << transport_tokens_available;
|
334
|
+
return !prioritized_queue_.HasNoWritableStreams(transport_tokens_available);
|
335
|
+
}
|
336
|
+
|
235
337
|
// TODO(akshitpatel) : [PH2][P4] - Verify if this works for large number of
|
236
338
|
// active streams based on the load tests. The reasoning to use max uint32_t
|
237
339
|
// is that even when the streams are dequeued from the queue, the streams
|
@@ -243,8 +345,8 @@ class WritableStreams {
|
|
243
345
|
static constexpr uint32_t kMaxBatchSize =
|
244
346
|
std::numeric_limits<uint32_t>::max();
|
245
347
|
|
246
|
-
MpscReceiver<StreamIDAndPriority
|
247
|
-
MpscSender<StreamIDAndPriority
|
348
|
+
MpscReceiver<std::optional<StreamIDAndPriority>> queue_;
|
349
|
+
MpscSender<std::optional<StreamIDAndPriority>> sender_;
|
248
350
|
PrioritizedQueue prioritized_queue_;
|
249
351
|
};
|
250
352
|
|
@@ -18,14 +18,14 @@
|
|
18
18
|
|
19
19
|
#include <algorithm>
|
20
20
|
|
21
|
-
#include "
|
21
|
+
#include "src/core/util/grpc_check.h"
|
22
22
|
|
23
23
|
namespace grpc_core {
|
24
24
|
|
25
25
|
size_t Chttp2WriteSizePolicy::WriteTargetSize() { return current_target_; }
|
26
26
|
|
27
27
|
void Chttp2WriteSizePolicy::BeginWrite(size_t size) {
|
28
|
-
|
28
|
+
GRPC_CHECK_EQ(experiment_start_time_, Timestamp::InfFuture());
|
29
29
|
if (size < current_target_ * 7 / 10) {
|
30
30
|
// If we were trending fast but stopped getting enough data to verify, then
|
31
31
|
// reset back to the default state.
|
@@ -31,7 +31,6 @@
|
|
31
31
|
#include <utility>
|
32
32
|
|
33
33
|
#include "absl/container/flat_hash_map.h"
|
34
|
-
#include "absl/log/check.h"
|
35
34
|
#include "absl/log/log.h"
|
36
35
|
#include "absl/status/status.h"
|
37
36
|
#include "src/core/call/metadata_batch.h"
|
@@ -69,6 +68,7 @@
|
|
69
68
|
#include "src/core/telemetry/stats.h"
|
70
69
|
#include "src/core/telemetry/stats_data.h"
|
71
70
|
#include "src/core/telemetry/tcp_tracer.h"
|
71
|
+
#include "src/core/util/grpc_check.h"
|
72
72
|
#include "src/core/util/match.h"
|
73
73
|
#include "src/core/util/ref_counted.h"
|
74
74
|
#include "src/core/util/ref_counted_ptr.h"
|
@@ -273,7 +273,7 @@ class WriteContext {
|
|
273
273
|
grpc_core::Http2Frame frame(std::move(*update));
|
274
274
|
Serialize(absl::Span<grpc_core::Http2Frame>(&frame, 1), t_->outbuf);
|
275
275
|
if (t_->keepalive_timeout != grpc_core::Duration::Infinity()) {
|
276
|
-
|
276
|
+
GRPC_CHECK(
|
277
277
|
t_->settings_ack_watchdog ==
|
278
278
|
grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid);
|
279
279
|
// We base settings timeout on keepalive timeout, but double it to allow
|
@@ -293,7 +293,7 @@ class WriteContext {
|
|
293
293
|
// simple writes are queued to qbuf, and flushed here
|
294
294
|
grpc_slice_buffer_move_into(&t_->qbuf, t_->outbuf.c_slice_buffer());
|
295
295
|
t_->num_pending_induced_frames = 0;
|
296
|
-
|
296
|
+
GRPC_CHECK_EQ(t_->qbuf.count, 0u);
|
297
297
|
}
|
298
298
|
|
299
299
|
void FlushWindowUpdates() {
|
@@ -20,7 +20,6 @@
|
|
20
20
|
#include <atomic>
|
21
21
|
#include <memory>
|
22
22
|
|
23
|
-
#include "absl/log/check.h"
|
24
23
|
#include "absl/log/log.h"
|
25
24
|
#include "absl/status/status.h"
|
26
25
|
#include "src/core/call/metadata.h"
|
@@ -36,6 +35,7 @@
|
|
36
35
|
#include "src/core/server/server.h"
|
37
36
|
#include "src/core/util/crash.h"
|
38
37
|
#include "src/core/util/debug_location.h"
|
38
|
+
#include "src/core/util/grpc_check.h"
|
39
39
|
|
40
40
|
namespace grpc_core {
|
41
41
|
|
@@ -35,7 +35,6 @@
|
|
35
35
|
#include <string>
|
36
36
|
#include <utility>
|
37
37
|
|
38
|
-
#include "absl/log/check.h"
|
39
38
|
#include "absl/log/log.h"
|
40
39
|
#include "absl/status/status.h"
|
41
40
|
#include "absl/status/statusor.h"
|
@@ -61,6 +60,7 @@
|
|
61
60
|
#include "src/core/lib/transport/transport.h"
|
62
61
|
#include "src/core/server/server.h"
|
63
62
|
#include "src/core/util/debug_location.h"
|
63
|
+
#include "src/core/util/grpc_check.h"
|
64
64
|
#include "src/core/util/ref_counted_ptr.h"
|
65
65
|
#include "src/core/util/status_helper.h"
|
66
66
|
#include "src/core/util/time.h"
|
@@ -1275,7 +1275,7 @@ grpc_channel* grpc_legacy_inproc_channel_create(grpc_server* server,
|
|
1275
1275
|
auto new_channel = grpc_core::ChannelCreate(
|
1276
1276
|
"inproc", client_args, GRPC_CLIENT_DIRECT_CHANNEL, client_transport);
|
1277
1277
|
if (!new_channel.ok()) {
|
1278
|
-
|
1278
|
+
GRPC_CHECK(!channel);
|
1279
1279
|
LOG(ERROR) << "Failed to create client channel: "
|
1280
1280
|
<< grpc_core::StatusToString(error);
|
1281
1281
|
intptr_t integer;
|
@@ -1293,7 +1293,7 @@ grpc_channel* grpc_legacy_inproc_channel_create(grpc_server* server,
|
|
1293
1293
|
channel = new_channel->release()->c_ptr();
|
1294
1294
|
}
|
1295
1295
|
} else {
|
1296
|
-
|
1296
|
+
GRPC_CHECK(!channel);
|
1297
1297
|
LOG(ERROR) << "Failed to create server channel: "
|
1298
1298
|
<< grpc_core::StatusToString(error);
|
1299
1299
|
intptr_t integer;
|