grpc 1.57.0.pre1 → 1.58.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +534 -284
- data/include/grpc/event_engine/event_engine.h +0 -1
- data/include/grpc/event_engine/memory_allocator.h +2 -2
- data/include/grpc/impl/channel_arg_names.h +371 -0
- data/include/grpc/impl/grpc_types.h +1 -353
- data/include/grpc/module.modulemap +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -1
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +2 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +7 -3
- data/src/core/ext/filters/client_channel/http_proxy.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +10 -5
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +5 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +4 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +115 -109
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.h +0 -5
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +7 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +11 -3
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +8 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +102 -11
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +9 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +4 -1
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_plugin.cc +6 -0
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +41 -14
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +9 -5
- data/src/core/ext/filters/client_channel/subchannel.h +8 -2
- data/src/core/ext/filters/deadline/deadline_filter.cc +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +1 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +1 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +4 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +8 -12
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +357 -358
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -18
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +63 -4
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +7 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +30 -57
- data/src/core/ext/transport/chttp2/transport/parsing.cc +16 -7
- data/src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc +80 -0
- data/src/core/ext/transport/chttp2/transport/ping_abuse_policy.h +55 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +98 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +73 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +81 -89
- data/src/core/ext/transport/inproc/inproc_transport.cc +1 -0
- data/src/core/ext/xds/xds_client_grpc.cc +1 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +1 -2
- data/src/core/ext/xds/xds_http_fault_filter.h +1 -2
- data/src/core/ext/xds/xds_http_filters.h +2 -4
- data/src/core/ext/xds/xds_http_rbac_filter.cc +3 -8
- data/src/core/ext/xds/xds_http_rbac_filter.h +1 -2
- data/src/core/ext/xds/xds_http_stateful_session_filter.cc +1 -2
- data/src/core/ext/xds/xds_http_stateful_session_filter.h +1 -2
- data/src/core/ext/xds/xds_lb_policy_registry.cc +3 -6
- data/src/core/ext/xds/xds_routing.cc +2 -2
- data/src/core/ext/xds/xds_transport_grpc.cc +1 -0
- data/src/core/lib/avl/avl.h +10 -173
- data/src/core/lib/channel/call_tracer.cc +289 -0
- data/src/core/lib/channel/call_tracer.h +35 -0
- data/src/core/lib/channel/channel_args.cc +84 -79
- data/src/core/lib/channel/channel_args.h +29 -17
- data/src/core/lib/channel/connected_channel.cc +0 -1
- data/src/core/lib/channel/promise_based_filter.cc +4 -1
- data/src/core/lib/compression/compression_internal.cc +8 -4
- data/src/core/lib/debug/stats_data.cc +93 -21
- data/src/core/lib/debug/stats_data.h +41 -0
- data/src/core/lib/event_engine/ares_resolver.cc +712 -0
- data/src/core/lib/event_engine/ares_resolver.h +150 -0
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -3
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +229 -0
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +117 -0
- data/src/core/lib/event_engine/forkable.cc +15 -1
- data/src/core/lib/event_engine/forkable.h +15 -0
- data/src/core/lib/event_engine/grpc_polled_fd.h +73 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +25 -3
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +10 -1
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +197 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +47 -1
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +12 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -0
- data/src/core/lib/event_engine/thread_pool/thread_count.cc +58 -0
- data/src/core/lib/event_engine/thread_pool/thread_count.h +161 -0
- data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +7 -0
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +86 -111
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +15 -61
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +3 -4
- data/src/core/lib/experiments/config.cc +14 -0
- data/src/core/lib/experiments/experiments.cc +141 -304
- data/src/core/lib/experiments/experiments.h +16 -17
- data/src/core/lib/gprpp/ref_counted.h +3 -1
- data/src/core/lib/gprpp/ref_counted_string.cc +44 -0
- data/src/core/lib/gprpp/ref_counted_string.h +146 -0
- data/src/core/lib/gprpp/time.h +2 -2
- data/src/core/lib/gprpp/work_serializer.cc +36 -0
- data/src/core/lib/gprpp/work_serializer.h +5 -0
- data/src/core/lib/http/httpcli_security_connector.cc +1 -0
- data/src/core/lib/iomgr/buffer_list.cc +2 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +7 -22
- data/src/core/lib/iomgr/tcp_posix.cc +3 -3
- data/src/core/lib/promise/detail/basic_seq.h +1 -372
- data/src/core/lib/promise/detail/seq_state.h +2076 -0
- data/src/core/lib/promise/seq.h +19 -2
- data/src/core/lib/promise/sleep.h +5 -10
- data/src/core/lib/promise/try_seq.h +34 -2
- data/src/core/lib/resource_quota/api.cc +1 -0
- data/src/core/lib/resource_quota/arena.cc +2 -0
- data/src/core/lib/resource_quota/arena.h +42 -8
- data/src/core/lib/resource_quota/memory_quota.cc +0 -1
- data/src/core/lib/resource_quota/resource_quota.h +1 -0
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/rbac_policy.h +1 -1
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +8 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +17 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +4 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +42 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +4 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +8 -5
- data/src/core/lib/security/transport/security_handshaker.cc +1 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +2 -0
- data/src/core/lib/surface/call.cc +32 -8
- data/src/core/lib/surface/channel.cc +1 -0
- data/src/core/lib/surface/completion_queue.cc +10 -0
- data/src/core/lib/surface/init.cc +1 -0
- data/src/core/lib/surface/server.cc +67 -64
- data/src/core/lib/surface/server.h +1 -15
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/tsi/alts/crypt/aes_gcm.cc +27 -2
- data/src/core/tsi/ssl_transport_security.cc +11 -0
- data/src/ruby/ext/grpc/rb_channel.c +1 -53
- data/src/ruby/lib/grpc/generic/active_call.rb +9 -14
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/test/client.rb +16 -0
- data/src/ruby/spec/generic/rpc_server_spec.rb +3 -3
- data/third_party/abseil-cpp/absl/algorithm/container.h +3 -2
- data/third_party/abseil-cpp/absl/base/attributes.h +58 -5
- data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
- data/third_party/abseil-cpp/absl/base/casts.h +8 -8
- data/third_party/abseil-cpp/absl/base/config.h +89 -106
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +26 -1
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +2 -2
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +50 -39
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +2 -1
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +17 -18
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +32 -3
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +24 -4
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +31 -73
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +9 -8
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -11
- data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +23 -32
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +2 -3
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/policy_checks.h +3 -3
- data/third_party/abseil-cpp/absl/base/prefetch.h +198 -0
- data/third_party/abseil-cpp/absl/container/fixed_array.h +54 -29
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -1
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -2
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +167 -79
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +3 -21
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +46 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -0
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +85 -26
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -18
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +70 -29
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +437 -236
- data/third_party/abseil-cpp/absl/crc/crc32c.h +8 -1
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +14 -8
- data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -35
- data/third_party/abseil-cpp/absl/crc/internal/crc.h +2 -10
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +1 -1
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +1 -1
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +4 -4
- data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +8 -10
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +17 -19
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +8 -8
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +59 -23
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +1 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +43 -19
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -0
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +1 -1
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc +1 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -2
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +16 -15
- data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +1 -1
- data/third_party/abseil-cpp/absl/flags/marshalling.cc +43 -2
- data/third_party/abseil-cpp/absl/flags/marshalling.h +5 -0
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +9 -1
- data/third_party/abseil-cpp/absl/functional/bind_front.h +1 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +3 -3
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +37 -24
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +19 -9
- data/third_party/abseil-cpp/absl/hash/hash.h +7 -4
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +38 -15
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +6 -0
- data/third_party/abseil-cpp/absl/meta/type_traits.h +48 -373
- data/third_party/abseil-cpp/absl/numeric/bits.h +4 -4
- data/third_party/abseil-cpp/absl/numeric/int128.cc +20 -8
- data/third_party/abseil-cpp/absl/numeric/int128.h +36 -39
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +0 -3
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +47 -30
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -3
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/platform.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +4 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +1 -1
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +1 -1
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +4 -0
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +12 -24
- data/third_party/abseil-cpp/absl/status/status.cc +11 -7
- data/third_party/abseil-cpp/absl/status/status.h +11 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +22 -8
- data/third_party/abseil-cpp/absl/strings/ascii.cc +54 -6
- data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -4
- data/third_party/abseil-cpp/absl/strings/charconv.h +2 -2
- data/third_party/abseil-cpp/absl/strings/cord.cc +1 -2
- data/third_party/abseil-cpp/absl/strings/cord.h +32 -5
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +23 -1
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +18 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +2 -5
- data/third_party/abseil-cpp/absl/strings/escaping.cc +10 -32
- data/third_party/abseil-cpp/absl/strings/escaping.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +2 -4
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +0 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +15 -13
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +13 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +8 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +5 -3
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +4 -7
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +8 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +46 -20
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +1 -34
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +23 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +2 -77
- data/third_party/abseil-cpp/absl/strings/internal/memutil.h +4 -112
- data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +10 -31
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -8
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +5 -20
- data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +56 -6
- data/third_party/abseil-cpp/absl/strings/match.cc +87 -0
- data/third_party/abseil-cpp/absl/strings/match.h +19 -0
- data/third_party/abseil-cpp/absl/strings/numbers.cc +154 -122
- data/third_party/abseil-cpp/absl/strings/numbers.h +1 -6
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +7 -50
- data/third_party/abseil-cpp/absl/strings/str_cat.h +83 -15
- data/third_party/abseil-cpp/absl/strings/str_format.h +6 -3
- data/third_party/abseil-cpp/absl/strings/str_split.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/string_view.cc +26 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +5 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +63 -43
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +111 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.h +63 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +11 -7
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +225 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +122 -114
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +12 -8
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +10 -1
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +167 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h +60 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +122 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.h +65 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +91 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.h +56 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +19 -113
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +42 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.h +90 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +151 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.h +70 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +407 -411
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +152 -118
- data/third_party/abseil-cpp/absl/time/clock.cc +6 -7
- data/third_party/abseil-cpp/absl/time/duration.cc +24 -26
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +3 -3
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +8 -6
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +6 -3
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +4 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +4 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +322 -295
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +8 -17
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +51 -33
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +7 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +128 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +5 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +34 -34
- data/third_party/abseil-cpp/absl/time/time.cc +9 -2
- data/third_party/abseil-cpp/absl/time/time.h +115 -15
- data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -52
- data/third_party/abseil-cpp/absl/types/internal/span.h +2 -2
- data/third_party/abseil-cpp/absl/types/internal/variant.h +2 -2
- data/third_party/abseil-cpp/absl/types/optional.h +15 -13
- data/third_party/abseil-cpp/absl/types/span.h +1 -2
- data/third_party/boringssl-with-bazel/err_data.c +15 -14
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +7 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +7 -7
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +7 -3
- data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +5 -5
- data/third_party/boringssl-with-bazel/src/crypto/bio/errno.c +92 -0
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -48
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +11 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/internal.h +16 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +9 -0
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +3 -7
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_fuchsia.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_linux.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.c +93 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +9 -14
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +37 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +38 -19
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +39 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +13 -21
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +6 -23
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +0 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +2 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +11 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +7 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +6 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +22 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +20 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/target.h +50 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -4
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +4 -4
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -0
- metadata +39 -31
- data/src/core/lib/promise/detail/basic_join.h +0 -197
- data/src/core/lib/promise/detail/switch.h +0 -1455
- data/src/core/lib/promise/try_join.h +0 -82
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -403
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +0 -62
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm.c +0 -38
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +0 -31
- data/third_party/re2/util/benchmark.h +0 -156
- data/third_party/re2/util/flags.h +0 -26
- data/third_party/re2/util/malloc_counter.h +0 -19
- data/third_party/re2/util/pcre.cc +0 -1025
- data/third_party/re2/util/pcre.h +0 -681
- data/third_party/re2/util/test.h +0 -50
- data/third_party/upb/upb/mini_table.h +0 -36
- data/third_party/zlib/gzclose.c +0 -25
- data/third_party/zlib/gzlib.c +0 -639
- data/third_party/zlib/gzread.c +0 -650
- data/third_party/zlib/gzwrite.c +0 -677
@@ -33,7 +33,7 @@
|
|
33
33
|
#include <grpc/support/log.h>
|
34
34
|
|
35
35
|
#include "src/core/ext/transport/chttp2/transport/internal.h"
|
36
|
-
#include "src/core/
|
36
|
+
#include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
|
37
37
|
|
38
38
|
grpc_slice grpc_chttp2_ping_create(uint8_t ack, uint64_t opaque_8bytes) {
|
39
39
|
grpc_slice slice = GRPC_SLICE_MALLOC(9 + 8);
|
@@ -94,24 +94,11 @@ grpc_error_handle grpc_chttp2_ping_parser_parse(void* parser,
|
|
94
94
|
grpc_chttp2_ack_ping(t, p->opaque_8bytes);
|
95
95
|
} else {
|
96
96
|
if (!t->is_client) {
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
if (t->keepalive_permit_without_calls == 0 && t->stream_map.empty()) {
|
103
|
-
// According to RFC1122, the interval of TCP Keep-Alive is default to
|
104
|
-
// no less than two hours. When there is no outstanding streams, we
|
105
|
-
// restrict the number of PINGS equivalent to TCP Keep-Alive.
|
106
|
-
next_allowed_ping = t->ping_recv_state.last_ping_recv_time +
|
107
|
-
grpc_core::Duration::Hours(2);
|
108
|
-
}
|
109
|
-
|
110
|
-
if (next_allowed_ping > now) {
|
111
|
-
grpc_chttp2_add_ping_strike(t);
|
97
|
+
const bool transport_idle =
|
98
|
+
t->keepalive_permit_without_calls == 0 && t->stream_map.empty();
|
99
|
+
if (t->ping_abuse_policy.ReceivedOnePing(transport_idle)) {
|
100
|
+
grpc_chttp2_exceeded_ping_strikes(t);
|
112
101
|
}
|
113
|
-
|
114
|
-
t->ping_recv_state.last_ping_recv_time = now;
|
115
102
|
}
|
116
103
|
if (t->ack_pings) {
|
117
104
|
if (t->ping_ack_count == t->ping_ack_capacity) {
|
@@ -44,6 +44,7 @@
|
|
44
44
|
#include "src/core/ext/transport/chttp2/transport/hpack_constants.h"
|
45
45
|
#include "src/core/ext/transport/chttp2/transport/hpack_parse_result.h"
|
46
46
|
#include "src/core/ext/transport/chttp2/transport/hpack_parser_table.h"
|
47
|
+
#include "src/core/lib/channel/call_tracer.h"
|
47
48
|
#include "src/core/lib/debug/stats.h"
|
48
49
|
#include "src/core/lib/debug/stats_data.h"
|
49
50
|
#include "src/core/lib/debug/trace.h"
|
@@ -1069,6 +1070,55 @@ Slice HPackParser::String::Take() {
|
|
1069
1070
|
GPR_UNREACHABLE_CODE(return Slice());
|
1070
1071
|
}
|
1071
1072
|
|
1073
|
+
class HPackParser::MetadataSizeEncoder {
|
1074
|
+
public:
|
1075
|
+
explicit MetadataSizeEncoder(std::string& summary) : summary_(summary) {}
|
1076
|
+
|
1077
|
+
void Encode(const Slice& key, const Slice& value) {
|
1078
|
+
AddToSummary(key.as_string_view(), value.size());
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
template <typename Key, typename Value>
|
1082
|
+
void Encode(Key, const Value& value) {
|
1083
|
+
AddToSummary(Key::key(), EncodedSizeOfKey(Key(), value));
|
1084
|
+
}
|
1085
|
+
|
1086
|
+
private:
|
1087
|
+
void AddToSummary(absl::string_view key,
|
1088
|
+
size_t value_length) GPR_ATTRIBUTE_NOINLINE {
|
1089
|
+
absl::StrAppend(&summary_, key, ":",
|
1090
|
+
hpack_constants::SizeForEntry(key.size(), value_length),
|
1091
|
+
",");
|
1092
|
+
}
|
1093
|
+
std::string& summary_;
|
1094
|
+
};
|
1095
|
+
|
1096
|
+
class HPackParser::MetadataSizesAnnotation
|
1097
|
+
: public CallTracerAnnotationInterface::Annotation {
|
1098
|
+
public:
|
1099
|
+
MetadataSizesAnnotation(grpc_metadata_batch* metadata_buffer,
|
1100
|
+
uint64_t soft_limit, uint64_t hard_limit)
|
1101
|
+
: CallTracerAnnotationInterface::Annotation(
|
1102
|
+
CallTracerAnnotationInterface::AnnotationType::kMetadataSizes),
|
1103
|
+
metadata_buffer_(metadata_buffer),
|
1104
|
+
soft_limit_(soft_limit),
|
1105
|
+
hard_limit_(hard_limit) {}
|
1106
|
+
|
1107
|
+
std::string ToString() const override {
|
1108
|
+
std::string metadata_annotation =
|
1109
|
+
absl::StrCat("gRPC metadata soft_limit:", soft_limit_,
|
1110
|
+
",hard_limit:", hard_limit_, ",");
|
1111
|
+
MetadataSizeEncoder encoder(metadata_annotation);
|
1112
|
+
metadata_buffer_->Encode(&encoder);
|
1113
|
+
return metadata_annotation;
|
1114
|
+
}
|
1115
|
+
|
1116
|
+
private:
|
1117
|
+
grpc_metadata_batch* metadata_buffer_;
|
1118
|
+
uint64_t soft_limit_;
|
1119
|
+
uint64_t hard_limit_;
|
1120
|
+
};
|
1121
|
+
|
1072
1122
|
// PUBLIC INTERFACE
|
1073
1123
|
|
1074
1124
|
HPackParser::HPackParser() = default;
|
@@ -1093,7 +1143,9 @@ void HPackParser::BeginFrame(grpc_metadata_batch* metadata_buffer,
|
|
1093
1143
|
log_info_ = log_info;
|
1094
1144
|
}
|
1095
1145
|
|
1096
|
-
grpc_error_handle HPackParser::Parse(
|
1146
|
+
grpc_error_handle HPackParser::Parse(
|
1147
|
+
const grpc_slice& slice, bool is_last,
|
1148
|
+
CallTracerAnnotationInterface* call_tracer) {
|
1097
1149
|
if (GPR_UNLIKELY(!unparsed_bytes_.empty())) {
|
1098
1150
|
unparsed_bytes_.insert(unparsed_bytes_.end(), GRPC_SLICE_START_PTR(slice),
|
1099
1151
|
GRPC_SLICE_END_PTR(slice));
|
@@ -1105,20 +1157,27 @@ grpc_error_handle HPackParser::Parse(const grpc_slice& slice, bool is_last) {
|
|
1105
1157
|
std::vector<uint8_t> buffer = std::move(unparsed_bytes_);
|
1106
1158
|
return ParseInput(Input(nullptr, buffer.data(),
|
1107
1159
|
buffer.data() + buffer.size(), state_.frame_error),
|
1108
|
-
is_last);
|
1160
|
+
is_last, call_tracer);
|
1109
1161
|
}
|
1110
1162
|
return ParseInput(Input(slice.refcount, GRPC_SLICE_START_PTR(slice),
|
1111
1163
|
GRPC_SLICE_END_PTR(slice), state_.frame_error),
|
1112
|
-
is_last);
|
1164
|
+
is_last, call_tracer);
|
1113
1165
|
}
|
1114
1166
|
|
1115
|
-
grpc_error_handle HPackParser::ParseInput(
|
1167
|
+
grpc_error_handle HPackParser::ParseInput(
|
1168
|
+
Input input, bool is_last, CallTracerAnnotationInterface* call_tracer) {
|
1116
1169
|
ParseInputInner(&input);
|
1117
1170
|
if (is_last && is_boundary()) {
|
1118
1171
|
if (state_.metadata_early_detection.Reject(state_.frame_length)) {
|
1119
1172
|
HandleMetadataSoftSizeLimitExceeded(&input);
|
1120
1173
|
}
|
1121
1174
|
global_stats().IncrementHttp2MetadataSize(state_.frame_length);
|
1175
|
+
if (call_tracer != nullptr && metadata_buffer_ != nullptr) {
|
1176
|
+
MetadataSizesAnnotation metadata_sizes_annotation(
|
1177
|
+
metadata_buffer_, state_.metadata_early_detection.soft_limit(),
|
1178
|
+
state_.metadata_early_detection.hard_limit());
|
1179
|
+
call_tracer->RecordAnnotation(metadata_sizes_annotation);
|
1180
|
+
}
|
1122
1181
|
if (!state_.frame_error.connection_error() &&
|
1123
1182
|
(input.eof_error() || state_.parse_state != ParseState::kTop)) {
|
1124
1183
|
state_.frame_error = HpackParseResult::IncompleteHeaderAtBoundaryError();
|
@@ -40,6 +40,7 @@
|
|
40
40
|
#include "src/core/ext/transport/chttp2/transport/hpack_parse_result.h"
|
41
41
|
#include "src/core/ext/transport/chttp2/transport/hpack_parser_table.h"
|
42
42
|
#include "src/core/lib/backoff/random_early_detection.h"
|
43
|
+
#include "src/core/lib/channel/call_tracer.h"
|
43
44
|
#include "src/core/lib/iomgr/error.h"
|
44
45
|
#include "src/core/lib/slice/slice.h"
|
45
46
|
#include "src/core/lib/slice/slice_refcount.h"
|
@@ -99,7 +100,8 @@ class HPackParser {
|
|
99
100
|
// Start throwing away any received headers after parsing them.
|
100
101
|
void StopBufferingFrame() { metadata_buffer_ = nullptr; }
|
101
102
|
// Parse one slice worth of data
|
102
|
-
grpc_error_handle Parse(const grpc_slice& slice, bool is_last
|
103
|
+
grpc_error_handle Parse(const grpc_slice& slice, bool is_last,
|
104
|
+
CallTracerAnnotationInterface* call_tracer);
|
103
105
|
// Reset state ready for the next BeginFrame
|
104
106
|
void FinishFrame();
|
105
107
|
|
@@ -117,6 +119,8 @@ class HPackParser {
|
|
117
119
|
// Helper classes: see implementation
|
118
120
|
class Parser;
|
119
121
|
class Input;
|
122
|
+
class MetadataSizeEncoder;
|
123
|
+
class MetadataSizesAnnotation;
|
120
124
|
|
121
125
|
// Helper to parse a string and turn it into a slice with appropriate memory
|
122
126
|
// management characteristics
|
@@ -249,7 +253,8 @@ class HPackParser {
|
|
249
253
|
absl::variant<const HPackTable::Memento*, Slice> key;
|
250
254
|
};
|
251
255
|
|
252
|
-
grpc_error_handle ParseInput(Input input, bool is_last
|
256
|
+
grpc_error_handle ParseInput(Input input, bool is_last,
|
257
|
+
CallTracerAnnotationInterface* call_tracer);
|
253
258
|
void ParseInputInner(Input* input);
|
254
259
|
GPR_ATTRIBUTE_NOINLINE
|
255
260
|
void HandleMetadataSoftSizeLimitExceeded(Input* input);
|
@@ -48,6 +48,8 @@
|
|
48
48
|
#include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
|
49
49
|
#include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
|
50
50
|
#include "src/core/ext/transport/chttp2/transport/http2_settings.h"
|
51
|
+
#include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
|
52
|
+
#include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
|
51
53
|
#include "src/core/lib/channel/channel_args.h"
|
52
54
|
#include "src/core/lib/channel/channelz.h"
|
53
55
|
#include "src/core/lib/debug/trace.h"
|
@@ -146,21 +148,14 @@ struct grpc_chttp2_ping_queue {
|
|
146
148
|
grpc_closure_list lists[GRPC_CHTTP2_PCL_COUNT] = {};
|
147
149
|
uint64_t inflight_id = 0;
|
148
150
|
};
|
149
|
-
|
150
|
-
int max_pings_without_data;
|
151
|
-
int max_ping_strikes;
|
152
|
-
grpc_core::Duration min_recv_ping_interval_without_data;
|
153
|
-
};
|
151
|
+
|
154
152
|
struct grpc_chttp2_repeated_ping_state {
|
155
153
|
grpc_core::Timestamp last_ping_sent_time;
|
156
154
|
int pings_before_data_required;
|
157
155
|
absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
|
158
156
|
delayed_ping_timer_handle;
|
159
157
|
};
|
160
|
-
|
161
|
-
grpc_core::Timestamp last_ping_recv_time;
|
162
|
-
int ping_strikes;
|
163
|
-
};
|
158
|
+
|
164
159
|
// deframer state for the overall http2 stream of bytes
|
165
160
|
typedef enum {
|
166
161
|
// prefix: one entry per http2 connection prefix byte
|
@@ -250,6 +245,19 @@ struct grpc_chttp2_transport : public grpc_core::KeepsGrpcInitialized {
|
|
250
245
|
grpc_endpoint* ep, bool is_client);
|
251
246
|
~grpc_chttp2_transport();
|
252
247
|
|
248
|
+
// Make this be able to be contained in RefCountedPtr<>
|
249
|
+
// Can't yet make this derive from RefCounted because we need to keep
|
250
|
+
// `grpc_transport base` first.
|
251
|
+
// TODO(ctiller): Make a transport interface.
|
252
|
+
void IncrementRefCount() { refs.Ref(); }
|
253
|
+
void Unref() {
|
254
|
+
if (refs.Unref()) delete this;
|
255
|
+
}
|
256
|
+
grpc_core::RefCountedPtr<grpc_chttp2_transport> Ref() {
|
257
|
+
IncrementRefCount();
|
258
|
+
return grpc_core::RefCountedPtr<grpc_chttp2_transport>(this);
|
259
|
+
}
|
260
|
+
|
253
261
|
grpc_transport base; // must be first
|
254
262
|
grpc_core::RefCount refs;
|
255
263
|
grpc_endpoint* ep;
|
@@ -343,8 +351,10 @@ struct grpc_chttp2_transport : public grpc_core::KeepsGrpcInitialized {
|
|
343
351
|
|
344
352
|
/// ping queues for various ping insertion points
|
345
353
|
grpc_chttp2_ping_queue ping_queue = grpc_chttp2_ping_queue();
|
346
|
-
|
347
|
-
|
354
|
+
grpc_core::Chttp2PingAbusePolicy ping_abuse_policy;
|
355
|
+
grpc_core::Chttp2PingRatePolicy ping_rate_policy;
|
356
|
+
absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
|
357
|
+
delayed_ping_timer_handle;
|
348
358
|
uint64_t ping_ctr = 0; // unique id for pings
|
349
359
|
grpc_closure retry_initiate_ping_locked;
|
350
360
|
|
@@ -352,7 +362,6 @@ struct grpc_chttp2_transport : public grpc_core::KeepsGrpcInitialized {
|
|
352
362
|
size_t ping_ack_count = 0;
|
353
363
|
size_t ping_ack_capacity = 0;
|
354
364
|
uint64_t* ping_acks = nullptr;
|
355
|
-
grpc_chttp2_server_ping_recv_state ping_recv_state;
|
356
365
|
|
357
366
|
/// parser for headers
|
358
367
|
grpc_core::HPackParser hpack_parser;
|
@@ -486,15 +495,9 @@ struct grpc_chttp2_stream {
|
|
486
495
|
const void* server_data, grpc_core::Arena* arena);
|
487
496
|
~grpc_chttp2_stream();
|
488
497
|
|
489
|
-
void* context;
|
490
|
-
grpc_chttp2_transport
|
498
|
+
void* context = nullptr;
|
499
|
+
const grpc_core::RefCountedPtr<grpc_chttp2_transport> t;
|
491
500
|
grpc_stream_refcount* refcount;
|
492
|
-
// Reffer is a 0-len structure, simply reffing `t` and `refcount` in its ctor
|
493
|
-
// before initializing the rest of the stream, to avoid cache misses. This
|
494
|
-
// field MUST be right after `t` and `refcount`.
|
495
|
-
struct Reffer {
|
496
|
-
explicit Reffer(grpc_chttp2_stream* s);
|
497
|
-
} reffer;
|
498
501
|
|
499
502
|
grpc_closure destroy_stream;
|
500
503
|
grpc_closure* destroy_stream_arg;
|
@@ -740,43 +743,11 @@ void grpc_chttp2_stream_ref(grpc_chttp2_stream* s);
|
|
740
743
|
void grpc_chttp2_stream_unref(grpc_chttp2_stream* s);
|
741
744
|
#endif
|
742
745
|
|
743
|
-
#ifndef NDEBUG
|
744
|
-
#define GRPC_CHTTP2_REF_TRANSPORT(t, r) \
|
745
|
-
grpc_chttp2_ref_transport(t, r, __FILE__, __LINE__)
|
746
|
-
#define GRPC_CHTTP2_UNREF_TRANSPORT(t, r) \
|
747
|
-
grpc_chttp2_unref_transport(t, r, __FILE__, __LINE__)
|
748
|
-
inline void grpc_chttp2_unref_transport(grpc_chttp2_transport* t,
|
749
|
-
const char* reason, const char* file,
|
750
|
-
int line) {
|
751
|
-
if (t->refs.Unref(grpc_core::DebugLocation(file, line), reason)) {
|
752
|
-
delete t;
|
753
|
-
}
|
754
|
-
}
|
755
|
-
inline void grpc_chttp2_ref_transport(grpc_chttp2_transport* t,
|
756
|
-
const char* reason, const char* file,
|
757
|
-
int line) {
|
758
|
-
t->refs.Ref(grpc_core::DebugLocation(file, line), reason);
|
759
|
-
}
|
760
|
-
#else
|
761
|
-
#define GRPC_CHTTP2_REF_TRANSPORT(t, r) grpc_chttp2_ref_transport(t)
|
762
|
-
#define GRPC_CHTTP2_UNREF_TRANSPORT(t, r) grpc_chttp2_unref_transport(t)
|
763
|
-
inline void grpc_chttp2_unref_transport(grpc_chttp2_transport* t) {
|
764
|
-
if (t->refs.Unref()) {
|
765
|
-
delete t;
|
766
|
-
}
|
767
|
-
}
|
768
|
-
inline void grpc_chttp2_ref_transport(grpc_chttp2_transport* t) {
|
769
|
-
t->refs.Ref();
|
770
|
-
}
|
771
|
-
#endif
|
772
|
-
|
773
746
|
void grpc_chttp2_ack_ping(grpc_chttp2_transport* t, uint64_t id);
|
774
747
|
|
775
|
-
///
|
776
|
-
///
|
777
|
-
|
778
|
-
/// "too_many_pings" followed by immediately closing the connection.
|
779
|
-
void grpc_chttp2_add_ping_strike(grpc_chttp2_transport* t);
|
748
|
+
/// Sends GOAWAY with error code ENHANCE_YOUR_CALM and additional debug data
|
749
|
+
/// resembling "too_many_pings" followed by immediately closing the connection.
|
750
|
+
void grpc_chttp2_exceeded_ping_strikes(grpc_chttp2_transport* t);
|
780
751
|
|
781
752
|
/// Resets ping clock. Should be called when flushing window updates,
|
782
753
|
/// initial/trailing metadata or data frames. For a server, it resets the number
|
@@ -810,9 +781,11 @@ void grpc_chttp2_config_default_keepalive_args(grpc_channel_args* args,
|
|
810
781
|
void grpc_chttp2_config_default_keepalive_args(
|
811
782
|
const grpc_core::ChannelArgs& channel_args, bool is_client);
|
812
783
|
|
813
|
-
void grpc_chttp2_retry_initiate_ping(
|
784
|
+
void grpc_chttp2_retry_initiate_ping(
|
785
|
+
grpc_core::RefCountedPtr<grpc_chttp2_transport> t);
|
814
786
|
|
815
|
-
void schedule_bdp_ping_locked(
|
787
|
+
void schedule_bdp_ping_locked(
|
788
|
+
grpc_core::RefCountedPtr<grpc_chttp2_transport> t);
|
816
789
|
|
817
790
|
uint32_t grpc_chttp2_min_read_progress_size(grpc_chttp2_transport* t);
|
818
791
|
|
@@ -47,11 +47,13 @@
|
|
47
47
|
#include "src/core/ext/transport/chttp2/transport/http2_settings.h"
|
48
48
|
#include "src/core/ext/transport/chttp2/transport/http_trace.h"
|
49
49
|
#include "src/core/ext/transport/chttp2/transport/internal.h"
|
50
|
+
#include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
|
51
|
+
#include "src/core/lib/channel/call_tracer.h"
|
50
52
|
#include "src/core/lib/channel/channelz.h"
|
53
|
+
#include "src/core/lib/channel/context.h"
|
51
54
|
#include "src/core/lib/debug/trace.h"
|
52
55
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
53
56
|
#include "src/core/lib/gprpp/status_helper.h"
|
54
|
-
#include "src/core/lib/gprpp/time.h"
|
55
57
|
#include "src/core/lib/iomgr/closure.h"
|
56
58
|
#include "src/core/lib/iomgr/combiner.h"
|
57
59
|
#include "src/core/lib/iomgr/endpoint.h"
|
@@ -510,8 +512,7 @@ static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t) {
|
|
510
512
|
if (bdp_est) {
|
511
513
|
if (t->bdp_ping_blocked) {
|
512
514
|
t->bdp_ping_blocked = false;
|
513
|
-
|
514
|
-
schedule_bdp_ping_locked(t);
|
515
|
+
schedule_bdp_ping_locked(t->Ref());
|
515
516
|
}
|
516
517
|
bdp_est->AddIncomingBytes(t->incoming_frame_size);
|
517
518
|
}
|
@@ -549,7 +550,7 @@ error_handler:
|
|
549
550
|
t->incoming_stream = s;
|
550
551
|
t->parser = grpc_chttp2_transport::Parser{
|
551
552
|
"data", grpc_chttp2_data_parser_parse, nullptr};
|
552
|
-
t->
|
553
|
+
t->ping_rate_policy.ReceivedDataFrame();
|
553
554
|
return absl::OkStatus();
|
554
555
|
} else if (s != nullptr) {
|
555
556
|
// handle stream errors by closing the stream
|
@@ -588,7 +589,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
|
|
588
589
|
? HPackParser::Priority::Included
|
589
590
|
: HPackParser::Priority::None;
|
590
591
|
|
591
|
-
t->
|
592
|
+
t->ping_rate_policy.ReceivedDataFrame();
|
592
593
|
|
593
594
|
// could be a new grpc_chttp2_stream or an existing grpc_chttp2_stream
|
594
595
|
s = grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
|
@@ -841,7 +842,7 @@ static const maybe_complete_func_type maybe_complete_funcs[] = {
|
|
841
842
|
|
842
843
|
static void force_client_rst_stream(void* sp, grpc_error_handle /*error*/) {
|
843
844
|
grpc_chttp2_stream* s = static_cast<grpc_chttp2_stream*>(sp);
|
844
|
-
grpc_chttp2_transport* t = s->t;
|
845
|
+
grpc_chttp2_transport* t = s->t.get();
|
845
846
|
if (!s->write_closed) {
|
846
847
|
grpc_chttp2_add_rst_stream_to_next_write(t, s->id, GRPC_HTTP2_NO_ERROR,
|
847
848
|
&s->stats.outgoing);
|
@@ -857,10 +858,18 @@ grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
|
|
857
858
|
const grpc_slice& slice,
|
858
859
|
int is_last) {
|
859
860
|
auto* parser = static_cast<grpc_core::HPackParser*>(hpack_parser);
|
861
|
+
grpc_core::CallTracerAnnotationInterface* call_tracer = nullptr;
|
860
862
|
if (s != nullptr) {
|
861
863
|
s->stats.incoming.header_bytes += GRPC_SLICE_LENGTH(slice);
|
864
|
+
|
865
|
+
if (s->context != nullptr) {
|
866
|
+
call_tracer = static_cast<grpc_core::CallTracerAnnotationInterface*>(
|
867
|
+
static_cast<grpc_call_context_element*>(
|
868
|
+
s->context)[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE]
|
869
|
+
.value);
|
870
|
+
}
|
862
871
|
}
|
863
|
-
grpc_error_handle error = parser->Parse(slice, is_last != 0);
|
872
|
+
grpc_error_handle error = parser->Parse(slice, is_last != 0, call_tracer);
|
864
873
|
if (!error.ok()) {
|
865
874
|
return error;
|
866
875
|
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
// Copyright 2023 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
|
18
|
+
|
19
|
+
#include <algorithm>
|
20
|
+
|
21
|
+
#include "absl/types/optional.h"
|
22
|
+
|
23
|
+
#include <grpc/impl/channel_arg_names.h>
|
24
|
+
|
25
|
+
namespace grpc_core {
|
26
|
+
|
27
|
+
namespace {
|
28
|
+
Duration g_default_min_recv_ping_interval_without_data = Duration::Minutes(5);
|
29
|
+
int g_default_max_ping_strikes = 2;
|
30
|
+
} // namespace
|
31
|
+
|
32
|
+
Chttp2PingAbusePolicy::Chttp2PingAbusePolicy(const ChannelArgs& args)
|
33
|
+
: min_recv_ping_interval_without_data_(std::max(
|
34
|
+
Duration::Zero(),
|
35
|
+
args.GetDurationFromIntMillis(
|
36
|
+
GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS)
|
37
|
+
.value_or(g_default_min_recv_ping_interval_without_data))),
|
38
|
+
max_ping_strikes_(
|
39
|
+
std::max(0, args.GetInt(GRPC_ARG_HTTP2_MAX_PING_STRIKES)
|
40
|
+
.value_or(g_default_max_ping_strikes))) {}
|
41
|
+
|
42
|
+
void Chttp2PingAbusePolicy::SetDefaults(const ChannelArgs& args) {
|
43
|
+
g_default_max_ping_strikes =
|
44
|
+
std::max(0, args.GetInt(GRPC_ARG_HTTP2_MAX_PING_STRIKES)
|
45
|
+
.value_or(g_default_max_ping_strikes));
|
46
|
+
g_default_min_recv_ping_interval_without_data =
|
47
|
+
std::max(Duration::Zero(),
|
48
|
+
args.GetDurationFromIntMillis(
|
49
|
+
GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS)
|
50
|
+
.value_or(g_default_min_recv_ping_interval_without_data));
|
51
|
+
}
|
52
|
+
|
53
|
+
bool Chttp2PingAbusePolicy::ReceivedOnePing(bool transport_idle) {
|
54
|
+
const Timestamp now = Timestamp::Now();
|
55
|
+
const Timestamp next_allowed_ping =
|
56
|
+
last_ping_recv_time_ + RecvPingIntervalWithoutData(transport_idle);
|
57
|
+
last_ping_recv_time_ = now;
|
58
|
+
if (next_allowed_ping <= now) return false;
|
59
|
+
// Received ping too soon: increment strike count.
|
60
|
+
++ping_strikes_;
|
61
|
+
return ping_strikes_ > max_ping_strikes_ && max_ping_strikes_ != 0;
|
62
|
+
}
|
63
|
+
|
64
|
+
Duration Chttp2PingAbusePolicy::RecvPingIntervalWithoutData(
|
65
|
+
bool transport_idle) const {
|
66
|
+
if (transport_idle) {
|
67
|
+
// According to RFC1122, the interval of TCP Keep-Alive is default to
|
68
|
+
// no less than two hours. When there is no outstanding streams, we
|
69
|
+
// restrict the number of PINGS equivalent to TCP Keep-Alive.
|
70
|
+
return Duration::Hours(2);
|
71
|
+
}
|
72
|
+
return min_recv_ping_interval_without_data_;
|
73
|
+
}
|
74
|
+
|
75
|
+
void Chttp2PingAbusePolicy::ResetPingStrikes() {
|
76
|
+
last_ping_recv_time_ = Timestamp::InfPast();
|
77
|
+
ping_strikes_ = 0;
|
78
|
+
}
|
79
|
+
|
80
|
+
} // namespace grpc_core
|
@@ -0,0 +1,55 @@
|
|
1
|
+
// Copyright 2023 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_ABUSE_POLICY_H
|
16
|
+
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_ABUSE_POLICY_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include "src/core/lib/channel/channel_args.h"
|
21
|
+
#include "src/core/lib/gprpp/time.h"
|
22
|
+
|
23
|
+
namespace grpc_core {
|
24
|
+
|
25
|
+
class Chttp2PingAbusePolicy {
|
26
|
+
public:
|
27
|
+
explicit Chttp2PingAbusePolicy(const ChannelArgs& args);
|
28
|
+
|
29
|
+
static void SetDefaults(const ChannelArgs& args);
|
30
|
+
|
31
|
+
// Record one received ping; returns true if the connection should be closed.
|
32
|
+
// If transport_idle is true, we increase the allowed time between pings up to
|
33
|
+
// TCP keep-alive check time.
|
34
|
+
GRPC_MUST_USE_RESULT bool ReceivedOnePing(bool transport_idle);
|
35
|
+
|
36
|
+
// Reset the ping clock, strike count.
|
37
|
+
void ResetPingStrikes();
|
38
|
+
|
39
|
+
int TestOnlyMaxPingStrikes() const { return max_ping_strikes_; }
|
40
|
+
Duration TestOnlyMinPingIntervalWithoutData() const {
|
41
|
+
return min_recv_ping_interval_without_data_;
|
42
|
+
}
|
43
|
+
|
44
|
+
private:
|
45
|
+
Duration RecvPingIntervalWithoutData(bool transport_idle) const;
|
46
|
+
|
47
|
+
Timestamp last_ping_recv_time_ = Timestamp::InfPast();
|
48
|
+
const Duration min_recv_ping_interval_without_data_;
|
49
|
+
int ping_strikes_ = 0;
|
50
|
+
const int max_ping_strikes_;
|
51
|
+
};
|
52
|
+
|
53
|
+
} // namespace grpc_core
|
54
|
+
|
55
|
+
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_ABUSE_POLICY_H
|
@@ -0,0 +1,98 @@
|
|
1
|
+
// Copyright 2023 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
|
18
|
+
|
19
|
+
#include <algorithm>
|
20
|
+
#include <ostream>
|
21
|
+
#include <utility>
|
22
|
+
|
23
|
+
#include "absl/strings/str_cat.h"
|
24
|
+
#include "absl/types/optional.h"
|
25
|
+
|
26
|
+
#include <grpc/impl/channel_arg_names.h>
|
27
|
+
|
28
|
+
#include "src/core/lib/gprpp/match.h"
|
29
|
+
|
30
|
+
namespace grpc_core {
|
31
|
+
|
32
|
+
namespace {
|
33
|
+
int g_default_max_pings_without_data = 2;
|
34
|
+
} // namespace
|
35
|
+
|
36
|
+
Chttp2PingRatePolicy::Chttp2PingRatePolicy(const ChannelArgs& args,
|
37
|
+
bool is_client)
|
38
|
+
: max_pings_without_data_(
|
39
|
+
is_client
|
40
|
+
? std::max(0, args.GetInt(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA)
|
41
|
+
.value_or(g_default_max_pings_without_data))
|
42
|
+
: 0) {}
|
43
|
+
|
44
|
+
void Chttp2PingRatePolicy::SetDefaults(const ChannelArgs& args) {
|
45
|
+
g_default_max_pings_without_data =
|
46
|
+
std::max(0, args.GetInt(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA)
|
47
|
+
.value_or(g_default_max_pings_without_data));
|
48
|
+
}
|
49
|
+
|
50
|
+
Chttp2PingRatePolicy::RequestSendPingResult
|
51
|
+
Chttp2PingRatePolicy::RequestSendPing(Duration next_allowed_ping_interval) {
|
52
|
+
if (max_pings_without_data_ != 0 && pings_before_data_required_ == 0) {
|
53
|
+
return TooManyRecentPings{};
|
54
|
+
}
|
55
|
+
const Timestamp next_allowed_ping =
|
56
|
+
last_ping_sent_time_ + next_allowed_ping_interval;
|
57
|
+
const Timestamp now = Timestamp::Now();
|
58
|
+
if (next_allowed_ping > now) {
|
59
|
+
return TooSoon{next_allowed_ping_interval, last_ping_sent_time_,
|
60
|
+
next_allowed_ping - now};
|
61
|
+
}
|
62
|
+
last_ping_sent_time_ = now;
|
63
|
+
if (pings_before_data_required_) --pings_before_data_required_;
|
64
|
+
return SendGranted{};
|
65
|
+
}
|
66
|
+
|
67
|
+
void Chttp2PingRatePolicy::ReceivedDataFrame() {
|
68
|
+
last_ping_sent_time_ = Timestamp::InfPast();
|
69
|
+
}
|
70
|
+
|
71
|
+
void Chttp2PingRatePolicy::ResetPingsBeforeDataRequired() {
|
72
|
+
pings_before_data_required_ = max_pings_without_data_;
|
73
|
+
}
|
74
|
+
|
75
|
+
std::string Chttp2PingRatePolicy::GetDebugString() const {
|
76
|
+
return absl::StrCat(
|
77
|
+
"max_pings_without_data: ", max_pings_without_data_,
|
78
|
+
", pings_before_data_required: ", pings_before_data_required_,
|
79
|
+
", last_ping_sent_time_: ", last_ping_sent_time_.ToString());
|
80
|
+
}
|
81
|
+
|
82
|
+
std::ostream& operator<<(std::ostream& out,
|
83
|
+
const Chttp2PingRatePolicy::RequestSendPingResult& r) {
|
84
|
+
Match(
|
85
|
+
r, [&out](Chttp2PingRatePolicy::SendGranted) { out << "SendGranted"; },
|
86
|
+
[&out](Chttp2PingRatePolicy::TooManyRecentPings) {
|
87
|
+
out << "TooManyRecentPings";
|
88
|
+
},
|
89
|
+
[&out](Chttp2PingRatePolicy::TooSoon r) {
|
90
|
+
out << "TooSoon: next_allowed="
|
91
|
+
<< r.next_allowed_ping_interval.ToString()
|
92
|
+
<< " last_ping_sent_time=" << r.last_ping.ToString()
|
93
|
+
<< " wait=" << r.wait.ToString();
|
94
|
+
});
|
95
|
+
return out;
|
96
|
+
}
|
97
|
+
|
98
|
+
} // namespace grpc_core
|