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 \