[chttp2] Remove a bunch of mostly-rolled-out experiments (#35426)

- `memory_pressure_controller` finally - allows deletion of pid_controller throughout the codebase
- `overload_protection` - one of the http2 rapid reset mitigations
- `red_max_concurrent_streams` - another http2 rapid reset mitigation

Closes #35426

COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/35426 from ctiller:new-years-cleanse 4651672e7e
PiperOrigin-RevId: 595205029
This commit is contained in:
Craig Tiller 2024-01-02 14:05:06 -08:00 committed by Copybara-Service
parent 29740367b0
commit a100e90f97
30 changed files with 7 additions and 604 deletions

47
CMakeLists.txt generated
View File

@ -1194,7 +1194,6 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx percent_encoding_test)
add_dependencies(buildtests_cxx periodic_update_test)
add_dependencies(buildtests_cxx pick_first_test)
add_dependencies(buildtests_cxx pid_controller_test)
add_dependencies(buildtests_cxx ping_abuse_policy_test)
add_dependencies(buildtests_cxx ping_callbacks_test)
add_dependencies(buildtests_cxx ping_configuration_test)
@ -2505,7 +2504,6 @@ add_library(grpc
src/core/lib/transport/http_connect_handshaker.cc
src/core/lib/transport/metadata_batch.cc
src/core/lib/transport/parsed_metadata.cc
src/core/lib/transport/pid_controller.cc
src/core/lib/transport/status_conversion.cc
src/core/lib/transport/tcp_connect_handshaker.cc
src/core/lib/transport/timeout_encoding.cc
@ -3198,7 +3196,6 @@ add_library(grpc_unsecure
src/core/lib/transport/http_connect_handshaker.cc
src/core/lib/transport/metadata_batch.cc
src/core/lib/transport/parsed_metadata.cc
src/core/lib/transport/pid_controller.cc
src/core/lib/transport/status_conversion.cc
src/core/lib/transport/tcp_connect_handshaker.cc
src/core/lib/transport/timeout_encoding.cc
@ -12230,7 +12227,6 @@ add_executable(flow_control_test
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/transport/bdp_estimator.cc
src/core/lib/transport/pid_controller.cc
test/core/transport/chttp2/flow_control_test.cc
third_party/upb/upb/hash/common.c
third_party/upb/upb/message/accessors.c
@ -17805,49 +17801,6 @@ target_link_libraries(pick_first_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(pid_controller_test
test/core/transport/pid_controller_test.cc
test/core/util/cmdline.cc
test/core/util/fuzzer_util.cc
test/core/util/grpc_profiler.cc
test/core/util/histogram.cc
test/core/util/mock_endpoint.cc
test/core/util/parse_hexstring.cc
test/core/util/passthru_endpoint.cc
test/core/util/resolve_localhost_ip46.cc
test/core/util/slice_splitter.cc
test/core/util/tracer_util.cc
)
target_compile_features(pid_controller_test PUBLIC cxx_std_14)
target_include_directories(pid_controller_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(pid_controller_test
${_gRPC_ALLTARGETS_LIBRARIES}
gtest
grpc_test_util
)
endif()
if(gRPC_BUILD_TESTS)

2
Makefile generated
View File

@ -1705,7 +1705,6 @@ LIBGRPC_SRC = \
src/core/lib/transport/http_connect_handshaker.cc \
src/core/lib/transport/metadata_batch.cc \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/tcp_connect_handshaker.cc \
src/core/lib/transport/timeout_encoding.cc \
@ -2248,7 +2247,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/transport/http_connect_handshaker.cc \
src/core/lib/transport/metadata_batch.cc \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/tcp_connect_handshaker.cc \
src/core/lib/transport/timeout_encoding.cc \

2
Package.swift generated
View File

@ -1898,8 +1898,6 @@ let package = Package(
"src/core/lib/transport/metadata_compression_traits.h",
"src/core/lib/transport/parsed_metadata.cc",
"src/core/lib/transport/parsed_metadata.h",
"src/core/lib/transport/pid_controller.cc",
"src/core/lib/transport/pid_controller.h",
"src/core/lib/transport/simple_slice_based_metadata.h",
"src/core/lib/transport/status_conversion.cc",
"src/core/lib/transport/status_conversion.h",

12
bazel/experiments.bzl generated
View File

@ -28,16 +28,13 @@ EXPERIMENT_ENABLES = {
"http2_stats_fix": "http2_stats_fix",
"keepalive_fix": "keepalive_fix",
"keepalive_server_fix": "keepalive_server_fix",
"memory_pressure_controller": "memory_pressure_controller",
"monitoring_experiment": "monitoring_experiment",
"multiping": "multiping",
"overload_protection": "overload_protection",
"peer_state_based_framing": "peer_state_based_framing",
"pending_queue_cap": "pending_queue_cap",
"pick_first_happy_eyeballs": "pick_first_happy_eyeballs",
"promise_based_client_call": "promise_based_client_call",
"promise_based_server_call": "promise_based_server_call",
"red_max_concurrent_streams": "red_max_concurrent_streams",
"registered_method_lookup_in_transport": "registered_method_lookup_in_transport",
"promise_based_inproc_transport": "promise_based_client_call,promise_based_inproc_transport,promise_based_server_call,registered_method_lookup_in_transport",
"registered_methods_map": "registered_methods_map",
@ -88,7 +85,6 @@ EXPERIMENTS = {
"flow_control_test": [
"multiping",
"peer_state_based_framing",
"red_max_concurrent_streams",
"rstpit",
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
@ -104,7 +100,6 @@ EXPERIMENTS = {
],
"resource_quota_test": [
"free_large_allocator",
"memory_pressure_controller",
"unconstrained_max_quota_buffer_size",
],
"xds_end2end_test": [
@ -125,7 +120,6 @@ EXPERIMENTS = {
"event_engine_listener",
],
"flow_control_test": [
"overload_protection",
"write_size_cap",
"write_size_policy",
],
@ -170,7 +164,6 @@ EXPERIMENTS = {
"flow_control_test": [
"multiping",
"peer_state_based_framing",
"red_max_concurrent_streams",
"rstpit",
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
@ -186,7 +179,6 @@ EXPERIMENTS = {
],
"resource_quota_test": [
"free_large_allocator",
"memory_pressure_controller",
"unconstrained_max_quota_buffer_size",
],
"xds_end2end_test": [
@ -201,7 +193,6 @@ EXPERIMENTS = {
"wrr_delegate_to_pick_first",
],
"flow_control_test": [
"overload_protection",
"write_size_cap",
"write_size_policy",
],
@ -253,7 +244,6 @@ EXPERIMENTS = {
"flow_control_test": [
"multiping",
"peer_state_based_framing",
"red_max_concurrent_streams",
"rstpit",
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
@ -272,7 +262,6 @@ EXPERIMENTS = {
],
"resource_quota_test": [
"free_large_allocator",
"memory_pressure_controller",
"unconstrained_max_quota_buffer_size",
],
"xds_end2end_test": [
@ -293,7 +282,6 @@ EXPERIMENTS = {
"event_engine_listener",
],
"flow_control_test": [
"overload_protection",
"write_size_cap",
"write_size_policy",
],

View File

@ -1175,7 +1175,6 @@ libs:
- src/core/lib/transport/metadata_batch.h
- src/core/lib/transport/metadata_compression_traits.h
- src/core/lib/transport/parsed_metadata.h
- src/core/lib/transport/pid_controller.h
- src/core/lib/transport/simple_slice_based_metadata.h
- src/core/lib/transport/status_conversion.h
- src/core/lib/transport/tcp_connect_handshaker.h
@ -1965,7 +1964,6 @@ libs:
- src/core/lib/transport/http_connect_handshaker.cc
- src/core/lib/transport/metadata_batch.cc
- src/core/lib/transport/parsed_metadata.cc
- src/core/lib/transport/pid_controller.cc
- src/core/lib/transport/status_conversion.cc
- src/core/lib/transport/tcp_connect_handshaker.cc
- src/core/lib/transport/timeout_encoding.cc
@ -2606,7 +2604,6 @@ libs:
- src/core/lib/transport/metadata_batch.h
- src/core/lib/transport/metadata_compression_traits.h
- src/core/lib/transport/parsed_metadata.h
- src/core/lib/transport/pid_controller.h
- src/core/lib/transport/simple_slice_based_metadata.h
- src/core/lib/transport/status_conversion.h
- src/core/lib/transport/tcp_connect_handshaker.h
@ -3016,7 +3013,6 @@ libs:
- src/core/lib/transport/http_connect_handshaker.cc
- src/core/lib/transport/metadata_batch.cc
- src/core/lib/transport/parsed_metadata.cc
- src/core/lib/transport/pid_controller.cc
- src/core/lib/transport/status_conversion.cc
- src/core/lib/transport/tcp_connect_handshaker.cc
- src/core/lib/transport/timeout_encoding.cc
@ -9283,7 +9279,6 @@ targets:
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/transport/bdp_estimator.h
- src/core/lib/transport/http2_errors.h
- src/core/lib/transport/pid_controller.h
- third_party/upb/upb/base/internal/log2.h
- third_party/upb/upb/generated_code_support.h
- third_party/upb/upb/hash/common.h
@ -9365,7 +9360,6 @@ targets:
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/transport/bdp_estimator.cc
- src/core/lib/transport/pid_controller.cc
- test/core/transport/chttp2/flow_control_test.cc
- third_party/upb/upb/hash/common.c
- third_party/upb/upb/message/accessors.c
@ -12712,38 +12706,6 @@ targets:
- protobuf
- grpc_test_util
uses_polling: false
- name: pid_controller_test
gtest: true
build: test
language: c++
headers:
- test/core/util/cmdline.h
- test/core/util/evaluate_args_test_util.h
- test/core/util/fuzzer_util.h
- test/core/util/grpc_profiler.h
- test/core/util/histogram.h
- test/core/util/mock_authorization_endpoint.h
- test/core/util/mock_endpoint.h
- test/core/util/parse_hexstring.h
- test/core/util/passthru_endpoint.h
- test/core/util/resolve_localhost_ip46.h
- test/core/util/slice_splitter.h
- test/core/util/tracer_util.h
src:
- test/core/transport/pid_controller_test.cc
- test/core/util/cmdline.cc
- test/core/util/fuzzer_util.cc
- test/core/util/grpc_profiler.cc
- test/core/util/histogram.cc
- test/core/util/mock_endpoint.cc
- test/core/util/parse_hexstring.cc
- test/core/util/passthru_endpoint.cc
- test/core/util/resolve_localhost_ip46.cc
- test/core/util/slice_splitter.cc
- test/core/util/tracer_util.cc
deps:
- gtest
- grpc_test_util
- name: ping_abuse_policy_test
gtest: true
build: test

1
config.m4 generated
View File

@ -837,7 +837,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/transport/http_connect_handshaker.cc \
src/core/lib/transport/metadata_batch.cc \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/tcp_connect_handshaker.cc \
src/core/lib/transport/timeout_encoding.cc \

1
config.w32 generated
View File

@ -802,7 +802,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\transport\\http_connect_handshaker.cc " +
"src\\core\\lib\\transport\\metadata_batch.cc " +
"src\\core\\lib\\transport\\parsed_metadata.cc " +
"src\\core\\lib\\transport\\pid_controller.cc " +
"src\\core\\lib\\transport\\status_conversion.cc " +
"src\\core\\lib\\transport\\tcp_connect_handshaker.cc " +
"src\\core\\lib\\transport\\timeout_encoding.cc " +

2
gRPC-C++.podspec generated
View File

@ -1270,7 +1270,6 @@ Pod::Spec.new do |s|
'src/core/lib/transport/metadata_batch.h',
'src/core/lib/transport/metadata_compression_traits.h',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/simple_slice_based_metadata.h',
'src/core/lib/transport/status_conversion.h',
'src/core/lib/transport/tcp_connect_handshaker.h',
@ -2512,7 +2511,6 @@ Pod::Spec.new do |s|
'src/core/lib/transport/metadata_batch.h',
'src/core/lib/transport/metadata_compression_traits.h',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/simple_slice_based_metadata.h',
'src/core/lib/transport/status_conversion.h',
'src/core/lib/transport/tcp_connect_handshaker.h',

3
gRPC-Core.podspec generated
View File

@ -1997,8 +1997,6 @@ Pod::Spec.new do |s|
'src/core/lib/transport/metadata_compression_traits.h',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/simple_slice_based_metadata.h',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/status_conversion.h',
@ -3279,7 +3277,6 @@ Pod::Spec.new do |s|
'src/core/lib/transport/metadata_batch.h',
'src/core/lib/transport/metadata_compression_traits.h',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/simple_slice_based_metadata.h',
'src/core/lib/transport/status_conversion.h',
'src/core/lib/transport/tcp_connect_handshaker.h',

2
grpc.gemspec generated
View File

@ -1900,8 +1900,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/transport/metadata_compression_traits.h )
s.files += %w( src/core/lib/transport/parsed_metadata.cc )
s.files += %w( src/core/lib/transport/parsed_metadata.h )
s.files += %w( src/core/lib/transport/pid_controller.cc )
s.files += %w( src/core/lib/transport/pid_controller.h )
s.files += %w( src/core/lib/transport/simple_slice_based_metadata.h )
s.files += %w( src/core/lib/transport/status_conversion.cc )
s.files += %w( src/core/lib/transport/status_conversion.h )

2
grpc.gyp generated
View File

@ -1024,7 +1024,6 @@
'src/core/lib/transport/http_connect_handshaker.cc',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/tcp_connect_handshaker.cc',
'src/core/lib/transport/timeout_encoding.cc',
@ -1508,7 +1507,6 @@
'src/core/lib/transport/http_connect_handshaker.cc',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/tcp_connect_handshaker.cc',
'src/core/lib/transport/timeout_encoding.cc',

2
package.xml generated
View File

@ -1882,8 +1882,6 @@
<file baseinstalldir="/" name="src/core/lib/transport/metadata_compression_traits.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/parsed_metadata.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/parsed_metadata.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/pid_controller.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/pid_controller.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/simple_slice_based_metadata.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/status_conversion.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/status_conversion.h" role="src" />

View File

@ -2609,20 +2609,6 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "pid_controller",
srcs = [
"lib/transport/pid_controller.cc",
],
hdrs = [
"lib/transport/pid_controller.h",
],
deps = [
"useful",
"//:gpr_platform",
],
)
grpc_cc_library(
name = "bdp_estimator",
srcs = [
@ -5907,7 +5893,6 @@ grpc_cc_library(
"experiments",
"http2_settings",
"memory_quota",
"pid_controller",
"time",
"useful",
"//:gpr",

View File

@ -646,7 +646,7 @@ static void read_channel_args(grpc_chttp2_transport* t,
t->max_concurrent_streams_overload_protection =
channel_args.GetBool(GRPC_ARG_MAX_CONCURRENT_STREAMS_OVERLOAD_PROTECTION)
.value_or(grpc_core::IsOverloadProtectionEnabled());
.value_or(true);
}
static void init_keepalive_pings_if_enabled_locked(

View File

@ -104,16 +104,7 @@ TransportFlowControl::TransportFlowControl(absl::string_view name,
MemoryOwner* memory_owner)
: memory_owner_(memory_owner),
enable_bdp_probe_(enable_bdp_probe),
bdp_estimator_(name),
pid_controller_(PidController::Args()
.set_gain_p(4)
.set_gain_i(8)
.set_gain_d(0)
.set_initial_control_value(TargetLogBdp())
.set_min_control_value(-1)
.set_max_control_value(25)
.set_integral_range(10)),
last_pid_update_(Timestamp::Now()) {}
bdp_estimator_(name) {}
uint32_t TransportFlowControl::DesiredAnnounceSize(bool writing_anyway) const {
const uint32_t target_announced_window =
@ -184,41 +175,6 @@ FlowControlAction TransportFlowControl::UpdateAction(FlowControlAction action) {
return action;
}
// Take in a target and modifies it based on the memory pressure of the system
static double AdjustForMemoryPressure(double memory_pressure, double target) {
// do not increase window under heavy memory pressure.
static const double kLowMemPressure = 0.1;
static const double kZeroTarget = 22;
static const double kHighMemPressure = 0.8;
static const double kMaxMemPressure = 0.9;
if (memory_pressure < kLowMemPressure && target < kZeroTarget) {
target = (target - kZeroTarget) * memory_pressure / kLowMemPressure +
kZeroTarget;
} else if (memory_pressure > kHighMemPressure) {
target *= 1 - std::min(1.0, (memory_pressure - kHighMemPressure) /
(kMaxMemPressure - kHighMemPressure));
}
return target;
}
double TransportFlowControl::TargetLogBdp() {
return AdjustForMemoryPressure(
memory_owner_->is_valid()
? memory_owner_->GetPressureInfo().pressure_control_value
: 0.0,
1 + log2(bdp_estimator_.EstimateBdp()));
}
double TransportFlowControl::SmoothLogBdp(double value) {
Timestamp now = Timestamp::Now();
double bdp_error = value - pid_controller_.last_control_value();
const double dt = (now - last_pid_update_).seconds();
last_pid_update_ = now;
// Limit dt to 100ms
const double kMaxDt = 0.1;
return pid_controller_.Update(bdp_error, dt > kMaxDt ? kMaxDt : dt);
}
double
TransportFlowControl::TargetInitialWindowSizeBasedOnMemoryPressureAndBdp()
const {
@ -323,10 +279,8 @@ FlowControlAction TransportFlowControl::PeriodicUpdate() {
// TODO(ncteisen): experiment with setting target to be huge under low
// memory pressure.
uint32_t target = static_cast<uint32_t>(RoundUpToPowerOf2(
Clamp(IsMemoryPressureControllerEnabled()
? TargetInitialWindowSizeBasedOnMemoryPressureAndBdp()
: pow(2, SmoothLogBdp(TargetLogBdp())),
0.0, static_cast<double>(kMaxInitialWindowSize))));
Clamp(TargetInitialWindowSizeBasedOnMemoryPressureAndBdp(), 0.0,
static_cast<double>(kMaxInitialWindowSize))));
if (target < kMinPositiveInitialWindowSize) target = 0;
if (g_test_only_transport_target_window_estimates_mocker != nullptr) {
// Hook for simulating unusual flow control situations in tests.

View File

@ -40,7 +40,6 @@
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/resource_quota/memory_quota.h"
#include "src/core/lib/transport/bdp_estimator.h"
#include "src/core/lib/transport/pid_controller.h"
extern grpc_core::TraceFlag grpc_flowctl_trace;
@ -330,8 +329,6 @@ class TransportFlowControl final {
}
private:
double TargetLogBdp();
double SmoothLogBdp(double value);
double TargetInitialWindowSizeBasedOnMemoryPressureAndBdp() const;
static void UpdateSetting(grpc_chttp2_setting_id id, int64_t* desired_value,
uint32_t new_desired_value,
@ -359,10 +356,6 @@ class TransportFlowControl final {
// bdp estimation
BdpEstimator bdp_estimator_;
// pid controller
PidController pid_controller_;
Timestamp last_pid_update_;
int64_t remote_window_ = kDefaultWindow;
int64_t target_initial_window_size_ = kDefaultWindow;
int64_t target_frame_size_ = kDefaultFrameSize;

View File

@ -674,7 +674,6 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM);
return init_header_skip_frame_parser(t, priority_type, is_eoh);
} else if (GPR_UNLIKELY(
grpc_core::IsRedMaxConcurrentStreamsEnabled() &&
t->stream_map.size() >=
t->max_concurrent_streams_policy.AdvertiseValue() &&
grpc_core::RandomEarlyDetection(

View File

@ -60,19 +60,12 @@ const char* const description_keepalive_server_fix =
"Allows overriding keepalive_permit_without_calls for servers. Refer "
"https://github.com/grpc/grpc/pull/33917 for more information.";
const char* const additional_constraints_keepalive_server_fix = "{}";
const char* const description_memory_pressure_controller =
"New memory pressure controller";
const char* const additional_constraints_memory_pressure_controller = "{}";
const char* const description_monitoring_experiment =
"Placeholder experiment to prove/disprove our monitoring is working";
const char* const additional_constraints_monitoring_experiment = "{}";
const char* const description_multiping =
"Allow more than one ping to be in flight at a time by default.";
const char* const additional_constraints_multiping = "{}";
const char* const description_overload_protection =
"If chttp2 has more streams than it can handle open, send RST_STREAM "
"immediately on new streams appearing.";
const char* const additional_constraints_overload_protection = "{}";
const char* const description_peer_state_based_framing =
"If set, the max sizes of frames sent to lower layers is controlled based "
"on the peer's memory pressure which is reflected in its max http2 frame "
@ -97,10 +90,6 @@ const char* const description_promise_based_server_call =
"If set, use the new gRPC promise based call code when it's appropriate "
"(ie when all filters in a stack are promise based)";
const char* const additional_constraints_promise_based_server_call = "{}";
const char* const description_red_max_concurrent_streams =
"Perform random early rejection of requests that would exceed a newly "
"reduced MAX_CONCURRENT_STREAMS but are allowed by the current.";
const char* const additional_constraints_red_max_concurrent_streams = "{}";
const char* const description_registered_method_lookup_in_transport =
"Change registered method's lookup point to transport";
const char* const additional_constraints_registered_method_lookup_in_transport =
@ -219,15 +208,10 @@ const ExperimentMetadata g_experiment_metadata[] = {
additional_constraints_keepalive_fix, nullptr, 0, false, false},
{"keepalive_server_fix", description_keepalive_server_fix,
additional_constraints_keepalive_server_fix, nullptr, 0, false, false},
{"memory_pressure_controller", description_memory_pressure_controller,
additional_constraints_memory_pressure_controller, nullptr, 0, false,
true},
{"monitoring_experiment", description_monitoring_experiment,
additional_constraints_monitoring_experiment, nullptr, 0, true, true},
{"multiping", description_multiping, additional_constraints_multiping,
nullptr, 0, false, true},
{"overload_protection", description_overload_protection,
additional_constraints_overload_protection, nullptr, 0, true, true},
{"peer_state_based_framing", description_peer_state_based_framing,
additional_constraints_peer_state_based_framing, nullptr, 0, false, true},
{"pending_queue_cap", description_pending_queue_cap,
@ -238,9 +222,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
additional_constraints_promise_based_client_call, nullptr, 0, false, true},
{"promise_based_server_call", description_promise_based_server_call,
additional_constraints_promise_based_server_call, nullptr, 0, false, true},
{"red_max_concurrent_streams", description_red_max_concurrent_streams,
additional_constraints_red_max_concurrent_streams, nullptr, 0, false,
true},
{"registered_method_lookup_in_transport",
description_registered_method_lookup_in_transport,
additional_constraints_registered_method_lookup_in_transport, nullptr, 0,
@ -339,19 +320,12 @@ const char* const description_keepalive_server_fix =
"Allows overriding keepalive_permit_without_calls for servers. Refer "
"https://github.com/grpc/grpc/pull/33917 for more information.";
const char* const additional_constraints_keepalive_server_fix = "{}";
const char* const description_memory_pressure_controller =
"New memory pressure controller";
const char* const additional_constraints_memory_pressure_controller = "{}";
const char* const description_monitoring_experiment =
"Placeholder experiment to prove/disprove our monitoring is working";
const char* const additional_constraints_monitoring_experiment = "{}";
const char* const description_multiping =
"Allow more than one ping to be in flight at a time by default.";
const char* const additional_constraints_multiping = "{}";
const char* const description_overload_protection =
"If chttp2 has more streams than it can handle open, send RST_STREAM "
"immediately on new streams appearing.";
const char* const additional_constraints_overload_protection = "{}";
const char* const description_peer_state_based_framing =
"If set, the max sizes of frames sent to lower layers is controlled based "
"on the peer's memory pressure which is reflected in its max http2 frame "
@ -376,10 +350,6 @@ const char* const description_promise_based_server_call =
"If set, use the new gRPC promise based call code when it's appropriate "
"(ie when all filters in a stack are promise based)";
const char* const additional_constraints_promise_based_server_call = "{}";
const char* const description_red_max_concurrent_streams =
"Perform random early rejection of requests that would exceed a newly "
"reduced MAX_CONCURRENT_STREAMS but are allowed by the current.";
const char* const additional_constraints_red_max_concurrent_streams = "{}";
const char* const description_registered_method_lookup_in_transport =
"Change registered method's lookup point to transport";
const char* const additional_constraints_registered_method_lookup_in_transport =
@ -498,15 +468,10 @@ const ExperimentMetadata g_experiment_metadata[] = {
additional_constraints_keepalive_fix, nullptr, 0, false, false},
{"keepalive_server_fix", description_keepalive_server_fix,
additional_constraints_keepalive_server_fix, nullptr, 0, false, false},
{"memory_pressure_controller", description_memory_pressure_controller,
additional_constraints_memory_pressure_controller, nullptr, 0, false,
true},
{"monitoring_experiment", description_monitoring_experiment,
additional_constraints_monitoring_experiment, nullptr, 0, true, true},
{"multiping", description_multiping, additional_constraints_multiping,
nullptr, 0, false, true},
{"overload_protection", description_overload_protection,
additional_constraints_overload_protection, nullptr, 0, true, true},
{"peer_state_based_framing", description_peer_state_based_framing,
additional_constraints_peer_state_based_framing, nullptr, 0, false, true},
{"pending_queue_cap", description_pending_queue_cap,
@ -517,9 +482,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
additional_constraints_promise_based_client_call, nullptr, 0, false, true},
{"promise_based_server_call", description_promise_based_server_call,
additional_constraints_promise_based_server_call, nullptr, 0, false, true},
{"red_max_concurrent_streams", description_red_max_concurrent_streams,
additional_constraints_red_max_concurrent_streams, nullptr, 0, false,
true},
{"registered_method_lookup_in_transport",
description_registered_method_lookup_in_transport,
additional_constraints_registered_method_lookup_in_transport, nullptr, 0,
@ -618,19 +580,12 @@ const char* const description_keepalive_server_fix =
"Allows overriding keepalive_permit_without_calls for servers. Refer "
"https://github.com/grpc/grpc/pull/33917 for more information.";
const char* const additional_constraints_keepalive_server_fix = "{}";
const char* const description_memory_pressure_controller =
"New memory pressure controller";
const char* const additional_constraints_memory_pressure_controller = "{}";
const char* const description_monitoring_experiment =
"Placeholder experiment to prove/disprove our monitoring is working";
const char* const additional_constraints_monitoring_experiment = "{}";
const char* const description_multiping =
"Allow more than one ping to be in flight at a time by default.";
const char* const additional_constraints_multiping = "{}";
const char* const description_overload_protection =
"If chttp2 has more streams than it can handle open, send RST_STREAM "
"immediately on new streams appearing.";
const char* const additional_constraints_overload_protection = "{}";
const char* const description_peer_state_based_framing =
"If set, the max sizes of frames sent to lower layers is controlled based "
"on the peer's memory pressure which is reflected in its max http2 frame "
@ -655,10 +610,6 @@ const char* const description_promise_based_server_call =
"If set, use the new gRPC promise based call code when it's appropriate "
"(ie when all filters in a stack are promise based)";
const char* const additional_constraints_promise_based_server_call = "{}";
const char* const description_red_max_concurrent_streams =
"Perform random early rejection of requests that would exceed a newly "
"reduced MAX_CONCURRENT_STREAMS but are allowed by the current.";
const char* const additional_constraints_red_max_concurrent_streams = "{}";
const char* const description_registered_method_lookup_in_transport =
"Change registered method's lookup point to transport";
const char* const additional_constraints_registered_method_lookup_in_transport =
@ -777,15 +728,10 @@ const ExperimentMetadata g_experiment_metadata[] = {
additional_constraints_keepalive_fix, nullptr, 0, false, false},
{"keepalive_server_fix", description_keepalive_server_fix,
additional_constraints_keepalive_server_fix, nullptr, 0, false, false},
{"memory_pressure_controller", description_memory_pressure_controller,
additional_constraints_memory_pressure_controller, nullptr, 0, false,
true},
{"monitoring_experiment", description_monitoring_experiment,
additional_constraints_monitoring_experiment, nullptr, 0, true, true},
{"multiping", description_multiping, additional_constraints_multiping,
nullptr, 0, false, true},
{"overload_protection", description_overload_protection,
additional_constraints_overload_protection, nullptr, 0, true, true},
{"peer_state_based_framing", description_peer_state_based_framing,
additional_constraints_peer_state_based_framing, nullptr, 0, false, true},
{"pending_queue_cap", description_pending_queue_cap,
@ -796,9 +742,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
additional_constraints_promise_based_client_call, nullptr, 0, false, true},
{"promise_based_server_call", description_promise_based_server_call,
additional_constraints_promise_based_server_call, nullptr, 0, false, true},
{"red_max_concurrent_streams", description_red_max_concurrent_streams,
additional_constraints_red_max_concurrent_streams, nullptr, 0, false,
true},
{"registered_method_lookup_in_transport",
description_registered_method_lookup_in_transport,
additional_constraints_registered_method_lookup_in_transport, nullptr, 0,

View File

@ -79,12 +79,9 @@ inline bool IsFreeLargeAllocatorEnabled() { return false; }
inline bool IsHttp2StatsFixEnabled() { return true; }
inline bool IsKeepaliveFixEnabled() { return false; }
inline bool IsKeepaliveServerFixEnabled() { return false; }
inline bool IsMemoryPressureControllerEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT
inline bool IsMonitoringExperimentEnabled() { return true; }
inline bool IsMultipingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_OVERLOAD_PROTECTION
inline bool IsOverloadProtectionEnabled() { return true; }
inline bool IsPeerStateBasedFramingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_PENDING_QUEUE_CAP
inline bool IsPendingQueueCapEnabled() { return true; }
@ -92,7 +89,6 @@ inline bool IsPendingQueueCapEnabled() { return true; }
inline bool IsPickFirstHappyEyeballsEnabled() { return true; }
inline bool IsPromiseBasedClientCallEnabled() { return false; }
inline bool IsPromiseBasedServerCallEnabled() { return false; }
inline bool IsRedMaxConcurrentStreamsEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_REGISTERED_METHOD_LOOKUP_IN_TRANSPORT
inline bool IsRegisteredMethodLookupInTransportEnabled() { return true; }
inline bool IsPromiseBasedInprocTransportEnabled() { return false; }
@ -145,12 +141,9 @@ inline bool IsFreeLargeAllocatorEnabled() { return false; }
inline bool IsHttp2StatsFixEnabled() { return true; }
inline bool IsKeepaliveFixEnabled() { return false; }
inline bool IsKeepaliveServerFixEnabled() { return false; }
inline bool IsMemoryPressureControllerEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT
inline bool IsMonitoringExperimentEnabled() { return true; }
inline bool IsMultipingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_OVERLOAD_PROTECTION
inline bool IsOverloadProtectionEnabled() { return true; }
inline bool IsPeerStateBasedFramingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_PENDING_QUEUE_CAP
inline bool IsPendingQueueCapEnabled() { return true; }
@ -158,7 +151,6 @@ inline bool IsPendingQueueCapEnabled() { return true; }
inline bool IsPickFirstHappyEyeballsEnabled() { return true; }
inline bool IsPromiseBasedClientCallEnabled() { return false; }
inline bool IsPromiseBasedServerCallEnabled() { return false; }
inline bool IsRedMaxConcurrentStreamsEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_REGISTERED_METHOD_LOOKUP_IN_TRANSPORT
inline bool IsRegisteredMethodLookupInTransportEnabled() { return true; }
inline bool IsPromiseBasedInprocTransportEnabled() { return false; }
@ -211,12 +203,9 @@ inline bool IsFreeLargeAllocatorEnabled() { return false; }
inline bool IsHttp2StatsFixEnabled() { return true; }
inline bool IsKeepaliveFixEnabled() { return false; }
inline bool IsKeepaliveServerFixEnabled() { return false; }
inline bool IsMemoryPressureControllerEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT
inline bool IsMonitoringExperimentEnabled() { return true; }
inline bool IsMultipingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_OVERLOAD_PROTECTION
inline bool IsOverloadProtectionEnabled() { return true; }
inline bool IsPeerStateBasedFramingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_PENDING_QUEUE_CAP
inline bool IsPendingQueueCapEnabled() { return true; }
@ -224,7 +213,6 @@ inline bool IsPendingQueueCapEnabled() { return true; }
inline bool IsPickFirstHappyEyeballsEnabled() { return true; }
inline bool IsPromiseBasedClientCallEnabled() { return false; }
inline bool IsPromiseBasedServerCallEnabled() { return false; }
inline bool IsRedMaxConcurrentStreamsEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_REGISTERED_METHOD_LOOKUP_IN_TRANSPORT
inline bool IsRegisteredMethodLookupInTransportEnabled() { return true; }
inline bool IsPromiseBasedInprocTransportEnabled() { return false; }
@ -267,16 +255,13 @@ enum ExperimentIds {
kExperimentIdHttp2StatsFix,
kExperimentIdKeepaliveFix,
kExperimentIdKeepaliveServerFix,
kExperimentIdMemoryPressureController,
kExperimentIdMonitoringExperiment,
kExperimentIdMultiping,
kExperimentIdOverloadProtection,
kExperimentIdPeerStateBasedFraming,
kExperimentIdPendingQueueCap,
kExperimentIdPickFirstHappyEyeballs,
kExperimentIdPromiseBasedClientCall,
kExperimentIdPromiseBasedServerCall,
kExperimentIdRedMaxConcurrentStreams,
kExperimentIdRegisteredMethodLookupInTransport,
kExperimentIdPromiseBasedInprocTransport,
kExperimentIdRegisteredMethodsMap,
@ -344,10 +329,6 @@ inline bool IsKeepaliveFixEnabled() {
inline bool IsKeepaliveServerFixEnabled() {
return IsExperimentEnabled(kExperimentIdKeepaliveServerFix);
}
#define GRPC_EXPERIMENT_IS_INCLUDED_MEMORY_PRESSURE_CONTROLLER
inline bool IsMemoryPressureControllerEnabled() {
return IsExperimentEnabled(kExperimentIdMemoryPressureController);
}
#define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT
inline bool IsMonitoringExperimentEnabled() {
return IsExperimentEnabled(kExperimentIdMonitoringExperiment);
@ -356,10 +337,6 @@ inline bool IsMonitoringExperimentEnabled() {
inline bool IsMultipingEnabled() {
return IsExperimentEnabled(kExperimentIdMultiping);
}
#define GRPC_EXPERIMENT_IS_INCLUDED_OVERLOAD_PROTECTION
inline bool IsOverloadProtectionEnabled() {
return IsExperimentEnabled(kExperimentIdOverloadProtection);
}
#define GRPC_EXPERIMENT_IS_INCLUDED_PEER_STATE_BASED_FRAMING
inline bool IsPeerStateBasedFramingEnabled() {
return IsExperimentEnabled(kExperimentIdPeerStateBasedFraming);
@ -380,10 +357,6 @@ inline bool IsPromiseBasedClientCallEnabled() {
inline bool IsPromiseBasedServerCallEnabled() {
return IsExperimentEnabled(kExperimentIdPromiseBasedServerCall);
}
#define GRPC_EXPERIMENT_IS_INCLUDED_RED_MAX_CONCURRENT_STREAMS
inline bool IsRedMaxConcurrentStreamsEnabled() {
return IsExperimentEnabled(kExperimentIdRedMaxConcurrentStreams);
}
#define GRPC_EXPERIMENT_IS_INCLUDED_REGISTERED_METHOD_LOOKUP_IN_TRANSPORT
inline bool IsRegisteredMethodLookupInTransportEnabled() {
return IsExperimentEnabled(kExperimentIdRegisteredMethodLookupInTransport);

View File

@ -107,11 +107,6 @@
owner: yashkt@google.com
test_tags: []
allow_in_fuzzing_config: false
- name: memory_pressure_controller
description: New memory pressure controller
expiry: 2024/05/05
owner: ctiller@google.com
test_tags: [resource_quota_test]
- name: monitoring_experiment
description: Placeholder experiment to prove/disprove our monitoring is working
expiry: never-ever
@ -123,13 +118,6 @@
expiry: 2024/01/15
owner: ctiller@google.com
test_tags: [flow_control_test]
- name: overload_protection
description:
If chttp2 has more streams than it can handle open, send RST_STREAM immediately
on new streams appearing.
expiry: 2024/03/03
owner: ctiller@google.com
test_tags: [flow_control_test]
- name: peer_state_based_framing
description:
If set, the max sizes of frames sent to lower layers is controlled based
@ -177,13 +165,6 @@
expiry: 2024/06/14
owner: ctiller@google.com
test_tags: ["core_end2end_test", "cpp_end2end_test", "xds_end2end_test", "logging_test"]
- name: red_max_concurrent_streams
description:
Perform random early rejection of requests that would exceed a newly reduced
MAX_CONCURRENT_STREAMS but are allowed by the current.
expiry: 2024/03/03
owner: ctiller@google.com
test_tags: [flow_control_test]
- name: registered_method_lookup_in_transport
description:
Change registered method's lookup point to transport

View File

@ -78,12 +78,8 @@
default: false
- name: keepalive_server_fix
default: false
- name: memory_pressure_controller
default: false
- name: monitoring_experiment
default: true
- name: overload_protection
default: true
- name: peer_state_based_framing
default: false
- name: pending_queue_cap
@ -94,8 +90,6 @@
default: false
- name: promise_based_server_call
default: false
- name: red_max_concurrent_streams
default: false
- name: registered_method_lookup_in_transport
default: true
- name: registered_methods_map

View File

@ -658,14 +658,9 @@ BasicMemoryQuota::PressureInfo BasicMemoryQuota::GetPressureInfo() {
if (size < 1) return PressureInfo{1, 1, 1};
PressureInfo pressure_info;
pressure_info.instantaneous_pressure = std::max(0.0, (size - free) / size);
if (IsMemoryPressureControllerEnabled()) {
pressure_info.pressure_control_value =
pressure_tracker_.AddSampleAndGetControlValue(
pressure_info.instantaneous_pressure);
} else {
pressure_info.pressure_control_value =
std::min(pressure_info.instantaneous_pressure, 1.0);
}
pressure_info.pressure_control_value =
pressure_tracker_.AddSampleAndGetControlValue(
pressure_info.instantaneous_pressure);
pressure_info.max_recommended_allocation_size = quota_size / 16;
return pressure_info;
}

View File

@ -1,51 +0,0 @@
//
//
// Copyright 2016 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#include <grpc/support/port_platform.h>
#include "src/core/lib/transport/pid_controller.h"
#include "src/core/lib/gpr/useful.h"
namespace grpc_core {
PidController::PidController(const Args& args)
: last_control_value_(args.initial_control_value()), args_(args) {}
double PidController::Update(double error, double dt) {
if (dt <= 0) return last_control_value_;
// integrate error using the trapezoid rule
error_integral_ += dt * (last_error_ + error) * 0.5;
error_integral_ =
Clamp(error_integral_, -args_.integral_range(), args_.integral_range());
double diff_error = (error - last_error_) / dt;
// calculate derivative of control value vs time
double dc_dt = args_.gain_p() * error + args_.gain_i() * error_integral_ +
args_.gain_d() * diff_error;
// and perform trapezoidal integration
double new_control_value =
last_control_value_ + dt * (last_dc_dt_ + dc_dt) * 0.5;
new_control_value = Clamp(new_control_value, args_.min_control_value(),
args_.max_control_value());
last_error_ = error;
last_dc_dt_ = dc_dt;
last_control_value_ = new_control_value;
return new_control_value;
}
} // namespace grpc_core

View File

@ -1,116 +0,0 @@
//
//
// Copyright 2016 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#ifndef GRPC_SRC_CORE_LIB_TRANSPORT_PID_CONTROLLER_H
#define GRPC_SRC_CORE_LIB_TRANSPORT_PID_CONTROLLER_H
#include <grpc/support/port_platform.h>
#include <limits>
// \file Simple PID controller.
// Implements a proportional-integral-derivative controller.
// Used when we want to iteratively control a variable to converge some other
// observed value to a 'set-point'.
// Gains can be set to adjust sensitivity to current error (p), the integral
// of error (i), and the derivative of error (d).
namespace grpc_core {
class PidController {
public:
class Args {
public:
double gain_p() const { return gain_p_; }
double gain_i() const { return gain_i_; }
double gain_d() const { return gain_d_; }
double initial_control_value() const { return initial_control_value_; }
double min_control_value() const { return min_control_value_; }
double max_control_value() const { return max_control_value_; }
double integral_range() const { return integral_range_; }
Args& set_gain_p(double gain_p) {
gain_p_ = gain_p;
return *this;
}
Args& set_gain_i(double gain_i) {
gain_i_ = gain_i;
return *this;
}
Args& set_gain_d(double gain_d) {
gain_d_ = gain_d;
return *this;
}
Args& set_initial_control_value(double initial_control_value) {
initial_control_value_ = initial_control_value;
return *this;
}
Args& set_min_control_value(double min_control_value) {
min_control_value_ = min_control_value;
return *this;
}
Args& set_max_control_value(double max_control_value) {
max_control_value_ = max_control_value;
return *this;
}
Args& set_integral_range(double integral_range) {
integral_range_ = integral_range;
return *this;
}
private:
double gain_p_ = 0.0;
double gain_i_ = 0.0;
double gain_d_ = 0.0;
double initial_control_value_ = 0.0;
double min_control_value_ = std::numeric_limits<double>::min();
double max_control_value_ = std::numeric_limits<double>::max();
double integral_range_ = std::numeric_limits<double>::max();
};
explicit PidController(const Args& args);
/// Reset the controller internal state: useful when the environment has
/// changed significantly
void Reset() {
last_error_ = 0.0;
last_dc_dt_ = 0.0;
error_integral_ = 0.0;
}
/// Update the controller: given a current error estimate, and the time since
/// the last update, returns a new control value
double Update(double error, double dt);
/// Returns the last control value calculated
double last_control_value() const { return last_control_value_; }
/// Returns the current error integral (mostly for testing)
double error_integral() const { return error_integral_; }
private:
double last_error_ = 0.0;
double error_integral_ = 0.0;
double last_control_value_;
double last_dc_dt_ = 0.0;
const Args args_;
};
} // namespace grpc_core
#endif // GRPC_SRC_CORE_LIB_TRANSPORT_PID_CONTROLLER_H

View File

@ -811,7 +811,6 @@ CORE_SOURCE_FILES = [
'src/core/lib/transport/http_connect_handshaker.cc',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/tcp_connect_handshaker.cc',
'src/core/lib/transport/timeout_encoding.cc',

View File

@ -94,21 +94,6 @@ grpc_cc_test(
],
)
grpc_cc_test(
name = "pid_controller_test",
srcs = ["pid_controller_test.cc"],
external_deps = [
"gtest",
],
language = "C++",
deps = [
"//:gpr",
"//:grpc",
"//test/core/util:grpc_test_util",
"//test/core/util:grpc_test_util_base",
],
)
grpc_cc_test(
name = "promise_endpoint_test",
srcs = ["promise_endpoint_test.cc"],

View File

@ -1,89 +0,0 @@
//
//
// Copyright 2016 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#include "src/core/lib/transport/pid_controller.h"
#include <math.h>
#include <memory>
#include <ostream>
#include "gtest/gtest.h"
#include "test/core/util/test_config.h"
namespace grpc_core {
namespace testing {
TEST(PidController, NoOp) {
PidController pid(PidController::Args()
.set_gain_p(1)
.set_gain_i(1)
.set_gain_d(1)
.set_initial_control_value(1));
}
struct SimpleConvergenceTestArgs {
double gain_p;
double gain_i;
double gain_d;
double dt;
double set_point;
double start;
};
std::ostream& operator<<(std::ostream& out, SimpleConvergenceTestArgs args) {
return out << "gain_p:" << args.gain_p << " gain_i:" << args.gain_i
<< " gain_d:" << args.gain_d << " dt:" << args.dt
<< " set_point:" << args.set_point << " start:" << args.start;
}
class SimpleConvergenceTest
: public ::testing::TestWithParam<SimpleConvergenceTestArgs> {};
TEST_P(SimpleConvergenceTest, Converges) {
PidController pid(PidController::Args()
.set_gain_p(GetParam().gain_p)
.set_gain_i(GetParam().gain_i)
.set_gain_d(GetParam().gain_d)
.set_initial_control_value(GetParam().start));
for (int i = 0; i < 100000; i++) {
pid.Update(GetParam().set_point - pid.last_control_value(), GetParam().dt);
}
EXPECT_LT(fabs(GetParam().set_point - pid.last_control_value()), 0.1);
if (GetParam().gain_i > 0) {
EXPECT_LT(fabs(pid.error_integral()), 0.1);
}
}
INSTANTIATE_TEST_SUITE_P(
X, SimpleConvergenceTest,
::testing::Values(SimpleConvergenceTestArgs{0.2, 0, 0, 1, 100, 0},
SimpleConvergenceTestArgs{0.2, 0.1, 0, 1, 100, 0},
SimpleConvergenceTestArgs{0.2, 0.1, 0.1, 1, 100, 0}));
} // namespace testing
} // namespace grpc_core
int main(int argc, char** argv) {
grpc::testing::TestEnvironment env(&argc, argv);
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View File

@ -2899,8 +2899,6 @@ src/core/lib/transport/metadata_batch.h \
src/core/lib/transport/metadata_compression_traits.h \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/parsed_metadata.h \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/pid_controller.h \
src/core/lib/transport/simple_slice_based_metadata.h \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/status_conversion.h \

View File

@ -2680,8 +2680,6 @@ src/core/lib/transport/metadata_batch.h \
src/core/lib/transport/metadata_compression_traits.h \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/parsed_metadata.h \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/pid_controller.h \
src/core/lib/transport/simple_slice_based_metadata.h \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/status_conversion.h \

View File

@ -6601,30 +6601,6 @@
],
"uses_polling": false
},
{
"args": [],
"benchmark": false,
"ci_platforms": [
"linux",
"mac",
"posix",
"windows"
],
"cpu_cost": 1.0,
"exclude_configs": [],
"exclude_iomgrs": [],
"flaky": false,
"gtest": true,
"language": "c++",
"name": "pid_controller_test",
"platforms": [
"linux",
"mac",
"posix",
"windows"
],
"uses_polling": true
},
{
"args": [],
"benchmark": false,