diff --git a/BUILD b/BUILD index 33461c9d86e..dfc27803ce2 100644 --- a/BUILD +++ b/BUILD @@ -404,12 +404,20 @@ grpc_cc_library( grpc_cc_library( name = "experiments", - srcs = ["src/core/lib/experiments/experiments.cc"], - hdrs = ["src/core/lib/experiments/experiments.h"], + srcs = [ + "src/core/lib/experiments/config.cc", + "src/core/lib/experiments/experiments.cc", + ], + hdrs = [ + "src/core/lib/experiments/config.h", + "src/core/lib/experiments/experiments.h", + ], + external_deps = ["absl/strings"], language = "c++", deps = [ "gpr", "gpr_platform", + "no_destruct", ], ) @@ -435,6 +443,7 @@ grpc_cc_library( "channel_stack_type", "config", "default_event_engine", + "experiments", "forkable", "gpr", "grpc_authorization_base", @@ -498,6 +507,7 @@ grpc_cc_library( "channel_stack_type", "config", "default_event_engine", + "experiments", "forkable", "gpr", "grpc_alts_credentials", diff --git a/CMakeLists.txt b/CMakeLists.txt index 63da4c8b20e..93966e9a992 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2126,6 +2126,7 @@ add_library(grpc src/core/lib/event_engine/windows/iocp.cc src/core/lib/event_engine/windows/win_socket.cc src/core/lib/event_engine/windows/windows_engine.cc + src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/status_helper.cc src/core/lib/gprpp/time.cc @@ -2762,6 +2763,7 @@ add_library(grpc_unsecure src/core/lib/event_engine/windows/iocp.cc src/core/lib/event_engine/windows/win_socket.cc src/core/lib/event_engine/windows/windows_engine.cc + src/core/lib/experiments/config.cc src/core/lib/experiments/experiments.cc src/core/lib/gprpp/status_helper.cc src/core/lib/gprpp/time.cc diff --git a/Makefile b/Makefile index 08272b1abc3..653b9a0cc7f 100644 --- a/Makefile +++ b/Makefile @@ -1441,6 +1441,7 @@ LIBGRPC_SRC = \ src/core/lib/event_engine/windows/iocp.cc \ src/core/lib/event_engine/windows/win_socket.cc \ src/core/lib/event_engine/windows/windows_engine.cc \ + src/core/lib/experiments/config.cc \ src/core/lib/experiments/experiments.cc \ src/core/lib/gprpp/status_helper.cc \ src/core/lib/gprpp/time.cc \ @@ -1941,6 +1942,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/event_engine/windows/iocp.cc \ src/core/lib/event_engine/windows/win_socket.cc \ src/core/lib/event_engine/windows/windows_engine.cc \ + src/core/lib/experiments/config.cc \ src/core/lib/experiments/experiments.cc \ src/core/lib/gprpp/status_helper.cc \ src/core/lib/gprpp/time.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index e3591df5821..0affbceb488 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -796,6 +796,7 @@ libs: - src/core/lib/event_engine/windows/iocp.h - src/core/lib/event_engine/windows/win_socket.h - src/core/lib/event_engine/windows/windows_engine.h + - src/core/lib/experiments/config.h - src/core/lib/experiments/experiments.h - src/core/lib/gprpp/atomic_utils.h - src/core/lib/gprpp/bitset.h @@ -1499,6 +1500,7 @@ libs: - src/core/lib/event_engine/windows/iocp.cc - src/core/lib/event_engine/windows/win_socket.cc - src/core/lib/event_engine/windows/windows_engine.cc + - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/status_helper.cc - src/core/lib/gprpp/time.cc @@ -2015,6 +2017,7 @@ libs: - src/core/lib/event_engine/windows/iocp.h - src/core/lib/event_engine/windows/win_socket.h - src/core/lib/event_engine/windows/windows_engine.h + - src/core/lib/experiments/config.h - src/core/lib/experiments/experiments.h - src/core/lib/gprpp/atomic_utils.h - src/core/lib/gprpp/bitset.h @@ -2358,6 +2361,7 @@ libs: - src/core/lib/event_engine/windows/iocp.cc - src/core/lib/event_engine/windows/win_socket.cc - src/core/lib/event_engine/windows/windows_engine.cc + - src/core/lib/experiments/config.cc - src/core/lib/experiments/experiments.cc - src/core/lib/gprpp/status_helper.cc - src/core/lib/gprpp/time.cc diff --git a/config.m4 b/config.m4 index ee602b1b290..ae74b4ccdc4 100644 --- a/config.m4 +++ b/config.m4 @@ -489,6 +489,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/event_engine/windows/iocp.cc \ src/core/lib/event_engine/windows/win_socket.cc \ src/core/lib/event_engine/windows/windows_engine.cc \ + src/core/lib/experiments/config.cc \ src/core/lib/experiments/experiments.cc \ src/core/lib/gpr/alloc.cc \ src/core/lib/gpr/atm.cc \ diff --git a/config.w32 b/config.w32 index 493335baed5..9a0e9617728 100644 --- a/config.w32 +++ b/config.w32 @@ -455,6 +455,7 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\event_engine\\windows\\iocp.cc " + "src\\core\\lib\\event_engine\\windows\\win_socket.cc " + "src\\core\\lib\\event_engine\\windows\\windows_engine.cc " + + "src\\core\\lib\\experiments\\config.cc " + "src\\core\\lib\\experiments\\experiments.cc " + "src\\core\\lib\\gpr\\alloc.cc " + "src\\core\\lib\\gpr\\atm.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 29d2c096a36..2677ed83fb7 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -701,6 +701,7 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/windows/iocp.h', 'src/core/lib/event_engine/windows/win_socket.h', 'src/core/lib/event_engine/windows/windows_engine.h', + 'src/core/lib/experiments/config.h', 'src/core/lib/experiments/experiments.h', 'src/core/lib/gpr/alloc.h', 'src/core/lib/gpr/env.h', @@ -1560,6 +1561,7 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/windows/iocp.h', 'src/core/lib/event_engine/windows/win_socket.h', 'src/core/lib/event_engine/windows/windows_engine.h', + 'src/core/lib/experiments/config.h', 'src/core/lib/experiments/experiments.h', 'src/core/lib/gpr/alloc.h', 'src/core/lib/gpr/env.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 2bdf2c4e539..a94c5f19411 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1088,6 +1088,8 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/windows/win_socket.h', 'src/core/lib/event_engine/windows/windows_engine.cc', 'src/core/lib/event_engine/windows/windows_engine.h', + 'src/core/lib/experiments/config.cc', + 'src/core/lib/experiments/config.h', 'src/core/lib/experiments/experiments.cc', 'src/core/lib/experiments/experiments.h', 'src/core/lib/gpr/alloc.cc', @@ -2184,6 +2186,7 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/windows/iocp.h', 'src/core/lib/event_engine/windows/win_socket.h', 'src/core/lib/event_engine/windows/windows_engine.h', + 'src/core/lib/experiments/config.h', 'src/core/lib/experiments/experiments.h', 'src/core/lib/gpr/alloc.h', 'src/core/lib/gpr/env.h', diff --git a/grpc.gemspec b/grpc.gemspec index b9723f5ae3a..60b527ade76 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -1001,6 +1001,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/event_engine/windows/win_socket.h ) s.files += %w( src/core/lib/event_engine/windows/windows_engine.cc ) s.files += %w( src/core/lib/event_engine/windows/windows_engine.h ) + s.files += %w( src/core/lib/experiments/config.cc ) + s.files += %w( src/core/lib/experiments/config.h ) s.files += %w( src/core/lib/experiments/experiments.cc ) s.files += %w( src/core/lib/experiments/experiments.h ) s.files += %w( src/core/lib/gpr/alloc.cc ) diff --git a/grpc.gyp b/grpc.gyp index 1ae4b63e199..82c139f7ef3 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -820,6 +820,7 @@ 'src/core/lib/event_engine/windows/iocp.cc', 'src/core/lib/event_engine/windows/win_socket.cc', 'src/core/lib/event_engine/windows/windows_engine.cc', + 'src/core/lib/experiments/config.cc', 'src/core/lib/experiments/experiments.cc', 'src/core/lib/gprpp/status_helper.cc', 'src/core/lib/gprpp/time.cc', @@ -1265,6 +1266,7 @@ 'src/core/lib/event_engine/windows/iocp.cc', 'src/core/lib/event_engine/windows/win_socket.cc', 'src/core/lib/event_engine/windows/windows_engine.cc', + 'src/core/lib/experiments/config.cc', 'src/core/lib/experiments/experiments.cc', 'src/core/lib/gprpp/status_helper.cc', 'src/core/lib/gprpp/time.cc', diff --git a/package.xml b/package.xml index b4b856f9fb1..0a4b303f59e 100644 --- a/package.xml +++ b/package.xml @@ -983,6 +983,8 @@ + + diff --git a/src/core/lib/experiments/config.cc b/src/core/lib/experiments/config.cc new file mode 100644 index 00000000000..8085b39910f --- /dev/null +++ b/src/core/lib/experiments/config.cc @@ -0,0 +1,115 @@ +// Copyright 2022 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 + +#include "src/core/lib/experiments/config.h" + +#include + +#include +#include +#include + +#include "absl/strings/ascii.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/str_split.h" +#include "absl/strings/string_view.h" + +#include + +#include "src/core/lib/experiments/experiments.h" +#include "src/core/lib/gprpp/global_config.h" +#include "src/core/lib/gprpp/no_destruct.h" + +GPR_GLOBAL_CONFIG_DEFINE_STRING( + grpc_experiments, "", + "List of grpc experiments to enable (or with a '-' prefix to disable)."); + +namespace grpc_core { + +namespace { +struct Experiments { + bool enabled[kNumExperiments]; +}; + +GPR_ATTRIBUTE_NOINLINE Experiments LoadExperimentsFromConfigVariable() { + // Set defaults from metadata. + Experiments experiments; + for (size_t i = 0; i < kNumExperiments; i++) { + experiments.enabled[i] = g_experiment_metadata[i].default_value; + } + // Get the global config. + auto experiments_str = GPR_GLOBAL_CONFIG_GET(grpc_experiments); + // For each comma-separated experiment in the global config: + for (auto experiment : + absl::StrSplit(absl::string_view(experiments_str.get()), ',')) { + // Strip whitespace. + experiment = absl::StripAsciiWhitespace(experiment); + // Handle ",," without crashing. + if (experiment.empty()) continue; + // Enable unless prefixed with '-' (=> disable). + bool enable = true; + if (experiment[0] == '-') { + enable = false; + experiment.remove_prefix(1); + } + // See if we can find the experiment in the list in this binary. + bool found = false; + for (size_t i = 0; i < kNumExperiments; i++) { + if (experiment == g_experiment_metadata[i].name) { + experiments.enabled[i] = enable; + found = true; + break; + } + } + // If not found log an error, but don't take any other action. + // Allows us an easy path to disabling experiments. + if (!found) { + gpr_log(GPR_ERROR, "Unknown experiment: %s", + std::string(experiment).c_str()); + } + } + return experiments; +} +} // namespace + +bool IsExperimentEnabled(size_t experiment_id) { + // One time initialization: + static const NoDestruct experiments{ + LoadExperimentsFromConfigVariable()}; + // Normal path: just return the value; + return experiments->enabled[experiment_id]; +} + +void PrintExperimentsList() { + size_t max_experiment_length = 0; + for (size_t i = 0; i < kNumExperiments; i++) { + max_experiment_length = + std::max(max_experiment_length, strlen(g_experiment_metadata[i].name)); + } + for (size_t i = 0; i < kNumExperiments; i++) { + gpr_log( + GPR_DEBUG, "%s", + absl::StrCat("gRPC EXPERIMENT ", g_experiment_metadata[i].name, + std::string(max_experiment_length - + strlen(g_experiment_metadata[i].name) + 1, + ' '), + IsExperimentEnabled(i) ? "ON " : "OFF", " (default:", + g_experiment_metadata->default_value ? "ON" : "OFF", ")") + .c_str()); + } +} + +} // namespace grpc_core diff --git a/src/core/lib/experiments/config.h b/src/core/lib/experiments/config.h new file mode 100644 index 00000000000..5a3738731ed --- /dev/null +++ b/src/core/lib/experiments/config.h @@ -0,0 +1,34 @@ +// Copyright 2022 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_CORE_LIB_EXPERIMENTS_CONFIG_H +#define GRPC_CORE_LIB_EXPERIMENTS_CONFIG_H + +#include + +#include + +namespace grpc_core { + +// Return true if experiment \a experiment_id is enabled. +// Experiments are numbered by their order in the g_experiment_metadata array +// declared in experiments.h. +bool IsExperimentEnabled(size_t experiment_id); + +// Print out a list of all experiments that are built into this binary. +void PrintExperimentsList(); + +} // namespace grpc_core + +#endif // GRPC_CORE_LIB_EXPERIMENTS_CONFIG_H diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index b260de2d080..da8c33355b6 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -18,8 +18,6 @@ #include "src/core/lib/experiments/experiments.h" -#include "src/core/lib/gprpp/global_config.h" - namespace { const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP " @@ -33,37 +31,12 @@ const char* const description_tcp_rcv_lowat = "Use SO_RCVLOWAT to avoid wakeups on the read path."; } // namespace -GPR_GLOBAL_CONFIG_DEFINE_BOOL(grpc_experimental_enable_tcp_frame_size_tuning, - false, description_tcp_frame_size_tuning); -GPR_GLOBAL_CONFIG_DEFINE_BOOL(grpc_experimental_enable_tcp_read_chunks, false, - description_tcp_read_chunks); -GPR_GLOBAL_CONFIG_DEFINE_BOOL(grpc_experimental_enable_tcp_rcv_lowat, false, - description_tcp_rcv_lowat); - namespace grpc_core { -bool IsTcpFrameSizeTuningEnabled() { - static const bool enabled = - GPR_GLOBAL_CONFIG_GET(grpc_experimental_enable_tcp_frame_size_tuning); - return enabled; -} -bool IsTcpReadChunksEnabled() { - static const bool enabled = - GPR_GLOBAL_CONFIG_GET(grpc_experimental_enable_tcp_read_chunks); - return enabled; -} -bool IsTcpRcvLowatEnabled() { - static const bool enabled = - GPR_GLOBAL_CONFIG_GET(grpc_experimental_enable_tcp_rcv_lowat); - return enabled; -} - const ExperimentMetadata g_experiment_metadata[] = { - {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, false, - IsTcpFrameSizeTuningEnabled}, - {"tcp_read_chunks", description_tcp_read_chunks, false, - IsTcpReadChunksEnabled}, - {"tcp_rcv_lowat", description_tcp_rcv_lowat, false, IsTcpRcvLowatEnabled}, + {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, false}, + {"tcp_read_chunks", description_tcp_read_chunks, false}, + {"tcp_rcv_lowat", description_tcp_rcv_lowat, false}, }; } // namespace grpc_core diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index 5e7e97535d0..6003f5a6da3 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -21,17 +21,18 @@ #include +#include "src/core/lib/experiments/config.h" + namespace grpc_core { -bool IsTcpFrameSizeTuningEnabled(); -bool IsTcpReadChunksEnabled(); -bool IsTcpRcvLowatEnabled(); +inline bool IsTcpFrameSizeTuningEnabled() { return IsExperimentEnabled(0); } +inline bool IsTcpReadChunksEnabled() { return IsExperimentEnabled(1); } +inline bool IsTcpRcvLowatEnabled() { return IsExperimentEnabled(2); } struct ExperimentMetadata { const char* name; const char* description; bool default_value; - bool (*is_enabled)(); }; constexpr const size_t kNumExperiments = 3; diff --git a/src/core/lib/surface/init.cc b/src/core/lib/surface/init.cc index 56500b0e733..78e423cfa69 100644 --- a/src/core/lib/surface/init.cc +++ b/src/core/lib/surface/init.cc @@ -40,6 +40,7 @@ #include "src/core/lib/event_engine/default_event_engine.h" #include "src/core/lib/event_engine/forkable.h" #include "src/core/lib/event_engine/posix_engine/timer_manager.h" +#include "src/core/lib/experiments/config.h" #include "src/core/lib/gprpp/fork.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/gprpp/thd.h" @@ -120,6 +121,7 @@ static void do_basic_init(void) { g_shutting_down_cv = new grpc_core::CondVar(); grpc_register_built_in_plugins(); gpr_time_init(); + grpc_core::PrintExperimentsList(); } typedef struct grpc_plugin { diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 3fcb76ad987..7b2b01f7a8d 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -464,6 +464,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/event_engine/windows/iocp.cc', 'src/core/lib/event_engine/windows/win_socket.cc', 'src/core/lib/event_engine/windows/windows_engine.cc', + 'src/core/lib/experiments/config.cc', 'src/core/lib/experiments/experiments.cc', 'src/core/lib/gpr/alloc.cc', 'src/core/lib/gpr/atm.cc', diff --git a/test/core/iomgr/tcp_posix_test.cc b/test/core/iomgr/tcp_posix_test.cc index 69e200f087a..1b7aa68f517 100644 --- a/test/core/iomgr/tcp_posix_test.cc +++ b/test/core/iomgr/tcp_posix_test.cc @@ -37,6 +37,7 @@ #include #include "src/core/lib/event_engine/channel_args_endpoint_config.h" +#include "src/core/lib/experiments/experiments.h" #include "src/core/lib/gpr/useful.h" #include "src/core/lib/iomgr/buffer_list.h" #include "src/core/lib/iomgr/ev_posix.h" @@ -50,8 +51,6 @@ static gpr_mu* g_mu; static grpc_pollset* g_pollset; -GPR_GLOBAL_CONFIG_DECLARE_BOOL(grpc_experimental_enable_tcp_frame_size_tuning); - /* General test notes: @@ -191,7 +190,9 @@ static void read_cb(void* user_data, grpc_error_handle error) { current_data = state->read_bytes % 256; // The number of bytes read each time this callback is invoked must be >= // the min_progress_size. - GPR_ASSERT(state->min_progress_size <= state->incoming.length); + if (grpc_core::IsTcpFrameSizeTuningEnabled()) { + GPR_ASSERT(state->min_progress_size <= state->incoming.length); + } read_bytes = count_slices(state->incoming.slices, state->incoming.count, ¤t_data); state->read_bytes += read_bytes; @@ -698,7 +699,6 @@ static void destroy_pollset(void* p, grpc_error_handle /*error*/) { int main(int argc, char** argv) { grpc_closure destroyed; grpc::testing::TestEnvironment env(&argc, argv); - GPR_GLOBAL_CONFIG_SET(grpc_experimental_enable_tcp_frame_size_tuning, true); grpc_init(); grpc_core::grpc_tcp_set_write_timestamps_callback(timestamps_verifier); { diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index f6a5e09b679..be478152654 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -26,7 +26,6 @@ #include "absl/debugging/failure_signal_handler.h" #include "absl/status/status.h" #include "absl/strings/match.h" -#include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include @@ -127,10 +126,7 @@ void ParseTestArgs(int* argc, char** argv) { continue; } if (absl::StartsWith(argv[i], experiment_flag)) { - gpr_setenv( - absl::StrCat("GRPC_EXPERIMENT_", argv[i] + experiment_flag.length()) - .c_str(), - "true"); + gpr_setenv("GRPC_EXPERIMENTS", argv[i] + experiment_flag.length()); // remove the spent argv RmArg(i, argc, argv); continue; diff --git a/tools/codegen/core/gen_experiments.py b/tools/codegen/core/gen_experiments.py index 6203ef9a2fe..0cbe5d14745 100755 --- a/tools/codegen/core/gen_experiments.py +++ b/tools/codegen/core/gen_experiments.py @@ -120,7 +120,6 @@ EXPERIMENT_METADATA = """struct ExperimentMetadata { const char* name; const char* description; bool default_value; - bool (*is_enabled)(); };""" with open('src/core/lib/experiments/experiments.h', 'w') as H: @@ -137,11 +136,14 @@ with open('src/core/lib/experiments/experiments.h', 'w') as H: print("#include ", file=H) print(file=H) print("#include ", file=H) + print("#include \"src/core/lib/experiments/config.h\"", file=H) print(file=H) print("namespace grpc_core {", file=H) print(file=H) - for attr in attrs: - print("bool Is%sEnabled();" % snake_to_pascal(attr['name']), file=H) + for i, attr in enumerate(attrs): + print("inline bool Is%sEnabled() { return IsExperimentEnabled(%d); }" % + (snake_to_pascal(attr['name']), i), + file=H) print(file=H) print(EXPERIMENT_METADATA, file=H) print(file=H) @@ -164,7 +166,6 @@ with open('src/core/lib/experiments/experiments.cc', 'w') as C: print("#include ", file=C) print("#include \"src/core/lib/experiments/experiments.h\"", file=C) - print("#include \"src/core/lib/gprpp/global_config.h\"", file=C) print(file=C) print("namespace {", file=C) for attr in attrs: @@ -173,29 +174,13 @@ with open('src/core/lib/experiments/experiments.cc', 'w') as C: file=C) print("}", file=C) print(file=C) - for attr in attrs: - print( - "GPR_GLOBAL_CONFIG_DEFINE_BOOL(grpc_experimental_enable_%s, %s, description_%s);" - % (attr['name'], 'true' if attr['default'] else 'false', - attr['name']), - file=C) - print(file=C) print("namespace grpc_core {", file=C) print(file=C) - for attr in attrs: - print("bool Is%sEnabled() {" % snake_to_pascal(attr['name']), file=C) - print( - " static const bool enabled = GPR_GLOBAL_CONFIG_GET(grpc_experimental_enable_%s);" - % attr['name'], - file=C) - print(" return enabled;", file=C) - print("}", file=C) - print(file=C) print("const ExperimentMetadata g_experiment_metadata[] = {", file=C) for attr in attrs: - print(" {%s, description_%s, %s, Is%sEnabled}," % - (c_str(attr['name']), attr['name'], 'true' - if attr['default'] else 'false', snake_to_pascal(attr['name'])), + print(" {%s, description_%s, %s}," % + (c_str(attr['name']), attr['name'], + 'true' if attr['default'] else 'false'), file=C) print("};", file=C) print(file=C) diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index bbe32e5bdd9..35558b5e077 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1984,6 +1984,8 @@ src/core/lib/event_engine/windows/win_socket.cc \ src/core/lib/event_engine/windows/win_socket.h \ src/core/lib/event_engine/windows/windows_engine.cc \ src/core/lib/event_engine/windows/windows_engine.h \ +src/core/lib/experiments/config.cc \ +src/core/lib/experiments/config.h \ src/core/lib/experiments/experiments.cc \ src/core/lib/experiments/experiments.h \ src/core/lib/gpr/alloc.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 8de0de53ee3..10d9836f13f 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1774,6 +1774,8 @@ src/core/lib/event_engine/windows/win_socket.cc \ src/core/lib/event_engine/windows/win_socket.h \ src/core/lib/event_engine/windows/windows_engine.cc \ src/core/lib/event_engine/windows/windows_engine.h \ +src/core/lib/experiments/config.cc \ +src/core/lib/experiments/config.h \ src/core/lib/experiments/experiments.cc \ src/core/lib/experiments/experiments.h \ src/core/lib/gpr/README.md \