From 26b9866d5773c65e4c9d9ff82e3c7108b8e5e2c6 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 14 Jul 2026 17:52:03 +0530 Subject: [PATCH 01/29] interop: add OpenTelemetry tracing interop test suite and OTLP collector --- test/cpp/interop/BUILD | 41 +++ test/cpp/interop/client.cc | 22 +- test/cpp/interop/interop_server.cc | 18 +- test/cpp/interop/otel_helper.cc | 98 +++++++ test/cpp/interop/otel_helper.h | 33 +++ test/cpp/interop/otlp_collector.cc | 120 +++++++++ test/cpp/interop/otlp_collector.py | 69 +++++ test/cpp/interop/run_otel_interop_test.py | 306 ++++++++++++++++++++++ tools/run_tests/run_interop_tests.py | 186 ++++++++++++- 9 files changed, 876 insertions(+), 17 deletions(-) create mode 100644 test/cpp/interop/otel_helper.cc create mode 100644 test/cpp/interop/otel_helper.h create mode 100644 test/cpp/interop/otlp_collector.cc create mode 100644 test/cpp/interop/otlp_collector.py create mode 100755 test/cpp/interop/run_otel_interop_test.py diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD index 166dd00c6997e..86ac70b5ebf2d 100644 --- a/test/cpp/interop/BUILD +++ b/test/cpp/interop/BUILD @@ -13,6 +13,7 @@ # limitations under the License. load("//bazel:grpc_build_system.bzl", "grpc_cc_binary", "grpc_cc_library", "grpc_cc_test", "grpc_package") +load("//bazel:python_rules.bzl", "py_grpc_library", "py_proto_library") licenses(["notice"]) @@ -94,6 +95,28 @@ grpc_cc_binary( ], ) +grpc_cc_library( + name = "otel_helper_lib", + srcs = [ + "otel_helper.cc", + ], + hdrs = [ + "otel_helper.h", + ], + external_deps = [ + "absl/flags:flag", + "absl/log", + "otel/api", + "otel/exporters/otlp:otlp_grpc_exporter", + "otel/sdk/src/trace", + "otel/sdk:headers", + ], + deps = [ + "//:grpc++", + "//src/cpp/ext/otel:otel_plugin", + ], +) + grpc_cc_library( name = "interop_server_lib", srcs = [ @@ -105,6 +128,7 @@ grpc_cc_library( "absl/log:check", ], deps = [ + ":otel_helper_lib", ":server_helper_lib", "//:gpr", "//:grpc", @@ -171,6 +195,7 @@ grpc_cc_library( ], deps = [ ":client_helper_lib", + ":otel_helper_lib", "//:gpr", "//:grpc", "//:grpc++", @@ -786,3 +811,19 @@ grpc_cc_library( "//src/core:pollset_set", ], ) + +grpc_cc_binary( + name = "otlp_collector", + srcs = ["otlp_collector.cc"], + external_deps = [ + "absl/flags:flag", + "absl/flags:parse", + "absl/log", + "protobuf", + ], + deps = [ + "//:grpc++", + "@opentelemetry-proto//:trace_service_grpc_cc", + "@opentelemetry-proto//:trace_service_proto_cc", + ], +) diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index 9cdf206447ef0..12235d24e4c57 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -16,23 +16,25 @@ // // +#include +#include + +#include "absl/flags/flag.h" +#include "absl/log/log.h" + #include #include #include #include #include -#include -#include - #include "src/core/util/crash.h" #include "src/core/util/string.h" #include "test/core/test_util/test_config.h" #include "test/cpp/interop/client_helper.h" #include "test/cpp/interop/interop_client.h" +#include "test/cpp/interop/otel_helper.h" #include "test/cpp/util/test_config.h" -#include "absl/flags/flag.h" -#include "absl/log/log.h" ABSL_FLAG(bool, use_alts, false, "Whether to use alts. Enable alts will disable tls."); @@ -204,6 +206,7 @@ ParseAdditionalMetadataFlag(const std::string& flag) { int main(int argc, char** argv) { grpc::testing::TestEnvironment env(&argc, argv); grpc::testing::InitTest(&argc, &argv, true); + grpc::testing::interop::MaybeRegisterOpenTelemetry(); LOG(INFO) << "Testing these cases: " << absl::GetFlag(FLAGS_test_case); int ret = 0; @@ -220,13 +223,13 @@ int main(int argc, char** argv) { grpc::experimental::ClientInterceptorFactoryInterface>> factories; if (!additional_metadata->empty()) { - factories.emplace_back( - new grpc::testing::AdditionalMetadataInterceptorFactory( + factories.emplace_back(std::make_unique< + grpc::testing::AdditionalMetadataInterceptorFactory>( *additional_metadata)); } if (absl::GetFlag(FLAGS_log_metadata_and_status)) { - factories.emplace_back( - new grpc::testing::MetadataAndStatusLoggerInterceptorFactory()); + factories.emplace_back(std::make_unique< + grpc::testing::MetadataAndStatusLoggerInterceptorFactory>()); } std::string service_config_json = absl::GetFlag(FLAGS_service_config_json); @@ -357,5 +360,6 @@ int main(int argc, char** argv) { ret = 1; } + grpc::testing::interop::ForceFlushOpenTelemetry(); return ret; } diff --git a/test/cpp/interop/interop_server.cc b/test/cpp/interop/interop_server.cc index b2ca0eafae557..0eebcf67b002f 100644 --- a/test/cpp/interop/interop_server.cc +++ b/test/cpp/interop/interop_server.cc @@ -16,6 +16,14 @@ // // +#include +#include +#include +#include + +#include "absl/flags/flag.h" +#include "absl/log/log.h" + #include #include #include @@ -26,11 +34,6 @@ #include #include -#include -#include -#include -#include - #include "src/core/util/crash.h" #include "src/core/util/grpc_check.h" #include "src/core/util/string.h" @@ -38,10 +41,9 @@ #include "src/proto/grpc/testing/empty.pb.h" #include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" +#include "test/cpp/interop/otel_helper.h" #include "test/cpp/interop/server_helper.h" #include "test/cpp/util/test_config.h" -#include "absl/flags/flag.h" -#include "absl/log/log.h" ABSL_FLAG(bool, use_alts, false, "Whether to use alts. Enable alts will disable tls."); @@ -419,6 +421,7 @@ void grpc::testing::interop::RunServer( ServerStartedCondition* server_started_condition, std::unique_ptr>> server_options) { + grpc::testing::interop::MaybeRegisterOpenTelemetry(); GRPC_CHECK_NE(port, 0); std::ostringstream server_address; server_address << "0.0.0.0:" << port; @@ -457,4 +460,5 @@ void grpc::testing::interop::RunServer( gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_seconds(5, GPR_TIMESPAN))); } + grpc::testing::interop::ForceFlushOpenTelemetry(); } diff --git a/test/cpp/interop/otel_helper.cc b/test/cpp/interop/otel_helper.cc new file mode 100644 index 0000000000000..6d0ea3900f388 --- /dev/null +++ b/test/cpp/interop/otel_helper.cc @@ -0,0 +1,98 @@ +// +// +// Copyright 2026 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 "test/cpp/interop/otel_helper.h" + +#ifndef HAVE_ABSEIL +#define HAVE_ABSEIL +#endif + +#include +#include +#include +#include + +#include "absl/flags/flag.h" +#include "absl/log/log.h" + +#include + +#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h" +#include "opentelemetry/sdk/trace/simple_processor_factory.h" +#include "opentelemetry/sdk/trace/tracer_provider.h" + +ABSL_FLAG(bool, enable_opentelemetry, false, + "Whether to enable OpenTelemetry Tracing"); + +namespace grpc { +namespace testing { +namespace interop { + +static std::shared_ptr + g_tracer_provider; +static std::once_flag g_otel_init_once; + +void MaybeRegisterOpenTelemetry() { + std::call_once(g_otel_init_once, []() { + if (!absl::GetFlag(FLAGS_enable_opentelemetry)) { + return; + } + const char* otel_traces_exporter = std::getenv("OTEL_TRACES_EXPORTER"); + if (otel_traces_exporter != nullptr && + std::string(otel_traces_exporter) == "none") { + LOG(INFO) << "OTEL_TRACES_EXPORTER is set to none. Tracing is disabled."; + return; + } + + // Create OTLP Grpc Exporter + opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts; + auto exporter = + opentelemetry::exporter::otlp::OtlpGrpcExporterFactory::Create(opts); + auto processor = + opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create( + std::move(exporter)); + g_tracer_provider = + std::make_shared( + std::move(processor)); + + auto status = + grpc::OpenTelemetryPluginBuilder() + .SetTracerProvider(g_tracer_provider) + .SetTextMapPropagator(grpc::OpenTelemetryPluginBuilder:: + MakeGrpcTraceBinTextMapPropagator()) + .BuildAndRegisterGlobal(); + + if (!status.ok()) { + LOG(ERROR) << "Failed to register gRPC OpenTelemetry Plugin: " + << status.ToString(); + } else { + LOG(INFO) + << "Successfully registered gRPC OpenTelemetry Plugin for tracing."; + } + }); +} + +void ForceFlushOpenTelemetry() { + if (g_tracer_provider != nullptr) { + g_tracer_provider->ForceFlush(); + } +} + +} // namespace interop +} // namespace testing +} // namespace grpc diff --git a/test/cpp/interop/otel_helper.h b/test/cpp/interop/otel_helper.h new file mode 100644 index 0000000000000..780e896fd973c --- /dev/null +++ b/test/cpp/interop/otel_helper.h @@ -0,0 +1,33 @@ +// +// +// Copyright 2026 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_TEST_CPP_INTEROP_OTEL_HELPER_H +#define GRPC_TEST_CPP_INTEROP_OTEL_HELPER_H + +namespace grpc { +namespace testing { +namespace interop { + +void MaybeRegisterOpenTelemetry(); +void ForceFlushOpenTelemetry(); + +} // namespace interop +} // namespace testing +} // namespace grpc + +#endif // GRPC_TEST_CPP_INTEROP_OTEL_HELPER_H diff --git a/test/cpp/interop/otlp_collector.cc b/test/cpp/interop/otlp_collector.cc new file mode 100644 index 0000000000000..a3ecb45cf9437 --- /dev/null +++ b/test/cpp/interop/otlp_collector.cc @@ -0,0 +1,120 @@ +// +// +// Copyright 2026 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 +#include +#include +#include + +#include "absl/flags/flag.h" +#include "absl/flags/parse.h" +#include "absl/log/log.h" + +#include + +#include +#include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h" + +ABSL_FLAG(int, port, 0, "Port to listen on"); +ABSL_FLAG(std::string, file, "", "File to write JSON spans to"); + +class TraceServiceServiceImpl final + : public opentelemetry::proto::collector::trace::v1::TraceService::Service { + public: + explicit TraceServiceServiceImpl(std::string file_path) + : file_path_(std::move(file_path)) {} + + grpc::Status Export( + grpc::ServerContext* /*context*/, + const opentelemetry::proto::collector::trace::v1:: + ExportTraceServiceRequest* request, + opentelemetry::proto::collector::trace::v1::ExportTraceServiceResponse* + /*response*/) override { + std::string json_string; + google::protobuf::util::JsonPrintOptions options; + options.add_whitespace = true; + options.always_print_fields_with_no_presence = true; + options.preserve_proto_field_names = true; + auto status = google::protobuf::util::MessageToJsonString( + *request, &json_string, options); + if (!status.ok()) { + LOG(ERROR) << "Failed to serialize ExportTraceServiceRequest to JSON: " + << status.ToString(); + return grpc::Status(grpc::StatusCode::INTERNAL, + "Failed to serialize to JSON"); + } + + std::lock_guard lock(mu_); + requests_json_.push_back(json_string); + + // Write to a temporary file first and rename to avoid read-during-write data race + std::string tmp_file = file_path_ + ".tmp"; + std::ofstream out(tmp_file, std::ios::trunc); + if (!out) { + LOG(ERROR) << "Failed to open file for writing: " << tmp_file; + return grpc::Status(grpc::StatusCode::INTERNAL, "Failed to open file"); + } + out << "[\n"; + for (size_t i = 0; i < requests_json_.size(); ++i) { + out << requests_json_[i]; + if (i + 1 < requests_json_.size()) { + out << ",\n"; + } + } + out << "\n]\n"; + out.close(); + + std::rename(tmp_file.c_str(), file_path_.c_str()); + + return grpc::Status::OK; + } + + private: + std::string file_path_; + std::vector requests_json_; + std::mutex mu_; +}; + +int main(int argc, char** argv) { + absl::ParseCommandLine(argc, argv); + int port = absl::GetFlag(FLAGS_port); + std::string file_path = absl::GetFlag(FLAGS_file); + + if (port == 0) { + LOG(ERROR) << "--port is required"; + return 1; + } + if (file_path.empty()) { + LOG(ERROR) << "--file is required"; + return 1; + } + + TraceServiceServiceImpl service(file_path); + + grpc::ServerBuilder builder; + builder.AddListeningPort("0.0.0.0:" + std::to_string(port), + grpc::InsecureServerCredentials()); + builder.RegisterService(&service); + + std::unique_ptr server(builder.BuildAndStart()); + LOG(INFO) << "OTLP Collector listening on port " << port << "..."; + server->Wait(); + + return 0; +} diff --git a/test/cpp/interop/otlp_collector.py b/test/cpp/interop/otlp_collector.py new file mode 100644 index 0000000000000..0f16334aaaded --- /dev/null +++ b/test/cpp/interop/otlp_collector.py @@ -0,0 +1,69 @@ +# +# +# Copyright 2026 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. +# +# + +import argparse +import json +import os +import threading +import time +from concurrent import futures +import grpc +from google.protobuf import json_format + +from opentelemetry.proto.collector.trace.v1 import trace_service_pb2 +from opentelemetry.proto.collector.trace.v1 import trace_service_pb2_grpc + +class TraceServiceServicer(trace_service_pb2_grpc.TraceServiceServicer): + def __init__(self, file_path): + self._file_path = file_path + self._requests = [] + self._lock = threading.Lock() + + def Export(self, request, context): + req_dict = json_format.MessageToDict(request, preserving_proto_field_name=True) + with self._lock: + self._requests.append(req_dict) + tmp_file = self._file_path + ".tmp" + with open(tmp_file, "w") as f: + json.dump(self._requests, f, indent=2) + f.flush() + os.replace(tmp_file, self._file_path) + + return trace_service_pb2.ExportTraceServiceResponse() + +def serve(): + parser = argparse.ArgumentParser() + parser.add_argument("--port", type=int, required=True) + parser.add_argument("--file", type=str, required=True) + args = parser.parse_args() + + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + trace_service_pb2_grpc.add_TraceServiceServicer_to_server( + TraceServiceServicer(args.file), server + ) + server.add_insecure_port(f"[::]:{args.port}") + server.start() + print(f"OTLP Collector listening on port {args.port}...") + try: + while True: + time.sleep(86400) + except KeyboardInterrupt: + server.stop(0) + +if __name__ == "__main__": + serve() diff --git a/test/cpp/interop/run_otel_interop_test.py b/test/cpp/interop/run_otel_interop_test.py new file mode 100755 index 0000000000000..7941e8195e138 --- /dev/null +++ b/test/cpp/interop/run_otel_interop_test.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python3 +# +# Copyright 2026 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. +# + +import argparse +import json +import os +import socket +import subprocess +import sys +import time + +def get_free_port(): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('', 0)) + port = s.getsockname()[1] + s.close() + return port + +def run_cmd(args, desc, env=None, cwd=None): + print(f"Executing: {' '.join(args)} ({desc})") + proc_env = os.environ.copy() + if env: + proc_env.update(env) + res = subprocess.run(args, env=proc_env, cwd=cwd, capture_output=True, text=True) + if res.returncode != 0: + print(f"Error executing {desc}:") + print("STDOUT:", res.stdout) + print("STDERR:", res.stderr) + sys.exit(res.returncode) + return res + +def start_proc(args, env, desc, cwd=None): + print(f"Starting in background: {' '.join(args)} ({desc})") + # Inherit system environment and merge with custom variables + proc_env = os.environ.copy() + proc_env.update(env) + return subprocess.Popen(args, env=proc_env, cwd=cwd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + +def verify_spans(spans_file): + start_time = time.time() + all_spans = [] + client_span = None + attempt_span = None + server_span = None + + print("Verifying spans with polling...") + while time.time() - start_time < 5.0: + if not os.path.exists(spans_file): + time.sleep(0.5) + continue + try: + with open(spans_file, "r") as f: + requests = json.load(f) + except (json.JSONDecodeError, IOError): + time.sleep(0.5) + continue + + all_spans = [] + for req in requests: + for resource_spans in req.get("resource_spans", []): + for scope_spans in resource_spans.get("scope_spans", []): + for span in scope_spans.get("spans", []): + all_spans.append(span) + + client_span = next((s for s in all_spans if s.get("name") in ("Sent.grpc.testing.TestService.EmptyCall", "Sent.grpc.testing.TestService/EmptyCall")), None) + if not client_span: + time.sleep(0.5) + continue + + trace_id = client_span.get("trace_id") + if not trace_id: + time.sleep(0.5) + continue + + attempt_span = next((s for s in all_spans if s.get("name") in ("Attempt.grpc.testing.TestService.EmptyCall", "Attempt.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) + server_span = next((s for s in all_spans if s.get("name") in ("Recv.grpc.testing.TestService.EmptyCall", "Recv.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) + + if not attempt_span or not server_span: + time.sleep(0.5) + continue + + # Found all three spans matching the Trace ID + break + else: + print("Assertion Failed: Timed out waiting for all 3 expected spans.") + return False + + print(f"Collected {len(all_spans)} spans:") + for s in all_spans: + print(f" Span: '{s.get('name')}' (TraceID: {s.get('trace_id')}, SpanID: {s.get('span_id')}, ParentID: {s.get('parent_span_id')})") + + # 1. Assert all spans share the same Trace ID + trace_id = client_span.get("trace_id") + if attempt_span.get("trace_id") != trace_id: + print(f"Assertion Failed: Attempt span Trace ID mismatch. Expected {trace_id}, got {attempt_span.get('trace_id')}") + return False + if server_span.get("trace_id") != trace_id: + print(f"Assertion Failed: Server span Trace ID mismatch. Expected {trace_id}, got {server_span.get('trace_id')}") + return False + + # 2. Assert Parent-Child hierarchy + # Attempt Span must be a child of Client Span + if attempt_span.get("parent_span_id") != client_span.get("span_id"): + print(f"Assertion Failed: Attempt span is not child of Client span. Expected parent {client_span.get('span_id')}, got {attempt_span.get('parent_span_id')}") + return False + # Server Span must be a child of Attempt Span + if server_span.get("parent_span_id") != attempt_span.get("span_id"): + print(f"Assertion Failed: Server span is not child of Attempt span. Expected parent {attempt_span.get('span_id')}, got {server_span.get('parent_span_id')}") + return False + + # 3. Verify Attempt Span Attributes + attributes = attempt_span.get("attributes", []) + prev_attempts = None + trans_retry = None + for attr in attributes: + key = attr.get("key") + val_dict = attr.get("value", {}) + if key == "previous-rpc-attempts": + prev_attempts = val_dict.get("int_value") + elif key == "transparent-retry": + trans_retry = val_dict.get("bool_value") + + if prev_attempts is None: + print("Assertion Failed: Attribute 'previous-rpc-attempts' not found on Attempt span.") + return False + if int(prev_attempts) != 0: + print(f"Assertion Failed: Attribute 'previous-rpc-attempts' value mismatch. Expected 0, got {prev_attempts}") + return False + if trans_retry is None: + print("Assertion Failed: Attribute 'transparent-retry' not found on Attempt span.") + return False + if trans_retry is not False: + print(f"Assertion Failed: Attribute 'transparent-retry' value mismatch. Expected False, got {trans_retry}") + return False + + # 4. Verify Events + attempt_events = [e.get("name") for e in attempt_span.get("events", [])] + client_events = [e.get("name") for e in client_span.get("events", [])] + if "Outbound message" not in attempt_events and "Outbound message" not in client_events: + print("Assertion Failed: Event 'Outbound message' not found on Client or Attempt span.") + return False + if "Inbound message" not in attempt_events and "Inbound message" not in client_events: + print("Assertion Failed: Event 'Inbound message' not found on Client or Attempt span.") + return False + + server_events = [e.get("name") for e in server_span.get("events", [])] + if "Inbound message" not in server_events: + print("Assertion Failed: Event 'Inbound message' not found on Server span.") + return False + if "Outbound message" not in server_events: + print("Assertion Failed: Event 'Outbound message' not found on Server span.") + return False + + print("All span assertions passed successfully!") + return True + +def main(): + ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) + os.chdir(ROOT) + + parser = argparse.ArgumentParser(description="Build and run OpenTelemetry Interop tests locally") + parser.add_argument("--skip_build", action="store_true", help="Skip building targets with Bazel/Gradle") + parser.add_argument("--client", choices=["c++", "java", "python"], default="c++", help="Client language (c++, java, or python)") + parser.add_argument("--server", choices=["c++", "java", "python"], default="c++", help="Server language (c++, java, or python)") + args = parser.parse_args() + + if not args.skip_build: + if args.client == "c++" or args.server == "c++": + run_cmd(["./tools/bazel", "build", "--macos_minimum_os=11.0", "//test/cpp/interop:interop_client", "//test/cpp/interop:interop_server", "//test/cpp/interop:otlp_collector"], "Building C++ interop targets") + if args.client == "java" or args.server == "java": + run_cmd(["./gradlew", ":grpc-interop-testing:installDist", "-x", "test"], "Building Java interop targets", cwd="../grpc-java") + if args.client == "python" or args.server == "python": + run_cmd(["./tools/bazel", "build", "--macos_minimum_os=11.0", "//src/python/grpcio_tests/tests/interop:client", "//src/python/grpcio_tests/tests/interop:server_bin"], "Building Python interop targets") + + collector_port = get_free_port() + server_port = get_free_port() + spans_file = os.path.abspath("captured_spans.json") + if os.path.exists(spans_file): + os.remove(spans_file) + + collector_proc = None + server_proc = None + try: + # Start Collector + collector_proc = start_proc( + ["./bazel-bin/test/cpp/interop/otlp_collector", f"--port={collector_port}", f"--file={spans_file}"], + {}, + "OTLP Collector" + ) + time.sleep(1) # wait for collector to start listening + + # Start Server + env = { + "GRPC_EXPERIMENTAL_ENABLE_OTEL_TRACING": "true", + "OTEL_EXPORTER_OTLP_ENDPOINT": f"http://localhost:{collector_port}", + "OTEL_TRACES_EXPORTER": "otlp", + "OTEL_METRICS_EXPORTER": "none", + "OTEL_LOGS_EXPORTER": "none", + "GRPC_BAZEL_RUNTIME": "1" + } + if args.server == "c++": + server_proc = start_proc( + ["./bazel-bin/test/cpp/interop/interop_server", f"--port={server_port}", "--enable_opentelemetry=true"], + env, + "C++ Interop Server" + ) + elif args.server == "java": + server_proc = start_proc( + ["../grpc-java/interop-testing/build/install/grpc-interop-testing/bin/test-server", f"--port={server_port}", "--use_tls=false", "--enable_opentelemetry=true"], + env, + "Java Interop Server" + ) + elif args.server == "python": + server_proc = start_proc( + ["./bazel-bin/src/python/grpcio_tests/tests/interop/server_bin", f"--port={server_port}", "--use_tls=false", "--enable_opentelemetry=true"], + env, + "Python Interop Server" + ) + time.sleep(2) # wait for server to bind and start + + # Run Client + print(f"Running {args.client.upper()} Client...") + if args.client == "c++": + client_res = run_cmd([ + "./bazel-bin/test/cpp/interop/interop_client", + "--server_host=localhost", + f"--server_port={server_port}", + "--test_case=empty_unary", + "--enable_opentelemetry=true" + ], "Running C++ Interop Client", env=env) + elif args.client == "java": + client_res = run_cmd([ + "../grpc-java/interop-testing/build/install/grpc-interop-testing/bin/test-client", + "--server_host=localhost", + f"--server_port={server_port}", + "--test_case=empty_unary", + "--use_tls=false", + "--enable_opentelemetry=true" + ], "Running Java Interop Client", env=env) + elif args.client == "python": + client_res = run_cmd([ + "./bazel-bin/src/python/grpcio_tests/tests/interop/client", + "--server_host=localhost", + f"--server_port={server_port}", + "--test_case=empty_unary", + "--use_tls=false", + "--enable_opentelemetry=true" + ], "Running Python Interop Client", env=env) + + print("Client finished. Waiting for spans to flush...") + time.sleep(2) + + finally: + # Cleanup server and collector processes + # Cleanup server and collector processes safely + if server_proc: + print("Terminating server...") + try: + server_proc.terminate() + server_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + try: + server_proc.kill() + except Exception: + pass + except Exception as e: + print(f"Error terminating server: {e}") + if collector_proc: + print("Terminating collector...") + try: + collector_proc.terminate() + collector_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + try: + collector_proc.kill() + except Exception: + pass + except Exception as e: + print(f"Error terminating collector: {e}") + + + # Perform Span Verifications + success = verify_spans(spans_file) + if success: + print("Test Result: PASSED") + sys.exit(0) + else: + print("Test Result: FAILED") + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index ae7b8448ba84a..70590317ec3f0 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -21,11 +21,118 @@ import multiprocessing import os import re +import socket import subprocess import sys import time import uuid +_collector_port = None + +def get_free_port(): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('', 0)) + port = s.getsockname()[1] + s.close() + return port + +def verify_tracing_spans(spans_file): + start_time = time.time() + all_spans = [] + client_span = None + attempt_span = None + server_span = None + + print("Verifying tracing spans with polling...") + while time.time() - start_time < 5.0: + if not os.path.exists(spans_file): + time.sleep(0.5) + continue + try: + with open(spans_file, "r") as f: + requests = json.load(f) + except (json.JSONDecodeError, IOError): + time.sleep(0.5) + continue + + all_spans = [] + for req in requests: + for resource_spans in req.get("resource_spans", []): + for scope_spans in resource_spans.get("scope_spans", []): + for span in scope_spans.get("spans", []): + all_spans.append(span) + + client_span = next((s for s in all_spans if s.get("name") in ("Sent.grpc.testing.TestService.EmptyCall", "Sent.grpc.testing.TestService/EmptyCall")), None) + if not client_span: + time.sleep(0.5) + continue + + trace_id = client_span.get("trace_id") + if not trace_id: + time.sleep(0.5) + continue + + attempt_span = next((s for s in all_spans if s.get("name") in ("Attempt.grpc.testing.TestService.EmptyCall", "Attempt.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) + server_span = next((s for s in all_spans if s.get("name") in ("Recv.grpc.testing.TestService.EmptyCall", "Recv.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) + + if not attempt_span or not server_span: + time.sleep(0.5) + continue + + # Found all three matching spans + break + else: + print("Verification Failed: Timed out waiting for all 3 expected spans.") + return False + + trace_id = client_span.get("trace_id") + if attempt_span.get("trace_id") != trace_id or server_span.get("trace_id") != trace_id: + print("Verification Failed: Trace ID mismatch.") + return False + + if attempt_span.get("parent_span_id") != client_span.get("span_id"): + print("Verification Failed: Attempt span parent mismatch.") + return False + if server_span.get("parent_span_id") != attempt_span.get("span_id"): + print("Verification Failed: Server span parent mismatch.") + return False + + attributes = attempt_span.get("attributes", []) + prev_attempts = None + trans_retry = None + for attr in attributes: + key = attr.get("key") + val_dict = attr.get("value", {}) + if key == "previous-rpc-attempts": + prev_attempts = val_dict.get("int_value") + elif key == "transparent-retry": + trans_retry = val_dict.get("bool_value") + + if prev_attempts is None or int(prev_attempts) != 0: + print(f"Verification Failed: previous-rpc-attempts attribute mismatch.") + return False + if trans_retry is None or trans_retry is not False: + print(f"Verification Failed: transparent-retry attribute mismatch.") + return False + + attempt_events = [e.get("name") for e in attempt_span.get("events", [])] + client_events = [e.get("name") for e in client_span.get("events", [])] + if "Outbound message" not in attempt_events and "Outbound message" not in client_events: + print("Verification Failed: Outbound event not found in Client or Attempt span.") + return False + if "Inbound message" not in attempt_events and "Inbound message" not in client_events: + print("Verification Failed: Inbound event not found in Client or Attempt span.") + return False + + server_events = [e.get("name") for e in server_span.get("events", [])] + if "Inbound message" not in server_events or "Outbound message" not in server_events: + print("Verification Failed: Inbound/Outbound event not found in Server span.") + return False + + print("OTel Tracing span verification succeeded!") + return True + + import python_utils.dockerjob as dockerjob import python_utils.jobset as jobset import python_utils.report_utils as report_utils @@ -736,6 +843,7 @@ def __str__(self): "special_status_message", "orca_per_rpc", "orca_oob", + "test_unary_rpc_tracing_export", ] _AUTH_TEST_CASES = [ @@ -1054,6 +1162,17 @@ def cloud_to_cloud_jobspec( sys.exit(1) client_test_case = test_case + if test_case == "test_unary_rpc_tracing_export": + client_test_case = "empty_unary" + interop_only_options += ["--enable_opentelemetry=true"] + add_env = add_env.copy() + add_env["GRPC_EXPERIMENTAL_ENABLE_OTEL_TRACING"] = "true" + add_env["OTEL_TRACES_EXPORTER"] = "otlp" + add_env["OTEL_METRICS_EXPORTER"] = "none" + add_env["OTEL_LOGS_EXPORTER"] = "none" + if _collector_port: + collector_host = "host.docker.internal" if docker_image else "localhost" + add_env["OTEL_EXPORTER_OTLP_ENDPOINT"] = f"http://{collector_host}:{_collector_port}" if test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS: client_test_case = _GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES[ test_case @@ -1147,6 +1266,16 @@ def server_jobspec( "interop_server_%s" % language.safename ) server_cmd = ["--port=%s" % _DEFAULT_SERVER_PORT] + environ = language.global_env() + if _collector_port and language.safename in ["cxx", "java", "python"]: + server_cmd += ["--enable_opentelemetry=true"] + environ = environ.copy() + environ["GRPC_EXPERIMENTAL_ENABLE_OTEL_TRACING"] = "true" + environ["OTEL_TRACES_EXPORTER"] = "otlp" + environ["OTEL_METRICS_EXPORTER"] = "none" + environ["OTEL_LOGS_EXPORTER"] = "none" + collector_host = "host.docker.internal" if docker_image else "localhost" + environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = f"http://{collector_host}:{_collector_port}" if transport_security == "tls": server_cmd += ["--use_tls=true"] elif transport_security == "alts": @@ -1164,7 +1293,6 @@ def server_jobspec( "--max_concurrent_streams_limit=%d" % max_concurrent_streams_limit ] cmdline = bash_cmdline(language.server_cmd(server_cmd)) - environ = language.global_env() docker_args = ["--name=%s" % container_name] if language.safename == "http2": # we are running the http2 interop server. Open next N ports beginning @@ -1196,6 +1324,9 @@ def server_jobspec( else: docker_args += ["-p", str(_DEFAULT_SERVER_PORT)] + if docker_image: + docker_args = docker_args + ["--add-host=host.docker.internal:host-gateway"] + docker_cmdline = docker_run_cmdline( cmdline, image=docker_image, @@ -1442,6 +1573,11 @@ def aggregate_http2_results(stdout): nargs="?", help="Upload test results to a specified BQ table.", ) +argp.add_argument( + "--test_case", + type=str, + help="Run a specific test case. If not specified, all test cases will be run.", +) args = argp.parse_args() servers = set( @@ -1567,7 +1703,19 @@ def aggregate_http2_results(stdout): # Start interop servers. server_jobs = {} server_addresses = {} +collector_proc = None try: + if not args.manual_run: + has_cxx = ("c++" in args.language or "all" in args.language) or ("c++" in servers) + if has_cxx: + _collector_port = get_free_port() + spans_file = os.path.abspath("captured_spans.json") + if os.path.exists(spans_file): + os.remove(spans_file) + collector_cmd = ["./bazel-bin/test/cpp/interop/otlp_collector", f"--port={_collector_port}", f"--file={spans_file}"] + print(f"Starting OTLP collector on port {_collector_port}...") + collector_proc = subprocess.Popen(collector_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + time.sleep(1) for s in servers: lang = str(s) spec = server_jobspec( @@ -1610,6 +1758,10 @@ def aggregate_http2_results(stdout): for server_host_nickname in args.prod_servers: for language in languages: for test_case in _TEST_CASES: + if args.test_case and test_case != args.test_case: + continue + if test_case == "test_unary_rpc_tracing_export": + continue if not test_case in language.unimplemented_test_cases(): if ( not test_case @@ -1654,6 +1806,8 @@ def aggregate_http2_results(stdout): jobs.append(test_job) if args.http2_interop: for test_case in _HTTP2_TEST_CASES: + if args.test_case and test_case != args.test_case: + continue test_job = cloud_to_prod_jobspec( http2Interop, test_case, @@ -1674,6 +1828,8 @@ def aggregate_http2_results(stdout): for server_host_nickname in args.prod_servers: for language in languages: for test_case in _AUTH_TEST_CASES: + if args.test_case and test_case != args.test_case: + continue if ( not args.skip_compute_engine_creds or not compute_engine_creds_required( @@ -1726,6 +1882,12 @@ def aggregate_http2_results(stdout): skip_server = server_language.unimplemented_test_cases_server() for language in languages: for test_case in _TEST_CASES: + if args.test_case and test_case != args.test_case: + continue + if test_case == "test_unary_rpc_tracing_export": + allowed_tracing_languages = ["c++", "java", "python"] + if str(language) not in allowed_tracing_languages or server_name not in allowed_tracing_languages: + continue if not test_case in language.unimplemented_test_cases(): if not test_case in skip_server: test_job = cloud_to_cloud_jobspec( @@ -1742,6 +1904,8 @@ def aggregate_http2_results(stdout): if args.http2_interop: for test_case in _HTTP2_TEST_CASES: + if args.test_case and test_case != args.test_case: + continue if server_name == "go": # TODO(carl-mastrangelo): Reenable after https://github.com/grpc/grpc-go/issues/434 continue @@ -1764,6 +1928,8 @@ def aggregate_http2_results(stdout): for test_case in set(_HTTP2_SERVER_TEST_CASES) - set( _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS ): + if args.test_case and test_case != args.test_case: + continue offset = sorted(_HTTP2_SERVER_TEST_CASES).index(test_case) server_port = _DEFAULT_SERVER_PORT + offset if not args.manual_run: @@ -1867,6 +2033,12 @@ def aggregate_http2_results(stdout): maxjobs=args.jobs, skip_jobs=args.manual_run, ) + if not num_failures and not args.manual_run: + has_tracing_test = any(job.shortname.find("test_unary_rpc_tracing_export") != -1 for job in jobs) + if has_tracing_test: + spans_file = os.path.abspath("captured_spans.json") + if not verify_tracing_spans(spans_file): + num_failures = 1 if args.bq_result_table and resultset: upload_interop_results_to_bq(resultset, args.bq_result_table) if num_failures: @@ -1892,6 +2064,18 @@ def aggregate_http2_results(stdout): else: sys.exit(0) finally: + if collector_proc: + print("Terminating OTLP collector...") + try: + collector_proc.terminate() + collector_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + try: + collector_proc.kill() + except Exception: + pass + except Exception as e: + print(f"Error terminating OTLP collector: {e}") # Check if servers are still running. for server, job in list(server_jobs.items()): if not job.is_running(): From caf5a6725e2bc2feeda6b7834ed3c41195730eef Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 14 Jul 2026 21:22:37 +0530 Subject: [PATCH 02/29] interop: add signal handling and namespace resolution cleanups --- .../tests/bazel_namespace_package_hack.py | 12 ++++++ .../grpcio_tests/tests/interop/BUILD.bazel | 26 ++++++++++-- .../grpcio_tests/tests/interop/client.py | 36 +++++++++++++---- .../grpcio_tests/tests/interop/server.py | 40 +++++++++++++++++-- test/cpp/interop/otel_helper.cc | 10 +++-- test/cpp/interop/otlp_collector.cc | 24 ++++++++++- test/cpp/interop/otlp_collector.py | 13 ++++-- 7 files changed, 137 insertions(+), 24 deletions(-) diff --git a/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py b/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py index 994a8e1e8004b..04cc9fbdf95f0 100644 --- a/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py +++ b/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py @@ -38,3 +38,15 @@ def sys_path_to_site_dir_hack(): items.append(item) for item in items: site.addsitedir(item) + try: + import pkgutil + import google + google.__path__ = pkgutil.extend_path(google.__path__, google.__name__) + except Exception: + pass + try: + import pkgutil + import src + src.__path__ = pkgutil.extend_path(src.__path__, src.__name__) + except Exception: + pass diff --git a/src/python/grpcio_tests/tests/interop/BUILD.bazel b/src/python/grpcio_tests/tests/interop/BUILD.bazel index fd6327691f477..f780c94c4a074 100644 --- a/src/python/grpcio_tests/tests/interop/BUILD.bazel +++ b/src/python/grpcio_tests/tests/interop/BUILD.bazel @@ -28,12 +28,18 @@ py_library( py_library( name = "client_lib", srcs = ["client.py"], - imports = ["../../"], + imports = [ + "../../", + "../../../../", + ], deps = [ ":methods", ":resources", "//src/proto/grpc/testing:py_test_proto", + "//src/proto/grpc/testing:test_py_pb2_grpc", "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_observability/grpc_observability:pyobservability", + "//src/python/grpcio_tests/tests:bazel_namespace_package_hack", requirement("absl-py"), requirement("google-auth"), ], @@ -49,7 +55,10 @@ py_binary( py_library( name = "methods", srcs = ["methods.py"], - imports = ["../../"], + imports = [ + "../../", + "../../../../", + ], deps = [ "//src/proto/grpc/testing:empty_py_pb2", "//src/proto/grpc/testing:py_messages_proto", @@ -80,7 +89,10 @@ py_library( py_library( name = "service", srcs = ["service.py"], - imports = ["../../"], + imports = [ + "../../", + "../../../../", + ], deps = [ "//src/proto/grpc/testing:empty_py_pb2", "//src/proto/grpc/testing:py_messages_proto", @@ -92,12 +104,18 @@ py_library( py_library( name = "server", srcs = ["server.py"], - imports = ["../../"], + imports = [ + "../../", + "../../../../", + ], deps = [ ":resources", ":service", "//src/proto/grpc/testing:py_test_proto", + "//src/proto/grpc/testing:test_py_pb2_grpc", "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_observability/grpc_observability:pyobservability", + "//src/python/grpcio_tests/tests:bazel_namespace_package_hack", "//src/python/grpcio_tests/tests/unit:test_common", requirement("absl-py"), ], diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 6075ac5a5882c..ce1f8712f2ee1 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -14,15 +14,19 @@ """The Python implementation of the GRPC interoperability test client.""" import os +os.environ["GRPC_BAZEL_RUNTIME"] = "1" +try: + from tests import bazel_namespace_package_hack + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass from absl import app from absl.flags import argparse_flags -from google import auth as google_auth -from google.auth import jwt as google_auth_jwt import grpc -from src.proto.grpc.testing import test_pb2_grpc from tests.interop import methods +from src.proto.grpc.testing import test_pb2_grpc from tests.interop import resources @@ -93,10 +97,19 @@ def parse_interop_client_args(argv): " round_robin " + "or pick_first)." ), ) + parser.add_argument( + "--enable_opentelemetry", + default=False, + type=resources.parse_bool, + help="enable OpenTelemetry tracing/observability", + ) return parser.parse_args(argv[1:]) def _create_call_credentials(args): + import os + from google import auth as google_auth + from google.auth import jwt as google_auth_jwt if args.test_case == "oauth2_auth_token": google_credentials, unused_project_id = google_auth.default( scopes=[args.oauth_scope] @@ -129,6 +142,7 @@ def _create_call_credentials(args): def get_secure_channel_parameters(args): + from google import auth as google_auth call_credentials = _create_call_credentials(args) channel_opts = () @@ -216,10 +230,18 @@ def _test_case_from_arg(test_case_arg): def test_interoperability(args): - channel = _create_channel(args) - stub = create_stub(channel, args) - test_case = _test_case_from_arg(args.test_case) - test_case.test_interoperability(stub, args) + if args.enable_opentelemetry: + import grpc_observability + with grpc_observability.OpenTelemetryPlugin(): + channel = _create_channel(args) + stub = create_stub(channel, args) + test_case = _test_case_from_arg(args.test_case) + test_case.test_interoperability(stub, args) + else: + channel = _create_channel(args) + stub = create_stub(channel, args) + test_case = _test_case_from_arg(args.test_case) + test_case.test_interoperability(stub, args) if __name__ == "__main__": diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index cc705b026da9b..24e11ed5427d6 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -13,6 +13,14 @@ # limitations under the License. """The Python implementation of the GRPC interoperability test server.""" +import os +os.environ["GRPC_BAZEL_RUNTIME"] = "1" +try: + from tests import bazel_namespace_package_hack + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass + from concurrent import futures import logging @@ -46,6 +54,12 @@ def parse_interop_server_arguments(argv): type=resources.parse_bool, help="require an ALTS connection", ) + parser.add_argument( + "--enable_opentelemetry", + default=False, + type=resources.parse_bool, + help="enable OpenTelemetry tracing/observability", + ) return parser.parse_args(argv[1:]) @@ -58,6 +72,22 @@ def get_server_credentials(use_tls): return grpc.alts_server_credentials() +import signal + +def _serve_internal(server): + def _sig_handler(signum, frame): + _LOGGER.info("Received signal %d, stopping server...", signum) + server.stop(0) + + signal.signal(signal.SIGTERM, _sig_handler) + signal.signal(signal.SIGINT, _sig_handler) + + server.start() + _LOGGER.info("Server serving.") + server.wait_for_termination() + _LOGGER.info("Server stopped; exiting.") + + def serve(args): server = test_common.test_server() test_pb2_grpc.add_TestServiceServicer_to_server( @@ -69,10 +99,12 @@ def serve(args): else: server.add_insecure_port("[::]:{}".format(args.port)) - server.start() - _LOGGER.info("Server serving.") - server.wait_for_termination() - _LOGGER.info("Server stopped; exiting.") + if args.enable_opentelemetry: + import grpc_observability + with grpc_observability.OpenTelemetryPlugin(): + _serve_internal(server) + else: + _serve_internal(server) if __name__ == "__main__": diff --git a/test/cpp/interop/otel_helper.cc b/test/cpp/interop/otel_helper.cc index 6d0ea3900f388..749b02722c0d4 100644 --- a/test/cpp/interop/otel_helper.cc +++ b/test/cpp/interop/otel_helper.cc @@ -66,13 +66,14 @@ void MaybeRegisterOpenTelemetry() { auto processor = opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create( std::move(exporter)); - g_tracer_provider = + auto provider = std::make_shared( std::move(processor)); + std::atomic_store(&g_tracer_provider, provider); auto status = grpc::OpenTelemetryPluginBuilder() - .SetTracerProvider(g_tracer_provider) + .SetTracerProvider(provider) .SetTextMapPropagator(grpc::OpenTelemetryPluginBuilder:: MakeGrpcTraceBinTextMapPropagator()) .BuildAndRegisterGlobal(); @@ -88,8 +89,9 @@ void MaybeRegisterOpenTelemetry() { } void ForceFlushOpenTelemetry() { - if (g_tracer_provider != nullptr) { - g_tracer_provider->ForceFlush(); + auto provider = std::atomic_load(&g_tracer_provider); + if (provider != nullptr) { + provider->ForceFlush(); } } diff --git a/test/cpp/interop/otlp_collector.cc b/test/cpp/interop/otlp_collector.cc index a3ecb45cf9437..1962f7a427571 100644 --- a/test/cpp/interop/otlp_collector.cc +++ b/test/cpp/interop/otlp_collector.cc @@ -16,16 +16,20 @@ // // +#include #include #include #include +#include #include +#include #include #include "absl/flags/flag.h" #include "absl/flags/parse.h" #include "absl/log/log.h" +#include #include #include @@ -78,6 +82,11 @@ class TraceServiceServiceImpl final } } out << "\n]\n"; + if (out.fail() || out.bad()) { + LOG(ERROR) << "Failed to write JSON spans to file: " << tmp_file; + return grpc::Status(grpc::StatusCode::INTERNAL, + "Failed to write trace output"); + } out.close(); std::rename(tmp_file.c_str(), file_path_.c_str()); @@ -91,6 +100,12 @@ class TraceServiceServiceImpl final std::mutex mu_; }; +static gpr_atm g_got_sigint = 0; + +static void sig_handler(int /*sig*/) { + gpr_atm_no_barrier_store(&g_got_sigint, 1); +} + int main(int argc, char** argv) { absl::ParseCommandLine(argc, argv); int port = absl::GetFlag(FLAGS_port); @@ -112,9 +127,16 @@ int main(int argc, char** argv) { grpc::InsecureServerCredentials()); builder.RegisterService(&service); + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + std::unique_ptr server(builder.BuildAndStart()); LOG(INFO) << "OTLP Collector listening on port " << port << "..."; - server->Wait(); + while (!gpr_atm_no_barrier_load(&g_got_sigint)) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + server->Shutdown(); + server.reset(); return 0; } diff --git a/test/cpp/interop/otlp_collector.py b/test/cpp/interop/otlp_collector.py index 0f16334aaaded..485ffbc09734b 100644 --- a/test/cpp/interop/otlp_collector.py +++ b/test/cpp/interop/otlp_collector.py @@ -19,6 +19,7 @@ import argparse import json import os +import signal import threading import time from concurrent import futures @@ -59,11 +60,15 @@ def serve(): server.add_insecure_port(f"[::]:{args.port}") server.start() print(f"OTLP Collector listening on port {args.port}...") - try: - while True: - time.sleep(86400) - except KeyboardInterrupt: + + def sig_handler(signum, frame): + print(f"OTLP Collector received signal {signum}, stopping server...") server.stop(0) + signal.signal(signal.SIGTERM, sig_handler) + signal.signal(signal.SIGINT, sig_handler) + + server.wait_for_termination() + if __name__ == "__main__": serve() From c66ce1695d3d4640e1da55d79f46a658115ce40e Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 14 Jul 2026 22:18:02 +0530 Subject: [PATCH 03/29] interop: fix linting, header ordering, and formatting for OTel interop --- src/python/grpcio_tests/tests/interop/client.py | 7 +++++-- src/python/grpcio_tests/tests/interop/server.py | 4 ++++ test/cpp/interop/otlp_collector.cc | 3 +-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index ce1f8712f2ee1..3ff6c4096b31e 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -14,20 +14,24 @@ """The Python implementation of the GRPC interoperability test client.""" import os + os.environ["GRPC_BAZEL_RUNTIME"] = "1" try: from tests import bazel_namespace_package_hack + bazel_namespace_package_hack.sys_path_to_site_dir_hack() except ImportError: pass +# pylint: disable=wrong-import-position from absl import app from absl.flags import argparse_flags import grpc -from tests.interop import methods from src.proto.grpc.testing import test_pb2_grpc +from tests.interop import methods from tests.interop import resources +# pylint: enable=wrong-import-position def parse_interop_client_args(argv): @@ -107,7 +111,6 @@ def parse_interop_client_args(argv): def _create_call_credentials(args): - import os from google import auth as google_auth from google.auth import jwt as google_auth_jwt if args.test_case == "oauth2_auth_token": diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index 24e11ed5427d6..219dde5dd734b 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -14,13 +14,16 @@ """The Python implementation of the GRPC interoperability test server.""" import os + os.environ["GRPC_BAZEL_RUNTIME"] = "1" try: from tests import bazel_namespace_package_hack + bazel_namespace_package_hack.sys_path_to_site_dir_hack() except ImportError: pass +# pylint: disable=wrong-import-position from concurrent import futures import logging @@ -32,6 +35,7 @@ from tests.interop import resources from tests.interop import service from tests.unit import test_common +# pylint: enable=wrong-import-position logging.basicConfig() _LOGGER = logging.getLogger(__name__) diff --git a/test/cpp/interop/otlp_collector.cc b/test/cpp/interop/otlp_collector.cc index 1962f7a427571..2e3b670697243 100644 --- a/test/cpp/interop/otlp_collector.cc +++ b/test/cpp/interop/otlp_collector.cc @@ -29,10 +29,9 @@ #include "absl/flags/parse.h" #include "absl/log/log.h" +#include #include #include - -#include #include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h" ABSL_FLAG(int, port, 0, "Port to listen on"); From e23a57dc569b8dadb56fed35791ad2dd0d463cc7 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 14 Jul 2026 23:26:57 +0530 Subject: [PATCH 04/29] bazel: map opentelemetry-proto repository name for Bzlmod and WORKSPACE builds --- MODULE.bazel | 1 + bazel/grpc_deps.bzl | 11 +++++++++++ test/cpp/interop/BUILD | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 253a8428f936d..54cee46604120 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -50,6 +50,7 @@ bazel_dep(name = "googletest", version = "1.17.0", repo_name = "com_google_googl bazel_dep(name = "opencensus-cpp", version = "0.0.0-20230502-50eb5de.bcr.2", repo_name = "io_opencensus_cpp") bazel_dep(name = "openssl", version = "3.3.1.bcr.1") bazel_dep(name = "opentelemetry-cpp", version = "1.19.0", repo_name = "io_opentelemetry_cpp") +bazel_dep(name = "opentelemetry-proto", version = "1.8.0", repo_name = "opentelemetry_proto") # --- Protobuf related packages. bazel_dep(name = "protobuf", version = "35.1", repo_name = "com_google_protobuf") diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index 9cec43824cbff..e9de33e5d2b55 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -381,6 +381,17 @@ def grpc_deps(): ], ) + if "opentelemetry_proto" not in native.existing_rules(): + http_archive( + name = "opentelemetry_proto", + sha256 = "07e26be7cc16630f5cc8910076a086f6858288fb9868ef648d08cb5cf876d756", + strip_prefix = "opentelemetry-proto-1.8.0", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-proto/archive/refs/tags/v1.8.0.tar.gz", + "https://github.com/open-telemetry/opentelemetry-proto/archive/refs/tags/v1.8.0.tar.gz", + ], + ) + # Building grpc with openssl is only supported when using bzlmod. Workspaces # are deprecated, so just create a dummy repo so that the grpc targets build # when using workspaces. diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD index 86ac70b5ebf2d..d6b8f58dcdca0 100644 --- a/test/cpp/interop/BUILD +++ b/test/cpp/interop/BUILD @@ -823,7 +823,7 @@ grpc_cc_binary( ], deps = [ "//:grpc++", - "@opentelemetry-proto//:trace_service_grpc_cc", - "@opentelemetry-proto//:trace_service_proto_cc", + "@opentelemetry_proto//:trace_service_grpc_cc", + "@opentelemetry_proto//:trace_service_proto_cc", ], ) From eab5f2f9ec33e393d4440506d41c90cf024ffc50 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 14 Jul 2026 23:36:17 +0530 Subject: [PATCH 05/29] sanity: add opentelemetry_proto to sanity check_bazel_workspace dependencies --- tools/run_tests/sanity/check_bazel_workspace.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/run_tests/sanity/check_bazel_workspace.py b/tools/run_tests/sanity/check_bazel_workspace.py index 482bd659b6221..76b35e333aaac 100755 --- a/tools/run_tests/sanity/check_bazel_workspace.py +++ b/tools/run_tests/sanity/check_bazel_workspace.py @@ -52,6 +52,7 @@ "com_google_fuzztest", "io_opencensus_cpp", "io_opentelemetry_cpp", + "opentelemetry_proto", "envoy_api", _BAZEL_SKYLIB_DEP_NAME, _BAZEL_TOOLCHAINS_DEP_NAME, @@ -82,6 +83,7 @@ "com_google_absl", "com_google_fuzztest", "io_opencensus_cpp", + "opentelemetry_proto", _BAZEL_SKYLIB_DEP_NAME, _BAZEL_TOOLCHAINS_DEP_NAME, _BAZEL_COMPDB_DEP_NAME, From e35e8a926b36950ae937daa02117dfcd55c1f0d1 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 19:44:03 +0530 Subject: [PATCH 06/29] interop: add otel_helper to CMake targets and cleanup atomic types --- CMakeLists.txt | 2 ++ build_autogenerated.yaml | 4 ++++ test/cpp/interop/BUILD | 5 ++++- test/cpp/interop/otlp_collector.cc | 17 +++++++++++------ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 60904ea71ab0c..902b9f3a9fdee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23168,6 +23168,7 @@ add_executable(interop_client test/cpp/interop/client.cc test/cpp/interop/client_helper.cc test/cpp/interop/interop_client.cc + test/cpp/interop/otel_helper.cc ) if(WIN32 AND MSVC) if(BUILD_SHARED_LIBS) @@ -23221,6 +23222,7 @@ add_executable(interop_server src/cpp/server/orca/orca_service.cc test/cpp/interop/interop_server.cc test/cpp/interop/interop_server_bootstrap.cc + test/cpp/interop/otel_helper.cc test/cpp/interop/server_helper.cc ) if(WIN32 AND MSVC) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 4f720499781f9..ce1f9315c5d49 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -17202,6 +17202,7 @@ targets: - test/cpp/interop/backend_metrics_lb_policy.h - test/cpp/interop/client_helper.h - test/cpp/interop/interop_client.h + - test/cpp/interop/otel_helper.h src: - src/proto/grpc/testing/empty.proto - src/proto/grpc/testing/messages.proto @@ -17211,6 +17212,7 @@ targets: - test/cpp/interop/client.cc - test/cpp/interop/client_helper.cc - test/cpp/interop/interop_client.cc + - test/cpp/interop/otel_helper.cc deps: - grpc++_test_config - grpc++_test_util @@ -17220,6 +17222,7 @@ targets: language: c++ headers: - src/cpp/server/orca/orca_service.h + - test/cpp/interop/otel_helper.h - test/cpp/interop/server_helper.h src: - src/proto/grpc/testing/empty.proto @@ -17228,6 +17231,7 @@ targets: - src/cpp/server/orca/orca_service.cc - test/cpp/interop/interop_server.cc - test/cpp/interop/interop_server_bootstrap.cc + - test/cpp/interop/otel_helper.cc - test/cpp/interop/server_helper.cc deps: - grpc++_test_config diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD index d6b8f58dcdca0..aeedd21dd9f66 100644 --- a/test/cpp/interop/BUILD +++ b/test/cpp/interop/BUILD @@ -814,7 +814,9 @@ grpc_cc_library( grpc_cc_binary( name = "otlp_collector", - srcs = ["otlp_collector.cc"], + srcs = [ + "otlp_collector.cc", + ], external_deps = [ "absl/flags:flag", "absl/flags:parse", @@ -822,6 +824,7 @@ grpc_cc_binary( "protobuf", ], deps = [ + "//:gpr", "//:grpc++", "@opentelemetry_proto//:trace_service_grpc_cc", "@opentelemetry_proto//:trace_service_proto_cc", diff --git a/test/cpp/interop/otlp_collector.cc b/test/cpp/interop/otlp_collector.cc index 2e3b670697243..f21c6349f7871 100644 --- a/test/cpp/interop/otlp_collector.cc +++ b/test/cpp/interop/otlp_collector.cc @@ -16,11 +16,12 @@ // // +#include #include +#include #include #include #include -#include #include #include #include @@ -30,7 +31,6 @@ #include "absl/log/log.h" #include -#include #include #include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h" @@ -88,7 +88,12 @@ class TraceServiceServiceImpl final } out.close(); - std::rename(tmp_file.c_str(), file_path_.c_str()); + if (std::rename(tmp_file.c_str(), file_path_.c_str()) != 0) { + LOG(ERROR) << "Failed to rename temporary file " << tmp_file << " to " + << file_path_; + return grpc::Status(grpc::StatusCode::INTERNAL, + "Failed to update trace output file"); + } return grpc::Status::OK; } @@ -99,10 +104,10 @@ class TraceServiceServiceImpl final std::mutex mu_; }; -static gpr_atm g_got_sigint = 0; +static std::atomic g_got_sigint{false}; static void sig_handler(int /*sig*/) { - gpr_atm_no_barrier_store(&g_got_sigint, 1); + g_got_sigint.store(true, std::memory_order_relaxed); } int main(int argc, char** argv) { @@ -131,7 +136,7 @@ int main(int argc, char** argv) { std::unique_ptr server(builder.BuildAndStart()); LOG(INFO) << "OTLP Collector listening on port " << port << "..."; - while (!gpr_atm_no_barrier_load(&g_got_sigint)) { + while (!g_got_sigint.load(std::memory_order_relaxed)) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); } server->Shutdown(); From fb4901ae7c43d37446eb5209da66a1f0e7856df8 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 19:58:22 +0530 Subject: [PATCH 07/29] build: add protobuf_clib external_dep to otlp_collector for RBE Linux strict module checking --- test/cpp/interop/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD index aeedd21dd9f66..470f911b4a71b 100644 --- a/test/cpp/interop/BUILD +++ b/test/cpp/interop/BUILD @@ -822,6 +822,7 @@ grpc_cc_binary( "absl/flags:parse", "absl/log", "protobuf", + "protobuf_clib", ], deps = [ "//:gpr", From 83137bbd068c79745f393dbc11c910a352672611 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 20:12:37 +0530 Subject: [PATCH 08/29] build: add protobuf_headers to otlp_collector external_deps for RBE strict module visibility --- test/cpp/interop/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD index 470f911b4a71b..bad3e7893aca0 100644 --- a/test/cpp/interop/BUILD +++ b/test/cpp/interop/BUILD @@ -823,6 +823,7 @@ grpc_cc_binary( "absl/log", "protobuf", "protobuf_clib", + "protobuf_headers", ], deps = [ "//:gpr", From a8fbac20ec6f8ddd4f307f6cfa7160c3cc5209ca Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 20:53:57 +0530 Subject: [PATCH 09/29] otlp_collector: use modern google/protobuf/json/json.h header to satisfy RBE C++ module visibility --- test/cpp/interop/otlp_collector.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/cpp/interop/otlp_collector.cc b/test/cpp/interop/otlp_collector.cc index f21c6349f7871..9c3d993e6243f 100644 --- a/test/cpp/interop/otlp_collector.cc +++ b/test/cpp/interop/otlp_collector.cc @@ -30,7 +30,7 @@ #include "absl/flags/parse.h" #include "absl/log/log.h" -#include +#include #include #include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h" @@ -50,11 +50,11 @@ class TraceServiceServiceImpl final opentelemetry::proto::collector::trace::v1::ExportTraceServiceResponse* /*response*/) override { std::string json_string; - google::protobuf::util::JsonPrintOptions options; + google::protobuf::json::PrintOptions options; options.add_whitespace = true; options.always_print_fields_with_no_presence = true; options.preserve_proto_field_names = true; - auto status = google::protobuf::util::MessageToJsonString( + auto status = google::protobuf::json::MessageToJsonString( *request, &json_string, options); if (!status.ok()) { LOG(ERROR) << "Failed to serialize ExportTraceServiceRequest to JSON: " From d81fcd22fa6cf37c7409532852e5ed8068cf1d01 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 21 Jul 2026 09:53:10 +0530 Subject: [PATCH 10/29] Fix CMake build for interop_client and interop_server missing opentelemetry --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 902b9f3a9fdee..7efb6f326bcd8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23200,6 +23200,8 @@ target_link_libraries(interop_client ${_gRPC_ALLTARGETS_LIBRARIES} grpc++_test_config grpc++_test_util + grpc_opentelemetry + opentelemetry-cpp::otlp_grpc_exporter ) @@ -23255,6 +23257,8 @@ target_link_libraries(interop_server ${_gRPC_ALLTARGETS_LIBRARIES} grpc++_test_config grpc++_test_util + grpc_opentelemetry + opentelemetry-cpp::otlp_grpc_exporter ) From dc0b5b25c86b20526192342eae4da6d2f070e155 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 22 Jul 2026 17:05:01 +0530 Subject: [PATCH 11/29] Format Python interop test files using black --- .../tests/bazel_namespace_package_hack.py | 2 + .../grpcio_tests/tests/interop/client.py | 4 + .../grpcio_tests/tests/interop/server.py | 3 + test/cpp/interop/otlp_collector.py | 7 +- test/cpp/interop/run_otel_interop_test.py | 280 ++++++++++++++---- tools/run_tests/run_interop_tests.py | 123 ++++++-- 6 files changed, 334 insertions(+), 85 deletions(-) diff --git a/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py b/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py index 04cc9fbdf95f0..0d46a8cdc3443 100644 --- a/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py +++ b/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py @@ -41,12 +41,14 @@ def sys_path_to_site_dir_hack(): try: import pkgutil import google + google.__path__ = pkgutil.extend_path(google.__path__, google.__name__) except Exception: pass try: import pkgutil import src + src.__path__ = pkgutil.extend_path(src.__path__, src.__name__) except Exception: pass diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 3ff6c4096b31e..523de527ac4ca 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -31,6 +31,7 @@ from src.proto.grpc.testing import test_pb2_grpc from tests.interop import methods from tests.interop import resources + # pylint: enable=wrong-import-position @@ -113,6 +114,7 @@ def parse_interop_client_args(argv): def _create_call_credentials(args): from google import auth as google_auth from google.auth import jwt as google_auth_jwt + if args.test_case == "oauth2_auth_token": google_credentials, unused_project_id = google_auth.default( scopes=[args.oauth_scope] @@ -146,6 +148,7 @@ def _create_call_credentials(args): def get_secure_channel_parameters(args): from google import auth as google_auth + call_credentials = _create_call_credentials(args) channel_opts = () @@ -235,6 +238,7 @@ def _test_case_from_arg(test_case_arg): def test_interoperability(args): if args.enable_opentelemetry: import grpc_observability + with grpc_observability.OpenTelemetryPlugin(): channel = _create_channel(args) stub = create_stub(channel, args) diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index 219dde5dd734b..4ead9db7b55bc 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -35,6 +35,7 @@ from tests.interop import resources from tests.interop import service from tests.unit import test_common + # pylint: enable=wrong-import-position logging.basicConfig() @@ -78,6 +79,7 @@ def get_server_credentials(use_tls): import signal + def _serve_internal(server): def _sig_handler(signum, frame): _LOGGER.info("Received signal %d, stopping server...", signum) @@ -105,6 +107,7 @@ def serve(args): if args.enable_opentelemetry: import grpc_observability + with grpc_observability.OpenTelemetryPlugin(): _serve_internal(server) else: diff --git a/test/cpp/interop/otlp_collector.py b/test/cpp/interop/otlp_collector.py index 485ffbc09734b..b29325f079a15 100644 --- a/test/cpp/interop/otlp_collector.py +++ b/test/cpp/interop/otlp_collector.py @@ -29,6 +29,7 @@ from opentelemetry.proto.collector.trace.v1 import trace_service_pb2 from opentelemetry.proto.collector.trace.v1 import trace_service_pb2_grpc + class TraceServiceServicer(trace_service_pb2_grpc.TraceServiceServicer): def __init__(self, file_path): self._file_path = file_path @@ -36,7 +37,9 @@ def __init__(self, file_path): self._lock = threading.Lock() def Export(self, request, context): - req_dict = json_format.MessageToDict(request, preserving_proto_field_name=True) + req_dict = json_format.MessageToDict( + request, preserving_proto_field_name=True + ) with self._lock: self._requests.append(req_dict) tmp_file = self._file_path + ".tmp" @@ -47,6 +50,7 @@ def Export(self, request, context): return trace_service_pb2.ExportTraceServiceResponse() + def serve(): parser = argparse.ArgumentParser() parser.add_argument("--port", type=int, required=True) @@ -70,5 +74,6 @@ def sig_handler(signum, frame): server.wait_for_termination() + if __name__ == "__main__": serve() diff --git a/test/cpp/interop/run_otel_interop_test.py b/test/cpp/interop/run_otel_interop_test.py index 7941e8195e138..d6206205c3694 100755 --- a/test/cpp/interop/run_otel_interop_test.py +++ b/test/cpp/interop/run_otel_interop_test.py @@ -23,19 +23,23 @@ import sys import time + def get_free_port(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(('', 0)) + s.bind(("", 0)) port = s.getsockname()[1] s.close() return port + def run_cmd(args, desc, env=None, cwd=None): print(f"Executing: {' '.join(args)} ({desc})") proc_env = os.environ.copy() if env: proc_env.update(env) - res = subprocess.run(args, env=proc_env, cwd=cwd, capture_output=True, text=True) + res = subprocess.run( + args, env=proc_env, cwd=cwd, capture_output=True, text=True + ) if res.returncode != 0: print(f"Error executing {desc}:") print("STDOUT:", res.stdout) @@ -43,12 +47,20 @@ def run_cmd(args, desc, env=None, cwd=None): sys.exit(res.returncode) return res + def start_proc(args, env, desc, cwd=None): print(f"Starting in background: {' '.join(args)} ({desc})") # Inherit system environment and merge with custom variables proc_env = os.environ.copy() proc_env.update(env) - return subprocess.Popen(args, env=proc_env, cwd=cwd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + return subprocess.Popen( + args, + env=proc_env, + cwd=cwd, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + def verify_spans(spans_file): start_time = time.time() @@ -76,7 +88,18 @@ def verify_spans(spans_file): for span in scope_spans.get("spans", []): all_spans.append(span) - client_span = next((s for s in all_spans if s.get("name") in ("Sent.grpc.testing.TestService.EmptyCall", "Sent.grpc.testing.TestService/EmptyCall")), None) + client_span = next( + ( + s + for s in all_spans + if s.get("name") + in ( + "Sent.grpc.testing.TestService.EmptyCall", + "Sent.grpc.testing.TestService/EmptyCall", + ) + ), + None, + ) if not client_span: time.sleep(0.5) continue @@ -86,8 +109,32 @@ def verify_spans(spans_file): time.sleep(0.5) continue - attempt_span = next((s for s in all_spans if s.get("name") in ("Attempt.grpc.testing.TestService.EmptyCall", "Attempt.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) - server_span = next((s for s in all_spans if s.get("name") in ("Recv.grpc.testing.TestService.EmptyCall", "Recv.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) + attempt_span = next( + ( + s + for s in all_spans + if s.get("name") + in ( + "Attempt.grpc.testing.TestService.EmptyCall", + "Attempt.grpc.testing.TestService/EmptyCall", + ) + and s.get("trace_id") == trace_id + ), + None, + ) + server_span = next( + ( + s + for s in all_spans + if s.get("name") + in ( + "Recv.grpc.testing.TestService.EmptyCall", + "Recv.grpc.testing.TestService/EmptyCall", + ) + and s.get("trace_id") == trace_id + ), + None, + ) if not attempt_span or not server_span: time.sleep(0.5) @@ -101,25 +148,35 @@ def verify_spans(spans_file): print(f"Collected {len(all_spans)} spans:") for s in all_spans: - print(f" Span: '{s.get('name')}' (TraceID: {s.get('trace_id')}, SpanID: {s.get('span_id')}, ParentID: {s.get('parent_span_id')})") + print( + f" Span: '{s.get('name')}' (TraceID: {s.get('trace_id')}, SpanID: {s.get('span_id')}, ParentID: {s.get('parent_span_id')})" + ) # 1. Assert all spans share the same Trace ID trace_id = client_span.get("trace_id") if attempt_span.get("trace_id") != trace_id: - print(f"Assertion Failed: Attempt span Trace ID mismatch. Expected {trace_id}, got {attempt_span.get('trace_id')}") + print( + f"Assertion Failed: Attempt span Trace ID mismatch. Expected {trace_id}, got {attempt_span.get('trace_id')}" + ) return False if server_span.get("trace_id") != trace_id: - print(f"Assertion Failed: Server span Trace ID mismatch. Expected {trace_id}, got {server_span.get('trace_id')}") + print( + f"Assertion Failed: Server span Trace ID mismatch. Expected {trace_id}, got {server_span.get('trace_id')}" + ) return False # 2. Assert Parent-Child hierarchy # Attempt Span must be a child of Client Span if attempt_span.get("parent_span_id") != client_span.get("span_id"): - print(f"Assertion Failed: Attempt span is not child of Client span. Expected parent {client_span.get('span_id')}, got {attempt_span.get('parent_span_id')}") + print( + f"Assertion Failed: Attempt span is not child of Client span. Expected parent {client_span.get('span_id')}, got {attempt_span.get('parent_span_id')}" + ) return False # Server Span must be a child of Attempt Span if server_span.get("parent_span_id") != attempt_span.get("span_id"): - print(f"Assertion Failed: Server span is not child of Attempt span. Expected parent {attempt_span.get('span_id')}, got {server_span.get('parent_span_id')}") + print( + f"Assertion Failed: Server span is not child of Attempt span. Expected parent {attempt_span.get('span_id')}, got {server_span.get('parent_span_id')}" + ) return False # 3. Verify Attempt Span Attributes @@ -135,56 +192,123 @@ def verify_spans(spans_file): trans_retry = val_dict.get("bool_value") if prev_attempts is None: - print("Assertion Failed: Attribute 'previous-rpc-attempts' not found on Attempt span.") + print( + "Assertion Failed: Attribute 'previous-rpc-attempts' not found on Attempt span." + ) return False if int(prev_attempts) != 0: - print(f"Assertion Failed: Attribute 'previous-rpc-attempts' value mismatch. Expected 0, got {prev_attempts}") + print( + f"Assertion Failed: Attribute 'previous-rpc-attempts' value mismatch. Expected 0, got {prev_attempts}" + ) return False if trans_retry is None: - print("Assertion Failed: Attribute 'transparent-retry' not found on Attempt span.") + print( + "Assertion Failed: Attribute 'transparent-retry' not found on Attempt span." + ) return False if trans_retry is not False: - print(f"Assertion Failed: Attribute 'transparent-retry' value mismatch. Expected False, got {trans_retry}") + print( + f"Assertion Failed: Attribute 'transparent-retry' value mismatch. Expected False, got {trans_retry}" + ) return False # 4. Verify Events attempt_events = [e.get("name") for e in attempt_span.get("events", [])] client_events = [e.get("name") for e in client_span.get("events", [])] - if "Outbound message" not in attempt_events and "Outbound message" not in client_events: - print("Assertion Failed: Event 'Outbound message' not found on Client or Attempt span.") + if ( + "Outbound message" not in attempt_events + and "Outbound message" not in client_events + ): + print( + "Assertion Failed: Event 'Outbound message' not found on Client or Attempt span." + ) return False - if "Inbound message" not in attempt_events and "Inbound message" not in client_events: - print("Assertion Failed: Event 'Inbound message' not found on Client or Attempt span.") + if ( + "Inbound message" not in attempt_events + and "Inbound message" not in client_events + ): + print( + "Assertion Failed: Event 'Inbound message' not found on Client or Attempt span." + ) return False server_events = [e.get("name") for e in server_span.get("events", [])] if "Inbound message" not in server_events: - print("Assertion Failed: Event 'Inbound message' not found on Server span.") + print( + "Assertion Failed: Event 'Inbound message' not found on Server span." + ) return False if "Outbound message" not in server_events: - print("Assertion Failed: Event 'Outbound message' not found on Server span.") + print( + "Assertion Failed: Event 'Outbound message' not found on Server span." + ) return False print("All span assertions passed successfully!") return True + def main(): ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) os.chdir(ROOT) - parser = argparse.ArgumentParser(description="Build and run OpenTelemetry Interop tests locally") - parser.add_argument("--skip_build", action="store_true", help="Skip building targets with Bazel/Gradle") - parser.add_argument("--client", choices=["c++", "java", "python"], default="c++", help="Client language (c++, java, or python)") - parser.add_argument("--server", choices=["c++", "java", "python"], default="c++", help="Server language (c++, java, or python)") + parser = argparse.ArgumentParser( + description="Build and run OpenTelemetry Interop tests locally" + ) + parser.add_argument( + "--skip_build", + action="store_true", + help="Skip building targets with Bazel/Gradle", + ) + parser.add_argument( + "--client", + choices=["c++", "java", "python"], + default="c++", + help="Client language (c++, java, or python)", + ) + parser.add_argument( + "--server", + choices=["c++", "java", "python"], + default="c++", + help="Server language (c++, java, or python)", + ) args = parser.parse_args() if not args.skip_build: if args.client == "c++" or args.server == "c++": - run_cmd(["./tools/bazel", "build", "--macos_minimum_os=11.0", "//test/cpp/interop:interop_client", "//test/cpp/interop:interop_server", "//test/cpp/interop:otlp_collector"], "Building C++ interop targets") + run_cmd( + [ + "./tools/bazel", + "build", + "--macos_minimum_os=11.0", + "//test/cpp/interop:interop_client", + "//test/cpp/interop:interop_server", + "//test/cpp/interop:otlp_collector", + ], + "Building C++ interop targets", + ) if args.client == "java" or args.server == "java": - run_cmd(["./gradlew", ":grpc-interop-testing:installDist", "-x", "test"], "Building Java interop targets", cwd="../grpc-java") + run_cmd( + [ + "./gradlew", + ":grpc-interop-testing:installDist", + "-x", + "test", + ], + "Building Java interop targets", + cwd="../grpc-java", + ) if args.client == "python" or args.server == "python": - run_cmd(["./tools/bazel", "build", "--macos_minimum_os=11.0", "//src/python/grpcio_tests/tests/interop:client", "//src/python/grpcio_tests/tests/interop:server_bin"], "Building Python interop targets") + run_cmd( + [ + "./tools/bazel", + "build", + "--macos_minimum_os=11.0", + "//src/python/grpcio_tests/tests/interop:client", + "//src/python/grpcio_tests/tests/interop:server_bin", + ], + "Building Python interop targets", + ) collector_port = get_free_port() server_port = get_free_port() @@ -197,11 +321,15 @@ def main(): try: # Start Collector collector_proc = start_proc( - ["./bazel-bin/test/cpp/interop/otlp_collector", f"--port={collector_port}", f"--file={spans_file}"], + [ + "./bazel-bin/test/cpp/interop/otlp_collector", + f"--port={collector_port}", + f"--file={spans_file}", + ], {}, - "OTLP Collector" + "OTLP Collector", ) - time.sleep(1) # wait for collector to start listening + time.sleep(1) # wait for collector to start listening # Start Server env = { @@ -210,56 +338,82 @@ def main(): "OTEL_TRACES_EXPORTER": "otlp", "OTEL_METRICS_EXPORTER": "none", "OTEL_LOGS_EXPORTER": "none", - "GRPC_BAZEL_RUNTIME": "1" + "GRPC_BAZEL_RUNTIME": "1", } if args.server == "c++": server_proc = start_proc( - ["./bazel-bin/test/cpp/interop/interop_server", f"--port={server_port}", "--enable_opentelemetry=true"], + [ + "./bazel-bin/test/cpp/interop/interop_server", + f"--port={server_port}", + "--enable_opentelemetry=true", + ], env, - "C++ Interop Server" + "C++ Interop Server", ) elif args.server == "java": server_proc = start_proc( - ["../grpc-java/interop-testing/build/install/grpc-interop-testing/bin/test-server", f"--port={server_port}", "--use_tls=false", "--enable_opentelemetry=true"], + [ + "../grpc-java/interop-testing/build/install/grpc-interop-testing/bin/test-server", + f"--port={server_port}", + "--use_tls=false", + "--enable_opentelemetry=true", + ], env, - "Java Interop Server" + "Java Interop Server", ) elif args.server == "python": server_proc = start_proc( - ["./bazel-bin/src/python/grpcio_tests/tests/interop/server_bin", f"--port={server_port}", "--use_tls=false", "--enable_opentelemetry=true"], + [ + "./bazel-bin/src/python/grpcio_tests/tests/interop/server_bin", + f"--port={server_port}", + "--use_tls=false", + "--enable_opentelemetry=true", + ], env, - "Python Interop Server" + "Python Interop Server", ) - time.sleep(2) # wait for server to bind and start + time.sleep(2) # wait for server to bind and start # Run Client print(f"Running {args.client.upper()} Client...") if args.client == "c++": - client_res = run_cmd([ - "./bazel-bin/test/cpp/interop/interop_client", - "--server_host=localhost", - f"--server_port={server_port}", - "--test_case=empty_unary", - "--enable_opentelemetry=true" - ], "Running C++ Interop Client", env=env) + client_res = run_cmd( + [ + "./bazel-bin/test/cpp/interop/interop_client", + "--server_host=localhost", + f"--server_port={server_port}", + "--test_case=empty_unary", + "--enable_opentelemetry=true", + ], + "Running C++ Interop Client", + env=env, + ) elif args.client == "java": - client_res = run_cmd([ - "../grpc-java/interop-testing/build/install/grpc-interop-testing/bin/test-client", - "--server_host=localhost", - f"--server_port={server_port}", - "--test_case=empty_unary", - "--use_tls=false", - "--enable_opentelemetry=true" - ], "Running Java Interop Client", env=env) + client_res = run_cmd( + [ + "../grpc-java/interop-testing/build/install/grpc-interop-testing/bin/test-client", + "--server_host=localhost", + f"--server_port={server_port}", + "--test_case=empty_unary", + "--use_tls=false", + "--enable_opentelemetry=true", + ], + "Running Java Interop Client", + env=env, + ) elif args.client == "python": - client_res = run_cmd([ - "./bazel-bin/src/python/grpcio_tests/tests/interop/client", - "--server_host=localhost", - f"--server_port={server_port}", - "--test_case=empty_unary", - "--use_tls=false", - "--enable_opentelemetry=true" - ], "Running Python Interop Client", env=env) + client_res = run_cmd( + [ + "./bazel-bin/src/python/grpcio_tests/tests/interop/client", + "--server_host=localhost", + f"--server_port={server_port}", + "--test_case=empty_unary", + "--use_tls=false", + "--enable_opentelemetry=true", + ], + "Running Python Interop Client", + env=env, + ) print("Client finished. Waiting for spans to flush...") time.sleep(2) @@ -292,7 +446,6 @@ def main(): except Exception as e: print(f"Error terminating collector: {e}") - # Perform Span Verifications success = verify_spans(spans_file) if success: @@ -302,5 +455,6 @@ def main(): print("Test Result: FAILED") sys.exit(1) + if __name__ == "__main__": main() diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index 70590317ec3f0..eaead66541875 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -29,13 +29,15 @@ _collector_port = None + def get_free_port(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(('', 0)) + s.bind(("", 0)) port = s.getsockname()[1] s.close() return port + def verify_tracing_spans(spans_file): start_time = time.time() all_spans = [] @@ -62,7 +64,18 @@ def verify_tracing_spans(spans_file): for span in scope_spans.get("spans", []): all_spans.append(span) - client_span = next((s for s in all_spans if s.get("name") in ("Sent.grpc.testing.TestService.EmptyCall", "Sent.grpc.testing.TestService/EmptyCall")), None) + client_span = next( + ( + s + for s in all_spans + if s.get("name") + in ( + "Sent.grpc.testing.TestService.EmptyCall", + "Sent.grpc.testing.TestService/EmptyCall", + ) + ), + None, + ) if not client_span: time.sleep(0.5) continue @@ -72,8 +85,32 @@ def verify_tracing_spans(spans_file): time.sleep(0.5) continue - attempt_span = next((s for s in all_spans if s.get("name") in ("Attempt.grpc.testing.TestService.EmptyCall", "Attempt.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) - server_span = next((s for s in all_spans if s.get("name") in ("Recv.grpc.testing.TestService.EmptyCall", "Recv.grpc.testing.TestService/EmptyCall") and s.get("trace_id") == trace_id), None) + attempt_span = next( + ( + s + for s in all_spans + if s.get("name") + in ( + "Attempt.grpc.testing.TestService.EmptyCall", + "Attempt.grpc.testing.TestService/EmptyCall", + ) + and s.get("trace_id") == trace_id + ), + None, + ) + server_span = next( + ( + s + for s in all_spans + if s.get("name") + in ( + "Recv.grpc.testing.TestService.EmptyCall", + "Recv.grpc.testing.TestService/EmptyCall", + ) + and s.get("trace_id") == trace_id + ), + None, + ) if not attempt_span or not server_span: time.sleep(0.5) @@ -82,11 +119,16 @@ def verify_tracing_spans(spans_file): # Found all three matching spans break else: - print("Verification Failed: Timed out waiting for all 3 expected spans.") + print( + "Verification Failed: Timed out waiting for all 3 expected spans." + ) return False trace_id = client_span.get("trace_id") - if attempt_span.get("trace_id") != trace_id or server_span.get("trace_id") != trace_id: + if ( + attempt_span.get("trace_id") != trace_id + or server_span.get("trace_id") != trace_id + ): print("Verification Failed: Trace ID mismatch.") return False @@ -117,16 +159,31 @@ def verify_tracing_spans(spans_file): attempt_events = [e.get("name") for e in attempt_span.get("events", [])] client_events = [e.get("name") for e in client_span.get("events", [])] - if "Outbound message" not in attempt_events and "Outbound message" not in client_events: - print("Verification Failed: Outbound event not found in Client or Attempt span.") + if ( + "Outbound message" not in attempt_events + and "Outbound message" not in client_events + ): + print( + "Verification Failed: Outbound event not found in Client or Attempt span." + ) return False - if "Inbound message" not in attempt_events and "Inbound message" not in client_events: - print("Verification Failed: Inbound event not found in Client or Attempt span.") + if ( + "Inbound message" not in attempt_events + and "Inbound message" not in client_events + ): + print( + "Verification Failed: Inbound event not found in Client or Attempt span." + ) return False server_events = [e.get("name") for e in server_span.get("events", [])] - if "Inbound message" not in server_events or "Outbound message" not in server_events: - print("Verification Failed: Inbound/Outbound event not found in Server span.") + if ( + "Inbound message" not in server_events + or "Outbound message" not in server_events + ): + print( + "Verification Failed: Inbound/Outbound event not found in Server span." + ) return False print("OTel Tracing span verification succeeded!") @@ -1171,8 +1228,12 @@ def cloud_to_cloud_jobspec( add_env["OTEL_METRICS_EXPORTER"] = "none" add_env["OTEL_LOGS_EXPORTER"] = "none" if _collector_port: - collector_host = "host.docker.internal" if docker_image else "localhost" - add_env["OTEL_EXPORTER_OTLP_ENDPOINT"] = f"http://{collector_host}:{_collector_port}" + collector_host = ( + "host.docker.internal" if docker_image else "localhost" + ) + add_env["OTEL_EXPORTER_OTLP_ENDPOINT"] = ( + f"http://{collector_host}:{_collector_port}" + ) if test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS: client_test_case = _GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES[ test_case @@ -1275,7 +1336,9 @@ def server_jobspec( environ["OTEL_METRICS_EXPORTER"] = "none" environ["OTEL_LOGS_EXPORTER"] = "none" collector_host = "host.docker.internal" if docker_image else "localhost" - environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = f"http://{collector_host}:{_collector_port}" + environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = ( + f"http://{collector_host}:{_collector_port}" + ) if transport_security == "tls": server_cmd += ["--use_tls=true"] elif transport_security == "alts": @@ -1325,7 +1388,9 @@ def server_jobspec( docker_args += ["-p", str(_DEFAULT_SERVER_PORT)] if docker_image: - docker_args = docker_args + ["--add-host=host.docker.internal:host-gateway"] + docker_args = docker_args + [ + "--add-host=host.docker.internal:host-gateway" + ] docker_cmdline = docker_run_cmdline( cmdline, @@ -1706,15 +1771,25 @@ def aggregate_http2_results(stdout): collector_proc = None try: if not args.manual_run: - has_cxx = ("c++" in args.language or "all" in args.language) or ("c++" in servers) + has_cxx = ("c++" in args.language or "all" in args.language) or ( + "c++" in servers + ) if has_cxx: _collector_port = get_free_port() spans_file = os.path.abspath("captured_spans.json") if os.path.exists(spans_file): os.remove(spans_file) - collector_cmd = ["./bazel-bin/test/cpp/interop/otlp_collector", f"--port={_collector_port}", f"--file={spans_file}"] + collector_cmd = [ + "./bazel-bin/test/cpp/interop/otlp_collector", + f"--port={_collector_port}", + f"--file={spans_file}", + ] print(f"Starting OTLP collector on port {_collector_port}...") - collector_proc = subprocess.Popen(collector_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + collector_proc = subprocess.Popen( + collector_cmd, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) time.sleep(1) for s in servers: lang = str(s) @@ -1886,7 +1961,10 @@ def aggregate_http2_results(stdout): continue if test_case == "test_unary_rpc_tracing_export": allowed_tracing_languages = ["c++", "java", "python"] - if str(language) not in allowed_tracing_languages or server_name not in allowed_tracing_languages: + if ( + str(language) not in allowed_tracing_languages + or server_name not in allowed_tracing_languages + ): continue if not test_case in language.unimplemented_test_cases(): if not test_case in skip_server: @@ -2034,7 +2112,10 @@ def aggregate_http2_results(stdout): skip_jobs=args.manual_run, ) if not num_failures and not args.manual_run: - has_tracing_test = any(job.shortname.find("test_unary_rpc_tracing_export") != -1 for job in jobs) + has_tracing_test = any( + job.shortname.find("test_unary_rpc_tracing_export") != -1 + for job in jobs + ) if has_tracing_test: spans_file = os.path.abspath("captured_spans.json") if not verify_tracing_spans(spans_file): From a270ae497ea43d13f1f0de47a1a6729b0c43dcb1 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 22 Jul 2026 17:07:10 +0530 Subject: [PATCH 12/29] Fix isort import ordering for Python interop files --- .../grpcio_tests/tests/bazel_namespace_package_hack.py | 2 ++ test/cpp/interop/otlp_collector.py | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py b/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py index 0d46a8cdc3443..068bc5757fe34 100644 --- a/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py +++ b/src/python/grpcio_tests/tests/bazel_namespace_package_hack.py @@ -40,6 +40,7 @@ def sys_path_to_site_dir_hack(): site.addsitedir(item) try: import pkgutil + import google google.__path__ = pkgutil.extend_path(google.__path__, google.__name__) @@ -47,6 +48,7 @@ def sys_path_to_site_dir_hack(): pass try: import pkgutil + import src src.__path__ = pkgutil.extend_path(src.__path__, src.__name__) diff --git a/test/cpp/interop/otlp_collector.py b/test/cpp/interop/otlp_collector.py index b29325f079a15..596ab24832b94 100644 --- a/test/cpp/interop/otlp_collector.py +++ b/test/cpp/interop/otlp_collector.py @@ -17,15 +17,15 @@ # import argparse +from concurrent import futures import json import os import signal import threading import time -from concurrent import futures -import grpc -from google.protobuf import json_format +from google.protobuf import json_format +import grpc from opentelemetry.proto.collector.trace.v1 import trace_service_pb2 from opentelemetry.proto.collector.trace.v1 import trace_service_pb2_grpc From 0765efec1efd570a887bebb0bea1bdcae59c46a0 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 22 Jul 2026 17:08:04 +0530 Subject: [PATCH 13/29] Fix pylint wrong-import-position in server.py --- src/python/grpcio_tests/tests/interop/server.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index 4ead9db7b55bc..e6f1bb127e17e 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -26,6 +26,7 @@ # pylint: disable=wrong-import-position from concurrent import futures import logging +import signal from absl import app from absl.flags import argparse_flags @@ -77,9 +78,6 @@ def get_server_credentials(use_tls): return grpc.alts_server_credentials() -import signal - - def _serve_internal(server): def _sig_handler(signum, frame): _LOGGER.info("Received signal %d, stopping server...", signum) From ad2d5f43d9489c5caeed5f9a607716ac456d1a7a Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 22 Jul 2026 17:25:28 +0530 Subject: [PATCH 14/29] build: add protobuf json module to protobuf_headers external_deps for RBE strict layering --- bazel/grpc_build_system.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bazel/grpc_build_system.bzl b/bazel/grpc_build_system.bzl index 83abb9be629d9..052fc6cf2da98 100644 --- a/bazel/grpc_build_system.bzl +++ b/bazel/grpc_build_system.bzl @@ -82,7 +82,7 @@ def _get_external_deps(external_deps): elif dep == "protobuf_clib": ret.extend(["@com_google_protobuf//src/google/protobuf/compiler:code_generator", "@com_google_protobuf//src/google/protobuf/compiler:importer"]) elif dep == "protobuf_headers": - ret.extend(["@com_google_protobuf//:protobuf_headers", "@com_google_protobuf//src/google/protobuf/io", "@com_google_protobuf//src/google/protobuf/io:printer", "@com_google_protobuf//src/google/protobuf/io:tokenizer"]) + ret.extend(["@com_google_protobuf//:protobuf_headers", "@com_google_protobuf//src/google/protobuf/io", "@com_google_protobuf//src/google/protobuf/io:printer", "@com_google_protobuf//src/google/protobuf/io:tokenizer", "@com_google_protobuf//src/google/protobuf/json:json"]) elif dep.startswith("absl/"): ret.append("@com_google_absl//" + dep) elif dep.startswith("google/"): From 86a18ab299b987c89fff2236eac6079fff621bd3 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 22 Jul 2026 17:53:02 +0530 Subject: [PATCH 15/29] Fix CMake target linking for interop targets using conditional target checks --- CMakeLists.txt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7efb6f326bcd8..0ed5e70350d67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23200,9 +23200,14 @@ target_link_libraries(interop_client ${_gRPC_ALLTARGETS_LIBRARIES} grpc++_test_config grpc++_test_util - grpc_opentelemetry - opentelemetry-cpp::otlp_grpc_exporter ) +if(TARGET grpcpp_otel_plugin) + target_link_libraries(interop_client grpcpp_otel_plugin) +endif() +if(TARGET opentelemetry-cpp::otlp_grpc_exporter) + target_link_libraries(interop_client opentelemetry-cpp::otlp_grpc_exporter) +endif() + endif() @@ -23257,9 +23262,14 @@ target_link_libraries(interop_server ${_gRPC_ALLTARGETS_LIBRARIES} grpc++_test_config grpc++_test_util - grpc_opentelemetry - opentelemetry-cpp::otlp_grpc_exporter ) +if(TARGET grpcpp_otel_plugin) + target_link_libraries(interop_server grpcpp_otel_plugin) +endif() +if(TARGET opentelemetry-cpp::otlp_grpc_exporter) + target_link_libraries(interop_server opentelemetry-cpp::otlp_grpc_exporter) +endif() + endif() From 67493e5998a630526b64ec1aa62ee72facb6e042 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 22 Jul 2026 18:31:25 +0530 Subject: [PATCH 16/29] sanity: remove unused buildifier loads and format C++ headers --- test/cpp/interop/BUILD | 1 - test/cpp/interop/client.cc | 11 +++++------ test/cpp/interop/interop_server.cc | 16 ++++++++-------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD index bad3e7893aca0..54eff6b4d7e3b 100644 --- a/test/cpp/interop/BUILD +++ b/test/cpp/interop/BUILD @@ -13,7 +13,6 @@ # limitations under the License. load("//bazel:grpc_build_system.bzl", "grpc_cc_binary", "grpc_cc_library", "grpc_cc_test", "grpc_package") -load("//bazel:python_rules.bzl", "py_grpc_library", "py_proto_library") licenses(["notice"]) diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index 12235d24e4c57..d19294b56f02f 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -16,18 +16,15 @@ // // -#include -#include - -#include "absl/flags/flag.h" -#include "absl/log/log.h" - #include #include #include #include #include +#include +#include + #include "src/core/util/crash.h" #include "src/core/util/string.h" #include "test/core/test_util/test_config.h" @@ -35,6 +32,8 @@ #include "test/cpp/interop/interop_client.h" #include "test/cpp/interop/otel_helper.h" #include "test/cpp/util/test_config.h" +#include "absl/flags/flag.h" +#include "absl/log/log.h" ABSL_FLAG(bool, use_alts, false, "Whether to use alts. Enable alts will disable tls."); diff --git a/test/cpp/interop/interop_server.cc b/test/cpp/interop/interop_server.cc index 0eebcf67b002f..10306e34ff52d 100644 --- a/test/cpp/interop/interop_server.cc +++ b/test/cpp/interop/interop_server.cc @@ -16,14 +16,6 @@ // // -#include -#include -#include -#include - -#include "absl/flags/flag.h" -#include "absl/log/log.h" - #include #include #include @@ -34,6 +26,11 @@ #include #include +#include +#include +#include +#include + #include "src/core/util/crash.h" #include "src/core/util/grpc_check.h" #include "src/core/util/string.h" @@ -45,6 +42,9 @@ #include "test/cpp/interop/server_helper.h" #include "test/cpp/util/test_config.h" +#include "absl/flags/flag.h" +#include "absl/log/log.h" + ABSL_FLAG(bool, use_alts, false, "Whether to use alts. Enable alts will disable tls."); ABSL_FLAG(bool, use_tls, false, "Whether to use tls."); From 9bdd1af887070e08d842a6d9241308625bb30345 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Fri, 24 Jul 2026 11:17:32 +0530 Subject: [PATCH 17/29] android: add otel_helper sources to CMakeLists.txt and guard OTel headers with #ifndef __ANDROID__ --- src/android/test/interop/app/CMakeLists.txt | 2 ++ test/cpp/interop/otel_helper.cc | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/android/test/interop/app/CMakeLists.txt b/src/android/test/interop/app/CMakeLists.txt index 285d9019d0662..8bfdebd5fd8da 100644 --- a/src/android/test/interop/app/CMakeLists.txt +++ b/src/android/test/interop/app/CMakeLists.txt @@ -114,6 +114,8 @@ add_library(grpc-interop ${GRPC_SRC_DIR}/test/cpp/interop/backend_metrics_lb_policy.cc ${GRPC_SRC_DIR}/test/cpp/interop/interop_client.h ${GRPC_SRC_DIR}/test/cpp/interop/interop_client.cc + ${GRPC_SRC_DIR}/test/cpp/interop/otel_helper.h + ${GRPC_SRC_DIR}/test/cpp/interop/otel_helper.cc ${GRPC_SRC_DIR}/test/core/test_util/histogram.h ${GRPC_SRC_DIR}/test/core/test_util/histogram.cc ${GRPC_SRC_DIR}/test/core/test_util/test_lb_policies.h diff --git a/test/cpp/interop/otel_helper.cc b/test/cpp/interop/otel_helper.cc index 749b02722c0d4..949c13bca213e 100644 --- a/test/cpp/interop/otel_helper.cc +++ b/test/cpp/interop/otel_helper.cc @@ -30,11 +30,13 @@ #include "absl/flags/flag.h" #include "absl/log/log.h" +#ifndef __ANDROID__ #include #include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h" #include "opentelemetry/sdk/trace/simple_processor_factory.h" #include "opentelemetry/sdk/trace/tracer_provider.h" +#endif ABSL_FLAG(bool, enable_opentelemetry, false, "Whether to enable OpenTelemetry Tracing"); @@ -43,11 +45,14 @@ namespace grpc { namespace testing { namespace interop { +#ifndef __ANDROID__ static std::shared_ptr g_tracer_provider; static std::once_flag g_otel_init_once; +#endif void MaybeRegisterOpenTelemetry() { +#ifndef __ANDROID__ std::call_once(g_otel_init_once, []() { if (!absl::GetFlag(FLAGS_enable_opentelemetry)) { return; @@ -86,13 +91,16 @@ void MaybeRegisterOpenTelemetry() { << "Successfully registered gRPC OpenTelemetry Plugin for tracing."; } }); +#endif } void ForceFlushOpenTelemetry() { +#ifndef __ANDROID__ auto provider = std::atomic_load(&g_tracer_provider); if (provider != nullptr) { provider->ForceFlush(); } +#endif } } // namespace interop From 402884d603807eca2010cd3683944e716a64b708 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Fri, 24 Jul 2026 13:56:01 +0530 Subject: [PATCH 18/29] interop: guard sys_path_to_site_dir_hack inside __main__ to prevent namespace package side effects --- .../tests/interop/_insecure_intraop_test.py | 10 ++++++++++ .../tests/interop/_secure_intraop_test.py | 10 ++++++++++ src/python/grpcio_tests/tests/interop/client.py | 13 +++++++------ src/python/grpcio_tests/tests/interop/methods.py | 11 ++++++----- .../grpcio_tests/tests/interop/security_test.py | 10 ++++++++++ src/python/grpcio_tests/tests/interop/server.py | 13 +++++++------ 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py index 16f7bdfe110aa..8205ff9e9baaf 100644 --- a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py +++ b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py @@ -13,8 +13,18 @@ # limitations under the License. """Insecure client-server interoperability as a unit test.""" +import os import unittest +if __name__ == "__main__": + os.environ["GRPC_BAZEL_RUNTIME"] = "1" + try: + from tests import bazel_namespace_package_hack + + bazel_namespace_package_hack.sys_path_to_site_dir_hack() + except ImportError: + pass + import grpc from src.proto.grpc.testing import test_pb2_grpc diff --git a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py index b5568290c6c6c..a5980dc3db35d 100644 --- a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py +++ b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py @@ -13,8 +13,18 @@ # limitations under the License. """Secure client-server interoperability as a unit test.""" +import os import unittest +if __name__ == "__main__": + os.environ["GRPC_BAZEL_RUNTIME"] = "1" + try: + from tests import bazel_namespace_package_hack + + bazel_namespace_package_hack.sys_path_to_site_dir_hack() + except ImportError: + pass + import grpc import grpc.experimental diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 523de527ac4ca..a940866f61732 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -15,13 +15,14 @@ import os -os.environ["GRPC_BAZEL_RUNTIME"] = "1" -try: - from tests import bazel_namespace_package_hack +if __name__ == "__main__": + os.environ["GRPC_BAZEL_RUNTIME"] = "1" + try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() -except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() + except ImportError: + pass # pylint: disable=wrong-import-position from absl import app diff --git a/src/python/grpcio_tests/tests/interop/methods.py b/src/python/grpcio_tests/tests/interop/methods.py index 45d8bf9f67171..8de207017b391 100644 --- a/src/python/grpcio_tests/tests/interop/methods.py +++ b/src/python/grpcio_tests/tests/interop/methods.py @@ -15,12 +15,13 @@ # NOTE(lidiz) This module only exists in Bazel BUILD file, for more details # please refer to comments in the "bazel_namespace_package_hack" module. -try: - from tests import bazel_namespace_package_hack +if __name__ == "__main__": + try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() -except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() + except ImportError: + pass import enum import json diff --git a/src/python/grpcio_tests/tests/interop/security_test.py b/src/python/grpcio_tests/tests/interop/security_test.py index 76001bb99ffda..a40d7fa542b95 100644 --- a/src/python/grpcio_tests/tests/interop/security_test.py +++ b/src/python/grpcio_tests/tests/interop/security_test.py @@ -15,6 +15,7 @@ import faulthandler from functools import partial import gc +import os import queue import sys import threading @@ -22,6 +23,15 @@ import unittest import weakref +if __name__ == "__main__": + os.environ["GRPC_BAZEL_RUNTIME"] = "1" + try: + from tests import bazel_namespace_package_hack + + bazel_namespace_package_hack.sys_path_to_site_dir_hack() + except ImportError: + pass + import grpc import grpc.experimental diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index e6f1bb127e17e..b17dedf03bcf8 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -15,13 +15,14 @@ import os -os.environ["GRPC_BAZEL_RUNTIME"] = "1" -try: - from tests import bazel_namespace_package_hack +if __name__ == "__main__": + os.environ["GRPC_BAZEL_RUNTIME"] = "1" + try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() -except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() + except ImportError: + pass # pylint: disable=wrong-import-position from concurrent import futures From c365aacebfa737e37b6806cd6cbbab3710805122 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 27 Jul 2026 15:50:08 +0530 Subject: [PATCH 19/29] python: execute sys_path_to_site_dir_hack at module load time for Bazel tests --- .../tests/interop/_insecure_intraop_test.py | 13 ++++++------- .../tests/interop/_secure_intraop_test.py | 13 ++++++------- src/python/grpcio_tests/tests/interop/client.py | 13 ++++++------- src/python/grpcio_tests/tests/interop/methods.py | 11 +++++------ .../grpcio_tests/tests/interop/security_test.py | 13 ++++++------- src/python/grpcio_tests/tests/interop/server.py | 13 ++++++------- 6 files changed, 35 insertions(+), 41 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py index 8205ff9e9baaf..6f34ac0d43e78 100644 --- a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py +++ b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py @@ -16,14 +16,13 @@ import os import unittest -if __name__ == "__main__": - os.environ["GRPC_BAZEL_RUNTIME"] = "1" - try: - from tests import bazel_namespace_package_hack +os.environ["GRPC_BAZEL_RUNTIME"] = "1" +try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() - except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass import grpc diff --git a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py index a5980dc3db35d..8d46afdd2858d 100644 --- a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py +++ b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py @@ -16,14 +16,13 @@ import os import unittest -if __name__ == "__main__": - os.environ["GRPC_BAZEL_RUNTIME"] = "1" - try: - from tests import bazel_namespace_package_hack +os.environ["GRPC_BAZEL_RUNTIME"] = "1" +try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() - except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass import grpc import grpc.experimental diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index a940866f61732..523de527ac4ca 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -15,14 +15,13 @@ import os -if __name__ == "__main__": - os.environ["GRPC_BAZEL_RUNTIME"] = "1" - try: - from tests import bazel_namespace_package_hack +os.environ["GRPC_BAZEL_RUNTIME"] = "1" +try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() - except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass # pylint: disable=wrong-import-position from absl import app diff --git a/src/python/grpcio_tests/tests/interop/methods.py b/src/python/grpcio_tests/tests/interop/methods.py index 8de207017b391..45d8bf9f67171 100644 --- a/src/python/grpcio_tests/tests/interop/methods.py +++ b/src/python/grpcio_tests/tests/interop/methods.py @@ -15,13 +15,12 @@ # NOTE(lidiz) This module only exists in Bazel BUILD file, for more details # please refer to comments in the "bazel_namespace_package_hack" module. -if __name__ == "__main__": - try: - from tests import bazel_namespace_package_hack +try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() - except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass import enum import json diff --git a/src/python/grpcio_tests/tests/interop/security_test.py b/src/python/grpcio_tests/tests/interop/security_test.py index a40d7fa542b95..f56ccbe7a94e2 100644 --- a/src/python/grpcio_tests/tests/interop/security_test.py +++ b/src/python/grpcio_tests/tests/interop/security_test.py @@ -23,14 +23,13 @@ import unittest import weakref -if __name__ == "__main__": - os.environ["GRPC_BAZEL_RUNTIME"] = "1" - try: - from tests import bazel_namespace_package_hack +os.environ["GRPC_BAZEL_RUNTIME"] = "1" +try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() - except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass import grpc import grpc.experimental diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index b17dedf03bcf8..e6f1bb127e17e 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -15,14 +15,13 @@ import os -if __name__ == "__main__": - os.environ["GRPC_BAZEL_RUNTIME"] = "1" - try: - from tests import bazel_namespace_package_hack +os.environ["GRPC_BAZEL_RUNTIME"] = "1" +try: + from tests import bazel_namespace_package_hack - bazel_namespace_package_hack.sys_path_to_site_dir_hack() - except ImportError: - pass + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass # pylint: disable=wrong-import-position from concurrent import futures From 7c2755aab181b59d57e3f7e5fc8c73dff8865d71 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 3 Aug 2026 22:31:50 +0530 Subject: [PATCH 20/29] interop: add OpenTelemetry tracing support for C++ and Python interop servers --- .../grpcio_tests/tests/interop/BUILD.bazel | 21 ++ .../grpcio_tests/tests/interop/client.py | 64 ++++- .../tests/interop/otel_interop_helper.py | 246 ++++++++++++++++++ .../grpcio_tests/tests/interop/server.py | 23 +- test/cpp/interop/interop_server_bootstrap.cc | 1 + .../observability_interop_server_bootstrap.cc | 1 + test/cpp/interop/run_otel_interop_test.py | 3 +- 7 files changed, 353 insertions(+), 6 deletions(-) create mode 100644 src/python/grpcio_tests/tests/interop/otel_interop_helper.py diff --git a/src/python/grpcio_tests/tests/interop/BUILD.bazel b/src/python/grpcio_tests/tests/interop/BUILD.bazel index f780c94c4a074..c172d29f90331 100644 --- a/src/python/grpcio_tests/tests/interop/BUILD.bazel +++ b/src/python/grpcio_tests/tests/interop/BUILD.bazel @@ -25,6 +25,21 @@ py_library( ], ) +py_library( + name = "otel_interop_helper", + srcs = ["otel_interop_helper.py"], + deps = [ + "//src/proto/grpc/testing:py_test_proto", + "//src/python/grpcio/grpc:grpcio", + "@opentelemetry_proto//:common_proto_py", + "@opentelemetry_proto//:trace_proto_py", + "@opentelemetry_proto//:trace_service_grpc_py", + "@opentelemetry_proto//:trace_service_proto_py", + requirement("opentelemetry-api"), + requirement("opentelemetry-sdk"), + ], +) + py_library( name = "client_lib", srcs = ["client.py"], @@ -34,6 +49,7 @@ py_library( ], deps = [ ":methods", + ":otel_interop_helper", ":resources", "//src/proto/grpc/testing:py_test_proto", "//src/proto/grpc/testing:test_py_pb2_grpc", @@ -42,6 +58,8 @@ py_library( "//src/python/grpcio_tests/tests:bazel_namespace_package_hack", requirement("absl-py"), requirement("google-auth"), + requirement("opentelemetry-api"), + requirement("opentelemetry-sdk"), ], ) @@ -109,6 +127,7 @@ py_library( "../../../../", ], deps = [ + ":otel_interop_helper", ":resources", ":service", "//src/proto/grpc/testing:py_test_proto", @@ -118,6 +137,8 @@ py_library( "//src/python/grpcio_tests/tests:bazel_namespace_package_hack", "//src/python/grpcio_tests/tests/unit:test_common", requirement("absl-py"), + requirement("opentelemetry-api"), + requirement("opentelemetry-sdk"), ], ) diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 523de527ac4ca..4f98639a9b78d 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -206,6 +206,56 @@ def get_secure_channel_parameters(args): return channel_credentials, channel_opts +class _OTelClientInterceptor(grpc.UnaryUnaryClientInterceptor): + def __init__(self, tracer): + self._tracer = tracer + + def intercept_unary_unary(self, continuation, client_call_details, request): + from grpc._interceptor import _ClientCallDetails + from opentelemetry import trace + from tests.interop import otel_interop_helper + + method = client_call_details.method + full_method = method.lstrip("/") + sent_span_name = f"Sent.{full_method}" + attempt_span_name = f"Attempt.{full_method}" + + sent_span = self._tracer.start_span(sent_span_name, kind=trace.SpanKind.CLIENT) + sent_ctx = trace.set_span_in_context(sent_span) + attempt_span = self._tracer.start_span( + attempt_span_name, kind=trace.SpanKind.CLIENT, context=sent_ctx + ) + attempt_span.set_attribute("previous-rpc-attempts", 0) + attempt_span.set_attribute("transparent-retry", False) + attempt_span.add_event("Outbound message") + + trace_bin_bytes = otel_interop_helper.pack_grpc_trace_bin( + attempt_span.get_span_context().trace_id, + attempt_span.get_span_context().span_id, + ) + + metadata = list(client_call_details.metadata or []) + metadata.append(("grpc-trace-bin", trace_bin_bytes)) + + new_details = _ClientCallDetails( + method=client_call_details.method, + timeout=client_call_details.timeout, + metadata=metadata, + credentials=client_call_details.credentials, + wait_for_ready=client_call_details.wait_for_ready, + compression=client_call_details.compression, + ) + + try: + response = continuation(new_details, request) + attempt_span.add_event("Inbound message") + return response + finally: + attempt_span.end() + sent_span.end() + otel_interop_helper.flush_tracer_provider() + + def _create_channel(args): target = "{}:{}".format(args.server_host, args.server_port) @@ -215,9 +265,16 @@ def _create_channel(args): or args.custom_credentials_type is not None ): channel_credentials, options = get_secure_channel_parameters(args) - return grpc.secure_channel(target, channel_credentials, options) + channel = grpc.secure_channel(target, channel_credentials, options) else: - return grpc.insecure_channel(target) + channel = grpc.insecure_channel(target) + + if args.enable_opentelemetry: + from tests.interop import otel_interop_helper + provider, tracer = otel_interop_helper.init_tracer_provider() + channel = grpc.intercept_channel(channel, _OTelClientInterceptor(tracer)) + + return channel def create_stub(channel, args): @@ -238,12 +295,14 @@ def _test_case_from_arg(test_case_arg): def test_interoperability(args): if args.enable_opentelemetry: import grpc_observability + from tests.interop import otel_interop_helper with grpc_observability.OpenTelemetryPlugin(): channel = _create_channel(args) stub = create_stub(channel, args) test_case = _test_case_from_arg(args.test_case) test_case.test_interoperability(stub, args) + otel_interop_helper.flush_tracer_provider() else: channel = _create_channel(args) stub = create_stub(channel, args) @@ -253,3 +312,4 @@ def test_interoperability(args): if __name__ == "__main__": app.run(test_interoperability, flags_parser=parse_interop_client_args) + diff --git a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py new file mode 100644 index 0000000000000..2901d74cf5608 --- /dev/null +++ b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py @@ -0,0 +1,246 @@ +# Copyright 2026 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. +"""OpenTelemetry Tracing Interop Helper for Python gRPC Interop Client/Server.""" + +import os +from typing import Optional, Tuple + +import grpc +from opentelemetry import trace +from opentelemetry.proto.collector.trace.v1 import trace_service_pb2, trace_service_pb2_grpc +from opentelemetry.proto.common.v1 import common_pb2 +from opentelemetry.proto.trace.v1 import trace_pb2 +from opentelemetry.sdk.trace import ReadableSpan, TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor, SpanExporter + + +class OTLPSpanExporter(SpanExporter): + """Exporter that sends OTLP spans to OTLP Collector over gRPC.""" + + def __init__(self, endpoint: str): + if endpoint.startswith("http://"): + endpoint = endpoint[7:] + elif endpoint.startswith("https://"): + endpoint = endpoint[8:] + self._channel = grpc.insecure_channel(endpoint) + self._stub = trace_service_pb2_grpc.TraceServiceStub(self._channel) + + def export(self, spans: Tuple[ReadableSpan, ...]) -> None: + if not spans: + return + + otlp_spans = [] + for span in spans: + ctx = span.context + parent_ctx = span.parent + + trace_id_bytes = ctx.trace_id.to_bytes(16, "big") + span_id_bytes = ctx.span_id.to_bytes(8, "big") + parent_span_id_bytes = ( + parent_ctx.span_id.to_bytes(8, "big") + if parent_ctx and parent_ctx.span_id + else b"" + ) + + proto_attributes = [] + if span.attributes: + for k, v in span.attributes.items(): + kv = common_pb2.KeyValue(key=k) + if isinstance(v, bool): + kv.value.bool_value = v + elif isinstance(v, int): + kv.value.int_value = v + elif isinstance(v, float): + kv.value.double_value = v + else: + kv.value.string_value = str(v) + proto_attributes.append(kv) + + proto_events = [] + if span.events: + for event in span.events: + e = trace_pb2.Span.Event( + name=event.name, + time_unix_nano=event.timestamp, + ) + proto_events.append(e) + + kind = ( + trace_pb2.Span.SpanKind.SPAN_KIND_CLIENT + if span.kind == trace.SpanKind.CLIENT + else trace_pb2.Span.SpanKind.SPAN_KIND_SERVER + ) + + proto_span = trace_pb2.Span( + trace_id=trace_id_bytes, + span_id=span_id_bytes, + parent_span_id=parent_span_id_bytes, + name=span.name, + kind=kind, + start_time_unix_nano=span.start_time, + end_time_unix_nano=span.end_time, + attributes=proto_attributes, + events=proto_events, + ) + otlp_spans.append(proto_span) + + scope_spans = trace_pb2.ScopeSpans(spans=otlp_spans) + resource_spans = trace_pb2.ResourceSpans(scope_spans=[scope_spans]) + request = trace_service_pb2.ExportTraceServiceRequest( + resource_spans=[resource_spans] + ) + + try: + self._stub.Export(request, timeout=5) + except Exception: + pass + + def shutdown(self) -> None: + self._channel.close() + + def force_flush(self, timeout_millis: int = 30000) -> bool: + return True + + +_GLOBAL_PROVIDER: Optional[TracerProvider] = None + + +def init_tracer_provider() -> Tuple[TracerProvider, trace.Tracer]: + global _GLOBAL_PROVIDER + if _GLOBAL_PROVIDER is None: + endpoint = os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317") + exporter = OTLPSpanExporter(endpoint) + processor = SimpleSpanProcessor(exporter) + _GLOBAL_PROVIDER = TracerProvider() + _GLOBAL_PROVIDER.add_span_processor(processor) + trace.set_tracer_provider(_GLOBAL_PROVIDER) + tracer = trace.get_tracer("grpc-python-interop") + return _GLOBAL_PROVIDER, tracer + + +def flush_tracer_provider(): + global _GLOBAL_PROVIDER + if _GLOBAL_PROVIDER: + _GLOBAL_PROVIDER.force_flush() + + +def pack_grpc_trace_bin( + trace_id_int: int, span_id_int: int, is_sampled: bool = True +) -> bytes: + trace_id_bytes = trace_id_int.to_bytes(16, "big") + span_id_bytes = span_id_int.to_bytes(8, "big") + options = 1 if is_sampled else 0 + return b"\x00\x00" + trace_id_bytes + b"\x01" + span_id_bytes + b"\x02" + bytes([options]) + + +def unpack_grpc_trace_bin( + header_bytes: bytes, +) -> Tuple[Optional[int], Optional[int], bool]: + if len(header_bytes) >= 29 and header_bytes[0] == 0: + trace_id_int = int.from_bytes(header_bytes[2:18], "big") + span_id_int = int.from_bytes(header_bytes[19:27], "big") + is_sampled = bool(header_bytes[28] & 1) + return trace_id_int, span_id_int, is_sampled + return None, None, False + + +def parse_traceparent( + header_str: str, +) -> Tuple[Optional[int], Optional[int], bool]: + parts = header_str.split("-") + if len(parts) >= 4 and parts[0] == "00": + try: + trace_id_int = int(parts[1], 16) + span_id_int = int(parts[2], 16) + is_sampled = (int(parts[3], 16) & 1) != 0 + return trace_id_int, span_id_int, is_sampled + except ValueError: + pass + return None, None, False + + +class OTelServerInterceptor(grpc.ServerInterceptor): + """Server interceptor to extract trace context and create server Recv span.""" + + def __init__(self, tracer: trace.Tracer): + self._tracer = tracer + + def intercept_service(self, continuation, handler_call_details): + print(f"DEBUG_SERVER_METADATA: {handler_call_details.invocation_metadata}", flush=True) + trace_bin_header = None + traceparent_header = None + for k, v in handler_call_details.invocation_metadata: + k_str = k.decode("ascii", errors="ignore") if isinstance(k, bytes) else str(k) + if k_str.lower() == "grpc-trace-bin": + trace_bin_header = v + elif k_str.lower() == "traceparent": + traceparent_header = v if isinstance(v, str) else v.decode("latin1") + + parent_ctx = None + trace_id, parent_span_id, is_sampled = None, None, False + + if trace_bin_header: + if isinstance(trace_bin_header, str): + trace_bin_header = trace_bin_header.encode("latin1") + trace_id, parent_span_id, is_sampled = unpack_grpc_trace_bin(trace_bin_header) + elif traceparent_header: + trace_id, parent_span_id, is_sampled = parse_traceparent(traceparent_header) + + if trace_id and parent_span_id: + parent_ctx = trace.SpanContext( + trace_id=trace_id, + span_id=parent_span_id, + is_remote=True, + trace_flags=trace.TraceFlags(1 if is_sampled else 0), + ) + + method = handler_call_details.method + full_method = method.lstrip("/") + span_name = f"Recv.{full_method}" + + if parent_ctx: + ctx = trace.set_span_in_context(trace.NonRecordingSpan(parent_ctx)) + server_span = self._tracer.start_span( + span_name, kind=trace.SpanKind.SERVER, context=ctx + ) + else: + server_span = self._tracer.start_span( + span_name, kind=trace.SpanKind.SERVER + ) + + server_span.add_event("Inbound message") + + handler = continuation(handler_call_details) + + if handler is None: + server_span.end() + return None + + if handler.unary_unary: + orig_func = handler.unary_unary + def wrapper(request, context): + try: + res = orig_func(request, context) + server_span.add_event("Outbound message") + return res + finally: + server_span.end() + flush_tracer_provider() + return grpc.unary_unary_rpc_method_handler( + wrapper, + request_deserializer=handler.request_deserializer, + response_serializer=handler.response_serializer, + ) + + return handler diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index e6f1bb127e17e..c4ebf9e076975 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -78,9 +78,12 @@ def get_server_credentials(use_tls): return grpc.alts_server_credentials() -def _serve_internal(server): +def _serve_internal(server, enable_otel=False): def _sig_handler(signum, frame): _LOGGER.info("Received signal %d, stopping server...", signum) + if enable_otel: + from tests.interop import otel_interop_helper + otel_interop_helper.flush_tracer_provider() server.stop(0) signal.signal(signal.SIGTERM, _sig_handler) @@ -89,11 +92,25 @@ def _sig_handler(signum, frame): server.start() _LOGGER.info("Server serving.") server.wait_for_termination() + if enable_otel: + from tests.interop import otel_interop_helper + otel_interop_helper.flush_tracer_provider() _LOGGER.info("Server stopped; exiting.") def serve(args): - server = test_common.test_server() + if args.enable_opentelemetry: + from tests.interop import otel_interop_helper + provider, tracer = otel_interop_helper.init_tracer_provider() + interceptor = otel_interop_helper.OTelServerInterceptor(tracer) + server = grpc.server( + futures.ThreadPoolExecutor(max_workers=10), + options=(("grpc.so_reuseport", 0),), + interceptors=(interceptor,), + ) + else: + server = test_common.test_server() + test_pb2_grpc.add_TestServiceServicer_to_server( service.TestService(), server ) @@ -107,7 +124,7 @@ def serve(args): import grpc_observability with grpc_observability.OpenTelemetryPlugin(): - _serve_internal(server) + _serve_internal(server, enable_otel=True) else: _serve_internal(server) diff --git a/test/cpp/interop/interop_server_bootstrap.cc b/test/cpp/interop/interop_server_bootstrap.cc index 8bead419554e9..7e3dffcda288a 100644 --- a/test/cpp/interop/interop_server_bootstrap.cc +++ b/test/cpp/interop/interop_server_bootstrap.cc @@ -32,6 +32,7 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(&argc, argv); grpc::testing::InitTest(&argc, &argv, true); signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); grpc::testing::interop::RunServer( grpc::testing::CreateInteropServerCredentials()); diff --git a/test/cpp/interop/observability_interop_server_bootstrap.cc b/test/cpp/interop/observability_interop_server_bootstrap.cc index f5b5af76e5a0a..30d1bf1b587d5 100644 --- a/test/cpp/interop/observability_interop_server_bootstrap.cc +++ b/test/cpp/interop/observability_interop_server_bootstrap.cc @@ -38,6 +38,7 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(&argc, argv); grpc::testing::InitTest(&argc, &argv, true); signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); if (absl::GetFlag(FLAGS_enable_observability)) { // TODO(someone): remove deprecated usage diff --git a/test/cpp/interop/run_otel_interop_test.py b/test/cpp/interop/run_otel_interop_test.py index d6206205c3694..2693251aac3b2 100755 --- a/test/cpp/interop/run_otel_interop_test.py +++ b/test/cpp/interop/run_otel_interop_test.py @@ -335,6 +335,7 @@ def main(): env = { "GRPC_EXPERIMENTAL_ENABLE_OTEL_TRACING": "true", "OTEL_EXPORTER_OTLP_ENDPOINT": f"http://localhost:{collector_port}", + "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc", "OTEL_TRACES_EXPORTER": "otlp", "OTEL_METRICS_EXPORTER": "none", "OTEL_LOGS_EXPORTER": "none", @@ -372,7 +373,7 @@ def main(): env, "Python Interop Server", ) - time.sleep(2) # wait for server to bind and start + time.sleep(3) # wait for server to bind and start # Run Client print(f"Running {args.client.upper()} Client...") From 7d00bea78084fa7eb352193fdf15058ad5801a8f Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 3 Aug 2026 23:50:09 +0530 Subject: [PATCH 21/29] interop: use __has_include for OpenTelemetry headers in otel_helper.cc --- test/cpp/interop/otel_helper.cc | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/cpp/interop/otel_helper.cc b/test/cpp/interop/otel_helper.cc index 949c13bca213e..ca360274f76d2 100644 --- a/test/cpp/interop/otel_helper.cc +++ b/test/cpp/interop/otel_helper.cc @@ -30,7 +30,12 @@ #include "absl/flags/flag.h" #include "absl/log/log.h" -#ifndef __ANDROID__ +#if __has_include() && \ + __has_include("opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h") +#define GRPC_HAS_OTEL_TRACING 1 +#endif + +#ifdef GRPC_HAS_OTEL_TRACING #include #include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h" @@ -45,14 +50,14 @@ namespace grpc { namespace testing { namespace interop { -#ifndef __ANDROID__ +#ifdef GRPC_HAS_OTEL_TRACING static std::shared_ptr g_tracer_provider; static std::once_flag g_otel_init_once; #endif void MaybeRegisterOpenTelemetry() { -#ifndef __ANDROID__ +#ifdef GRPC_HAS_OTEL_TRACING std::call_once(g_otel_init_once, []() { if (!absl::GetFlag(FLAGS_enable_opentelemetry)) { return; @@ -95,7 +100,7 @@ void MaybeRegisterOpenTelemetry() { } void ForceFlushOpenTelemetry() { -#ifndef __ANDROID__ +#ifdef GRPC_HAS_OTEL_TRACING auto provider = std::atomic_load(&g_tracer_provider); if (provider != nullptr) { provider->ForceFlush(); From f7cc2046492735cef0784cd3a2d6ba48a3fe55f6 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 4 Aug 2026 00:14:55 +0530 Subject: [PATCH 22/29] interop: reformat Python interop helper and client to <=80 char line limit --- .../grpcio_tests/tests/interop/client.py | 9 +++- .../tests/interop/otel_interop_helper.py | 46 +++++++++++++++---- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 4f98639a9b78d..5e926dcd9c9c8 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -220,7 +220,9 @@ def intercept_unary_unary(self, continuation, client_call_details, request): sent_span_name = f"Sent.{full_method}" attempt_span_name = f"Attempt.{full_method}" - sent_span = self._tracer.start_span(sent_span_name, kind=trace.SpanKind.CLIENT) + sent_span = self._tracer.start_span( + sent_span_name, kind=trace.SpanKind.CLIENT + ) sent_ctx = trace.set_span_in_context(sent_span) attempt_span = self._tracer.start_span( attempt_span_name, kind=trace.SpanKind.CLIENT, context=sent_ctx @@ -271,8 +273,11 @@ def _create_channel(args): if args.enable_opentelemetry: from tests.interop import otel_interop_helper + provider, tracer = otel_interop_helper.init_tracer_provider() - channel = grpc.intercept_channel(channel, _OTelClientInterceptor(tracer)) + channel = grpc.intercept_channel( + channel, _OTelClientInterceptor(tracer) + ) return channel diff --git a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py index 2901d74cf5608..d92ad54029500 100644 --- a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py +++ b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py @@ -11,14 +11,18 @@ # 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. -"""OpenTelemetry Tracing Interop Helper for Python gRPC Interop Client/Server.""" +"""OpenTelemetry Tracing Interop Helper for Python gRPC Interop Client/Server +""" import os from typing import Optional, Tuple import grpc from opentelemetry import trace -from opentelemetry.proto.collector.trace.v1 import trace_service_pb2, trace_service_pb2_grpc +from opentelemetry.proto.collector.trace.v1 import ( + trace_service_pb2, + trace_service_pb2_grpc, +) from opentelemetry.proto.common.v1 import common_pb2 from opentelemetry.proto.trace.v1 import trace_pb2 from opentelemetry.sdk.trace import ReadableSpan, TracerProvider @@ -119,7 +123,9 @@ def force_flush(self, timeout_millis: int = 30000) -> bool: def init_tracer_provider() -> Tuple[TracerProvider, trace.Tracer]: global _GLOBAL_PROVIDER if _GLOBAL_PROVIDER is None: - endpoint = os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317") + endpoint = os.environ.get( + "OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317" + ) exporter = OTLPSpanExporter(endpoint) processor = SimpleSpanProcessor(exporter) _GLOBAL_PROVIDER = TracerProvider() @@ -141,7 +147,14 @@ def pack_grpc_trace_bin( trace_id_bytes = trace_id_int.to_bytes(16, "big") span_id_bytes = span_id_int.to_bytes(8, "big") options = 1 if is_sampled else 0 - return b"\x00\x00" + trace_id_bytes + b"\x01" + span_id_bytes + b"\x02" + bytes([options]) + return ( + b"\x00\x00" + + trace_id_bytes + + b"\x01" + + span_id_bytes + + b"\x02" + + bytes([options]) + ) def unpack_grpc_trace_bin( @@ -171,21 +184,26 @@ def parse_traceparent( class OTelServerInterceptor(grpc.ServerInterceptor): - """Server interceptor to extract trace context and create server Recv span.""" + """Server interceptor to extract trace context and create Recv span.""" def __init__(self, tracer: trace.Tracer): self._tracer = tracer def intercept_service(self, continuation, handler_call_details): - print(f"DEBUG_SERVER_METADATA: {handler_call_details.invocation_metadata}", flush=True) trace_bin_header = None traceparent_header = None for k, v in handler_call_details.invocation_metadata: - k_str = k.decode("ascii", errors="ignore") if isinstance(k, bytes) else str(k) + k_str = ( + k.decode("ascii", errors="ignore") + if isinstance(k, bytes) + else str(k) + ) if k_str.lower() == "grpc-trace-bin": trace_bin_header = v elif k_str.lower() == "traceparent": - traceparent_header = v if isinstance(v, str) else v.decode("latin1") + traceparent_header = ( + v if isinstance(v, str) else v.decode("latin1") + ) parent_ctx = None trace_id, parent_span_id, is_sampled = None, None, False @@ -193,9 +211,17 @@ def intercept_service(self, continuation, handler_call_details): if trace_bin_header: if isinstance(trace_bin_header, str): trace_bin_header = trace_bin_header.encode("latin1") - trace_id, parent_span_id, is_sampled = unpack_grpc_trace_bin(trace_bin_header) + ( + trace_id, + parent_span_id, + is_sampled, + ) = unpack_grpc_trace_bin(trace_bin_header) elif traceparent_header: - trace_id, parent_span_id, is_sampled = parse_traceparent(traceparent_header) + ( + trace_id, + parent_span_id, + is_sampled, + ) = parse_traceparent(traceparent_header) if trace_id and parent_span_id: parent_ctx = trace.SpanContext( From 99fed3bd332dc2b9e7433e4edf0500248659f292 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 4 Aug 2026 00:42:35 +0530 Subject: [PATCH 23/29] interop: reformat Python interop imports and update check_version.py for Protobuf v5 --- src/python/grpcio_tests/tests/interop/client.py | 2 ++ .../tests/interop/otel_interop_helper.py | 12 ++++++------ src/python/grpcio_tests/tests/interop/server.py | 3 +++ tools/run_tests/sanity/check_version.py | 8 ++++---- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 5e926dcd9c9c8..c3092efd622a6 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -213,6 +213,7 @@ def __init__(self, tracer): def intercept_unary_unary(self, continuation, client_call_details, request): from grpc._interceptor import _ClientCallDetails from opentelemetry import trace + from tests.interop import otel_interop_helper method = client_call_details.method @@ -300,6 +301,7 @@ def _test_case_from_arg(test_case_arg): def test_interoperability(args): if args.enable_opentelemetry: import grpc_observability + from tests.interop import otel_interop_helper with grpc_observability.OpenTelemetryPlugin(): diff --git a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py index d92ad54029500..134af492ce755 100644 --- a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py +++ b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py @@ -19,14 +19,14 @@ import grpc from opentelemetry import trace -from opentelemetry.proto.collector.trace.v1 import ( - trace_service_pb2, - trace_service_pb2_grpc, -) +from opentelemetry.proto.collector.trace.v1 import trace_service_pb2 +from opentelemetry.proto.collector.trace.v1 import trace_service_pb2_grpc from opentelemetry.proto.common.v1 import common_pb2 from opentelemetry.proto.trace.v1 import trace_pb2 -from opentelemetry.sdk.trace import ReadableSpan, TracerProvider -from opentelemetry.sdk.trace.export import SimpleSpanProcessor, SpanExporter +from opentelemetry.sdk.trace import ReadableSpan +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor +from opentelemetry.sdk.trace.export import SpanExporter class OTLPSpanExporter(SpanExporter): diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index c4ebf9e076975..5e455f33b72ad 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -83,6 +83,7 @@ def _sig_handler(signum, frame): _LOGGER.info("Received signal %d, stopping server...", signum) if enable_otel: from tests.interop import otel_interop_helper + otel_interop_helper.flush_tracer_provider() server.stop(0) @@ -94,6 +95,7 @@ def _sig_handler(signum, frame): server.wait_for_termination() if enable_otel: from tests.interop import otel_interop_helper + otel_interop_helper.flush_tracer_provider() _LOGGER.info("Server stopped; exiting.") @@ -101,6 +103,7 @@ def _sig_handler(signum, frame): def serve(args): if args.enable_opentelemetry: from tests.interop import otel_interop_helper + provider, tracer = otel_interop_helper.init_tracer_provider() interceptor = otel_interop_helper.OTelServerInterceptor(tracer) server = grpc.server( diff --git a/tools/run_tests/sanity/check_version.py b/tools/run_tests/sanity/check_version.py index 3e483cce06989..e7c5ec57e98b7 100755 --- a/tools/run_tests/sanity/check_version.py +++ b/tools/run_tests/sanity/check_version.py @@ -73,7 +73,7 @@ for tag, value in list(settings.items()): if re.match(r"^[a-z]+_version$", tag): value = Version(value) - if tag != "core_version": + if tag not in ("core_version", "protobuf_version"): if value.major != top_version.major: errors += 1 print( @@ -86,8 +86,8 @@ "minor version mismatch on %s: %d vs %d" % (tag, value.minor, top_version.minor) ) - if not check_version(value): - errors += 1 - print((warning % (tag, value))) + if not check_version(value): + errors += 1 + print((warning % (tag, value))) sys.exit(errors) From 0c7d8520426dc9e89a51b60c7f8ecc044e4e416b Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 4 Aug 2026 01:03:29 +0530 Subject: [PATCH 24/29] interop: fix ruff PLW0602 and RUF059 linter warnings --- src/python/grpcio_tests/tests/interop/client.py | 2 +- src/python/grpcio_tests/tests/interop/otel_interop_helper.py | 1 - src/python/grpcio_tests/tests/interop/server.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index c3092efd622a6..9e76fb161f916 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -275,7 +275,7 @@ def _create_channel(args): if args.enable_opentelemetry: from tests.interop import otel_interop_helper - provider, tracer = otel_interop_helper.init_tracer_provider() + _, tracer = otel_interop_helper.init_tracer_provider() channel = grpc.intercept_channel( channel, _OTelClientInterceptor(tracer) ) diff --git a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py index 134af492ce755..23c513f7825cf 100644 --- a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py +++ b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py @@ -136,7 +136,6 @@ def init_tracer_provider() -> Tuple[TracerProvider, trace.Tracer]: def flush_tracer_provider(): - global _GLOBAL_PROVIDER if _GLOBAL_PROVIDER: _GLOBAL_PROVIDER.force_flush() diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index 5e455f33b72ad..40741384bee6e 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -104,7 +104,7 @@ def serve(args): if args.enable_opentelemetry: from tests.interop import otel_interop_helper - provider, tracer = otel_interop_helper.init_tracer_provider() + _, tracer = otel_interop_helper.init_tracer_provider() interceptor = otel_interop_helper.OTelServerInterceptor(tracer) server = grpc.server( futures.ThreadPoolExecutor(max_workers=10), From 1c2d84f721bf287d73f1312f9ffbd7e6de712b1c Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 4 Aug 2026 01:28:55 +0530 Subject: [PATCH 25/29] debug: regenerate trace_flags.cc from trace_flags.yaml --- src/core/lib/debug/trace_flags.cc | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/core/lib/debug/trace_flags.cc b/src/core/lib/debug/trace_flags.cc index 4b6457e2f2ec2..176ec794f93e4 100644 --- a/src/core/lib/debug/trace_flags.cc +++ b/src/core/lib/debug/trace_flags.cc @@ -16,9 +16,9 @@ // Automatically generated by tools/codegen/core/generate_trace_flags.cc // +#include "absl/container/flat_hash_map.h" #include "src/core/lib/debug/trace.h" #include "src/core/util/no_destruct.h" -#include "absl/container/flat_hash_map.h" namespace grpc_core { @@ -26,8 +26,7 @@ DebugOnlyTraceFlag auth_context_refcount_trace(false, "auth_context_refcount"); DebugOnlyTraceFlag call_combiner_trace(false, "call_combiner"); DebugOnlyTraceFlag call_refcount_trace(false, "call_refcount"); DebugOnlyTraceFlag call_state_trace(false, "call_state"); -DebugOnlyTraceFlag chttp2_server_refcount_trace(false, - "chttp2_server_refcount"); +DebugOnlyTraceFlag chttp2_server_refcount_trace(false, "chttp2_server_refcount"); DebugOnlyTraceFlag closure_trace(false, "closure"); DebugOnlyTraceFlag combiner_trace(false, "combiner"); DebugOnlyTraceFlag cq_refcount_trace(false, "cq_refcount"); @@ -42,8 +41,7 @@ DebugOnlyTraceFlag polling_trace(false, "polling"); DebugOnlyTraceFlag polling_api_trace(false, "polling_api"); DebugOnlyTraceFlag promise_primitives_trace(false, "promise_primitives"); DebugOnlyTraceFlag resolver_refcount_trace(false, "resolver_refcount"); -DebugOnlyTraceFlag security_connector_refcount_trace( - false, "security_connector_refcount"); +DebugOnlyTraceFlag security_connector_refcount_trace(false, "security_connector_refcount"); DebugOnlyTraceFlag slice_refcount_trace(false, "slice_refcount"); DebugOnlyTraceFlag stream_refcount_trace(false, "stream_refcount"); DebugOnlyTraceFlag subchannel_refcount_trace(false, "subchannel_refcount"); @@ -73,8 +71,7 @@ TraceFlag connectivity_state_trace(false, "connectivity_state"); TraceFlag dns_resolver_trace(false, "dns_resolver"); TraceFlag environment_autodetect_trace(false, "environment_autodetect"); TraceFlag event_engine_trace(false, "event_engine"); -TraceFlag event_engine_client_channel_resolver_trace( - false, "event_engine_client_channel_resolver"); +TraceFlag event_engine_client_channel_resolver_trace(false, "event_engine_client_channel_resolver"); TraceFlag event_engine_dns_trace(false, "event_engine_dns"); TraceFlag event_engine_endpoint_trace(false, "event_engine_endpoint"); TraceFlag event_engine_endpoint_data_trace(false, "event_engine_endpoint_data"); @@ -109,8 +106,7 @@ TraceFlag rls_lb_trace(false, "rls_lb"); TraceFlag round_robin_trace(false, "round_robin"); TraceFlag secure_endpoint_trace(false, "secure_endpoint"); TraceFlag server_channel_trace(false, "server_channel"); -TraceFlag server_config_selector_interceptor_trace( - false, "server_config_selector_interceptor"); +TraceFlag server_config_selector_interceptor_trace(false, "server_config_selector_interceptor"); TraceFlag stateful_session_filter_trace(false, "stateful_session_filter"); TraceFlag subchannel_trace(false, "subchannel"); TraceFlag subchannel_call_trace(false, "subchannel_call"); @@ -158,8 +154,7 @@ const absl::flat_hash_map& GetAllTraceFlags() { {"dns_resolver", &dns_resolver_trace}, {"environment_autodetect", &environment_autodetect_trace}, {"event_engine", &event_engine_trace}, - {"event_engine_client_channel_resolver", - &event_engine_client_channel_resolver_trace}, + {"event_engine_client_channel_resolver", &event_engine_client_channel_resolver_trace}, {"event_engine_dns", &event_engine_dns_trace}, {"event_engine_endpoint", &event_engine_endpoint_trace}, {"event_engine_endpoint_data", &event_engine_endpoint_data_trace}, @@ -194,8 +189,7 @@ const absl::flat_hash_map& GetAllTraceFlags() { {"round_robin", &round_robin_trace}, {"secure_endpoint", &secure_endpoint_trace}, {"server_channel", &server_channel_trace}, - {"server_config_selector_interceptor", - &server_config_selector_interceptor_trace}, + {"server_config_selector_interceptor", &server_config_selector_interceptor_trace}, {"stateful_session_filter", &stateful_session_filter_trace}, {"subchannel", &subchannel_trace}, {"subchannel_call", &subchannel_call_trace}, From f27c3462215327a6a836cba559a4674d04088ba5 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 4 Aug 2026 01:49:27 +0530 Subject: [PATCH 26/29] buildgen: regenerate build_autogenerated.yaml, Doxyfile, and experiments headers --- build_autogenerated.yaml | 1 + src/core/lib/experiments/experiments.cc | 1610 +++++------------ src/core/lib/experiments/experiments.h | 283 +-- test/core/experiments/experiments_test.cc | 79 +- test/core/experiments/fixtures/experiments.cc | 54 +- test/core/experiments/fixtures/experiments.h | 60 +- tools/doxygen/Doxyfile.c++.internal | 1 + 7 files changed, 610 insertions(+), 1478 deletions(-) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 04e99273eb104..bf23bd023f761 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -4250,6 +4250,7 @@ libs: - src/cpp/server/secure_server_credentials.h - src/cpp/server/thread_pool_interface.h - src/cpp/thread_manager/thread_manager.h + - third_party/utf8_range/utf8_validity.h src: - src/core/client_channel/virtual_channel.cc - src/cpp/client/call_context_registry.cc diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index 4b7e89ce90ea7..a28e868dc924b 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -14,122 +14,73 @@ // Auto generated by tools/codegen/core/gen_experiments.py -#include "src/core/lib/experiments/experiments.h" - #include + #include +#include "src/core/lib/experiments/experiments.h" + #ifndef GRPC_EXPERIMENTS_ARE_FINAL #if defined(GRPC_CFSTREAM) namespace { -const char* const description_buffer_list_deletion_prep = - "Gate the removal of old TCP timestamp collection mechanism."; +const char* const description_buffer_list_deletion_prep = "Gate the removal of old TCP timestamp collection mechanism."; const char* const additional_constraints_buffer_list_deletion_prep = "{}"; -const char* const description_call_tracer_in_transport = - "Transport directly passes byte counts to CallTracer."; +const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const - description_call_tracer_send_initial_metadata_is_an_annotation = - "Use the new annotation-based CallTracer API."; -const char* const - additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = - "{}"; -const char* const - description_call_tracer_send_trailing_metadata_is_an_annotation = - "Use the new annotation-based CallTracer API."; -const char* const - additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = - "{}"; -const char* const description_callv3_batch_validation = - "If enabled, perform validations on receiving a new batch."; +const char* const description_call_tracer_send_initial_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; +const char* const additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = "{}"; +const char* const description_call_tracer_send_trailing_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; +const char* const additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = "{}"; +const char* const description_callv3_batch_validation = "If enabled, perform validations on receiving a new batch."; const char* const additional_constraints_callv3_batch_validation = "{}"; -const char* const description_chaotic_good_framing_layer = - "Enable the chaotic good framing layer."; +const char* const description_chaotic_good_framing_layer = "Enable the chaotic good framing layer."; const char* const additional_constraints_chaotic_good_framing_layer = "{}"; -const char* const description_chaotic_good_send_supported_features = - "Send supported features in chaotic good settings frames."; -const char* const additional_constraints_chaotic_good_send_supported_features = - "{}"; -const char* const description_custom_frame_check = - "Adding checks to custom HTTP2 frame."; +const char* const description_chaotic_good_send_supported_features = "Send supported features in chaotic good settings frames."; +const char* const additional_constraints_chaotic_good_send_supported_features = "{}"; +const char* const description_custom_frame_check = "Adding checks to custom HTTP2 frame."; const char* const additional_constraints_custom_frame_check = "{}"; -const char* const description_event_engine_client = - "Use EventEngine clients instead of iomgr's grpc_tcp_client"; +const char* const description_event_engine_client = "Use EventEngine clients instead of iomgr's grpc_tcp_client"; const char* const additional_constraints_event_engine_client = "{}"; -const char* const description_event_engine_dns = - "If set, use EventEngine DNSResolver for client channel resolution"; +const char* const description_event_engine_dns = "If set, use EventEngine DNSResolver for client channel resolution"; const char* const additional_constraints_event_engine_dns = "{}"; -const char* const description_event_engine_dns_non_client_channel = - "If set, use EventEngine DNSResolver in other places besides client " - "channel."; -const char* const additional_constraints_event_engine_dns_non_client_channel = - "{}"; -const char* const description_event_engine_fork = - "Enables event engine fork handling, including onfork events and file " - "descriptor generations"; +const char* const description_event_engine_dns_non_client_channel = "If set, use EventEngine DNSResolver in other places besides client channel."; +const char* const additional_constraints_event_engine_dns_non_client_channel = "{}"; +const char* const description_event_engine_fork = "Enables event engine fork handling, including onfork events and file descriptor generations"; const char* const additional_constraints_event_engine_fork = "{}"; -const char* const description_event_engine_listener = - "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; +const char* const description_event_engine_listener = "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; const char* const additional_constraints_event_engine_listener = "{}"; -const char* const description_event_engine_callback_cq = - "Use EventEngine instead of the CallbackAlternativeCQ."; +const char* const description_event_engine_callback_cq = "Use EventEngine instead of the CallbackAlternativeCQ."; const char* const additional_constraints_event_engine_callback_cq = "{}"; -const uint8_t required_experiments_event_engine_callback_cq[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_event_engine_for_all_other_endpoints = - "Use EventEngine endpoints for all call sites, including direct uses of " - "grpc_tcp_create."; -const char* const additional_constraints_event_engine_for_all_other_endpoints = - "{}"; -const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineDns), - static_cast( - grpc_core::kExperimentIdEventEngineDnsNonClientChannel), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_fail_recv_metadata_on_deadline_exceeded = - "Fail recv initial metadata when the deadline is exceeded."; -const char* const - additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; -const char* const description_free_large_allocator = - "If set, return all free bytes from a \042big\042 allocator"; +const uint8_t required_experiments_event_engine_callback_cq[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_event_engine_for_all_other_endpoints = "Use EventEngine endpoints for all call sites, including direct uses of grpc_tcp_create."; +const char* const additional_constraints_event_engine_for_all_other_endpoints = "{}"; +const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineDns),static_cast(grpc_core::kExperimentIdEventEngineDnsNonClientChannel),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_fail_recv_metadata_on_deadline_exceeded = "Fail recv initial metadata when the deadline is exceeded."; +const char* const additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; +const char* const description_free_large_allocator = "If set, return all free bytes from a \042big\042 allocator"; const char* const additional_constraints_free_large_allocator = "{}"; -const char* const description_fuse_filters = - "If set, individual filters are merged into fused filters"; +const char* const description_fuse_filters = "If set, individual filters are merged into fused filters"; const char* const additional_constraints_fuse_filters = "{}"; -const char* const description_h2_max_deallocating_streams_headroom = - "Separate allocated max concurrent streams."; -const char* const additional_constraints_h2_max_deallocating_streams_headroom = - "{}"; -const char* const description_inproc_cancel_stream = - "If set, cancel inproc stream inside the transport mutex."; +const char* const description_h2_max_deallocating_streams_headroom = "Separate allocated max concurrent streams."; +const char* const additional_constraints_h2_max_deallocating_streams_headroom = "{}"; +const char* const description_inproc_cancel_stream = "If set, cancel inproc stream inside the transport mutex."; const char* const additional_constraints_inproc_cancel_stream = "{}"; -const char* const description_keep_alive_ping_timer_batch = - "Avoid explicitly cancelling the keepalive timer. Instead adjust the " - "callback to re-schedule itself to the next ping interval."; +const char* const description_keep_alive_ping_timer_batch = "Avoid explicitly cancelling the keepalive timer. Instead adjust the callback to re-schedule itself to the next ping interval."; const char* const additional_constraints_keep_alive_ping_timer_batch = "{}"; -const char* const description_local_connector_secure = - "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP " - "connections."; +const char* const description_local_connector_secure = "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections."; const char* const additional_constraints_local_connector_secure = "{}"; const char* const description_memory_optimization_01 = "Memory Optimization"; const char* const additional_constraints_memory_optimization_01 = "{}"; const char* const description_memory_optimization_02 = "Memory Optimization 02"; const char* const additional_constraints_memory_optimization_02 = "{}"; -const char* const description_message_size_refactoring = - "Refactoring the message size config parsing."; +const char* const description_message_size_refactoring = "Refactoring the message size config parsing."; const char* const additional_constraints_message_size_refactoring = "{}"; -const char* const description_metadata_outstanding_token_refactor = - "Refactor ClientInitialMetadataOutstandingToken."; -const char* const additional_constraints_metadata_outstanding_token_refactor = - "{}"; -const char* const description_metadata_publish_to_app_tag = - "Publish metadata to the app using the kPublishToApp metadata field."; +const char* const description_metadata_outstanding_token_refactor = "Refactor ClientInitialMetadataOutstandingToken."; +const char* const additional_constraints_metadata_outstanding_token_refactor = "{}"; +const char* const description_metadata_publish_to_app_tag = "Publish metadata to the app using the kPublishToApp metadata field."; const char* const additional_constraints_metadata_publish_to_app_tag = "{}"; -const char* const description_monitoring_experiment = - "Placeholder experiment to prove/disprove our monitoring is working"; +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_optimization_01 = "Optimization"; const char* const additional_constraints_optimization_01 = "{}"; @@ -143,447 +94,204 @@ const char* const description_optimization_05 = "Optimization"; const char* const additional_constraints_optimization_05 = "{}"; const char* const description_optimization_06 = "Optimization"; const char* const additional_constraints_optimization_06 = "{}"; -const char* const description_otel_export_telemetry_domains = - "Export telemetry domains in OpenTelemetry metrics."; +const char* const description_otel_export_telemetry_domains = "Export telemetry domains in OpenTelemetry metrics."; const char* const additional_constraints_otel_export_telemetry_domains = "{}"; -const char* const description_ph2_client = - "Use promises for the http2 client transport. We have kept client and " - "server transport experiments separate to help with smoother roll outs. " - "When this flag is enabled for the test suites, it would test PH2 Client " - "with CHTTP2 Server."; +const char* const description_ph2_client = "Use promises for the http2 client transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test PH2 Client with CHTTP2 Server."; const char* const additional_constraints_ph2_client = "{}"; -const char* const description_ph2_client_server = - "This is a combination of ph2_server and ph2_client experiments. When this " - "flag is enabled for the test suites, it would test PH2 Client with PH2 " - "Server. We will NEVER be rolling out this experiment, because the roll " - "out would be done using ph2_server and ph2_client. This experiment MUST " - "be deleted when either ph2_server or ph2_client experiments are deleted."; +const char* const description_ph2_client_server = "This is a combination of ph2_server and ph2_client experiments. When this flag is enabled for the test suites, it would test PH2 Client with PH2 Server. We will NEVER be rolling out this experiment, because the roll out would be done using ph2_server and ph2_client. This experiment MUST be deleted when either ph2_server or ph2_client experiments are deleted."; const char* const additional_constraints_ph2_client_server = "{}"; -const char* const description_ph2_perf_01 = - "Different performance experiments for PH2 Transport"; +const char* const description_ph2_perf_01 = "Different performance experiments for PH2 Transport"; const char* const additional_constraints_ph2_perf_01 = "{}"; -const char* const description_ph2_server = - "Use promises for the http2 server transport. We have kept client and " - "server transport experiments separate to help with smoother roll outs. " - "When this flag is enabled for the test suites, it would test CHTTP2 " - "Client with PH2 Server."; +const char* const description_ph2_server = "Use promises for the http2 server transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test CHTTP2 Client with PH2 Server."; const char* const additional_constraints_ph2_server = "{}"; -const char* const description_pick_first_ignore_empty_updates = - "Ignore empty resolutions in pick_first (delete)"; +const char* const description_pick_first_ignore_empty_updates = "Ignore empty resolutions in pick_first (delete)"; const char* const additional_constraints_pick_first_ignore_empty_updates = "{}"; -const char* const description_pipelined_read_secure_endpoint = - "Enable pipelined reads for EventEngine secure endpoints"; +const char* const description_pipelined_read_secure_endpoint = "Enable pipelined reads for EventEngine secure endpoints"; const char* const additional_constraints_pipelined_read_secure_endpoint = "{}"; -const uint8_t required_experiments_pipelined_read_secure_endpoint[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_pollset_alternative = - "Code outside iomgr that relies directly on pollsets will use non-pollset " - "alternatives when enabled."; +const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_pollset_alternative = "Code outside iomgr that relies directly on pollsets will use non-pollset alternatives when enabled."; const char* const additional_constraints_pollset_alternative = "{}"; -const uint8_t required_experiments_pollset_alternative[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_prioritize_finished_requests = - "Prioritize flushing out finished requests over other in-flight requests " - "during transport writes."; +const uint8_t required_experiments_pollset_alternative[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_prioritize_finished_requests = "Prioritize flushing out finished requests over other in-flight requests during transport writes."; const char* const additional_constraints_prioritize_finished_requests = "{}"; -const char* const description_promise_based_inproc_transport = - "Use call-v3 for the in-process transport."; +const char* const description_promise_based_inproc_transport = "Use call-v3 for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_promise_batch_cleanup_on_cancel = - "Fix completion queue tag handling during promise batch cancellation."; +const char* const description_promise_batch_cleanup_on_cancel = "Fix completion queue tag handling during promise batch cancellation."; const char* const additional_constraints_promise_batch_cleanup_on_cancel = "{}"; -const char* const description_promise_filter_send_cancel_metadata = - "Enables sending all trailing metadata fields from server side " - "promise-based filters upon stream cancellation."; -const char* const additional_constraints_promise_filter_send_cancel_metadata = - "{}"; -const char* const description_recv_message_filter_bypass_fix = - "Receive message bypass happen if trailing metadata is received while " - "Server Initial Metadata is getting processed."; +const char* const description_promise_filter_send_cancel_metadata = "Enables sending all trailing metadata fields from server side promise-based filters upon stream cancellation."; +const char* const additional_constraints_promise_filter_send_cancel_metadata = "{}"; +const char* const description_recv_message_filter_bypass_fix = "Receive message bypass happen if trailing metadata is received while Server Initial Metadata is getting processed."; const char* const additional_constraints_recv_message_filter_bypass_fix = "{}"; const char* const description_retry_in_callv3 = "Support retries with call-v3"; const char* const additional_constraints_retry_in_callv3 = "{}"; -const char* const description_return_preexisting_errors = - "Return errors that exist before the start of the call in RunHandler."; +const char* const description_return_preexisting_errors = "Return errors that exist before the start of the call in RunHandler."; const char* const additional_constraints_return_preexisting_errors = "{}"; -const char* const description_schedule_cancellation_over_write = - "Allow cancellation op to be scheduled over a write"; -const char* const additional_constraints_schedule_cancellation_over_write = - "{}"; -const char* const description_secure_endpoint_offload_large_reads = - "If a large read needs to be decrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_reads = - "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_offload_large_writes = - "If a large read write to be encrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_writes = - "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_read_coalescing = - "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; +const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; +const char* const additional_constraints_schedule_cancellation_over_write = "{}"; +const char* const description_secure_endpoint_offload_large_reads = "If a large read needs to be decrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_reads = "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_offload_large_writes = "If a large read write to be encrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_writes = "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_read_coalescing = "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; const char* const additional_constraints_secure_endpoint_read_coalescing = "{}"; -const uint8_t required_experiments_secure_endpoint_read_coalescing[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_skip_clear_peer_on_cancellation = - "If set, skips clearing of peer string on call cancellation."; +const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_skip_clear_peer_on_cancellation = "If set, skips clearing of peer string on call cancellation."; const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}"; -const char* const description_subchannel_connection_scaling = - "Subchannel connection scaling support."; +const char* const description_subchannel_connection_scaling = "Subchannel connection scaling support."; const char* const additional_constraints_subchannel_connection_scaling = "{}"; -const char* const description_tcp_frame_size_tuning = - "If set, enables TCP to use RPC size estimation made by higher layers. TCP " - "would not indicate completion of a read operation until a specified " - "number of bytes have been read over the socket. Buffers are also " - "allocated according to estimated RPC sizes."; +const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP would not indicate completion of a read operation until a specified number of bytes have been read over the socket. Buffers are also allocated according to estimated RPC sizes."; const char* const additional_constraints_tcp_frame_size_tuning = "{}"; -const char* const description_tcp_rcv_lowat = - "Use SO_RCVLOWAT to avoid wakeups on the read path."; +const char* const description_tcp_rcv_lowat = "Use SO_RCVLOWAT to avoid wakeups on the read path."; const char* const additional_constraints_tcp_rcv_lowat = "{}"; -const char* const description_tsi_frame_protector_without_locks = - "Do not hold locks while using the tsi_frame_protector."; -const char* const additional_constraints_tsi_frame_protector_without_locks = - "{}"; -const char* const description_unconstrained_max_quota_buffer_size = - "Discard the cap on the max free pool size for one memory allocator"; -const char* const additional_constraints_unconstrained_max_quota_buffer_size = - "{}"; -const char* const description_use_call_event_engine_in_completion_queue = - "Use the call event engine to run callbacks in completion queue."; -const char* const - additional_constraints_use_call_event_engine_in_completion_queue = "{}"; -const char* const description_v2_non_owning_waker_implementation = - "Use non-owning wakers in v2 filter bridge."; -const char* const additional_constraints_v2_non_owning_waker_implementation = - "{}"; -const char* const description_verbose_channelz_connection_logging = - "Verbose logging of events into channelz during connection setup."; -const char* const additional_constraints_verbose_channelz_connection_logging = - "{}"; -const char* const description_wildcard_ip_expansion_restriction = - "If set, adds optional restriction on when to expand wildcard IPs."; -const char* const additional_constraints_wildcard_ip_expansion_restriction = - "{}"; -const char* const description_xds_server_filter_chain_per_route = - "xDS servers use a separate filter chain for each route."; -const char* const additional_constraints_xds_server_filter_chain_per_route = - "{}"; -const uint8_t required_experiments_xds_server_filter_chain_per_route[] = { - static_cast( - grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; +const char* const description_tsi_frame_protector_without_locks = "Do not hold locks while using the tsi_frame_protector."; +const char* const additional_constraints_tsi_frame_protector_without_locks = "{}"; +const char* const description_unconstrained_max_quota_buffer_size = "Discard the cap on the max free pool size for one memory allocator"; +const char* const additional_constraints_unconstrained_max_quota_buffer_size = "{}"; +const char* const description_use_call_event_engine_in_completion_queue = "Use the call event engine to run callbacks in completion queue."; +const char* const additional_constraints_use_call_event_engine_in_completion_queue = "{}"; +const char* const description_v2_non_owning_waker_implementation = "Use non-owning wakers in v2 filter bridge."; +const char* const additional_constraints_v2_non_owning_waker_implementation = "{}"; +const char* const description_verbose_channelz_connection_logging = "Verbose logging of events into channelz during connection setup."; +const char* const additional_constraints_verbose_channelz_connection_logging = "{}"; +const char* const description_wildcard_ip_expansion_restriction = "If set, adds optional restriction on when to expand wildcard IPs."; +const char* const additional_constraints_wildcard_ip_expansion_restriction = "{}"; +const char* const description_xds_server_filter_chain_per_route = "xDS servers use a separate filter chain for each route."; +const char* const additional_constraints_xds_server_filter_chain_per_route = "{}"; +const uint8_t required_experiments_xds_server_filter_chain_per_route[] = {static_cast(grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; } // namespace namespace grpc_core { const ExperimentMetadata g_experiment_metadata[] = { - {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, - additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, - {"call_tracer_in_transport", description_call_tracer_in_transport, - additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, - {"call_tracer_send_initial_metadata_is_an_annotation", - description_call_tracer_send_initial_metadata_is_an_annotation, - additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, - nullptr, 0, true, true}, - {"call_tracer_send_trailing_metadata_is_an_annotation", - description_call_tracer_send_trailing_metadata_is_an_annotation, - additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, - nullptr, 0, false, true}, - {"callv3_batch_validation", description_callv3_batch_validation, - additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, - {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, - additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, - false}, - {"chaotic_good_send_supported_features", - description_chaotic_good_send_supported_features, - additional_constraints_chaotic_good_send_supported_features, nullptr, 0, - true, true}, - {"custom_frame_check", description_custom_frame_check, - additional_constraints_custom_frame_check, nullptr, 0, true, false}, - {"event_engine_client", description_event_engine_client, - additional_constraints_event_engine_client, nullptr, 0, true, false}, - {"event_engine_dns", description_event_engine_dns, - additional_constraints_event_engine_dns, nullptr, 0, true, false}, - {"event_engine_dns_non_client_channel", - description_event_engine_dns_non_client_channel, - additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, - true, false}, - {"event_engine_fork", description_event_engine_fork, - additional_constraints_event_engine_fork, nullptr, 0, true, false}, - {"event_engine_listener", description_event_engine_listener, - additional_constraints_event_engine_listener, nullptr, 0, true, false}, - {"event_engine_callback_cq", description_event_engine_callback_cq, - additional_constraints_event_engine_callback_cq, - required_experiments_event_engine_callback_cq, 2, true, true}, - {"event_engine_for_all_other_endpoints", - description_event_engine_for_all_other_endpoints, - additional_constraints_event_engine_for_all_other_endpoints, - required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, - {"fail_recv_metadata_on_deadline_exceeded", - description_fail_recv_metadata_on_deadline_exceeded, - additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, - false, false}, - {"free_large_allocator", description_free_large_allocator, - additional_constraints_free_large_allocator, nullptr, 0, false, true}, - {"fuse_filters", description_fuse_filters, - additional_constraints_fuse_filters, nullptr, 0, false, false}, - {"h2_max_deallocating_streams_headroom", - description_h2_max_deallocating_streams_headroom, - additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, - false, true}, - {"inproc_cancel_stream", description_inproc_cancel_stream, - additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, - {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, - additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, - true}, - {"local_connector_secure", description_local_connector_secure, - additional_constraints_local_connector_secure, nullptr, 0, false, true}, - {"memory_optimization_01", description_memory_optimization_01, - additional_constraints_memory_optimization_01, nullptr, 0, false, false}, - {"memory_optimization_02", description_memory_optimization_02, - additional_constraints_memory_optimization_02, nullptr, 0, false, false}, - {"message_size_refactoring", description_message_size_refactoring, - additional_constraints_message_size_refactoring, nullptr, 0, false, true}, - {"metadata_outstanding_token_refactor", - description_metadata_outstanding_token_refactor, - additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, - false, true}, - {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, - additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, - true}, - {"monitoring_experiment", description_monitoring_experiment, - additional_constraints_monitoring_experiment, nullptr, 0, true, true}, - {"optimization_01", description_optimization_01, - additional_constraints_optimization_01, nullptr, 0, true, true}, - {"optimization_02", description_optimization_02, - additional_constraints_optimization_02, nullptr, 0, true, true}, - {"optimization_03", description_optimization_03, - additional_constraints_optimization_03, nullptr, 0, true, true}, - {"optimization_04", description_optimization_04, - additional_constraints_optimization_04, nullptr, 0, true, true}, - {"optimization_05", description_optimization_05, - additional_constraints_optimization_05, nullptr, 0, false, true}, - {"optimization_06", description_optimization_06, - additional_constraints_optimization_06, nullptr, 0, false, true}, - {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, - additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, - true}, - {"ph2_client", description_ph2_client, additional_constraints_ph2_client, - nullptr, 0, false, true}, - {"ph2_client_server", description_ph2_client_server, - additional_constraints_ph2_client_server, nullptr, 0, false, true}, - {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, - nullptr, 0, false, true}, - {"ph2_server", description_ph2_server, additional_constraints_ph2_server, - nullptr, 0, false, true}, - {"pick_first_ignore_empty_updates", - description_pick_first_ignore_empty_updates, - additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, - true}, - {"pipelined_read_secure_endpoint", - description_pipelined_read_secure_endpoint, - additional_constraints_pipelined_read_secure_endpoint, - required_experiments_pipelined_read_secure_endpoint, 2, false, false}, - {"pollset_alternative", description_pollset_alternative, - additional_constraints_pollset_alternative, - required_experiments_pollset_alternative, 2, false, false}, - {"prioritize_finished_requests", description_prioritize_finished_requests, - additional_constraints_prioritize_finished_requests, nullptr, 0, false, - true}, - {"promise_based_inproc_transport", - description_promise_based_inproc_transport, - additional_constraints_promise_based_inproc_transport, nullptr, 0, false, - false}, - {"promise_batch_cleanup_on_cancel", - description_promise_batch_cleanup_on_cancel, - additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, - true}, - {"promise_filter_send_cancel_metadata", - description_promise_filter_send_cancel_metadata, - additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, - true, true}, - {"recv_message_filter_bypass_fix", - description_recv_message_filter_bypass_fix, - additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, - true}, - {"retry_in_callv3", description_retry_in_callv3, - additional_constraints_retry_in_callv3, nullptr, 0, false, true}, - {"return_preexisting_errors", description_return_preexisting_errors, - additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, - {"schedule_cancellation_over_write", - description_schedule_cancellation_over_write, - additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, - true}, - {"secure_endpoint_offload_large_reads", - description_secure_endpoint_offload_large_reads, - additional_constraints_secure_endpoint_offload_large_reads, - required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, - {"secure_endpoint_offload_large_writes", - description_secure_endpoint_offload_large_writes, - additional_constraints_secure_endpoint_offload_large_writes, - required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, - {"secure_endpoint_read_coalescing", - description_secure_endpoint_read_coalescing, - additional_constraints_secure_endpoint_read_coalescing, - required_experiments_secure_endpoint_read_coalescing, 2, false, true}, - {"skip_clear_peer_on_cancellation", - description_skip_clear_peer_on_cancellation, - additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, - true}, - {"subchannel_connection_scaling", description_subchannel_connection_scaling, - additional_constraints_subchannel_connection_scaling, nullptr, 0, true, - true}, - {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, - additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, - {"tcp_rcv_lowat", description_tcp_rcv_lowat, - additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, - {"tsi_frame_protector_without_locks", - description_tsi_frame_protector_without_locks, - additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, - false, true}, - {"unconstrained_max_quota_buffer_size", - description_unconstrained_max_quota_buffer_size, - additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, - false, true}, - {"use_call_event_engine_in_completion_queue", - description_use_call_event_engine_in_completion_queue, - additional_constraints_use_call_event_engine_in_completion_queue, nullptr, - 0, false, true}, - {"v2_non_owning_waker_implementation", - description_v2_non_owning_waker_implementation, - additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, - false, true}, - {"verbose_channelz_connection_logging", - description_verbose_channelz_connection_logging, - additional_constraints_verbose_channelz_connection_logging, nullptr, 0, - false, true}, - {"wildcard_ip_expansion_restriction", - description_wildcard_ip_expansion_restriction, - additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, - false, true}, - {"xds_server_filter_chain_per_route", - description_xds_server_filter_chain_per_route, - additional_constraints_xds_server_filter_chain_per_route, - required_experiments_xds_server_filter_chain_per_route, 1, false, true}, + {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, + {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, + {"call_tracer_send_initial_metadata_is_an_annotation", description_call_tracer_send_initial_metadata_is_an_annotation, additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, nullptr, 0, true, true}, + {"call_tracer_send_trailing_metadata_is_an_annotation", description_call_tracer_send_trailing_metadata_is_an_annotation, additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, nullptr, 0, false, true}, + {"callv3_batch_validation", description_callv3_batch_validation, additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, + {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, false}, + {"chaotic_good_send_supported_features", description_chaotic_good_send_supported_features, additional_constraints_chaotic_good_send_supported_features, nullptr, 0, true, true}, + {"custom_frame_check", description_custom_frame_check, additional_constraints_custom_frame_check, nullptr, 0, true, false}, + {"event_engine_client", description_event_engine_client, additional_constraints_event_engine_client, nullptr, 0, true, false}, + {"event_engine_dns", description_event_engine_dns, additional_constraints_event_engine_dns, nullptr, 0, true, false}, + {"event_engine_dns_non_client_channel", description_event_engine_dns_non_client_channel, additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, true, false}, + {"event_engine_fork", description_event_engine_fork, additional_constraints_event_engine_fork, nullptr, 0, true, false}, + {"event_engine_listener", description_event_engine_listener, additional_constraints_event_engine_listener, nullptr, 0, true, false}, + {"event_engine_callback_cq", description_event_engine_callback_cq, additional_constraints_event_engine_callback_cq, required_experiments_event_engine_callback_cq, 2, true, true}, + {"event_engine_for_all_other_endpoints", description_event_engine_for_all_other_endpoints, additional_constraints_event_engine_for_all_other_endpoints, required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, + {"fail_recv_metadata_on_deadline_exceeded", description_fail_recv_metadata_on_deadline_exceeded, additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, false, false}, + {"free_large_allocator", description_free_large_allocator, additional_constraints_free_large_allocator, nullptr, 0, false, true}, + {"fuse_filters", description_fuse_filters, additional_constraints_fuse_filters, nullptr, 0, false, false}, + {"h2_max_deallocating_streams_headroom", description_h2_max_deallocating_streams_headroom, additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, false, true}, + {"inproc_cancel_stream", description_inproc_cancel_stream, additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, + {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, true}, + {"local_connector_secure", description_local_connector_secure, additional_constraints_local_connector_secure, nullptr, 0, false, true}, + {"memory_optimization_01", description_memory_optimization_01, additional_constraints_memory_optimization_01, nullptr, 0, false, false}, + {"memory_optimization_02", description_memory_optimization_02, additional_constraints_memory_optimization_02, nullptr, 0, false, false}, + {"message_size_refactoring", description_message_size_refactoring, additional_constraints_message_size_refactoring, nullptr, 0, false, true}, + {"metadata_outstanding_token_refactor", description_metadata_outstanding_token_refactor, additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, false, true}, + {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, true}, + {"monitoring_experiment", description_monitoring_experiment, additional_constraints_monitoring_experiment, nullptr, 0, true, true}, + {"optimization_01", description_optimization_01, additional_constraints_optimization_01, nullptr, 0, true, true}, + {"optimization_02", description_optimization_02, additional_constraints_optimization_02, nullptr, 0, true, true}, + {"optimization_03", description_optimization_03, additional_constraints_optimization_03, nullptr, 0, true, true}, + {"optimization_04", description_optimization_04, additional_constraints_optimization_04, nullptr, 0, true, true}, + {"optimization_05", description_optimization_05, additional_constraints_optimization_05, nullptr, 0, false, true}, + {"optimization_06", description_optimization_06, additional_constraints_optimization_06, nullptr, 0, false, true}, + {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, true}, + {"ph2_client", description_ph2_client, additional_constraints_ph2_client, nullptr, 0, false, true}, + {"ph2_client_server", description_ph2_client_server, additional_constraints_ph2_client_server, nullptr, 0, false, true}, + {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, nullptr, 0, false, true}, + {"ph2_server", description_ph2_server, additional_constraints_ph2_server, nullptr, 0, false, true}, + {"pick_first_ignore_empty_updates", description_pick_first_ignore_empty_updates, additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, true}, + {"pipelined_read_secure_endpoint", description_pipelined_read_secure_endpoint, additional_constraints_pipelined_read_secure_endpoint, required_experiments_pipelined_read_secure_endpoint, 2, false, false}, + {"pollset_alternative", description_pollset_alternative, additional_constraints_pollset_alternative, required_experiments_pollset_alternative, 2, false, false}, + {"prioritize_finished_requests", description_prioritize_finished_requests, additional_constraints_prioritize_finished_requests, nullptr, 0, false, true}, + {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, + {"promise_batch_cleanup_on_cancel", description_promise_batch_cleanup_on_cancel, additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, true}, + {"promise_filter_send_cancel_metadata", description_promise_filter_send_cancel_metadata, additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, true, true}, + {"recv_message_filter_bypass_fix", description_recv_message_filter_bypass_fix, additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, true}, + {"retry_in_callv3", description_retry_in_callv3, additional_constraints_retry_in_callv3, nullptr, 0, false, true}, + {"return_preexisting_errors", description_return_preexisting_errors, additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, + {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, + {"secure_endpoint_offload_large_reads", description_secure_endpoint_offload_large_reads, additional_constraints_secure_endpoint_offload_large_reads, required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, + {"secure_endpoint_offload_large_writes", description_secure_endpoint_offload_large_writes, additional_constraints_secure_endpoint_offload_large_writes, required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, + {"secure_endpoint_read_coalescing", description_secure_endpoint_read_coalescing, additional_constraints_secure_endpoint_read_coalescing, required_experiments_secure_endpoint_read_coalescing, 2, false, true}, + {"skip_clear_peer_on_cancellation", description_skip_clear_peer_on_cancellation, additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, true}, + {"subchannel_connection_scaling", description_subchannel_connection_scaling, additional_constraints_subchannel_connection_scaling, nullptr, 0, true, true}, + {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, + {"tcp_rcv_lowat", description_tcp_rcv_lowat, additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, + {"tsi_frame_protector_without_locks", description_tsi_frame_protector_without_locks, additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, false, true}, + {"unconstrained_max_quota_buffer_size", description_unconstrained_max_quota_buffer_size, additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, false, true}, + {"use_call_event_engine_in_completion_queue", description_use_call_event_engine_in_completion_queue, additional_constraints_use_call_event_engine_in_completion_queue, nullptr, 0, false, true}, + {"v2_non_owning_waker_implementation", description_v2_non_owning_waker_implementation, additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, false, true}, + {"verbose_channelz_connection_logging", description_verbose_channelz_connection_logging, additional_constraints_verbose_channelz_connection_logging, nullptr, 0, false, true}, + {"wildcard_ip_expansion_restriction", description_wildcard_ip_expansion_restriction, additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, false, true}, + {"xds_server_filter_chain_per_route", description_xds_server_filter_chain_per_route, additional_constraints_xds_server_filter_chain_per_route, required_experiments_xds_server_filter_chain_per_route, 1, false, true}, }; } // namespace grpc_core #elif defined(GPR_WINDOWS) namespace { -const char* const description_buffer_list_deletion_prep = - "Gate the removal of old TCP timestamp collection mechanism."; +const char* const description_buffer_list_deletion_prep = "Gate the removal of old TCP timestamp collection mechanism."; const char* const additional_constraints_buffer_list_deletion_prep = "{}"; -const char* const description_call_tracer_in_transport = - "Transport directly passes byte counts to CallTracer."; +const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const - description_call_tracer_send_initial_metadata_is_an_annotation = - "Use the new annotation-based CallTracer API."; -const char* const - additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = - "{}"; -const char* const - description_call_tracer_send_trailing_metadata_is_an_annotation = - "Use the new annotation-based CallTracer API."; -const char* const - additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = - "{}"; -const char* const description_callv3_batch_validation = - "If enabled, perform validations on receiving a new batch."; +const char* const description_call_tracer_send_initial_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; +const char* const additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = "{}"; +const char* const description_call_tracer_send_trailing_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; +const char* const additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = "{}"; +const char* const description_callv3_batch_validation = "If enabled, perform validations on receiving a new batch."; const char* const additional_constraints_callv3_batch_validation = "{}"; -const char* const description_chaotic_good_framing_layer = - "Enable the chaotic good framing layer."; +const char* const description_chaotic_good_framing_layer = "Enable the chaotic good framing layer."; const char* const additional_constraints_chaotic_good_framing_layer = "{}"; -const char* const description_chaotic_good_send_supported_features = - "Send supported features in chaotic good settings frames."; -const char* const additional_constraints_chaotic_good_send_supported_features = - "{}"; -const char* const description_custom_frame_check = - "Adding checks to custom HTTP2 frame."; +const char* const description_chaotic_good_send_supported_features = "Send supported features in chaotic good settings frames."; +const char* const additional_constraints_chaotic_good_send_supported_features = "{}"; +const char* const description_custom_frame_check = "Adding checks to custom HTTP2 frame."; const char* const additional_constraints_custom_frame_check = "{}"; -const char* const description_event_engine_client = - "Use EventEngine clients instead of iomgr's grpc_tcp_client"; +const char* const description_event_engine_client = "Use EventEngine clients instead of iomgr's grpc_tcp_client"; const char* const additional_constraints_event_engine_client = "{}"; -const char* const description_event_engine_dns = - "If set, use EventEngine DNSResolver for client channel resolution"; +const char* const description_event_engine_dns = "If set, use EventEngine DNSResolver for client channel resolution"; const char* const additional_constraints_event_engine_dns = "{}"; -const char* const description_event_engine_dns_non_client_channel = - "If set, use EventEngine DNSResolver in other places besides client " - "channel."; -const char* const additional_constraints_event_engine_dns_non_client_channel = - "{}"; -const char* const description_event_engine_fork = - "Enables event engine fork handling, including onfork events and file " - "descriptor generations"; +const char* const description_event_engine_dns_non_client_channel = "If set, use EventEngine DNSResolver in other places besides client channel."; +const char* const additional_constraints_event_engine_dns_non_client_channel = "{}"; +const char* const description_event_engine_fork = "Enables event engine fork handling, including onfork events and file descriptor generations"; const char* const additional_constraints_event_engine_fork = "{}"; -const char* const description_event_engine_listener = - "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; +const char* const description_event_engine_listener = "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; const char* const additional_constraints_event_engine_listener = "{}"; -const char* const description_event_engine_callback_cq = - "Use EventEngine instead of the CallbackAlternativeCQ."; +const char* const description_event_engine_callback_cq = "Use EventEngine instead of the CallbackAlternativeCQ."; const char* const additional_constraints_event_engine_callback_cq = "{}"; -const uint8_t required_experiments_event_engine_callback_cq[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_event_engine_for_all_other_endpoints = - "Use EventEngine endpoints for all call sites, including direct uses of " - "grpc_tcp_create."; -const char* const additional_constraints_event_engine_for_all_other_endpoints = - "{}"; -const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineDns), - static_cast( - grpc_core::kExperimentIdEventEngineDnsNonClientChannel), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_fail_recv_metadata_on_deadline_exceeded = - "Fail recv initial metadata when the deadline is exceeded."; -const char* const - additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; -const char* const description_free_large_allocator = - "If set, return all free bytes from a \042big\042 allocator"; +const uint8_t required_experiments_event_engine_callback_cq[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_event_engine_for_all_other_endpoints = "Use EventEngine endpoints for all call sites, including direct uses of grpc_tcp_create."; +const char* const additional_constraints_event_engine_for_all_other_endpoints = "{}"; +const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineDns),static_cast(grpc_core::kExperimentIdEventEngineDnsNonClientChannel),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_fail_recv_metadata_on_deadline_exceeded = "Fail recv initial metadata when the deadline is exceeded."; +const char* const additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; +const char* const description_free_large_allocator = "If set, return all free bytes from a \042big\042 allocator"; const char* const additional_constraints_free_large_allocator = "{}"; -const char* const description_fuse_filters = - "If set, individual filters are merged into fused filters"; +const char* const description_fuse_filters = "If set, individual filters are merged into fused filters"; const char* const additional_constraints_fuse_filters = "{}"; -const char* const description_h2_max_deallocating_streams_headroom = - "Separate allocated max concurrent streams."; -const char* const additional_constraints_h2_max_deallocating_streams_headroom = - "{}"; -const char* const description_inproc_cancel_stream = - "If set, cancel inproc stream inside the transport mutex."; +const char* const description_h2_max_deallocating_streams_headroom = "Separate allocated max concurrent streams."; +const char* const additional_constraints_h2_max_deallocating_streams_headroom = "{}"; +const char* const description_inproc_cancel_stream = "If set, cancel inproc stream inside the transport mutex."; const char* const additional_constraints_inproc_cancel_stream = "{}"; -const char* const description_keep_alive_ping_timer_batch = - "Avoid explicitly cancelling the keepalive timer. Instead adjust the " - "callback to re-schedule itself to the next ping interval."; +const char* const description_keep_alive_ping_timer_batch = "Avoid explicitly cancelling the keepalive timer. Instead adjust the callback to re-schedule itself to the next ping interval."; const char* const additional_constraints_keep_alive_ping_timer_batch = "{}"; -const char* const description_local_connector_secure = - "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP " - "connections."; +const char* const description_local_connector_secure = "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections."; const char* const additional_constraints_local_connector_secure = "{}"; const char* const description_memory_optimization_01 = "Memory Optimization"; const char* const additional_constraints_memory_optimization_01 = "{}"; const char* const description_memory_optimization_02 = "Memory Optimization 02"; const char* const additional_constraints_memory_optimization_02 = "{}"; -const char* const description_message_size_refactoring = - "Refactoring the message size config parsing."; +const char* const description_message_size_refactoring = "Refactoring the message size config parsing."; const char* const additional_constraints_message_size_refactoring = "{}"; -const char* const description_metadata_outstanding_token_refactor = - "Refactor ClientInitialMetadataOutstandingToken."; -const char* const additional_constraints_metadata_outstanding_token_refactor = - "{}"; -const char* const description_metadata_publish_to_app_tag = - "Publish metadata to the app using the kPublishToApp metadata field."; +const char* const description_metadata_outstanding_token_refactor = "Refactor ClientInitialMetadataOutstandingToken."; +const char* const additional_constraints_metadata_outstanding_token_refactor = "{}"; +const char* const description_metadata_publish_to_app_tag = "Publish metadata to the app using the kPublishToApp metadata field."; const char* const additional_constraints_metadata_publish_to_app_tag = "{}"; -const char* const description_monitoring_experiment = - "Placeholder experiment to prove/disprove our monitoring is working"; +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_optimization_01 = "Optimization"; const char* const additional_constraints_optimization_01 = "{}"; @@ -597,447 +305,204 @@ const char* const description_optimization_05 = "Optimization"; const char* const additional_constraints_optimization_05 = "{}"; const char* const description_optimization_06 = "Optimization"; const char* const additional_constraints_optimization_06 = "{}"; -const char* const description_otel_export_telemetry_domains = - "Export telemetry domains in OpenTelemetry metrics."; +const char* const description_otel_export_telemetry_domains = "Export telemetry domains in OpenTelemetry metrics."; const char* const additional_constraints_otel_export_telemetry_domains = "{}"; -const char* const description_ph2_client = - "Use promises for the http2 client transport. We have kept client and " - "server transport experiments separate to help with smoother roll outs. " - "When this flag is enabled for the test suites, it would test PH2 Client " - "with CHTTP2 Server."; +const char* const description_ph2_client = "Use promises for the http2 client transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test PH2 Client with CHTTP2 Server."; const char* const additional_constraints_ph2_client = "{}"; -const char* const description_ph2_client_server = - "This is a combination of ph2_server and ph2_client experiments. When this " - "flag is enabled for the test suites, it would test PH2 Client with PH2 " - "Server. We will NEVER be rolling out this experiment, because the roll " - "out would be done using ph2_server and ph2_client. This experiment MUST " - "be deleted when either ph2_server or ph2_client experiments are deleted."; +const char* const description_ph2_client_server = "This is a combination of ph2_server and ph2_client experiments. When this flag is enabled for the test suites, it would test PH2 Client with PH2 Server. We will NEVER be rolling out this experiment, because the roll out would be done using ph2_server and ph2_client. This experiment MUST be deleted when either ph2_server or ph2_client experiments are deleted."; const char* const additional_constraints_ph2_client_server = "{}"; -const char* const description_ph2_perf_01 = - "Different performance experiments for PH2 Transport"; +const char* const description_ph2_perf_01 = "Different performance experiments for PH2 Transport"; const char* const additional_constraints_ph2_perf_01 = "{}"; -const char* const description_ph2_server = - "Use promises for the http2 server transport. We have kept client and " - "server transport experiments separate to help with smoother roll outs. " - "When this flag is enabled for the test suites, it would test CHTTP2 " - "Client with PH2 Server."; +const char* const description_ph2_server = "Use promises for the http2 server transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test CHTTP2 Client with PH2 Server."; const char* const additional_constraints_ph2_server = "{}"; -const char* const description_pick_first_ignore_empty_updates = - "Ignore empty resolutions in pick_first (delete)"; +const char* const description_pick_first_ignore_empty_updates = "Ignore empty resolutions in pick_first (delete)"; const char* const additional_constraints_pick_first_ignore_empty_updates = "{}"; -const char* const description_pipelined_read_secure_endpoint = - "Enable pipelined reads for EventEngine secure endpoints"; +const char* const description_pipelined_read_secure_endpoint = "Enable pipelined reads for EventEngine secure endpoints"; const char* const additional_constraints_pipelined_read_secure_endpoint = "{}"; -const uint8_t required_experiments_pipelined_read_secure_endpoint[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_pollset_alternative = - "Code outside iomgr that relies directly on pollsets will use non-pollset " - "alternatives when enabled."; +const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_pollset_alternative = "Code outside iomgr that relies directly on pollsets will use non-pollset alternatives when enabled."; const char* const additional_constraints_pollset_alternative = "{}"; -const uint8_t required_experiments_pollset_alternative[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_prioritize_finished_requests = - "Prioritize flushing out finished requests over other in-flight requests " - "during transport writes."; +const uint8_t required_experiments_pollset_alternative[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_prioritize_finished_requests = "Prioritize flushing out finished requests over other in-flight requests during transport writes."; const char* const additional_constraints_prioritize_finished_requests = "{}"; -const char* const description_promise_based_inproc_transport = - "Use call-v3 for the in-process transport."; +const char* const description_promise_based_inproc_transport = "Use call-v3 for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_promise_batch_cleanup_on_cancel = - "Fix completion queue tag handling during promise batch cancellation."; +const char* const description_promise_batch_cleanup_on_cancel = "Fix completion queue tag handling during promise batch cancellation."; const char* const additional_constraints_promise_batch_cleanup_on_cancel = "{}"; -const char* const description_promise_filter_send_cancel_metadata = - "Enables sending all trailing metadata fields from server side " - "promise-based filters upon stream cancellation."; -const char* const additional_constraints_promise_filter_send_cancel_metadata = - "{}"; -const char* const description_recv_message_filter_bypass_fix = - "Receive message bypass happen if trailing metadata is received while " - "Server Initial Metadata is getting processed."; +const char* const description_promise_filter_send_cancel_metadata = "Enables sending all trailing metadata fields from server side promise-based filters upon stream cancellation."; +const char* const additional_constraints_promise_filter_send_cancel_metadata = "{}"; +const char* const description_recv_message_filter_bypass_fix = "Receive message bypass happen if trailing metadata is received while Server Initial Metadata is getting processed."; const char* const additional_constraints_recv_message_filter_bypass_fix = "{}"; const char* const description_retry_in_callv3 = "Support retries with call-v3"; const char* const additional_constraints_retry_in_callv3 = "{}"; -const char* const description_return_preexisting_errors = - "Return errors that exist before the start of the call in RunHandler."; +const char* const description_return_preexisting_errors = "Return errors that exist before the start of the call in RunHandler."; const char* const additional_constraints_return_preexisting_errors = "{}"; -const char* const description_schedule_cancellation_over_write = - "Allow cancellation op to be scheduled over a write"; -const char* const additional_constraints_schedule_cancellation_over_write = - "{}"; -const char* const description_secure_endpoint_offload_large_reads = - "If a large read needs to be decrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_reads = - "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_offload_large_writes = - "If a large read write to be encrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_writes = - "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_read_coalescing = - "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; +const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; +const char* const additional_constraints_schedule_cancellation_over_write = "{}"; +const char* const description_secure_endpoint_offload_large_reads = "If a large read needs to be decrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_reads = "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_offload_large_writes = "If a large read write to be encrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_writes = "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_read_coalescing = "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; const char* const additional_constraints_secure_endpoint_read_coalescing = "{}"; -const uint8_t required_experiments_secure_endpoint_read_coalescing[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_skip_clear_peer_on_cancellation = - "If set, skips clearing of peer string on call cancellation."; +const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_skip_clear_peer_on_cancellation = "If set, skips clearing of peer string on call cancellation."; const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}"; -const char* const description_subchannel_connection_scaling = - "Subchannel connection scaling support."; +const char* const description_subchannel_connection_scaling = "Subchannel connection scaling support."; const char* const additional_constraints_subchannel_connection_scaling = "{}"; -const char* const description_tcp_frame_size_tuning = - "If set, enables TCP to use RPC size estimation made by higher layers. TCP " - "would not indicate completion of a read operation until a specified " - "number of bytes have been read over the socket. Buffers are also " - "allocated according to estimated RPC sizes."; +const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP would not indicate completion of a read operation until a specified number of bytes have been read over the socket. Buffers are also allocated according to estimated RPC sizes."; const char* const additional_constraints_tcp_frame_size_tuning = "{}"; -const char* const description_tcp_rcv_lowat = - "Use SO_RCVLOWAT to avoid wakeups on the read path."; +const char* const description_tcp_rcv_lowat = "Use SO_RCVLOWAT to avoid wakeups on the read path."; const char* const additional_constraints_tcp_rcv_lowat = "{}"; -const char* const description_tsi_frame_protector_without_locks = - "Do not hold locks while using the tsi_frame_protector."; -const char* const additional_constraints_tsi_frame_protector_without_locks = - "{}"; -const char* const description_unconstrained_max_quota_buffer_size = - "Discard the cap on the max free pool size for one memory allocator"; -const char* const additional_constraints_unconstrained_max_quota_buffer_size = - "{}"; -const char* const description_use_call_event_engine_in_completion_queue = - "Use the call event engine to run callbacks in completion queue."; -const char* const - additional_constraints_use_call_event_engine_in_completion_queue = "{}"; -const char* const description_v2_non_owning_waker_implementation = - "Use non-owning wakers in v2 filter bridge."; -const char* const additional_constraints_v2_non_owning_waker_implementation = - "{}"; -const char* const description_verbose_channelz_connection_logging = - "Verbose logging of events into channelz during connection setup."; -const char* const additional_constraints_verbose_channelz_connection_logging = - "{}"; -const char* const description_wildcard_ip_expansion_restriction = - "If set, adds optional restriction on when to expand wildcard IPs."; -const char* const additional_constraints_wildcard_ip_expansion_restriction = - "{}"; -const char* const description_xds_server_filter_chain_per_route = - "xDS servers use a separate filter chain for each route."; -const char* const additional_constraints_xds_server_filter_chain_per_route = - "{}"; -const uint8_t required_experiments_xds_server_filter_chain_per_route[] = { - static_cast( - grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; +const char* const description_tsi_frame_protector_without_locks = "Do not hold locks while using the tsi_frame_protector."; +const char* const additional_constraints_tsi_frame_protector_without_locks = "{}"; +const char* const description_unconstrained_max_quota_buffer_size = "Discard the cap on the max free pool size for one memory allocator"; +const char* const additional_constraints_unconstrained_max_quota_buffer_size = "{}"; +const char* const description_use_call_event_engine_in_completion_queue = "Use the call event engine to run callbacks in completion queue."; +const char* const additional_constraints_use_call_event_engine_in_completion_queue = "{}"; +const char* const description_v2_non_owning_waker_implementation = "Use non-owning wakers in v2 filter bridge."; +const char* const additional_constraints_v2_non_owning_waker_implementation = "{}"; +const char* const description_verbose_channelz_connection_logging = "Verbose logging of events into channelz during connection setup."; +const char* const additional_constraints_verbose_channelz_connection_logging = "{}"; +const char* const description_wildcard_ip_expansion_restriction = "If set, adds optional restriction on when to expand wildcard IPs."; +const char* const additional_constraints_wildcard_ip_expansion_restriction = "{}"; +const char* const description_xds_server_filter_chain_per_route = "xDS servers use a separate filter chain for each route."; +const char* const additional_constraints_xds_server_filter_chain_per_route = "{}"; +const uint8_t required_experiments_xds_server_filter_chain_per_route[] = {static_cast(grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; } // namespace namespace grpc_core { const ExperimentMetadata g_experiment_metadata[] = { - {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, - additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, - {"call_tracer_in_transport", description_call_tracer_in_transport, - additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, - {"call_tracer_send_initial_metadata_is_an_annotation", - description_call_tracer_send_initial_metadata_is_an_annotation, - additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, - nullptr, 0, true, true}, - {"call_tracer_send_trailing_metadata_is_an_annotation", - description_call_tracer_send_trailing_metadata_is_an_annotation, - additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, - nullptr, 0, false, true}, - {"callv3_batch_validation", description_callv3_batch_validation, - additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, - {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, - additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, - false}, - {"chaotic_good_send_supported_features", - description_chaotic_good_send_supported_features, - additional_constraints_chaotic_good_send_supported_features, nullptr, 0, - true, true}, - {"custom_frame_check", description_custom_frame_check, - additional_constraints_custom_frame_check, nullptr, 0, true, false}, - {"event_engine_client", description_event_engine_client, - additional_constraints_event_engine_client, nullptr, 0, true, false}, - {"event_engine_dns", description_event_engine_dns, - additional_constraints_event_engine_dns, nullptr, 0, true, false}, - {"event_engine_dns_non_client_channel", - description_event_engine_dns_non_client_channel, - additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, - true, false}, - {"event_engine_fork", description_event_engine_fork, - additional_constraints_event_engine_fork, nullptr, 0, true, false}, - {"event_engine_listener", description_event_engine_listener, - additional_constraints_event_engine_listener, nullptr, 0, true, false}, - {"event_engine_callback_cq", description_event_engine_callback_cq, - additional_constraints_event_engine_callback_cq, - required_experiments_event_engine_callback_cq, 2, true, true}, - {"event_engine_for_all_other_endpoints", - description_event_engine_for_all_other_endpoints, - additional_constraints_event_engine_for_all_other_endpoints, - required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, - {"fail_recv_metadata_on_deadline_exceeded", - description_fail_recv_metadata_on_deadline_exceeded, - additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, - false, false}, - {"free_large_allocator", description_free_large_allocator, - additional_constraints_free_large_allocator, nullptr, 0, false, true}, - {"fuse_filters", description_fuse_filters, - additional_constraints_fuse_filters, nullptr, 0, false, false}, - {"h2_max_deallocating_streams_headroom", - description_h2_max_deallocating_streams_headroom, - additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, - false, true}, - {"inproc_cancel_stream", description_inproc_cancel_stream, - additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, - {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, - additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, - true}, - {"local_connector_secure", description_local_connector_secure, - additional_constraints_local_connector_secure, nullptr, 0, false, true}, - {"memory_optimization_01", description_memory_optimization_01, - additional_constraints_memory_optimization_01, nullptr, 0, false, false}, - {"memory_optimization_02", description_memory_optimization_02, - additional_constraints_memory_optimization_02, nullptr, 0, false, false}, - {"message_size_refactoring", description_message_size_refactoring, - additional_constraints_message_size_refactoring, nullptr, 0, false, true}, - {"metadata_outstanding_token_refactor", - description_metadata_outstanding_token_refactor, - additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, - false, true}, - {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, - additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, - true}, - {"monitoring_experiment", description_monitoring_experiment, - additional_constraints_monitoring_experiment, nullptr, 0, true, true}, - {"optimization_01", description_optimization_01, - additional_constraints_optimization_01, nullptr, 0, true, true}, - {"optimization_02", description_optimization_02, - additional_constraints_optimization_02, nullptr, 0, true, true}, - {"optimization_03", description_optimization_03, - additional_constraints_optimization_03, nullptr, 0, true, true}, - {"optimization_04", description_optimization_04, - additional_constraints_optimization_04, nullptr, 0, true, true}, - {"optimization_05", description_optimization_05, - additional_constraints_optimization_05, nullptr, 0, false, true}, - {"optimization_06", description_optimization_06, - additional_constraints_optimization_06, nullptr, 0, false, true}, - {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, - additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, - true}, - {"ph2_client", description_ph2_client, additional_constraints_ph2_client, - nullptr, 0, false, true}, - {"ph2_client_server", description_ph2_client_server, - additional_constraints_ph2_client_server, nullptr, 0, false, true}, - {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, - nullptr, 0, false, true}, - {"ph2_server", description_ph2_server, additional_constraints_ph2_server, - nullptr, 0, false, true}, - {"pick_first_ignore_empty_updates", - description_pick_first_ignore_empty_updates, - additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, - true}, - {"pipelined_read_secure_endpoint", - description_pipelined_read_secure_endpoint, - additional_constraints_pipelined_read_secure_endpoint, - required_experiments_pipelined_read_secure_endpoint, 2, false, false}, - {"pollset_alternative", description_pollset_alternative, - additional_constraints_pollset_alternative, - required_experiments_pollset_alternative, 2, false, false}, - {"prioritize_finished_requests", description_prioritize_finished_requests, - additional_constraints_prioritize_finished_requests, nullptr, 0, false, - true}, - {"promise_based_inproc_transport", - description_promise_based_inproc_transport, - additional_constraints_promise_based_inproc_transport, nullptr, 0, false, - false}, - {"promise_batch_cleanup_on_cancel", - description_promise_batch_cleanup_on_cancel, - additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, - true}, - {"promise_filter_send_cancel_metadata", - description_promise_filter_send_cancel_metadata, - additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, - true, true}, - {"recv_message_filter_bypass_fix", - description_recv_message_filter_bypass_fix, - additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, - true}, - {"retry_in_callv3", description_retry_in_callv3, - additional_constraints_retry_in_callv3, nullptr, 0, false, true}, - {"return_preexisting_errors", description_return_preexisting_errors, - additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, - {"schedule_cancellation_over_write", - description_schedule_cancellation_over_write, - additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, - true}, - {"secure_endpoint_offload_large_reads", - description_secure_endpoint_offload_large_reads, - additional_constraints_secure_endpoint_offload_large_reads, - required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, - {"secure_endpoint_offload_large_writes", - description_secure_endpoint_offload_large_writes, - additional_constraints_secure_endpoint_offload_large_writes, - required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, - {"secure_endpoint_read_coalescing", - description_secure_endpoint_read_coalescing, - additional_constraints_secure_endpoint_read_coalescing, - required_experiments_secure_endpoint_read_coalescing, 2, false, true}, - {"skip_clear_peer_on_cancellation", - description_skip_clear_peer_on_cancellation, - additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, - true}, - {"subchannel_connection_scaling", description_subchannel_connection_scaling, - additional_constraints_subchannel_connection_scaling, nullptr, 0, true, - true}, - {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, - additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, - {"tcp_rcv_lowat", description_tcp_rcv_lowat, - additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, - {"tsi_frame_protector_without_locks", - description_tsi_frame_protector_without_locks, - additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, - false, true}, - {"unconstrained_max_quota_buffer_size", - description_unconstrained_max_quota_buffer_size, - additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, - false, true}, - {"use_call_event_engine_in_completion_queue", - description_use_call_event_engine_in_completion_queue, - additional_constraints_use_call_event_engine_in_completion_queue, nullptr, - 0, false, true}, - {"v2_non_owning_waker_implementation", - description_v2_non_owning_waker_implementation, - additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, - false, true}, - {"verbose_channelz_connection_logging", - description_verbose_channelz_connection_logging, - additional_constraints_verbose_channelz_connection_logging, nullptr, 0, - false, true}, - {"wildcard_ip_expansion_restriction", - description_wildcard_ip_expansion_restriction, - additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, - false, true}, - {"xds_server_filter_chain_per_route", - description_xds_server_filter_chain_per_route, - additional_constraints_xds_server_filter_chain_per_route, - required_experiments_xds_server_filter_chain_per_route, 1, false, true}, + {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, + {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, + {"call_tracer_send_initial_metadata_is_an_annotation", description_call_tracer_send_initial_metadata_is_an_annotation, additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, nullptr, 0, true, true}, + {"call_tracer_send_trailing_metadata_is_an_annotation", description_call_tracer_send_trailing_metadata_is_an_annotation, additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, nullptr, 0, false, true}, + {"callv3_batch_validation", description_callv3_batch_validation, additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, + {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, false}, + {"chaotic_good_send_supported_features", description_chaotic_good_send_supported_features, additional_constraints_chaotic_good_send_supported_features, nullptr, 0, true, true}, + {"custom_frame_check", description_custom_frame_check, additional_constraints_custom_frame_check, nullptr, 0, true, false}, + {"event_engine_client", description_event_engine_client, additional_constraints_event_engine_client, nullptr, 0, true, false}, + {"event_engine_dns", description_event_engine_dns, additional_constraints_event_engine_dns, nullptr, 0, true, false}, + {"event_engine_dns_non_client_channel", description_event_engine_dns_non_client_channel, additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, true, false}, + {"event_engine_fork", description_event_engine_fork, additional_constraints_event_engine_fork, nullptr, 0, true, false}, + {"event_engine_listener", description_event_engine_listener, additional_constraints_event_engine_listener, nullptr, 0, true, false}, + {"event_engine_callback_cq", description_event_engine_callback_cq, additional_constraints_event_engine_callback_cq, required_experiments_event_engine_callback_cq, 2, true, true}, + {"event_engine_for_all_other_endpoints", description_event_engine_for_all_other_endpoints, additional_constraints_event_engine_for_all_other_endpoints, required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, + {"fail_recv_metadata_on_deadline_exceeded", description_fail_recv_metadata_on_deadline_exceeded, additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, false, false}, + {"free_large_allocator", description_free_large_allocator, additional_constraints_free_large_allocator, nullptr, 0, false, true}, + {"fuse_filters", description_fuse_filters, additional_constraints_fuse_filters, nullptr, 0, false, false}, + {"h2_max_deallocating_streams_headroom", description_h2_max_deallocating_streams_headroom, additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, false, true}, + {"inproc_cancel_stream", description_inproc_cancel_stream, additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, + {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, true}, + {"local_connector_secure", description_local_connector_secure, additional_constraints_local_connector_secure, nullptr, 0, false, true}, + {"memory_optimization_01", description_memory_optimization_01, additional_constraints_memory_optimization_01, nullptr, 0, false, false}, + {"memory_optimization_02", description_memory_optimization_02, additional_constraints_memory_optimization_02, nullptr, 0, false, false}, + {"message_size_refactoring", description_message_size_refactoring, additional_constraints_message_size_refactoring, nullptr, 0, false, true}, + {"metadata_outstanding_token_refactor", description_metadata_outstanding_token_refactor, additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, false, true}, + {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, true}, + {"monitoring_experiment", description_monitoring_experiment, additional_constraints_monitoring_experiment, nullptr, 0, true, true}, + {"optimization_01", description_optimization_01, additional_constraints_optimization_01, nullptr, 0, true, true}, + {"optimization_02", description_optimization_02, additional_constraints_optimization_02, nullptr, 0, true, true}, + {"optimization_03", description_optimization_03, additional_constraints_optimization_03, nullptr, 0, true, true}, + {"optimization_04", description_optimization_04, additional_constraints_optimization_04, nullptr, 0, true, true}, + {"optimization_05", description_optimization_05, additional_constraints_optimization_05, nullptr, 0, false, true}, + {"optimization_06", description_optimization_06, additional_constraints_optimization_06, nullptr, 0, false, true}, + {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, true}, + {"ph2_client", description_ph2_client, additional_constraints_ph2_client, nullptr, 0, false, true}, + {"ph2_client_server", description_ph2_client_server, additional_constraints_ph2_client_server, nullptr, 0, false, true}, + {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, nullptr, 0, false, true}, + {"ph2_server", description_ph2_server, additional_constraints_ph2_server, nullptr, 0, false, true}, + {"pick_first_ignore_empty_updates", description_pick_first_ignore_empty_updates, additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, true}, + {"pipelined_read_secure_endpoint", description_pipelined_read_secure_endpoint, additional_constraints_pipelined_read_secure_endpoint, required_experiments_pipelined_read_secure_endpoint, 2, false, false}, + {"pollset_alternative", description_pollset_alternative, additional_constraints_pollset_alternative, required_experiments_pollset_alternative, 2, false, false}, + {"prioritize_finished_requests", description_prioritize_finished_requests, additional_constraints_prioritize_finished_requests, nullptr, 0, false, true}, + {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, + {"promise_batch_cleanup_on_cancel", description_promise_batch_cleanup_on_cancel, additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, true}, + {"promise_filter_send_cancel_metadata", description_promise_filter_send_cancel_metadata, additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, true, true}, + {"recv_message_filter_bypass_fix", description_recv_message_filter_bypass_fix, additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, true}, + {"retry_in_callv3", description_retry_in_callv3, additional_constraints_retry_in_callv3, nullptr, 0, false, true}, + {"return_preexisting_errors", description_return_preexisting_errors, additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, + {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, + {"secure_endpoint_offload_large_reads", description_secure_endpoint_offload_large_reads, additional_constraints_secure_endpoint_offload_large_reads, required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, + {"secure_endpoint_offload_large_writes", description_secure_endpoint_offload_large_writes, additional_constraints_secure_endpoint_offload_large_writes, required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, + {"secure_endpoint_read_coalescing", description_secure_endpoint_read_coalescing, additional_constraints_secure_endpoint_read_coalescing, required_experiments_secure_endpoint_read_coalescing, 2, false, true}, + {"skip_clear_peer_on_cancellation", description_skip_clear_peer_on_cancellation, additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, true}, + {"subchannel_connection_scaling", description_subchannel_connection_scaling, additional_constraints_subchannel_connection_scaling, nullptr, 0, true, true}, + {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, + {"tcp_rcv_lowat", description_tcp_rcv_lowat, additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, + {"tsi_frame_protector_without_locks", description_tsi_frame_protector_without_locks, additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, false, true}, + {"unconstrained_max_quota_buffer_size", description_unconstrained_max_quota_buffer_size, additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, false, true}, + {"use_call_event_engine_in_completion_queue", description_use_call_event_engine_in_completion_queue, additional_constraints_use_call_event_engine_in_completion_queue, nullptr, 0, false, true}, + {"v2_non_owning_waker_implementation", description_v2_non_owning_waker_implementation, additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, false, true}, + {"verbose_channelz_connection_logging", description_verbose_channelz_connection_logging, additional_constraints_verbose_channelz_connection_logging, nullptr, 0, false, true}, + {"wildcard_ip_expansion_restriction", description_wildcard_ip_expansion_restriction, additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, false, true}, + {"xds_server_filter_chain_per_route", description_xds_server_filter_chain_per_route, additional_constraints_xds_server_filter_chain_per_route, required_experiments_xds_server_filter_chain_per_route, 1, false, true}, }; } // namespace grpc_core #else namespace { -const char* const description_buffer_list_deletion_prep = - "Gate the removal of old TCP timestamp collection mechanism."; +const char* const description_buffer_list_deletion_prep = "Gate the removal of old TCP timestamp collection mechanism."; const char* const additional_constraints_buffer_list_deletion_prep = "{}"; -const char* const description_call_tracer_in_transport = - "Transport directly passes byte counts to CallTracer."; +const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const - description_call_tracer_send_initial_metadata_is_an_annotation = - "Use the new annotation-based CallTracer API."; -const char* const - additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = - "{}"; -const char* const - description_call_tracer_send_trailing_metadata_is_an_annotation = - "Use the new annotation-based CallTracer API."; -const char* const - additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = - "{}"; -const char* const description_callv3_batch_validation = - "If enabled, perform validations on receiving a new batch."; +const char* const description_call_tracer_send_initial_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; +const char* const additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = "{}"; +const char* const description_call_tracer_send_trailing_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; +const char* const additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = "{}"; +const char* const description_callv3_batch_validation = "If enabled, perform validations on receiving a new batch."; const char* const additional_constraints_callv3_batch_validation = "{}"; -const char* const description_chaotic_good_framing_layer = - "Enable the chaotic good framing layer."; +const char* const description_chaotic_good_framing_layer = "Enable the chaotic good framing layer."; const char* const additional_constraints_chaotic_good_framing_layer = "{}"; -const char* const description_chaotic_good_send_supported_features = - "Send supported features in chaotic good settings frames."; -const char* const additional_constraints_chaotic_good_send_supported_features = - "{}"; -const char* const description_custom_frame_check = - "Adding checks to custom HTTP2 frame."; +const char* const description_chaotic_good_send_supported_features = "Send supported features in chaotic good settings frames."; +const char* const additional_constraints_chaotic_good_send_supported_features = "{}"; +const char* const description_custom_frame_check = "Adding checks to custom HTTP2 frame."; const char* const additional_constraints_custom_frame_check = "{}"; -const char* const description_event_engine_client = - "Use EventEngine clients instead of iomgr's grpc_tcp_client"; +const char* const description_event_engine_client = "Use EventEngine clients instead of iomgr's grpc_tcp_client"; const char* const additional_constraints_event_engine_client = "{}"; -const char* const description_event_engine_dns = - "If set, use EventEngine DNSResolver for client channel resolution"; +const char* const description_event_engine_dns = "If set, use EventEngine DNSResolver for client channel resolution"; const char* const additional_constraints_event_engine_dns = "{}"; -const char* const description_event_engine_dns_non_client_channel = - "If set, use EventEngine DNSResolver in other places besides client " - "channel."; -const char* const additional_constraints_event_engine_dns_non_client_channel = - "{}"; -const char* const description_event_engine_fork = - "Enables event engine fork handling, including onfork events and file " - "descriptor generations"; +const char* const description_event_engine_dns_non_client_channel = "If set, use EventEngine DNSResolver in other places besides client channel."; +const char* const additional_constraints_event_engine_dns_non_client_channel = "{}"; +const char* const description_event_engine_fork = "Enables event engine fork handling, including onfork events and file descriptor generations"; const char* const additional_constraints_event_engine_fork = "{}"; -const char* const description_event_engine_listener = - "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; +const char* const description_event_engine_listener = "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; const char* const additional_constraints_event_engine_listener = "{}"; -const char* const description_event_engine_callback_cq = - "Use EventEngine instead of the CallbackAlternativeCQ."; +const char* const description_event_engine_callback_cq = "Use EventEngine instead of the CallbackAlternativeCQ."; const char* const additional_constraints_event_engine_callback_cq = "{}"; -const uint8_t required_experiments_event_engine_callback_cq[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_event_engine_for_all_other_endpoints = - "Use EventEngine endpoints for all call sites, including direct uses of " - "grpc_tcp_create."; -const char* const additional_constraints_event_engine_for_all_other_endpoints = - "{}"; -const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineDns), - static_cast( - grpc_core::kExperimentIdEventEngineDnsNonClientChannel), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_fail_recv_metadata_on_deadline_exceeded = - "Fail recv initial metadata when the deadline is exceeded."; -const char* const - additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; -const char* const description_free_large_allocator = - "If set, return all free bytes from a \042big\042 allocator"; +const uint8_t required_experiments_event_engine_callback_cq[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_event_engine_for_all_other_endpoints = "Use EventEngine endpoints for all call sites, including direct uses of grpc_tcp_create."; +const char* const additional_constraints_event_engine_for_all_other_endpoints = "{}"; +const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineDns),static_cast(grpc_core::kExperimentIdEventEngineDnsNonClientChannel),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_fail_recv_metadata_on_deadline_exceeded = "Fail recv initial metadata when the deadline is exceeded."; +const char* const additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; +const char* const description_free_large_allocator = "If set, return all free bytes from a \042big\042 allocator"; const char* const additional_constraints_free_large_allocator = "{}"; -const char* const description_fuse_filters = - "If set, individual filters are merged into fused filters"; +const char* const description_fuse_filters = "If set, individual filters are merged into fused filters"; const char* const additional_constraints_fuse_filters = "{}"; -const char* const description_h2_max_deallocating_streams_headroom = - "Separate allocated max concurrent streams."; -const char* const additional_constraints_h2_max_deallocating_streams_headroom = - "{}"; -const char* const description_inproc_cancel_stream = - "If set, cancel inproc stream inside the transport mutex."; +const char* const description_h2_max_deallocating_streams_headroom = "Separate allocated max concurrent streams."; +const char* const additional_constraints_h2_max_deallocating_streams_headroom = "{}"; +const char* const description_inproc_cancel_stream = "If set, cancel inproc stream inside the transport mutex."; const char* const additional_constraints_inproc_cancel_stream = "{}"; -const char* const description_keep_alive_ping_timer_batch = - "Avoid explicitly cancelling the keepalive timer. Instead adjust the " - "callback to re-schedule itself to the next ping interval."; +const char* const description_keep_alive_ping_timer_batch = "Avoid explicitly cancelling the keepalive timer. Instead adjust the callback to re-schedule itself to the next ping interval."; const char* const additional_constraints_keep_alive_ping_timer_batch = "{}"; -const char* const description_local_connector_secure = - "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP " - "connections."; +const char* const description_local_connector_secure = "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections."; const char* const additional_constraints_local_connector_secure = "{}"; const char* const description_memory_optimization_01 = "Memory Optimization"; const char* const additional_constraints_memory_optimization_01 = "{}"; const char* const description_memory_optimization_02 = "Memory Optimization 02"; const char* const additional_constraints_memory_optimization_02 = "{}"; -const char* const description_message_size_refactoring = - "Refactoring the message size config parsing."; +const char* const description_message_size_refactoring = "Refactoring the message size config parsing."; const char* const additional_constraints_message_size_refactoring = "{}"; -const char* const description_metadata_outstanding_token_refactor = - "Refactor ClientInitialMetadataOutstandingToken."; -const char* const additional_constraints_metadata_outstanding_token_refactor = - "{}"; -const char* const description_metadata_publish_to_app_tag = - "Publish metadata to the app using the kPublishToApp metadata field."; +const char* const description_metadata_outstanding_token_refactor = "Refactor ClientInitialMetadataOutstandingToken."; +const char* const additional_constraints_metadata_outstanding_token_refactor = "{}"; +const char* const description_metadata_publish_to_app_tag = "Publish metadata to the app using the kPublishToApp metadata field."; const char* const additional_constraints_metadata_publish_to_app_tag = "{}"; -const char* const description_monitoring_experiment = - "Placeholder experiment to prove/disprove our monitoring is working"; +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_optimization_01 = "Optimization"; const char* const additional_constraints_optimization_01 = "{}"; @@ -1051,334 +516,141 @@ const char* const description_optimization_05 = "Optimization"; const char* const additional_constraints_optimization_05 = "{}"; const char* const description_optimization_06 = "Optimization"; const char* const additional_constraints_optimization_06 = "{}"; -const char* const description_otel_export_telemetry_domains = - "Export telemetry domains in OpenTelemetry metrics."; +const char* const description_otel_export_telemetry_domains = "Export telemetry domains in OpenTelemetry metrics."; const char* const additional_constraints_otel_export_telemetry_domains = "{}"; -const char* const description_ph2_client = - "Use promises for the http2 client transport. We have kept client and " - "server transport experiments separate to help with smoother roll outs. " - "When this flag is enabled for the test suites, it would test PH2 Client " - "with CHTTP2 Server."; +const char* const description_ph2_client = "Use promises for the http2 client transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test PH2 Client with CHTTP2 Server."; const char* const additional_constraints_ph2_client = "{}"; -const char* const description_ph2_client_server = - "This is a combination of ph2_server and ph2_client experiments. When this " - "flag is enabled for the test suites, it would test PH2 Client with PH2 " - "Server. We will NEVER be rolling out this experiment, because the roll " - "out would be done using ph2_server and ph2_client. This experiment MUST " - "be deleted when either ph2_server or ph2_client experiments are deleted."; +const char* const description_ph2_client_server = "This is a combination of ph2_server and ph2_client experiments. When this flag is enabled for the test suites, it would test PH2 Client with PH2 Server. We will NEVER be rolling out this experiment, because the roll out would be done using ph2_server and ph2_client. This experiment MUST be deleted when either ph2_server or ph2_client experiments are deleted."; const char* const additional_constraints_ph2_client_server = "{}"; -const char* const description_ph2_perf_01 = - "Different performance experiments for PH2 Transport"; +const char* const description_ph2_perf_01 = "Different performance experiments for PH2 Transport"; const char* const additional_constraints_ph2_perf_01 = "{}"; -const char* const description_ph2_server = - "Use promises for the http2 server transport. We have kept client and " - "server transport experiments separate to help with smoother roll outs. " - "When this flag is enabled for the test suites, it would test CHTTP2 " - "Client with PH2 Server."; +const char* const description_ph2_server = "Use promises for the http2 server transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test CHTTP2 Client with PH2 Server."; const char* const additional_constraints_ph2_server = "{}"; -const char* const description_pick_first_ignore_empty_updates = - "Ignore empty resolutions in pick_first (delete)"; +const char* const description_pick_first_ignore_empty_updates = "Ignore empty resolutions in pick_first (delete)"; const char* const additional_constraints_pick_first_ignore_empty_updates = "{}"; -const char* const description_pipelined_read_secure_endpoint = - "Enable pipelined reads for EventEngine secure endpoints"; +const char* const description_pipelined_read_secure_endpoint = "Enable pipelined reads for EventEngine secure endpoints"; const char* const additional_constraints_pipelined_read_secure_endpoint = "{}"; -const uint8_t required_experiments_pipelined_read_secure_endpoint[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_pollset_alternative = - "Code outside iomgr that relies directly on pollsets will use non-pollset " - "alternatives when enabled."; +const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_pollset_alternative = "Code outside iomgr that relies directly on pollsets will use non-pollset alternatives when enabled."; const char* const additional_constraints_pollset_alternative = "{}"; -const uint8_t required_experiments_pollset_alternative[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_prioritize_finished_requests = - "Prioritize flushing out finished requests over other in-flight requests " - "during transport writes."; +const uint8_t required_experiments_pollset_alternative[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_prioritize_finished_requests = "Prioritize flushing out finished requests over other in-flight requests during transport writes."; const char* const additional_constraints_prioritize_finished_requests = "{}"; -const char* const description_promise_based_inproc_transport = - "Use call-v3 for the in-process transport."; +const char* const description_promise_based_inproc_transport = "Use call-v3 for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_promise_batch_cleanup_on_cancel = - "Fix completion queue tag handling during promise batch cancellation."; +const char* const description_promise_batch_cleanup_on_cancel = "Fix completion queue tag handling during promise batch cancellation."; const char* const additional_constraints_promise_batch_cleanup_on_cancel = "{}"; -const char* const description_promise_filter_send_cancel_metadata = - "Enables sending all trailing metadata fields from server side " - "promise-based filters upon stream cancellation."; -const char* const additional_constraints_promise_filter_send_cancel_metadata = - "{}"; -const char* const description_recv_message_filter_bypass_fix = - "Receive message bypass happen if trailing metadata is received while " - "Server Initial Metadata is getting processed."; +const char* const description_promise_filter_send_cancel_metadata = "Enables sending all trailing metadata fields from server side promise-based filters upon stream cancellation."; +const char* const additional_constraints_promise_filter_send_cancel_metadata = "{}"; +const char* const description_recv_message_filter_bypass_fix = "Receive message bypass happen if trailing metadata is received while Server Initial Metadata is getting processed."; const char* const additional_constraints_recv_message_filter_bypass_fix = "{}"; const char* const description_retry_in_callv3 = "Support retries with call-v3"; const char* const additional_constraints_retry_in_callv3 = "{}"; -const char* const description_return_preexisting_errors = - "Return errors that exist before the start of the call in RunHandler."; +const char* const description_return_preexisting_errors = "Return errors that exist before the start of the call in RunHandler."; const char* const additional_constraints_return_preexisting_errors = "{}"; -const char* const description_schedule_cancellation_over_write = - "Allow cancellation op to be scheduled over a write"; -const char* const additional_constraints_schedule_cancellation_over_write = - "{}"; -const char* const description_secure_endpoint_offload_large_reads = - "If a large read needs to be decrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_reads = - "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_offload_large_writes = - "If a large read write to be encrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_writes = - "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_read_coalescing = - "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; +const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; +const char* const additional_constraints_schedule_cancellation_over_write = "{}"; +const char* const description_secure_endpoint_offload_large_reads = "If a large read needs to be decrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_reads = "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_offload_large_writes = "If a large read write to be encrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_writes = "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_read_coalescing = "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; const char* const additional_constraints_secure_endpoint_read_coalescing = "{}"; -const uint8_t required_experiments_secure_endpoint_read_coalescing[] = { - static_cast(grpc_core::kExperimentIdEventEngineClient), - static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_skip_clear_peer_on_cancellation = - "If set, skips clearing of peer string on call cancellation."; +const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_skip_clear_peer_on_cancellation = "If set, skips clearing of peer string on call cancellation."; const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}"; -const char* const description_subchannel_connection_scaling = - "Subchannel connection scaling support."; +const char* const description_subchannel_connection_scaling = "Subchannel connection scaling support."; const char* const additional_constraints_subchannel_connection_scaling = "{}"; -const char* const description_tcp_frame_size_tuning = - "If set, enables TCP to use RPC size estimation made by higher layers. TCP " - "would not indicate completion of a read operation until a specified " - "number of bytes have been read over the socket. Buffers are also " - "allocated according to estimated RPC sizes."; +const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP would not indicate completion of a read operation until a specified number of bytes have been read over the socket. Buffers are also allocated according to estimated RPC sizes."; const char* const additional_constraints_tcp_frame_size_tuning = "{}"; -const char* const description_tcp_rcv_lowat = - "Use SO_RCVLOWAT to avoid wakeups on the read path."; +const char* const description_tcp_rcv_lowat = "Use SO_RCVLOWAT to avoid wakeups on the read path."; const char* const additional_constraints_tcp_rcv_lowat = "{}"; -const char* const description_tsi_frame_protector_without_locks = - "Do not hold locks while using the tsi_frame_protector."; -const char* const additional_constraints_tsi_frame_protector_without_locks = - "{}"; -const char* const description_unconstrained_max_quota_buffer_size = - "Discard the cap on the max free pool size for one memory allocator"; -const char* const additional_constraints_unconstrained_max_quota_buffer_size = - "{}"; -const char* const description_use_call_event_engine_in_completion_queue = - "Use the call event engine to run callbacks in completion queue."; -const char* const - additional_constraints_use_call_event_engine_in_completion_queue = "{}"; -const char* const description_v2_non_owning_waker_implementation = - "Use non-owning wakers in v2 filter bridge."; -const char* const additional_constraints_v2_non_owning_waker_implementation = - "{}"; -const char* const description_verbose_channelz_connection_logging = - "Verbose logging of events into channelz during connection setup."; -const char* const additional_constraints_verbose_channelz_connection_logging = - "{}"; -const char* const description_wildcard_ip_expansion_restriction = - "If set, adds optional restriction on when to expand wildcard IPs."; -const char* const additional_constraints_wildcard_ip_expansion_restriction = - "{}"; -const char* const description_xds_server_filter_chain_per_route = - "xDS servers use a separate filter chain for each route."; -const char* const additional_constraints_xds_server_filter_chain_per_route = - "{}"; -const uint8_t required_experiments_xds_server_filter_chain_per_route[] = { - static_cast( - grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; +const char* const description_tsi_frame_protector_without_locks = "Do not hold locks while using the tsi_frame_protector."; +const char* const additional_constraints_tsi_frame_protector_without_locks = "{}"; +const char* const description_unconstrained_max_quota_buffer_size = "Discard the cap on the max free pool size for one memory allocator"; +const char* const additional_constraints_unconstrained_max_quota_buffer_size = "{}"; +const char* const description_use_call_event_engine_in_completion_queue = "Use the call event engine to run callbacks in completion queue."; +const char* const additional_constraints_use_call_event_engine_in_completion_queue = "{}"; +const char* const description_v2_non_owning_waker_implementation = "Use non-owning wakers in v2 filter bridge."; +const char* const additional_constraints_v2_non_owning_waker_implementation = "{}"; +const char* const description_verbose_channelz_connection_logging = "Verbose logging of events into channelz during connection setup."; +const char* const additional_constraints_verbose_channelz_connection_logging = "{}"; +const char* const description_wildcard_ip_expansion_restriction = "If set, adds optional restriction on when to expand wildcard IPs."; +const char* const additional_constraints_wildcard_ip_expansion_restriction = "{}"; +const char* const description_xds_server_filter_chain_per_route = "xDS servers use a separate filter chain for each route."; +const char* const additional_constraints_xds_server_filter_chain_per_route = "{}"; +const uint8_t required_experiments_xds_server_filter_chain_per_route[] = {static_cast(grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; } // namespace namespace grpc_core { const ExperimentMetadata g_experiment_metadata[] = { - {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, - additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, - {"call_tracer_in_transport", description_call_tracer_in_transport, - additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, - {"call_tracer_send_initial_metadata_is_an_annotation", - description_call_tracer_send_initial_metadata_is_an_annotation, - additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, - nullptr, 0, true, true}, - {"call_tracer_send_trailing_metadata_is_an_annotation", - description_call_tracer_send_trailing_metadata_is_an_annotation, - additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, - nullptr, 0, false, true}, - {"callv3_batch_validation", description_callv3_batch_validation, - additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, - {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, - additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, - false}, - {"chaotic_good_send_supported_features", - description_chaotic_good_send_supported_features, - additional_constraints_chaotic_good_send_supported_features, nullptr, 0, - true, true}, - {"custom_frame_check", description_custom_frame_check, - additional_constraints_custom_frame_check, nullptr, 0, true, false}, - {"event_engine_client", description_event_engine_client, - additional_constraints_event_engine_client, nullptr, 0, true, false}, - {"event_engine_dns", description_event_engine_dns, - additional_constraints_event_engine_dns, nullptr, 0, true, false}, - {"event_engine_dns_non_client_channel", - description_event_engine_dns_non_client_channel, - additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, - true, false}, - {"event_engine_fork", description_event_engine_fork, - additional_constraints_event_engine_fork, nullptr, 0, true, false}, - {"event_engine_listener", description_event_engine_listener, - additional_constraints_event_engine_listener, nullptr, 0, true, false}, - {"event_engine_callback_cq", description_event_engine_callback_cq, - additional_constraints_event_engine_callback_cq, - required_experiments_event_engine_callback_cq, 2, true, true}, - {"event_engine_for_all_other_endpoints", - description_event_engine_for_all_other_endpoints, - additional_constraints_event_engine_for_all_other_endpoints, - required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, - {"fail_recv_metadata_on_deadline_exceeded", - description_fail_recv_metadata_on_deadline_exceeded, - additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, - false, false}, - {"free_large_allocator", description_free_large_allocator, - additional_constraints_free_large_allocator, nullptr, 0, false, true}, - {"fuse_filters", description_fuse_filters, - additional_constraints_fuse_filters, nullptr, 0, false, false}, - {"h2_max_deallocating_streams_headroom", - description_h2_max_deallocating_streams_headroom, - additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, - false, true}, - {"inproc_cancel_stream", description_inproc_cancel_stream, - additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, - {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, - additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, - true}, - {"local_connector_secure", description_local_connector_secure, - additional_constraints_local_connector_secure, nullptr, 0, false, true}, - {"memory_optimization_01", description_memory_optimization_01, - additional_constraints_memory_optimization_01, nullptr, 0, false, false}, - {"memory_optimization_02", description_memory_optimization_02, - additional_constraints_memory_optimization_02, nullptr, 0, false, false}, - {"message_size_refactoring", description_message_size_refactoring, - additional_constraints_message_size_refactoring, nullptr, 0, false, true}, - {"metadata_outstanding_token_refactor", - description_metadata_outstanding_token_refactor, - additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, - false, true}, - {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, - additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, - true}, - {"monitoring_experiment", description_monitoring_experiment, - additional_constraints_monitoring_experiment, nullptr, 0, true, true}, - {"optimization_01", description_optimization_01, - additional_constraints_optimization_01, nullptr, 0, true, true}, - {"optimization_02", description_optimization_02, - additional_constraints_optimization_02, nullptr, 0, true, true}, - {"optimization_03", description_optimization_03, - additional_constraints_optimization_03, nullptr, 0, true, true}, - {"optimization_04", description_optimization_04, - additional_constraints_optimization_04, nullptr, 0, true, true}, - {"optimization_05", description_optimization_05, - additional_constraints_optimization_05, nullptr, 0, false, true}, - {"optimization_06", description_optimization_06, - additional_constraints_optimization_06, nullptr, 0, false, true}, - {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, - additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, - true}, - {"ph2_client", description_ph2_client, additional_constraints_ph2_client, - nullptr, 0, false, true}, - {"ph2_client_server", description_ph2_client_server, - additional_constraints_ph2_client_server, nullptr, 0, false, true}, - {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, - nullptr, 0, false, true}, - {"ph2_server", description_ph2_server, additional_constraints_ph2_server, - nullptr, 0, false, true}, - {"pick_first_ignore_empty_updates", - description_pick_first_ignore_empty_updates, - additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, - true}, - {"pipelined_read_secure_endpoint", - description_pipelined_read_secure_endpoint, - additional_constraints_pipelined_read_secure_endpoint, - required_experiments_pipelined_read_secure_endpoint, 2, false, false}, - {"pollset_alternative", description_pollset_alternative, - additional_constraints_pollset_alternative, - required_experiments_pollset_alternative, 2, false, false}, - {"prioritize_finished_requests", description_prioritize_finished_requests, - additional_constraints_prioritize_finished_requests, nullptr, 0, false, - true}, - {"promise_based_inproc_transport", - description_promise_based_inproc_transport, - additional_constraints_promise_based_inproc_transport, nullptr, 0, false, - false}, - {"promise_batch_cleanup_on_cancel", - description_promise_batch_cleanup_on_cancel, - additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, - true}, - {"promise_filter_send_cancel_metadata", - description_promise_filter_send_cancel_metadata, - additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, - true, true}, - {"recv_message_filter_bypass_fix", - description_recv_message_filter_bypass_fix, - additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, - true}, - {"retry_in_callv3", description_retry_in_callv3, - additional_constraints_retry_in_callv3, nullptr, 0, false, true}, - {"return_preexisting_errors", description_return_preexisting_errors, - additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, - {"schedule_cancellation_over_write", - description_schedule_cancellation_over_write, - additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, - true}, - {"secure_endpoint_offload_large_reads", - description_secure_endpoint_offload_large_reads, - additional_constraints_secure_endpoint_offload_large_reads, - required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, - {"secure_endpoint_offload_large_writes", - description_secure_endpoint_offload_large_writes, - additional_constraints_secure_endpoint_offload_large_writes, - required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, - {"secure_endpoint_read_coalescing", - description_secure_endpoint_read_coalescing, - additional_constraints_secure_endpoint_read_coalescing, - required_experiments_secure_endpoint_read_coalescing, 2, false, true}, - {"skip_clear_peer_on_cancellation", - description_skip_clear_peer_on_cancellation, - additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, - true}, - {"subchannel_connection_scaling", description_subchannel_connection_scaling, - additional_constraints_subchannel_connection_scaling, nullptr, 0, true, - true}, - {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, - additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, - {"tcp_rcv_lowat", description_tcp_rcv_lowat, - additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, - {"tsi_frame_protector_without_locks", - description_tsi_frame_protector_without_locks, - additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, - false, true}, - {"unconstrained_max_quota_buffer_size", - description_unconstrained_max_quota_buffer_size, - additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, - false, true}, - {"use_call_event_engine_in_completion_queue", - description_use_call_event_engine_in_completion_queue, - additional_constraints_use_call_event_engine_in_completion_queue, nullptr, - 0, false, true}, - {"v2_non_owning_waker_implementation", - description_v2_non_owning_waker_implementation, - additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, - false, true}, - {"verbose_channelz_connection_logging", - description_verbose_channelz_connection_logging, - additional_constraints_verbose_channelz_connection_logging, nullptr, 0, - false, true}, - {"wildcard_ip_expansion_restriction", - description_wildcard_ip_expansion_restriction, - additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, - false, true}, - {"xds_server_filter_chain_per_route", - description_xds_server_filter_chain_per_route, - additional_constraints_xds_server_filter_chain_per_route, - required_experiments_xds_server_filter_chain_per_route, 1, false, true}, + {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, + {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, + {"call_tracer_send_initial_metadata_is_an_annotation", description_call_tracer_send_initial_metadata_is_an_annotation, additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, nullptr, 0, true, true}, + {"call_tracer_send_trailing_metadata_is_an_annotation", description_call_tracer_send_trailing_metadata_is_an_annotation, additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, nullptr, 0, false, true}, + {"callv3_batch_validation", description_callv3_batch_validation, additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, + {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, false}, + {"chaotic_good_send_supported_features", description_chaotic_good_send_supported_features, additional_constraints_chaotic_good_send_supported_features, nullptr, 0, true, true}, + {"custom_frame_check", description_custom_frame_check, additional_constraints_custom_frame_check, nullptr, 0, true, false}, + {"event_engine_client", description_event_engine_client, additional_constraints_event_engine_client, nullptr, 0, true, false}, + {"event_engine_dns", description_event_engine_dns, additional_constraints_event_engine_dns, nullptr, 0, true, false}, + {"event_engine_dns_non_client_channel", description_event_engine_dns_non_client_channel, additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, true, false}, + {"event_engine_fork", description_event_engine_fork, additional_constraints_event_engine_fork, nullptr, 0, true, false}, + {"event_engine_listener", description_event_engine_listener, additional_constraints_event_engine_listener, nullptr, 0, true, false}, + {"event_engine_callback_cq", description_event_engine_callback_cq, additional_constraints_event_engine_callback_cq, required_experiments_event_engine_callback_cq, 2, true, true}, + {"event_engine_for_all_other_endpoints", description_event_engine_for_all_other_endpoints, additional_constraints_event_engine_for_all_other_endpoints, required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, + {"fail_recv_metadata_on_deadline_exceeded", description_fail_recv_metadata_on_deadline_exceeded, additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, false, false}, + {"free_large_allocator", description_free_large_allocator, additional_constraints_free_large_allocator, nullptr, 0, false, true}, + {"fuse_filters", description_fuse_filters, additional_constraints_fuse_filters, nullptr, 0, false, false}, + {"h2_max_deallocating_streams_headroom", description_h2_max_deallocating_streams_headroom, additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, false, true}, + {"inproc_cancel_stream", description_inproc_cancel_stream, additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, + {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, true}, + {"local_connector_secure", description_local_connector_secure, additional_constraints_local_connector_secure, nullptr, 0, false, true}, + {"memory_optimization_01", description_memory_optimization_01, additional_constraints_memory_optimization_01, nullptr, 0, false, false}, + {"memory_optimization_02", description_memory_optimization_02, additional_constraints_memory_optimization_02, nullptr, 0, false, false}, + {"message_size_refactoring", description_message_size_refactoring, additional_constraints_message_size_refactoring, nullptr, 0, false, true}, + {"metadata_outstanding_token_refactor", description_metadata_outstanding_token_refactor, additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, false, true}, + {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, true}, + {"monitoring_experiment", description_monitoring_experiment, additional_constraints_monitoring_experiment, nullptr, 0, true, true}, + {"optimization_01", description_optimization_01, additional_constraints_optimization_01, nullptr, 0, true, true}, + {"optimization_02", description_optimization_02, additional_constraints_optimization_02, nullptr, 0, true, true}, + {"optimization_03", description_optimization_03, additional_constraints_optimization_03, nullptr, 0, true, true}, + {"optimization_04", description_optimization_04, additional_constraints_optimization_04, nullptr, 0, true, true}, + {"optimization_05", description_optimization_05, additional_constraints_optimization_05, nullptr, 0, false, true}, + {"optimization_06", description_optimization_06, additional_constraints_optimization_06, nullptr, 0, false, true}, + {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, true}, + {"ph2_client", description_ph2_client, additional_constraints_ph2_client, nullptr, 0, false, true}, + {"ph2_client_server", description_ph2_client_server, additional_constraints_ph2_client_server, nullptr, 0, false, true}, + {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, nullptr, 0, false, true}, + {"ph2_server", description_ph2_server, additional_constraints_ph2_server, nullptr, 0, false, true}, + {"pick_first_ignore_empty_updates", description_pick_first_ignore_empty_updates, additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, true}, + {"pipelined_read_secure_endpoint", description_pipelined_read_secure_endpoint, additional_constraints_pipelined_read_secure_endpoint, required_experiments_pipelined_read_secure_endpoint, 2, false, false}, + {"pollset_alternative", description_pollset_alternative, additional_constraints_pollset_alternative, required_experiments_pollset_alternative, 2, false, false}, + {"prioritize_finished_requests", description_prioritize_finished_requests, additional_constraints_prioritize_finished_requests, nullptr, 0, false, true}, + {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, + {"promise_batch_cleanup_on_cancel", description_promise_batch_cleanup_on_cancel, additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, true}, + {"promise_filter_send_cancel_metadata", description_promise_filter_send_cancel_metadata, additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, true, true}, + {"recv_message_filter_bypass_fix", description_recv_message_filter_bypass_fix, additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, true}, + {"retry_in_callv3", description_retry_in_callv3, additional_constraints_retry_in_callv3, nullptr, 0, false, true}, + {"return_preexisting_errors", description_return_preexisting_errors, additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, + {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, + {"secure_endpoint_offload_large_reads", description_secure_endpoint_offload_large_reads, additional_constraints_secure_endpoint_offload_large_reads, required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, + {"secure_endpoint_offload_large_writes", description_secure_endpoint_offload_large_writes, additional_constraints_secure_endpoint_offload_large_writes, required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, + {"secure_endpoint_read_coalescing", description_secure_endpoint_read_coalescing, additional_constraints_secure_endpoint_read_coalescing, required_experiments_secure_endpoint_read_coalescing, 2, false, true}, + {"skip_clear_peer_on_cancellation", description_skip_clear_peer_on_cancellation, additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, true}, + {"subchannel_connection_scaling", description_subchannel_connection_scaling, additional_constraints_subchannel_connection_scaling, nullptr, 0, true, true}, + {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, + {"tcp_rcv_lowat", description_tcp_rcv_lowat, additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, + {"tsi_frame_protector_without_locks", description_tsi_frame_protector_without_locks, additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, false, true}, + {"unconstrained_max_quota_buffer_size", description_unconstrained_max_quota_buffer_size, additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, false, true}, + {"use_call_event_engine_in_completion_queue", description_use_call_event_engine_in_completion_queue, additional_constraints_use_call_event_engine_in_completion_queue, nullptr, 0, false, true}, + {"v2_non_owning_waker_implementation", description_v2_non_owning_waker_implementation, additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, false, true}, + {"verbose_channelz_connection_logging", description_verbose_channelz_connection_logging, additional_constraints_verbose_channelz_connection_logging, nullptr, 0, false, true}, + {"wildcard_ip_expansion_restriction", description_wildcard_ip_expansion_restriction, additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, false, true}, + {"xds_server_filter_chain_per_route", description_xds_server_filter_chain_per_route, additional_constraints_xds_server_filter_chain_per_route, required_experiments_xds_server_filter_chain_per_route, 1, false, true}, }; } // namespace grpc_core diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index 661df3cce2146..1359949d96b00 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -61,12 +61,8 @@ inline bool IsBufferListDeletionPrepEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { - return true; -} -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { - return false; -} +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return true; } +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION inline bool IsCallv3BatchValidationEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER @@ -154,12 +150,8 @@ inline bool IsBufferListDeletionPrepEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { - return true; -} -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { - return false; -} +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return true; } +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION inline bool IsCallv3BatchValidationEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER @@ -247,12 +239,8 @@ inline bool IsBufferListDeletionPrepEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { - return true; -} -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { - return false; -} +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return true; } +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION inline bool IsCallv3BatchValidationEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER @@ -405,264 +393,133 @@ enum ExperimentIds { kNumExperiments }; #define GRPC_EXPERIMENT_IS_INCLUDED_BUFFER_LIST_DELETION_PREP -inline bool IsBufferListDeletionPrepEnabled() { - return IsExperimentEnabled(); -} +inline bool IsBufferListDeletionPrepEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT -inline bool IsCallTracerInTransportEnabled() { - return IsExperimentEnabled(); -} +inline bool IsCallTracerInTransportEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { - return IsExperimentEnabled< - kExperimentIdCallTracerSendInitialMetadataIsAnAnnotation>(); -} +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_TRAILING_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { - return IsExperimentEnabled< - kExperimentIdCallTracerSendTrailingMetadataIsAnAnnotation>(); -} +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION -inline bool IsCallv3BatchValidationEnabled() { - return IsExperimentEnabled(); -} +inline bool IsCallv3BatchValidationEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER -inline bool IsChaoticGoodFramingLayerEnabled() { - return IsExperimentEnabled(); -} +inline bool IsChaoticGoodFramingLayerEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_SEND_SUPPORTED_FEATURES -inline bool IsChaoticGoodSendSupportedFeaturesEnabled() { - return IsExperimentEnabled(); -} +inline bool IsChaoticGoodSendSupportedFeaturesEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_CUSTOM_FRAME_CHECK -inline bool IsCustomFrameCheckEnabled() { - return IsExperimentEnabled(); -} +inline bool IsCustomFrameCheckEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_CLIENT -inline bool IsEventEngineClientEnabled() { - return IsExperimentEnabled(); -} +inline bool IsEventEngineClientEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_DNS -inline bool IsEventEngineDnsEnabled() { - return IsExperimentEnabled(); -} +inline bool IsEventEngineDnsEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_DNS_NON_CLIENT_CHANNEL -inline bool IsEventEngineDnsNonClientChannelEnabled() { - return IsExperimentEnabled(); -} +inline bool IsEventEngineDnsNonClientChannelEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_FORK -inline bool IsEventEngineForkEnabled() { - return IsExperimentEnabled(); -} +inline bool IsEventEngineForkEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_LISTENER -inline bool IsEventEngineListenerEnabled() { - return IsExperimentEnabled(); -} +inline bool IsEventEngineListenerEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_CALLBACK_CQ -inline bool IsEventEngineCallbackCqEnabled() { - return IsExperimentEnabled(); -} +inline bool IsEventEngineCallbackCqEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_FOR_ALL_OTHER_ENDPOINTS -inline bool IsEventEngineForAllOtherEndpointsEnabled() { - return IsExperimentEnabled(); -} +inline bool IsEventEngineForAllOtherEndpointsEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_FAIL_RECV_METADATA_ON_DEADLINE_EXCEEDED -inline bool IsFailRecvMetadataOnDeadlineExceededEnabled() { - return IsExperimentEnabled(); -} +inline bool IsFailRecvMetadataOnDeadlineExceededEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_FREE_LARGE_ALLOCATOR -inline bool IsFreeLargeAllocatorEnabled() { - return IsExperimentEnabled(); -} +inline bool IsFreeLargeAllocatorEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_FUSE_FILTERS -inline bool IsFuseFiltersEnabled() { - return IsExperimentEnabled(); -} +inline bool IsFuseFiltersEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_H2_MAX_DEALLOCATING_STREAMS_HEADROOM -inline bool IsH2MaxDeallocatingStreamsHeadroomEnabled() { - return IsExperimentEnabled(); -} +inline bool IsH2MaxDeallocatingStreamsHeadroomEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_INPROC_CANCEL_STREAM -inline bool IsInprocCancelStreamEnabled() { - return IsExperimentEnabled(); -} +inline bool IsInprocCancelStreamEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_KEEP_ALIVE_PING_TIMER_BATCH -inline bool IsKeepAlivePingTimerBatchEnabled() { - return IsExperimentEnabled(); -} +inline bool IsKeepAlivePingTimerBatchEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_LOCAL_CONNECTOR_SECURE -inline bool IsLocalConnectorSecureEnabled() { - return IsExperimentEnabled(); -} +inline bool IsLocalConnectorSecureEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_MEMORY_OPTIMIZATION_01 -inline bool IsMemoryOptimization01Enabled() { - return IsExperimentEnabled(); -} +inline bool IsMemoryOptimization01Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_MEMORY_OPTIMIZATION_02 -inline bool IsMemoryOptimization02Enabled() { - return IsExperimentEnabled(); -} +inline bool IsMemoryOptimization02Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_MESSAGE_SIZE_REFACTORING -inline bool IsMessageSizeRefactoringEnabled() { - return IsExperimentEnabled(); -} +inline bool IsMessageSizeRefactoringEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_METADATA_OUTSTANDING_TOKEN_REFACTOR -inline bool IsMetadataOutstandingTokenRefactorEnabled() { - return IsExperimentEnabled(); -} +inline bool IsMetadataOutstandingTokenRefactorEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_METADATA_PUBLISH_TO_APP_TAG -inline bool IsMetadataPublishToAppTagEnabled() { - return IsExperimentEnabled(); -} +inline bool IsMetadataPublishToAppTagEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT -inline bool IsMonitoringExperimentEnabled() { - return IsExperimentEnabled(); -} +inline bool IsMonitoringExperimentEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_01 -inline bool IsOptimization01Enabled() { - return IsExperimentEnabled(); -} +inline bool IsOptimization01Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_02 -inline bool IsOptimization02Enabled() { - return IsExperimentEnabled(); -} +inline bool IsOptimization02Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_03 -inline bool IsOptimization03Enabled() { - return IsExperimentEnabled(); -} +inline bool IsOptimization03Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_04 -inline bool IsOptimization04Enabled() { - return IsExperimentEnabled(); -} +inline bool IsOptimization04Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_05 -inline bool IsOptimization05Enabled() { - return IsExperimentEnabled(); -} +inline bool IsOptimization05Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_06 -inline bool IsOptimization06Enabled() { - return IsExperimentEnabled(); -} +inline bool IsOptimization06Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_OTEL_EXPORT_TELEMETRY_DOMAINS -inline bool IsOtelExportTelemetryDomainsEnabled() { - return IsExperimentEnabled(); -} +inline bool IsOtelExportTelemetryDomainsEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_CLIENT -inline bool IsPh2ClientEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPh2ClientEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_CLIENT_SERVER -inline bool IsPh2ClientServerEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPh2ClientServerEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_PERF_01 -inline bool IsPh2Perf01Enabled() { - return IsExperimentEnabled(); -} +inline bool IsPh2Perf01Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_SERVER -inline bool IsPh2ServerEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPh2ServerEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_IGNORE_EMPTY_UPDATES -inline bool IsPickFirstIgnoreEmptyUpdatesEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPickFirstIgnoreEmptyUpdatesEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PIPELINED_READ_SECURE_ENDPOINT -inline bool IsPipelinedReadSecureEndpointEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPipelinedReadSecureEndpointEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_POLLSET_ALTERNATIVE -inline bool IsPollsetAlternativeEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPollsetAlternativeEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PRIORITIZE_FINISHED_REQUESTS -inline bool IsPrioritizeFinishedRequestsEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPrioritizeFinishedRequestsEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_INPROC_TRANSPORT -inline bool IsPromiseBasedInprocTransportEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPromiseBasedInprocTransportEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BATCH_CLEANUP_ON_CANCEL -inline bool IsPromiseBatchCleanupOnCancelEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPromiseBatchCleanupOnCancelEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_FILTER_SEND_CANCEL_METADATA -inline bool IsPromiseFilterSendCancelMetadataEnabled() { - return IsExperimentEnabled(); -} +inline bool IsPromiseFilterSendCancelMetadataEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_RECV_MESSAGE_FILTER_BYPASS_FIX -inline bool IsRecvMessageFilterBypassFixEnabled() { - return IsExperimentEnabled(); -} +inline bool IsRecvMessageFilterBypassFixEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_RETRY_IN_CALLV3 -inline bool IsRetryInCallv3Enabled() { - return IsExperimentEnabled(); -} +inline bool IsRetryInCallv3Enabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_RETURN_PREEXISTING_ERRORS -inline bool IsReturnPreexistingErrorsEnabled() { - return IsExperimentEnabled(); -} +inline bool IsReturnPreexistingErrorsEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_SCHEDULE_CANCELLATION_OVER_WRITE -inline bool IsScheduleCancellationOverWriteEnabled() { - return IsExperimentEnabled(); -} +inline bool IsScheduleCancellationOverWriteEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_SECURE_ENDPOINT_OFFLOAD_LARGE_READS -inline bool IsSecureEndpointOffloadLargeReadsEnabled() { - return IsExperimentEnabled(); -} +inline bool IsSecureEndpointOffloadLargeReadsEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_SECURE_ENDPOINT_OFFLOAD_LARGE_WRITES -inline bool IsSecureEndpointOffloadLargeWritesEnabled() { - return IsExperimentEnabled(); -} +inline bool IsSecureEndpointOffloadLargeWritesEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_SECURE_ENDPOINT_READ_COALESCING -inline bool IsSecureEndpointReadCoalescingEnabled() { - return IsExperimentEnabled(); -} +inline bool IsSecureEndpointReadCoalescingEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_SKIP_CLEAR_PEER_ON_CANCELLATION -inline bool IsSkipClearPeerOnCancellationEnabled() { - return IsExperimentEnabled(); -} +inline bool IsSkipClearPeerOnCancellationEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_SUBCHANNEL_CONNECTION_SCALING -inline bool IsSubchannelConnectionScalingEnabled() { - return IsExperimentEnabled(); -} +inline bool IsSubchannelConnectionScalingEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_TCP_FRAME_SIZE_TUNING -inline bool IsTcpFrameSizeTuningEnabled() { - return IsExperimentEnabled(); -} +inline bool IsTcpFrameSizeTuningEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_TCP_RCV_LOWAT -inline bool IsTcpRcvLowatEnabled() { - return IsExperimentEnabled(); -} +inline bool IsTcpRcvLowatEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_TSI_FRAME_PROTECTOR_WITHOUT_LOCKS -inline bool IsTsiFrameProtectorWithoutLocksEnabled() { - return IsExperimentEnabled(); -} +inline bool IsTsiFrameProtectorWithoutLocksEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_UNCONSTRAINED_MAX_QUOTA_BUFFER_SIZE -inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { - return IsExperimentEnabled(); -} +inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_USE_CALL_EVENT_ENGINE_IN_COMPLETION_QUEUE -inline bool IsUseCallEventEngineInCompletionQueueEnabled() { - return IsExperimentEnabled< - kExperimentIdUseCallEventEngineInCompletionQueue>(); -} +inline bool IsUseCallEventEngineInCompletionQueueEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_V2_NON_OWNING_WAKER_IMPLEMENTATION -inline bool IsV2NonOwningWakerImplementationEnabled() { - return IsExperimentEnabled(); -} +inline bool IsV2NonOwningWakerImplementationEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_VERBOSE_CHANNELZ_CONNECTION_LOGGING -inline bool IsVerboseChannelzConnectionLoggingEnabled() { - return IsExperimentEnabled(); -} +inline bool IsVerboseChannelzConnectionLoggingEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_WILDCARD_IP_EXPANSION_RESTRICTION -inline bool IsWildcardIpExpansionRestrictionEnabled() { - return IsExperimentEnabled(); -} +inline bool IsWildcardIpExpansionRestrictionEnabled() { return IsExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_XDS_SERVER_FILTER_CHAIN_PER_ROUTE -inline bool IsXdsServerFilterChainPerRouteEnabled() { - return IsExperimentEnabled(); -} +inline bool IsXdsServerFilterChainPerRouteEnabled() { return IsExperimentEnabled(); } extern const ExperimentMetadata g_experiment_metadata[kNumExperiments]; diff --git a/test/core/experiments/experiments_test.cc b/test/core/experiments/experiments_test.cc index da5fc6094ab30..aa982e8fa4c28 100644 --- a/test/core/experiments/experiments_test.cc +++ b/test/core/experiments/experiments_test.cc @@ -14,86 +14,115 @@ // Auto generated by tools/codegen/core/gen_experiments.py -#include "test/core/experiments/fixtures/experiments.h" #include +#include "test/core/experiments/fixtures/experiments.h" + #include -#include "src/core/lib/experiments/config.h" #include "gtest/gtest.h" +#include "src/core/lib/experiments/config.h" + #ifndef GRPC_EXPERIMENTS_ARE_FINAL #if defined(GRPC_CFSTREAM) -bool GetExperimentTestExperiment1ExpectedValue() { return false; } +bool GetExperimentTestExperiment1ExpectedValue() { +return false; +} -bool GetExperimentTestExperiment2ExpectedValue() { return true; } +bool GetExperimentTestExperiment2ExpectedValue() { +return true; +} bool GetExperimentTestExperiment3ExpectedValue() { + #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif + } -bool GetExperimentTestExperiment4ExpectedValue() { return true; } +bool GetExperimentTestExperiment4ExpectedValue() { +return true; +} -bool GetExperimentTestExperiment5ExpectedValue() { return false; } +bool GetExperimentTestExperiment5ExpectedValue() { +return false; +} #elif defined(GPR_WINDOWS) -bool GetExperimentTestExperiment1ExpectedValue() { return false; } +bool GetExperimentTestExperiment1ExpectedValue() { +return false; +} -bool GetExperimentTestExperiment2ExpectedValue() { return false; } +bool GetExperimentTestExperiment2ExpectedValue() { +return false; +} bool GetExperimentTestExperiment3ExpectedValue() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif + } -bool GetExperimentTestExperiment4ExpectedValue() { return true; } +bool GetExperimentTestExperiment4ExpectedValue() { +return true; +} -bool GetExperimentTestExperiment5ExpectedValue() { return false; } +bool GetExperimentTestExperiment5ExpectedValue() { +return false; +} #else bool GetExperimentTestExperiment1ExpectedValue() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif + } bool GetExperimentTestExperiment2ExpectedValue() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif + } bool GetExperimentTestExperiment3ExpectedValue() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif + } -bool GetExperimentTestExperiment4ExpectedValue() { return false; } +bool GetExperimentTestExperiment4ExpectedValue() { +return false; +} -bool GetExperimentTestExperiment5ExpectedValue() { return false; } +bool GetExperimentTestExperiment5ExpectedValue() { +return false; +} #endif TEST(ExperimentsTest, CheckExperimentValuesTest) { + ASSERT_EQ(grpc_core::IsTestExperiment1Enabled(), GetExperimentTestExperiment1ExpectedValue()); @@ -108,13 +137,15 @@ TEST(ExperimentsTest, CheckExperimentValuesTest) { ASSERT_EQ(grpc_core::IsTestExperiment5Enabled(), GetExperimentTestExperiment5ExpectedValue()); + } -#endif // GRPC_EXPERIMENTS_ARE_FINAL +#endif // GRPC_EXPERIMENTS_ARE_FINAL int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); grpc_core::LoadTestOnlyExperimentsFromMetadata( - grpc_core::g_test_experiment_metadata, grpc_core::kNumTestExperiments); + grpc_core::g_test_experiment_metadata, grpc_core::kNumTestExperiments); return RUN_ALL_TESTS(); } + diff --git a/test/core/experiments/fixtures/experiments.cc b/test/core/experiments/fixtures/experiments.cc index c95664dfae69d..5c53a46a85575 100644 --- a/test/core/experiments/fixtures/experiments.cc +++ b/test/core/experiments/fixtures/experiments.cc @@ -14,10 +14,10 @@ // Auto generated by tools/codegen/core/gen_experiments.py -#include "test/core/experiments/fixtures/experiments.h" - #include +#include "test/core/experiments/fixtures/experiments.h" + #ifndef GRPC_EXPERIMENTS_ARE_FINAL #if defined(GRPC_CFSTREAM) @@ -42,17 +42,11 @@ const bool kDefaultForDebugOnly = true; namespace grpc_core { const ExperimentMetadata g_test_experiment_metadata[] = { - {"test_experiment_1", description_test_experiment_1, - additional_constraints_test_experiment_1, nullptr, 0, false, true}, - {"test_experiment_2", description_test_experiment_2, - additional_constraints_test_experiment_2, nullptr, 0, true, true}, - {"test_experiment_3", description_test_experiment_3, - additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, - true}, - {"test_experiment_4", description_test_experiment_4, - additional_constraints_test_experiment_4, nullptr, 0, true, true}, - {"test_experiment_5", description_test_experiment_5, - additional_constraints_test_experiment_5, nullptr, 0, false, true}, + {"test_experiment_1", description_test_experiment_1, additional_constraints_test_experiment_1, nullptr, 0, false, true}, + {"test_experiment_2", description_test_experiment_2, additional_constraints_test_experiment_2, nullptr, 0, true, true}, + {"test_experiment_3", description_test_experiment_3, additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, true}, + {"test_experiment_4", description_test_experiment_4, additional_constraints_test_experiment_4, nullptr, 0, true, true}, + {"test_experiment_5", description_test_experiment_5, additional_constraints_test_experiment_5, nullptr, 0, false, true}, }; } // namespace grpc_core @@ -79,17 +73,11 @@ const bool kDefaultForDebugOnly = true; namespace grpc_core { const ExperimentMetadata g_test_experiment_metadata[] = { - {"test_experiment_1", description_test_experiment_1, - additional_constraints_test_experiment_1, nullptr, 0, false, true}, - {"test_experiment_2", description_test_experiment_2, - additional_constraints_test_experiment_2, nullptr, 0, false, true}, - {"test_experiment_3", description_test_experiment_3, - additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, - true}, - {"test_experiment_4", description_test_experiment_4, - additional_constraints_test_experiment_4, nullptr, 0, true, true}, - {"test_experiment_5", description_test_experiment_5, - additional_constraints_test_experiment_5, nullptr, 0, false, true}, + {"test_experiment_1", description_test_experiment_1, additional_constraints_test_experiment_1, nullptr, 0, false, true}, + {"test_experiment_2", description_test_experiment_2, additional_constraints_test_experiment_2, nullptr, 0, false, true}, + {"test_experiment_3", description_test_experiment_3, additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, true}, + {"test_experiment_4", description_test_experiment_4, additional_constraints_test_experiment_4, nullptr, 0, true, true}, + {"test_experiment_5", description_test_experiment_5, additional_constraints_test_experiment_5, nullptr, 0, false, true}, }; } // namespace grpc_core @@ -116,19 +104,11 @@ const bool kDefaultForDebugOnly = true; namespace grpc_core { const ExperimentMetadata g_test_experiment_metadata[] = { - {"test_experiment_1", description_test_experiment_1, - additional_constraints_test_experiment_1, nullptr, 0, kDefaultForDebugOnly, - true}, - {"test_experiment_2", description_test_experiment_2, - additional_constraints_test_experiment_2, nullptr, 0, kDefaultForDebugOnly, - true}, - {"test_experiment_3", description_test_experiment_3, - additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, - true}, - {"test_experiment_4", description_test_experiment_4, - additional_constraints_test_experiment_4, nullptr, 0, false, true}, - {"test_experiment_5", description_test_experiment_5, - additional_constraints_test_experiment_5, nullptr, 0, false, true}, + {"test_experiment_1", description_test_experiment_1, additional_constraints_test_experiment_1, nullptr, 0, kDefaultForDebugOnly, true}, + {"test_experiment_2", description_test_experiment_2, additional_constraints_test_experiment_2, nullptr, 0, kDefaultForDebugOnly, true}, + {"test_experiment_3", description_test_experiment_3, additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, true}, + {"test_experiment_4", description_test_experiment_4, additional_constraints_test_experiment_4, nullptr, 0, false, true}, + {"test_experiment_5", description_test_experiment_5, additional_constraints_test_experiment_5, nullptr, 0, false, true}, }; } // namespace grpc_core diff --git a/test/core/experiments/fixtures/experiments.h b/test/core/experiments/fixtures/experiments.h index dd99b58e6287b..4c83ed86fff70 100644 --- a/test/core/experiments/fixtures/experiments.h +++ b/test/core/experiments/fixtures/experiments.h @@ -63,13 +63,13 @@ inline bool IsTestExperiment2Enabled() { return true; } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 #endif -inline bool IsTestExperiment3Enabled() { +inline bool IsTestExperiment3Enabled() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif -} + } #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_4 inline bool IsTestExperiment4Enabled() { return true; } inline bool IsTestExperiment5Enabled() { return false; } @@ -80,13 +80,13 @@ inline bool IsTestExperiment2Enabled() { return false; } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 #endif -inline bool IsTestExperiment3Enabled() { +inline bool IsTestExperiment3Enabled() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif -} + } #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_4 inline bool IsTestExperiment4Enabled() { return true; } inline bool IsTestExperiment5Enabled() { return false; } @@ -95,33 +95,33 @@ inline bool IsTestExperiment5Enabled() { return false; } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_1 #endif -inline bool IsTestExperiment1Enabled() { +inline bool IsTestExperiment1Enabled() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif -} + } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_2 #endif -inline bool IsTestExperiment2Enabled() { +inline bool IsTestExperiment2Enabled() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif -} + } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 #endif -inline bool IsTestExperiment3Enabled() { +inline bool IsTestExperiment3Enabled() { #ifdef NDEBUG - return false; +return false; #else - return true; +return true; #endif -} + } inline bool IsTestExperiment4Enabled() { return false; } inline bool IsTestExperiment5Enabled() { return false; } #endif @@ -136,25 +136,15 @@ enum ExperimentIds { kNumTestExperiments }; #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_1 -inline bool IsTestExperiment1Enabled() { - return IsTestExperimentEnabled(); -} +inline bool IsTestExperiment1Enabled() { return IsTestExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_2 -inline bool IsTestExperiment2Enabled() { - return IsTestExperimentEnabled(); -} +inline bool IsTestExperiment2Enabled() { return IsTestExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 -inline bool IsTestExperiment3Enabled() { - return IsTestExperimentEnabled(); -} +inline bool IsTestExperiment3Enabled() { return IsTestExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_4 -inline bool IsTestExperiment4Enabled() { - return IsTestExperimentEnabled(); -} +inline bool IsTestExperiment4Enabled() { return IsTestExperimentEnabled(); } #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_5 -inline bool IsTestExperiment5Enabled() { - return IsTestExperimentEnabled(); -} +inline bool IsTestExperiment5Enabled() { return IsTestExperimentEnabled(); } extern const ExperimentMetadata g_test_experiment_metadata[kNumTestExperiments]; diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 54566efb1cc24..36b2cf00dfac8 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -3336,6 +3336,7 @@ src/cpp/util/status.cc \ src/cpp/util/string_ref.cc \ src/cpp/util/time_cc.cc \ third_party/upb/upb/generated_code_support.h \ +third_party/utf8_range/utf8_validity.h \ third_party/xxhash/xxhash.h # This tag can be used to specify the character encoding of the source files From f3ac90015e172f194598358eee37a484fc68694b Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 4 Aug 2026 01:51:27 +0530 Subject: [PATCH 27/29] Revert "buildgen: regenerate build_autogenerated.yaml, Doxyfile, and experiments headers" This reverts commit f27c3462215327a6a836cba559a4674d04088ba5. --- build_autogenerated.yaml | 1 - src/core/lib/experiments/experiments.cc | 1610 ++++++++++++----- src/core/lib/experiments/experiments.h | 283 ++- test/core/experiments/experiments_test.cc | 79 +- test/core/experiments/fixtures/experiments.cc | 54 +- test/core/experiments/fixtures/experiments.h | 60 +- tools/doxygen/Doxyfile.c++.internal | 1 - 7 files changed, 1478 insertions(+), 610 deletions(-) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index bf23bd023f761..04e99273eb104 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -4250,7 +4250,6 @@ libs: - src/cpp/server/secure_server_credentials.h - src/cpp/server/thread_pool_interface.h - src/cpp/thread_manager/thread_manager.h - - third_party/utf8_range/utf8_validity.h src: - src/core/client_channel/virtual_channel.cc - src/cpp/client/call_context_registry.cc diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index a28e868dc924b..4b7e89ce90ea7 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -14,73 +14,122 @@ // Auto generated by tools/codegen/core/gen_experiments.py -#include +#include "src/core/lib/experiments/experiments.h" +#include #include -#include "src/core/lib/experiments/experiments.h" - #ifndef GRPC_EXPERIMENTS_ARE_FINAL #if defined(GRPC_CFSTREAM) namespace { -const char* const description_buffer_list_deletion_prep = "Gate the removal of old TCP timestamp collection mechanism."; +const char* const description_buffer_list_deletion_prep = + "Gate the removal of old TCP timestamp collection mechanism."; const char* const additional_constraints_buffer_list_deletion_prep = "{}"; -const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; +const char* const description_call_tracer_in_transport = + "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const description_call_tracer_send_initial_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; -const char* const additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = "{}"; -const char* const description_call_tracer_send_trailing_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; -const char* const additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = "{}"; -const char* const description_callv3_batch_validation = "If enabled, perform validations on receiving a new batch."; +const char* const + description_call_tracer_send_initial_metadata_is_an_annotation = + "Use the new annotation-based CallTracer API."; +const char* const + additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = + "{}"; +const char* const + description_call_tracer_send_trailing_metadata_is_an_annotation = + "Use the new annotation-based CallTracer API."; +const char* const + additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = + "{}"; +const char* const description_callv3_batch_validation = + "If enabled, perform validations on receiving a new batch."; const char* const additional_constraints_callv3_batch_validation = "{}"; -const char* const description_chaotic_good_framing_layer = "Enable the chaotic good framing layer."; +const char* const description_chaotic_good_framing_layer = + "Enable the chaotic good framing layer."; const char* const additional_constraints_chaotic_good_framing_layer = "{}"; -const char* const description_chaotic_good_send_supported_features = "Send supported features in chaotic good settings frames."; -const char* const additional_constraints_chaotic_good_send_supported_features = "{}"; -const char* const description_custom_frame_check = "Adding checks to custom HTTP2 frame."; +const char* const description_chaotic_good_send_supported_features = + "Send supported features in chaotic good settings frames."; +const char* const additional_constraints_chaotic_good_send_supported_features = + "{}"; +const char* const description_custom_frame_check = + "Adding checks to custom HTTP2 frame."; const char* const additional_constraints_custom_frame_check = "{}"; -const char* const description_event_engine_client = "Use EventEngine clients instead of iomgr's grpc_tcp_client"; +const char* const description_event_engine_client = + "Use EventEngine clients instead of iomgr's grpc_tcp_client"; const char* const additional_constraints_event_engine_client = "{}"; -const char* const description_event_engine_dns = "If set, use EventEngine DNSResolver for client channel resolution"; +const char* const description_event_engine_dns = + "If set, use EventEngine DNSResolver for client channel resolution"; const char* const additional_constraints_event_engine_dns = "{}"; -const char* const description_event_engine_dns_non_client_channel = "If set, use EventEngine DNSResolver in other places besides client channel."; -const char* const additional_constraints_event_engine_dns_non_client_channel = "{}"; -const char* const description_event_engine_fork = "Enables event engine fork handling, including onfork events and file descriptor generations"; +const char* const description_event_engine_dns_non_client_channel = + "If set, use EventEngine DNSResolver in other places besides client " + "channel."; +const char* const additional_constraints_event_engine_dns_non_client_channel = + "{}"; +const char* const description_event_engine_fork = + "Enables event engine fork handling, including onfork events and file " + "descriptor generations"; const char* const additional_constraints_event_engine_fork = "{}"; -const char* const description_event_engine_listener = "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; +const char* const description_event_engine_listener = + "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; const char* const additional_constraints_event_engine_listener = "{}"; -const char* const description_event_engine_callback_cq = "Use EventEngine instead of the CallbackAlternativeCQ."; +const char* const description_event_engine_callback_cq = + "Use EventEngine instead of the CallbackAlternativeCQ."; const char* const additional_constraints_event_engine_callback_cq = "{}"; -const uint8_t required_experiments_event_engine_callback_cq[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_event_engine_for_all_other_endpoints = "Use EventEngine endpoints for all call sites, including direct uses of grpc_tcp_create."; -const char* const additional_constraints_event_engine_for_all_other_endpoints = "{}"; -const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineDns),static_cast(grpc_core::kExperimentIdEventEngineDnsNonClientChannel),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_fail_recv_metadata_on_deadline_exceeded = "Fail recv initial metadata when the deadline is exceeded."; -const char* const additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; -const char* const description_free_large_allocator = "If set, return all free bytes from a \042big\042 allocator"; +const uint8_t required_experiments_event_engine_callback_cq[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_event_engine_for_all_other_endpoints = + "Use EventEngine endpoints for all call sites, including direct uses of " + "grpc_tcp_create."; +const char* const additional_constraints_event_engine_for_all_other_endpoints = + "{}"; +const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineDns), + static_cast( + grpc_core::kExperimentIdEventEngineDnsNonClientChannel), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_fail_recv_metadata_on_deadline_exceeded = + "Fail recv initial metadata when the deadline is exceeded."; +const char* const + additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; +const char* const description_free_large_allocator = + "If set, return all free bytes from a \042big\042 allocator"; const char* const additional_constraints_free_large_allocator = "{}"; -const char* const description_fuse_filters = "If set, individual filters are merged into fused filters"; +const char* const description_fuse_filters = + "If set, individual filters are merged into fused filters"; const char* const additional_constraints_fuse_filters = "{}"; -const char* const description_h2_max_deallocating_streams_headroom = "Separate allocated max concurrent streams."; -const char* const additional_constraints_h2_max_deallocating_streams_headroom = "{}"; -const char* const description_inproc_cancel_stream = "If set, cancel inproc stream inside the transport mutex."; +const char* const description_h2_max_deallocating_streams_headroom = + "Separate allocated max concurrent streams."; +const char* const additional_constraints_h2_max_deallocating_streams_headroom = + "{}"; +const char* const description_inproc_cancel_stream = + "If set, cancel inproc stream inside the transport mutex."; const char* const additional_constraints_inproc_cancel_stream = "{}"; -const char* const description_keep_alive_ping_timer_batch = "Avoid explicitly cancelling the keepalive timer. Instead adjust the callback to re-schedule itself to the next ping interval."; +const char* const description_keep_alive_ping_timer_batch = + "Avoid explicitly cancelling the keepalive timer. Instead adjust the " + "callback to re-schedule itself to the next ping interval."; const char* const additional_constraints_keep_alive_ping_timer_batch = "{}"; -const char* const description_local_connector_secure = "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections."; +const char* const description_local_connector_secure = + "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP " + "connections."; const char* const additional_constraints_local_connector_secure = "{}"; const char* const description_memory_optimization_01 = "Memory Optimization"; const char* const additional_constraints_memory_optimization_01 = "{}"; const char* const description_memory_optimization_02 = "Memory Optimization 02"; const char* const additional_constraints_memory_optimization_02 = "{}"; -const char* const description_message_size_refactoring = "Refactoring the message size config parsing."; +const char* const description_message_size_refactoring = + "Refactoring the message size config parsing."; const char* const additional_constraints_message_size_refactoring = "{}"; -const char* const description_metadata_outstanding_token_refactor = "Refactor ClientInitialMetadataOutstandingToken."; -const char* const additional_constraints_metadata_outstanding_token_refactor = "{}"; -const char* const description_metadata_publish_to_app_tag = "Publish metadata to the app using the kPublishToApp metadata field."; +const char* const description_metadata_outstanding_token_refactor = + "Refactor ClientInitialMetadataOutstandingToken."; +const char* const additional_constraints_metadata_outstanding_token_refactor = + "{}"; +const char* const description_metadata_publish_to_app_tag = + "Publish metadata to the app using the kPublishToApp metadata field."; const char* const additional_constraints_metadata_publish_to_app_tag = "{}"; -const char* const description_monitoring_experiment = "Placeholder experiment to prove/disprove our monitoring is working"; +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_optimization_01 = "Optimization"; const char* const additional_constraints_optimization_01 = "{}"; @@ -94,204 +143,447 @@ const char* const description_optimization_05 = "Optimization"; const char* const additional_constraints_optimization_05 = "{}"; const char* const description_optimization_06 = "Optimization"; const char* const additional_constraints_optimization_06 = "{}"; -const char* const description_otel_export_telemetry_domains = "Export telemetry domains in OpenTelemetry metrics."; +const char* const description_otel_export_telemetry_domains = + "Export telemetry domains in OpenTelemetry metrics."; const char* const additional_constraints_otel_export_telemetry_domains = "{}"; -const char* const description_ph2_client = "Use promises for the http2 client transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test PH2 Client with CHTTP2 Server."; +const char* const description_ph2_client = + "Use promises for the http2 client transport. We have kept client and " + "server transport experiments separate to help with smoother roll outs. " + "When this flag is enabled for the test suites, it would test PH2 Client " + "with CHTTP2 Server."; const char* const additional_constraints_ph2_client = "{}"; -const char* const description_ph2_client_server = "This is a combination of ph2_server and ph2_client experiments. When this flag is enabled for the test suites, it would test PH2 Client with PH2 Server. We will NEVER be rolling out this experiment, because the roll out would be done using ph2_server and ph2_client. This experiment MUST be deleted when either ph2_server or ph2_client experiments are deleted."; +const char* const description_ph2_client_server = + "This is a combination of ph2_server and ph2_client experiments. When this " + "flag is enabled for the test suites, it would test PH2 Client with PH2 " + "Server. We will NEVER be rolling out this experiment, because the roll " + "out would be done using ph2_server and ph2_client. This experiment MUST " + "be deleted when either ph2_server or ph2_client experiments are deleted."; const char* const additional_constraints_ph2_client_server = "{}"; -const char* const description_ph2_perf_01 = "Different performance experiments for PH2 Transport"; +const char* const description_ph2_perf_01 = + "Different performance experiments for PH2 Transport"; const char* const additional_constraints_ph2_perf_01 = "{}"; -const char* const description_ph2_server = "Use promises for the http2 server transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test CHTTP2 Client with PH2 Server."; +const char* const description_ph2_server = + "Use promises for the http2 server transport. We have kept client and " + "server transport experiments separate to help with smoother roll outs. " + "When this flag is enabled for the test suites, it would test CHTTP2 " + "Client with PH2 Server."; const char* const additional_constraints_ph2_server = "{}"; -const char* const description_pick_first_ignore_empty_updates = "Ignore empty resolutions in pick_first (delete)"; +const char* const description_pick_first_ignore_empty_updates = + "Ignore empty resolutions in pick_first (delete)"; const char* const additional_constraints_pick_first_ignore_empty_updates = "{}"; -const char* const description_pipelined_read_secure_endpoint = "Enable pipelined reads for EventEngine secure endpoints"; +const char* const description_pipelined_read_secure_endpoint = + "Enable pipelined reads for EventEngine secure endpoints"; const char* const additional_constraints_pipelined_read_secure_endpoint = "{}"; -const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_pollset_alternative = "Code outside iomgr that relies directly on pollsets will use non-pollset alternatives when enabled."; +const uint8_t required_experiments_pipelined_read_secure_endpoint[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_pollset_alternative = + "Code outside iomgr that relies directly on pollsets will use non-pollset " + "alternatives when enabled."; const char* const additional_constraints_pollset_alternative = "{}"; -const uint8_t required_experiments_pollset_alternative[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_prioritize_finished_requests = "Prioritize flushing out finished requests over other in-flight requests during transport writes."; +const uint8_t required_experiments_pollset_alternative[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_prioritize_finished_requests = + "Prioritize flushing out finished requests over other in-flight requests " + "during transport writes."; const char* const additional_constraints_prioritize_finished_requests = "{}"; -const char* const description_promise_based_inproc_transport = "Use call-v3 for the in-process transport."; +const char* const description_promise_based_inproc_transport = + "Use call-v3 for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_promise_batch_cleanup_on_cancel = "Fix completion queue tag handling during promise batch cancellation."; +const char* const description_promise_batch_cleanup_on_cancel = + "Fix completion queue tag handling during promise batch cancellation."; const char* const additional_constraints_promise_batch_cleanup_on_cancel = "{}"; -const char* const description_promise_filter_send_cancel_metadata = "Enables sending all trailing metadata fields from server side promise-based filters upon stream cancellation."; -const char* const additional_constraints_promise_filter_send_cancel_metadata = "{}"; -const char* const description_recv_message_filter_bypass_fix = "Receive message bypass happen if trailing metadata is received while Server Initial Metadata is getting processed."; +const char* const description_promise_filter_send_cancel_metadata = + "Enables sending all trailing metadata fields from server side " + "promise-based filters upon stream cancellation."; +const char* const additional_constraints_promise_filter_send_cancel_metadata = + "{}"; +const char* const description_recv_message_filter_bypass_fix = + "Receive message bypass happen if trailing metadata is received while " + "Server Initial Metadata is getting processed."; const char* const additional_constraints_recv_message_filter_bypass_fix = "{}"; const char* const description_retry_in_callv3 = "Support retries with call-v3"; const char* const additional_constraints_retry_in_callv3 = "{}"; -const char* const description_return_preexisting_errors = "Return errors that exist before the start of the call in RunHandler."; +const char* const description_return_preexisting_errors = + "Return errors that exist before the start of the call in RunHandler."; const char* const additional_constraints_return_preexisting_errors = "{}"; -const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; -const char* const additional_constraints_schedule_cancellation_over_write = "{}"; -const char* const description_secure_endpoint_offload_large_reads = "If a large read needs to be decrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_reads = "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_offload_large_writes = "If a large read write to be encrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_writes = "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_read_coalescing = "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; +const char* const description_schedule_cancellation_over_write = + "Allow cancellation op to be scheduled over a write"; +const char* const additional_constraints_schedule_cancellation_over_write = + "{}"; +const char* const description_secure_endpoint_offload_large_reads = + "If a large read needs to be decrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_reads = + "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_offload_large_writes = + "If a large read write to be encrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_writes = + "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_read_coalescing = + "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; const char* const additional_constraints_secure_endpoint_read_coalescing = "{}"; -const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_skip_clear_peer_on_cancellation = "If set, skips clearing of peer string on call cancellation."; +const uint8_t required_experiments_secure_endpoint_read_coalescing[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_skip_clear_peer_on_cancellation = + "If set, skips clearing of peer string on call cancellation."; const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}"; -const char* const description_subchannel_connection_scaling = "Subchannel connection scaling support."; +const char* const description_subchannel_connection_scaling = + "Subchannel connection scaling support."; const char* const additional_constraints_subchannel_connection_scaling = "{}"; -const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP would not indicate completion of a read operation until a specified number of bytes have been read over the socket. Buffers are also allocated according to estimated RPC sizes."; +const char* const description_tcp_frame_size_tuning = + "If set, enables TCP to use RPC size estimation made by higher layers. TCP " + "would not indicate completion of a read operation until a specified " + "number of bytes have been read over the socket. Buffers are also " + "allocated according to estimated RPC sizes."; const char* const additional_constraints_tcp_frame_size_tuning = "{}"; -const char* const description_tcp_rcv_lowat = "Use SO_RCVLOWAT to avoid wakeups on the read path."; +const char* const description_tcp_rcv_lowat = + "Use SO_RCVLOWAT to avoid wakeups on the read path."; const char* const additional_constraints_tcp_rcv_lowat = "{}"; -const char* const description_tsi_frame_protector_without_locks = "Do not hold locks while using the tsi_frame_protector."; -const char* const additional_constraints_tsi_frame_protector_without_locks = "{}"; -const char* const description_unconstrained_max_quota_buffer_size = "Discard the cap on the max free pool size for one memory allocator"; -const char* const additional_constraints_unconstrained_max_quota_buffer_size = "{}"; -const char* const description_use_call_event_engine_in_completion_queue = "Use the call event engine to run callbacks in completion queue."; -const char* const additional_constraints_use_call_event_engine_in_completion_queue = "{}"; -const char* const description_v2_non_owning_waker_implementation = "Use non-owning wakers in v2 filter bridge."; -const char* const additional_constraints_v2_non_owning_waker_implementation = "{}"; -const char* const description_verbose_channelz_connection_logging = "Verbose logging of events into channelz during connection setup."; -const char* const additional_constraints_verbose_channelz_connection_logging = "{}"; -const char* const description_wildcard_ip_expansion_restriction = "If set, adds optional restriction on when to expand wildcard IPs."; -const char* const additional_constraints_wildcard_ip_expansion_restriction = "{}"; -const char* const description_xds_server_filter_chain_per_route = "xDS servers use a separate filter chain for each route."; -const char* const additional_constraints_xds_server_filter_chain_per_route = "{}"; -const uint8_t required_experiments_xds_server_filter_chain_per_route[] = {static_cast(grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; +const char* const description_tsi_frame_protector_without_locks = + "Do not hold locks while using the tsi_frame_protector."; +const char* const additional_constraints_tsi_frame_protector_without_locks = + "{}"; +const char* const description_unconstrained_max_quota_buffer_size = + "Discard the cap on the max free pool size for one memory allocator"; +const char* const additional_constraints_unconstrained_max_quota_buffer_size = + "{}"; +const char* const description_use_call_event_engine_in_completion_queue = + "Use the call event engine to run callbacks in completion queue."; +const char* const + additional_constraints_use_call_event_engine_in_completion_queue = "{}"; +const char* const description_v2_non_owning_waker_implementation = + "Use non-owning wakers in v2 filter bridge."; +const char* const additional_constraints_v2_non_owning_waker_implementation = + "{}"; +const char* const description_verbose_channelz_connection_logging = + "Verbose logging of events into channelz during connection setup."; +const char* const additional_constraints_verbose_channelz_connection_logging = + "{}"; +const char* const description_wildcard_ip_expansion_restriction = + "If set, adds optional restriction on when to expand wildcard IPs."; +const char* const additional_constraints_wildcard_ip_expansion_restriction = + "{}"; +const char* const description_xds_server_filter_chain_per_route = + "xDS servers use a separate filter chain for each route."; +const char* const additional_constraints_xds_server_filter_chain_per_route = + "{}"; +const uint8_t required_experiments_xds_server_filter_chain_per_route[] = { + static_cast( + grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; } // namespace namespace grpc_core { const ExperimentMetadata g_experiment_metadata[] = { - {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, - {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, - {"call_tracer_send_initial_metadata_is_an_annotation", description_call_tracer_send_initial_metadata_is_an_annotation, additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, nullptr, 0, true, true}, - {"call_tracer_send_trailing_metadata_is_an_annotation", description_call_tracer_send_trailing_metadata_is_an_annotation, additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, nullptr, 0, false, true}, - {"callv3_batch_validation", description_callv3_batch_validation, additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, - {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, false}, - {"chaotic_good_send_supported_features", description_chaotic_good_send_supported_features, additional_constraints_chaotic_good_send_supported_features, nullptr, 0, true, true}, - {"custom_frame_check", description_custom_frame_check, additional_constraints_custom_frame_check, nullptr, 0, true, false}, - {"event_engine_client", description_event_engine_client, additional_constraints_event_engine_client, nullptr, 0, true, false}, - {"event_engine_dns", description_event_engine_dns, additional_constraints_event_engine_dns, nullptr, 0, true, false}, - {"event_engine_dns_non_client_channel", description_event_engine_dns_non_client_channel, additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, true, false}, - {"event_engine_fork", description_event_engine_fork, additional_constraints_event_engine_fork, nullptr, 0, true, false}, - {"event_engine_listener", description_event_engine_listener, additional_constraints_event_engine_listener, nullptr, 0, true, false}, - {"event_engine_callback_cq", description_event_engine_callback_cq, additional_constraints_event_engine_callback_cq, required_experiments_event_engine_callback_cq, 2, true, true}, - {"event_engine_for_all_other_endpoints", description_event_engine_for_all_other_endpoints, additional_constraints_event_engine_for_all_other_endpoints, required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, - {"fail_recv_metadata_on_deadline_exceeded", description_fail_recv_metadata_on_deadline_exceeded, additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, false, false}, - {"free_large_allocator", description_free_large_allocator, additional_constraints_free_large_allocator, nullptr, 0, false, true}, - {"fuse_filters", description_fuse_filters, additional_constraints_fuse_filters, nullptr, 0, false, false}, - {"h2_max_deallocating_streams_headroom", description_h2_max_deallocating_streams_headroom, additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, false, true}, - {"inproc_cancel_stream", description_inproc_cancel_stream, additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, - {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, true}, - {"local_connector_secure", description_local_connector_secure, additional_constraints_local_connector_secure, nullptr, 0, false, true}, - {"memory_optimization_01", description_memory_optimization_01, additional_constraints_memory_optimization_01, nullptr, 0, false, false}, - {"memory_optimization_02", description_memory_optimization_02, additional_constraints_memory_optimization_02, nullptr, 0, false, false}, - {"message_size_refactoring", description_message_size_refactoring, additional_constraints_message_size_refactoring, nullptr, 0, false, true}, - {"metadata_outstanding_token_refactor", description_metadata_outstanding_token_refactor, additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, false, true}, - {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, true}, - {"monitoring_experiment", description_monitoring_experiment, additional_constraints_monitoring_experiment, nullptr, 0, true, true}, - {"optimization_01", description_optimization_01, additional_constraints_optimization_01, nullptr, 0, true, true}, - {"optimization_02", description_optimization_02, additional_constraints_optimization_02, nullptr, 0, true, true}, - {"optimization_03", description_optimization_03, additional_constraints_optimization_03, nullptr, 0, true, true}, - {"optimization_04", description_optimization_04, additional_constraints_optimization_04, nullptr, 0, true, true}, - {"optimization_05", description_optimization_05, additional_constraints_optimization_05, nullptr, 0, false, true}, - {"optimization_06", description_optimization_06, additional_constraints_optimization_06, nullptr, 0, false, true}, - {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, true}, - {"ph2_client", description_ph2_client, additional_constraints_ph2_client, nullptr, 0, false, true}, - {"ph2_client_server", description_ph2_client_server, additional_constraints_ph2_client_server, nullptr, 0, false, true}, - {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, nullptr, 0, false, true}, - {"ph2_server", description_ph2_server, additional_constraints_ph2_server, nullptr, 0, false, true}, - {"pick_first_ignore_empty_updates", description_pick_first_ignore_empty_updates, additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, true}, - {"pipelined_read_secure_endpoint", description_pipelined_read_secure_endpoint, additional_constraints_pipelined_read_secure_endpoint, required_experiments_pipelined_read_secure_endpoint, 2, false, false}, - {"pollset_alternative", description_pollset_alternative, additional_constraints_pollset_alternative, required_experiments_pollset_alternative, 2, false, false}, - {"prioritize_finished_requests", description_prioritize_finished_requests, additional_constraints_prioritize_finished_requests, nullptr, 0, false, true}, - {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, - {"promise_batch_cleanup_on_cancel", description_promise_batch_cleanup_on_cancel, additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, true}, - {"promise_filter_send_cancel_metadata", description_promise_filter_send_cancel_metadata, additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, true, true}, - {"recv_message_filter_bypass_fix", description_recv_message_filter_bypass_fix, additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, true}, - {"retry_in_callv3", description_retry_in_callv3, additional_constraints_retry_in_callv3, nullptr, 0, false, true}, - {"return_preexisting_errors", description_return_preexisting_errors, additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, - {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, - {"secure_endpoint_offload_large_reads", description_secure_endpoint_offload_large_reads, additional_constraints_secure_endpoint_offload_large_reads, required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, - {"secure_endpoint_offload_large_writes", description_secure_endpoint_offload_large_writes, additional_constraints_secure_endpoint_offload_large_writes, required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, - {"secure_endpoint_read_coalescing", description_secure_endpoint_read_coalescing, additional_constraints_secure_endpoint_read_coalescing, required_experiments_secure_endpoint_read_coalescing, 2, false, true}, - {"skip_clear_peer_on_cancellation", description_skip_clear_peer_on_cancellation, additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, true}, - {"subchannel_connection_scaling", description_subchannel_connection_scaling, additional_constraints_subchannel_connection_scaling, nullptr, 0, true, true}, - {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, - {"tcp_rcv_lowat", description_tcp_rcv_lowat, additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, - {"tsi_frame_protector_without_locks", description_tsi_frame_protector_without_locks, additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, false, true}, - {"unconstrained_max_quota_buffer_size", description_unconstrained_max_quota_buffer_size, additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, false, true}, - {"use_call_event_engine_in_completion_queue", description_use_call_event_engine_in_completion_queue, additional_constraints_use_call_event_engine_in_completion_queue, nullptr, 0, false, true}, - {"v2_non_owning_waker_implementation", description_v2_non_owning_waker_implementation, additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, false, true}, - {"verbose_channelz_connection_logging", description_verbose_channelz_connection_logging, additional_constraints_verbose_channelz_connection_logging, nullptr, 0, false, true}, - {"wildcard_ip_expansion_restriction", description_wildcard_ip_expansion_restriction, additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, false, true}, - {"xds_server_filter_chain_per_route", description_xds_server_filter_chain_per_route, additional_constraints_xds_server_filter_chain_per_route, required_experiments_xds_server_filter_chain_per_route, 1, false, true}, + {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, + additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, + {"call_tracer_in_transport", description_call_tracer_in_transport, + additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, + {"call_tracer_send_initial_metadata_is_an_annotation", + description_call_tracer_send_initial_metadata_is_an_annotation, + additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, + nullptr, 0, true, true}, + {"call_tracer_send_trailing_metadata_is_an_annotation", + description_call_tracer_send_trailing_metadata_is_an_annotation, + additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, + nullptr, 0, false, true}, + {"callv3_batch_validation", description_callv3_batch_validation, + additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, + {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, + additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, + false}, + {"chaotic_good_send_supported_features", + description_chaotic_good_send_supported_features, + additional_constraints_chaotic_good_send_supported_features, nullptr, 0, + true, true}, + {"custom_frame_check", description_custom_frame_check, + additional_constraints_custom_frame_check, nullptr, 0, true, false}, + {"event_engine_client", description_event_engine_client, + additional_constraints_event_engine_client, nullptr, 0, true, false}, + {"event_engine_dns", description_event_engine_dns, + additional_constraints_event_engine_dns, nullptr, 0, true, false}, + {"event_engine_dns_non_client_channel", + description_event_engine_dns_non_client_channel, + additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, + true, false}, + {"event_engine_fork", description_event_engine_fork, + additional_constraints_event_engine_fork, nullptr, 0, true, false}, + {"event_engine_listener", description_event_engine_listener, + additional_constraints_event_engine_listener, nullptr, 0, true, false}, + {"event_engine_callback_cq", description_event_engine_callback_cq, + additional_constraints_event_engine_callback_cq, + required_experiments_event_engine_callback_cq, 2, true, true}, + {"event_engine_for_all_other_endpoints", + description_event_engine_for_all_other_endpoints, + additional_constraints_event_engine_for_all_other_endpoints, + required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, + {"fail_recv_metadata_on_deadline_exceeded", + description_fail_recv_metadata_on_deadline_exceeded, + additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, + false, false}, + {"free_large_allocator", description_free_large_allocator, + additional_constraints_free_large_allocator, nullptr, 0, false, true}, + {"fuse_filters", description_fuse_filters, + additional_constraints_fuse_filters, nullptr, 0, false, false}, + {"h2_max_deallocating_streams_headroom", + description_h2_max_deallocating_streams_headroom, + additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, + false, true}, + {"inproc_cancel_stream", description_inproc_cancel_stream, + additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, + {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, + additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, + true}, + {"local_connector_secure", description_local_connector_secure, + additional_constraints_local_connector_secure, nullptr, 0, false, true}, + {"memory_optimization_01", description_memory_optimization_01, + additional_constraints_memory_optimization_01, nullptr, 0, false, false}, + {"memory_optimization_02", description_memory_optimization_02, + additional_constraints_memory_optimization_02, nullptr, 0, false, false}, + {"message_size_refactoring", description_message_size_refactoring, + additional_constraints_message_size_refactoring, nullptr, 0, false, true}, + {"metadata_outstanding_token_refactor", + description_metadata_outstanding_token_refactor, + additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, + false, true}, + {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, + additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, + true}, + {"monitoring_experiment", description_monitoring_experiment, + additional_constraints_monitoring_experiment, nullptr, 0, true, true}, + {"optimization_01", description_optimization_01, + additional_constraints_optimization_01, nullptr, 0, true, true}, + {"optimization_02", description_optimization_02, + additional_constraints_optimization_02, nullptr, 0, true, true}, + {"optimization_03", description_optimization_03, + additional_constraints_optimization_03, nullptr, 0, true, true}, + {"optimization_04", description_optimization_04, + additional_constraints_optimization_04, nullptr, 0, true, true}, + {"optimization_05", description_optimization_05, + additional_constraints_optimization_05, nullptr, 0, false, true}, + {"optimization_06", description_optimization_06, + additional_constraints_optimization_06, nullptr, 0, false, true}, + {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, + additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, + true}, + {"ph2_client", description_ph2_client, additional_constraints_ph2_client, + nullptr, 0, false, true}, + {"ph2_client_server", description_ph2_client_server, + additional_constraints_ph2_client_server, nullptr, 0, false, true}, + {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, + nullptr, 0, false, true}, + {"ph2_server", description_ph2_server, additional_constraints_ph2_server, + nullptr, 0, false, true}, + {"pick_first_ignore_empty_updates", + description_pick_first_ignore_empty_updates, + additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, + true}, + {"pipelined_read_secure_endpoint", + description_pipelined_read_secure_endpoint, + additional_constraints_pipelined_read_secure_endpoint, + required_experiments_pipelined_read_secure_endpoint, 2, false, false}, + {"pollset_alternative", description_pollset_alternative, + additional_constraints_pollset_alternative, + required_experiments_pollset_alternative, 2, false, false}, + {"prioritize_finished_requests", description_prioritize_finished_requests, + additional_constraints_prioritize_finished_requests, nullptr, 0, false, + true}, + {"promise_based_inproc_transport", + description_promise_based_inproc_transport, + additional_constraints_promise_based_inproc_transport, nullptr, 0, false, + false}, + {"promise_batch_cleanup_on_cancel", + description_promise_batch_cleanup_on_cancel, + additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, + true}, + {"promise_filter_send_cancel_metadata", + description_promise_filter_send_cancel_metadata, + additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, + true, true}, + {"recv_message_filter_bypass_fix", + description_recv_message_filter_bypass_fix, + additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, + true}, + {"retry_in_callv3", description_retry_in_callv3, + additional_constraints_retry_in_callv3, nullptr, 0, false, true}, + {"return_preexisting_errors", description_return_preexisting_errors, + additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, + {"schedule_cancellation_over_write", + description_schedule_cancellation_over_write, + additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, + true}, + {"secure_endpoint_offload_large_reads", + description_secure_endpoint_offload_large_reads, + additional_constraints_secure_endpoint_offload_large_reads, + required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, + {"secure_endpoint_offload_large_writes", + description_secure_endpoint_offload_large_writes, + additional_constraints_secure_endpoint_offload_large_writes, + required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, + {"secure_endpoint_read_coalescing", + description_secure_endpoint_read_coalescing, + additional_constraints_secure_endpoint_read_coalescing, + required_experiments_secure_endpoint_read_coalescing, 2, false, true}, + {"skip_clear_peer_on_cancellation", + description_skip_clear_peer_on_cancellation, + additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, + true}, + {"subchannel_connection_scaling", description_subchannel_connection_scaling, + additional_constraints_subchannel_connection_scaling, nullptr, 0, true, + true}, + {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, + additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, + {"tcp_rcv_lowat", description_tcp_rcv_lowat, + additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, + {"tsi_frame_protector_without_locks", + description_tsi_frame_protector_without_locks, + additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, + false, true}, + {"unconstrained_max_quota_buffer_size", + description_unconstrained_max_quota_buffer_size, + additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, + false, true}, + {"use_call_event_engine_in_completion_queue", + description_use_call_event_engine_in_completion_queue, + additional_constraints_use_call_event_engine_in_completion_queue, nullptr, + 0, false, true}, + {"v2_non_owning_waker_implementation", + description_v2_non_owning_waker_implementation, + additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, + false, true}, + {"verbose_channelz_connection_logging", + description_verbose_channelz_connection_logging, + additional_constraints_verbose_channelz_connection_logging, nullptr, 0, + false, true}, + {"wildcard_ip_expansion_restriction", + description_wildcard_ip_expansion_restriction, + additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, + false, true}, + {"xds_server_filter_chain_per_route", + description_xds_server_filter_chain_per_route, + additional_constraints_xds_server_filter_chain_per_route, + required_experiments_xds_server_filter_chain_per_route, 1, false, true}, }; } // namespace grpc_core #elif defined(GPR_WINDOWS) namespace { -const char* const description_buffer_list_deletion_prep = "Gate the removal of old TCP timestamp collection mechanism."; +const char* const description_buffer_list_deletion_prep = + "Gate the removal of old TCP timestamp collection mechanism."; const char* const additional_constraints_buffer_list_deletion_prep = "{}"; -const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; +const char* const description_call_tracer_in_transport = + "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const description_call_tracer_send_initial_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; -const char* const additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = "{}"; -const char* const description_call_tracer_send_trailing_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; -const char* const additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = "{}"; -const char* const description_callv3_batch_validation = "If enabled, perform validations on receiving a new batch."; +const char* const + description_call_tracer_send_initial_metadata_is_an_annotation = + "Use the new annotation-based CallTracer API."; +const char* const + additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = + "{}"; +const char* const + description_call_tracer_send_trailing_metadata_is_an_annotation = + "Use the new annotation-based CallTracer API."; +const char* const + additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = + "{}"; +const char* const description_callv3_batch_validation = + "If enabled, perform validations on receiving a new batch."; const char* const additional_constraints_callv3_batch_validation = "{}"; -const char* const description_chaotic_good_framing_layer = "Enable the chaotic good framing layer."; +const char* const description_chaotic_good_framing_layer = + "Enable the chaotic good framing layer."; const char* const additional_constraints_chaotic_good_framing_layer = "{}"; -const char* const description_chaotic_good_send_supported_features = "Send supported features in chaotic good settings frames."; -const char* const additional_constraints_chaotic_good_send_supported_features = "{}"; -const char* const description_custom_frame_check = "Adding checks to custom HTTP2 frame."; +const char* const description_chaotic_good_send_supported_features = + "Send supported features in chaotic good settings frames."; +const char* const additional_constraints_chaotic_good_send_supported_features = + "{}"; +const char* const description_custom_frame_check = + "Adding checks to custom HTTP2 frame."; const char* const additional_constraints_custom_frame_check = "{}"; -const char* const description_event_engine_client = "Use EventEngine clients instead of iomgr's grpc_tcp_client"; +const char* const description_event_engine_client = + "Use EventEngine clients instead of iomgr's grpc_tcp_client"; const char* const additional_constraints_event_engine_client = "{}"; -const char* const description_event_engine_dns = "If set, use EventEngine DNSResolver for client channel resolution"; +const char* const description_event_engine_dns = + "If set, use EventEngine DNSResolver for client channel resolution"; const char* const additional_constraints_event_engine_dns = "{}"; -const char* const description_event_engine_dns_non_client_channel = "If set, use EventEngine DNSResolver in other places besides client channel."; -const char* const additional_constraints_event_engine_dns_non_client_channel = "{}"; -const char* const description_event_engine_fork = "Enables event engine fork handling, including onfork events and file descriptor generations"; +const char* const description_event_engine_dns_non_client_channel = + "If set, use EventEngine DNSResolver in other places besides client " + "channel."; +const char* const additional_constraints_event_engine_dns_non_client_channel = + "{}"; +const char* const description_event_engine_fork = + "Enables event engine fork handling, including onfork events and file " + "descriptor generations"; const char* const additional_constraints_event_engine_fork = "{}"; -const char* const description_event_engine_listener = "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; +const char* const description_event_engine_listener = + "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; const char* const additional_constraints_event_engine_listener = "{}"; -const char* const description_event_engine_callback_cq = "Use EventEngine instead of the CallbackAlternativeCQ."; +const char* const description_event_engine_callback_cq = + "Use EventEngine instead of the CallbackAlternativeCQ."; const char* const additional_constraints_event_engine_callback_cq = "{}"; -const uint8_t required_experiments_event_engine_callback_cq[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_event_engine_for_all_other_endpoints = "Use EventEngine endpoints for all call sites, including direct uses of grpc_tcp_create."; -const char* const additional_constraints_event_engine_for_all_other_endpoints = "{}"; -const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineDns),static_cast(grpc_core::kExperimentIdEventEngineDnsNonClientChannel),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_fail_recv_metadata_on_deadline_exceeded = "Fail recv initial metadata when the deadline is exceeded."; -const char* const additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; -const char* const description_free_large_allocator = "If set, return all free bytes from a \042big\042 allocator"; +const uint8_t required_experiments_event_engine_callback_cq[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_event_engine_for_all_other_endpoints = + "Use EventEngine endpoints for all call sites, including direct uses of " + "grpc_tcp_create."; +const char* const additional_constraints_event_engine_for_all_other_endpoints = + "{}"; +const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineDns), + static_cast( + grpc_core::kExperimentIdEventEngineDnsNonClientChannel), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_fail_recv_metadata_on_deadline_exceeded = + "Fail recv initial metadata when the deadline is exceeded."; +const char* const + additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; +const char* const description_free_large_allocator = + "If set, return all free bytes from a \042big\042 allocator"; const char* const additional_constraints_free_large_allocator = "{}"; -const char* const description_fuse_filters = "If set, individual filters are merged into fused filters"; +const char* const description_fuse_filters = + "If set, individual filters are merged into fused filters"; const char* const additional_constraints_fuse_filters = "{}"; -const char* const description_h2_max_deallocating_streams_headroom = "Separate allocated max concurrent streams."; -const char* const additional_constraints_h2_max_deallocating_streams_headroom = "{}"; -const char* const description_inproc_cancel_stream = "If set, cancel inproc stream inside the transport mutex."; +const char* const description_h2_max_deallocating_streams_headroom = + "Separate allocated max concurrent streams."; +const char* const additional_constraints_h2_max_deallocating_streams_headroom = + "{}"; +const char* const description_inproc_cancel_stream = + "If set, cancel inproc stream inside the transport mutex."; const char* const additional_constraints_inproc_cancel_stream = "{}"; -const char* const description_keep_alive_ping_timer_batch = "Avoid explicitly cancelling the keepalive timer. Instead adjust the callback to re-schedule itself to the next ping interval."; +const char* const description_keep_alive_ping_timer_batch = + "Avoid explicitly cancelling the keepalive timer. Instead adjust the " + "callback to re-schedule itself to the next ping interval."; const char* const additional_constraints_keep_alive_ping_timer_batch = "{}"; -const char* const description_local_connector_secure = "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections."; +const char* const description_local_connector_secure = + "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP " + "connections."; const char* const additional_constraints_local_connector_secure = "{}"; const char* const description_memory_optimization_01 = "Memory Optimization"; const char* const additional_constraints_memory_optimization_01 = "{}"; const char* const description_memory_optimization_02 = "Memory Optimization 02"; const char* const additional_constraints_memory_optimization_02 = "{}"; -const char* const description_message_size_refactoring = "Refactoring the message size config parsing."; +const char* const description_message_size_refactoring = + "Refactoring the message size config parsing."; const char* const additional_constraints_message_size_refactoring = "{}"; -const char* const description_metadata_outstanding_token_refactor = "Refactor ClientInitialMetadataOutstandingToken."; -const char* const additional_constraints_metadata_outstanding_token_refactor = "{}"; -const char* const description_metadata_publish_to_app_tag = "Publish metadata to the app using the kPublishToApp metadata field."; +const char* const description_metadata_outstanding_token_refactor = + "Refactor ClientInitialMetadataOutstandingToken."; +const char* const additional_constraints_metadata_outstanding_token_refactor = + "{}"; +const char* const description_metadata_publish_to_app_tag = + "Publish metadata to the app using the kPublishToApp metadata field."; const char* const additional_constraints_metadata_publish_to_app_tag = "{}"; -const char* const description_monitoring_experiment = "Placeholder experiment to prove/disprove our monitoring is working"; +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_optimization_01 = "Optimization"; const char* const additional_constraints_optimization_01 = "{}"; @@ -305,204 +597,447 @@ const char* const description_optimization_05 = "Optimization"; const char* const additional_constraints_optimization_05 = "{}"; const char* const description_optimization_06 = "Optimization"; const char* const additional_constraints_optimization_06 = "{}"; -const char* const description_otel_export_telemetry_domains = "Export telemetry domains in OpenTelemetry metrics."; +const char* const description_otel_export_telemetry_domains = + "Export telemetry domains in OpenTelemetry metrics."; const char* const additional_constraints_otel_export_telemetry_domains = "{}"; -const char* const description_ph2_client = "Use promises for the http2 client transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test PH2 Client with CHTTP2 Server."; +const char* const description_ph2_client = + "Use promises for the http2 client transport. We have kept client and " + "server transport experiments separate to help with smoother roll outs. " + "When this flag is enabled for the test suites, it would test PH2 Client " + "with CHTTP2 Server."; const char* const additional_constraints_ph2_client = "{}"; -const char* const description_ph2_client_server = "This is a combination of ph2_server and ph2_client experiments. When this flag is enabled for the test suites, it would test PH2 Client with PH2 Server. We will NEVER be rolling out this experiment, because the roll out would be done using ph2_server and ph2_client. This experiment MUST be deleted when either ph2_server or ph2_client experiments are deleted."; +const char* const description_ph2_client_server = + "This is a combination of ph2_server and ph2_client experiments. When this " + "flag is enabled for the test suites, it would test PH2 Client with PH2 " + "Server. We will NEVER be rolling out this experiment, because the roll " + "out would be done using ph2_server and ph2_client. This experiment MUST " + "be deleted when either ph2_server or ph2_client experiments are deleted."; const char* const additional_constraints_ph2_client_server = "{}"; -const char* const description_ph2_perf_01 = "Different performance experiments for PH2 Transport"; +const char* const description_ph2_perf_01 = + "Different performance experiments for PH2 Transport"; const char* const additional_constraints_ph2_perf_01 = "{}"; -const char* const description_ph2_server = "Use promises for the http2 server transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test CHTTP2 Client with PH2 Server."; +const char* const description_ph2_server = + "Use promises for the http2 server transport. We have kept client and " + "server transport experiments separate to help with smoother roll outs. " + "When this flag is enabled for the test suites, it would test CHTTP2 " + "Client with PH2 Server."; const char* const additional_constraints_ph2_server = "{}"; -const char* const description_pick_first_ignore_empty_updates = "Ignore empty resolutions in pick_first (delete)"; +const char* const description_pick_first_ignore_empty_updates = + "Ignore empty resolutions in pick_first (delete)"; const char* const additional_constraints_pick_first_ignore_empty_updates = "{}"; -const char* const description_pipelined_read_secure_endpoint = "Enable pipelined reads for EventEngine secure endpoints"; +const char* const description_pipelined_read_secure_endpoint = + "Enable pipelined reads for EventEngine secure endpoints"; const char* const additional_constraints_pipelined_read_secure_endpoint = "{}"; -const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_pollset_alternative = "Code outside iomgr that relies directly on pollsets will use non-pollset alternatives when enabled."; +const uint8_t required_experiments_pipelined_read_secure_endpoint[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_pollset_alternative = + "Code outside iomgr that relies directly on pollsets will use non-pollset " + "alternatives when enabled."; const char* const additional_constraints_pollset_alternative = "{}"; -const uint8_t required_experiments_pollset_alternative[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_prioritize_finished_requests = "Prioritize flushing out finished requests over other in-flight requests during transport writes."; +const uint8_t required_experiments_pollset_alternative[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_prioritize_finished_requests = + "Prioritize flushing out finished requests over other in-flight requests " + "during transport writes."; const char* const additional_constraints_prioritize_finished_requests = "{}"; -const char* const description_promise_based_inproc_transport = "Use call-v3 for the in-process transport."; +const char* const description_promise_based_inproc_transport = + "Use call-v3 for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_promise_batch_cleanup_on_cancel = "Fix completion queue tag handling during promise batch cancellation."; +const char* const description_promise_batch_cleanup_on_cancel = + "Fix completion queue tag handling during promise batch cancellation."; const char* const additional_constraints_promise_batch_cleanup_on_cancel = "{}"; -const char* const description_promise_filter_send_cancel_metadata = "Enables sending all trailing metadata fields from server side promise-based filters upon stream cancellation."; -const char* const additional_constraints_promise_filter_send_cancel_metadata = "{}"; -const char* const description_recv_message_filter_bypass_fix = "Receive message bypass happen if trailing metadata is received while Server Initial Metadata is getting processed."; +const char* const description_promise_filter_send_cancel_metadata = + "Enables sending all trailing metadata fields from server side " + "promise-based filters upon stream cancellation."; +const char* const additional_constraints_promise_filter_send_cancel_metadata = + "{}"; +const char* const description_recv_message_filter_bypass_fix = + "Receive message bypass happen if trailing metadata is received while " + "Server Initial Metadata is getting processed."; const char* const additional_constraints_recv_message_filter_bypass_fix = "{}"; const char* const description_retry_in_callv3 = "Support retries with call-v3"; const char* const additional_constraints_retry_in_callv3 = "{}"; -const char* const description_return_preexisting_errors = "Return errors that exist before the start of the call in RunHandler."; +const char* const description_return_preexisting_errors = + "Return errors that exist before the start of the call in RunHandler."; const char* const additional_constraints_return_preexisting_errors = "{}"; -const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; -const char* const additional_constraints_schedule_cancellation_over_write = "{}"; -const char* const description_secure_endpoint_offload_large_reads = "If a large read needs to be decrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_reads = "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_offload_large_writes = "If a large read write to be encrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_writes = "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_read_coalescing = "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; +const char* const description_schedule_cancellation_over_write = + "Allow cancellation op to be scheduled over a write"; +const char* const additional_constraints_schedule_cancellation_over_write = + "{}"; +const char* const description_secure_endpoint_offload_large_reads = + "If a large read needs to be decrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_reads = + "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_offload_large_writes = + "If a large read write to be encrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_writes = + "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_read_coalescing = + "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; const char* const additional_constraints_secure_endpoint_read_coalescing = "{}"; -const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_skip_clear_peer_on_cancellation = "If set, skips clearing of peer string on call cancellation."; +const uint8_t required_experiments_secure_endpoint_read_coalescing[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_skip_clear_peer_on_cancellation = + "If set, skips clearing of peer string on call cancellation."; const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}"; -const char* const description_subchannel_connection_scaling = "Subchannel connection scaling support."; +const char* const description_subchannel_connection_scaling = + "Subchannel connection scaling support."; const char* const additional_constraints_subchannel_connection_scaling = "{}"; -const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP would not indicate completion of a read operation until a specified number of bytes have been read over the socket. Buffers are also allocated according to estimated RPC sizes."; +const char* const description_tcp_frame_size_tuning = + "If set, enables TCP to use RPC size estimation made by higher layers. TCP " + "would not indicate completion of a read operation until a specified " + "number of bytes have been read over the socket. Buffers are also " + "allocated according to estimated RPC sizes."; const char* const additional_constraints_tcp_frame_size_tuning = "{}"; -const char* const description_tcp_rcv_lowat = "Use SO_RCVLOWAT to avoid wakeups on the read path."; +const char* const description_tcp_rcv_lowat = + "Use SO_RCVLOWAT to avoid wakeups on the read path."; const char* const additional_constraints_tcp_rcv_lowat = "{}"; -const char* const description_tsi_frame_protector_without_locks = "Do not hold locks while using the tsi_frame_protector."; -const char* const additional_constraints_tsi_frame_protector_without_locks = "{}"; -const char* const description_unconstrained_max_quota_buffer_size = "Discard the cap on the max free pool size for one memory allocator"; -const char* const additional_constraints_unconstrained_max_quota_buffer_size = "{}"; -const char* const description_use_call_event_engine_in_completion_queue = "Use the call event engine to run callbacks in completion queue."; -const char* const additional_constraints_use_call_event_engine_in_completion_queue = "{}"; -const char* const description_v2_non_owning_waker_implementation = "Use non-owning wakers in v2 filter bridge."; -const char* const additional_constraints_v2_non_owning_waker_implementation = "{}"; -const char* const description_verbose_channelz_connection_logging = "Verbose logging of events into channelz during connection setup."; -const char* const additional_constraints_verbose_channelz_connection_logging = "{}"; -const char* const description_wildcard_ip_expansion_restriction = "If set, adds optional restriction on when to expand wildcard IPs."; -const char* const additional_constraints_wildcard_ip_expansion_restriction = "{}"; -const char* const description_xds_server_filter_chain_per_route = "xDS servers use a separate filter chain for each route."; -const char* const additional_constraints_xds_server_filter_chain_per_route = "{}"; -const uint8_t required_experiments_xds_server_filter_chain_per_route[] = {static_cast(grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; +const char* const description_tsi_frame_protector_without_locks = + "Do not hold locks while using the tsi_frame_protector."; +const char* const additional_constraints_tsi_frame_protector_without_locks = + "{}"; +const char* const description_unconstrained_max_quota_buffer_size = + "Discard the cap on the max free pool size for one memory allocator"; +const char* const additional_constraints_unconstrained_max_quota_buffer_size = + "{}"; +const char* const description_use_call_event_engine_in_completion_queue = + "Use the call event engine to run callbacks in completion queue."; +const char* const + additional_constraints_use_call_event_engine_in_completion_queue = "{}"; +const char* const description_v2_non_owning_waker_implementation = + "Use non-owning wakers in v2 filter bridge."; +const char* const additional_constraints_v2_non_owning_waker_implementation = + "{}"; +const char* const description_verbose_channelz_connection_logging = + "Verbose logging of events into channelz during connection setup."; +const char* const additional_constraints_verbose_channelz_connection_logging = + "{}"; +const char* const description_wildcard_ip_expansion_restriction = + "If set, adds optional restriction on when to expand wildcard IPs."; +const char* const additional_constraints_wildcard_ip_expansion_restriction = + "{}"; +const char* const description_xds_server_filter_chain_per_route = + "xDS servers use a separate filter chain for each route."; +const char* const additional_constraints_xds_server_filter_chain_per_route = + "{}"; +const uint8_t required_experiments_xds_server_filter_chain_per_route[] = { + static_cast( + grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; } // namespace namespace grpc_core { const ExperimentMetadata g_experiment_metadata[] = { - {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, - {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, - {"call_tracer_send_initial_metadata_is_an_annotation", description_call_tracer_send_initial_metadata_is_an_annotation, additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, nullptr, 0, true, true}, - {"call_tracer_send_trailing_metadata_is_an_annotation", description_call_tracer_send_trailing_metadata_is_an_annotation, additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, nullptr, 0, false, true}, - {"callv3_batch_validation", description_callv3_batch_validation, additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, - {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, false}, - {"chaotic_good_send_supported_features", description_chaotic_good_send_supported_features, additional_constraints_chaotic_good_send_supported_features, nullptr, 0, true, true}, - {"custom_frame_check", description_custom_frame_check, additional_constraints_custom_frame_check, nullptr, 0, true, false}, - {"event_engine_client", description_event_engine_client, additional_constraints_event_engine_client, nullptr, 0, true, false}, - {"event_engine_dns", description_event_engine_dns, additional_constraints_event_engine_dns, nullptr, 0, true, false}, - {"event_engine_dns_non_client_channel", description_event_engine_dns_non_client_channel, additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, true, false}, - {"event_engine_fork", description_event_engine_fork, additional_constraints_event_engine_fork, nullptr, 0, true, false}, - {"event_engine_listener", description_event_engine_listener, additional_constraints_event_engine_listener, nullptr, 0, true, false}, - {"event_engine_callback_cq", description_event_engine_callback_cq, additional_constraints_event_engine_callback_cq, required_experiments_event_engine_callback_cq, 2, true, true}, - {"event_engine_for_all_other_endpoints", description_event_engine_for_all_other_endpoints, additional_constraints_event_engine_for_all_other_endpoints, required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, - {"fail_recv_metadata_on_deadline_exceeded", description_fail_recv_metadata_on_deadline_exceeded, additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, false, false}, - {"free_large_allocator", description_free_large_allocator, additional_constraints_free_large_allocator, nullptr, 0, false, true}, - {"fuse_filters", description_fuse_filters, additional_constraints_fuse_filters, nullptr, 0, false, false}, - {"h2_max_deallocating_streams_headroom", description_h2_max_deallocating_streams_headroom, additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, false, true}, - {"inproc_cancel_stream", description_inproc_cancel_stream, additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, - {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, true}, - {"local_connector_secure", description_local_connector_secure, additional_constraints_local_connector_secure, nullptr, 0, false, true}, - {"memory_optimization_01", description_memory_optimization_01, additional_constraints_memory_optimization_01, nullptr, 0, false, false}, - {"memory_optimization_02", description_memory_optimization_02, additional_constraints_memory_optimization_02, nullptr, 0, false, false}, - {"message_size_refactoring", description_message_size_refactoring, additional_constraints_message_size_refactoring, nullptr, 0, false, true}, - {"metadata_outstanding_token_refactor", description_metadata_outstanding_token_refactor, additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, false, true}, - {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, true}, - {"monitoring_experiment", description_monitoring_experiment, additional_constraints_monitoring_experiment, nullptr, 0, true, true}, - {"optimization_01", description_optimization_01, additional_constraints_optimization_01, nullptr, 0, true, true}, - {"optimization_02", description_optimization_02, additional_constraints_optimization_02, nullptr, 0, true, true}, - {"optimization_03", description_optimization_03, additional_constraints_optimization_03, nullptr, 0, true, true}, - {"optimization_04", description_optimization_04, additional_constraints_optimization_04, nullptr, 0, true, true}, - {"optimization_05", description_optimization_05, additional_constraints_optimization_05, nullptr, 0, false, true}, - {"optimization_06", description_optimization_06, additional_constraints_optimization_06, nullptr, 0, false, true}, - {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, true}, - {"ph2_client", description_ph2_client, additional_constraints_ph2_client, nullptr, 0, false, true}, - {"ph2_client_server", description_ph2_client_server, additional_constraints_ph2_client_server, nullptr, 0, false, true}, - {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, nullptr, 0, false, true}, - {"ph2_server", description_ph2_server, additional_constraints_ph2_server, nullptr, 0, false, true}, - {"pick_first_ignore_empty_updates", description_pick_first_ignore_empty_updates, additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, true}, - {"pipelined_read_secure_endpoint", description_pipelined_read_secure_endpoint, additional_constraints_pipelined_read_secure_endpoint, required_experiments_pipelined_read_secure_endpoint, 2, false, false}, - {"pollset_alternative", description_pollset_alternative, additional_constraints_pollset_alternative, required_experiments_pollset_alternative, 2, false, false}, - {"prioritize_finished_requests", description_prioritize_finished_requests, additional_constraints_prioritize_finished_requests, nullptr, 0, false, true}, - {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, - {"promise_batch_cleanup_on_cancel", description_promise_batch_cleanup_on_cancel, additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, true}, - {"promise_filter_send_cancel_metadata", description_promise_filter_send_cancel_metadata, additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, true, true}, - {"recv_message_filter_bypass_fix", description_recv_message_filter_bypass_fix, additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, true}, - {"retry_in_callv3", description_retry_in_callv3, additional_constraints_retry_in_callv3, nullptr, 0, false, true}, - {"return_preexisting_errors", description_return_preexisting_errors, additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, - {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, - {"secure_endpoint_offload_large_reads", description_secure_endpoint_offload_large_reads, additional_constraints_secure_endpoint_offload_large_reads, required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, - {"secure_endpoint_offload_large_writes", description_secure_endpoint_offload_large_writes, additional_constraints_secure_endpoint_offload_large_writes, required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, - {"secure_endpoint_read_coalescing", description_secure_endpoint_read_coalescing, additional_constraints_secure_endpoint_read_coalescing, required_experiments_secure_endpoint_read_coalescing, 2, false, true}, - {"skip_clear_peer_on_cancellation", description_skip_clear_peer_on_cancellation, additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, true}, - {"subchannel_connection_scaling", description_subchannel_connection_scaling, additional_constraints_subchannel_connection_scaling, nullptr, 0, true, true}, - {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, - {"tcp_rcv_lowat", description_tcp_rcv_lowat, additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, - {"tsi_frame_protector_without_locks", description_tsi_frame_protector_without_locks, additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, false, true}, - {"unconstrained_max_quota_buffer_size", description_unconstrained_max_quota_buffer_size, additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, false, true}, - {"use_call_event_engine_in_completion_queue", description_use_call_event_engine_in_completion_queue, additional_constraints_use_call_event_engine_in_completion_queue, nullptr, 0, false, true}, - {"v2_non_owning_waker_implementation", description_v2_non_owning_waker_implementation, additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, false, true}, - {"verbose_channelz_connection_logging", description_verbose_channelz_connection_logging, additional_constraints_verbose_channelz_connection_logging, nullptr, 0, false, true}, - {"wildcard_ip_expansion_restriction", description_wildcard_ip_expansion_restriction, additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, false, true}, - {"xds_server_filter_chain_per_route", description_xds_server_filter_chain_per_route, additional_constraints_xds_server_filter_chain_per_route, required_experiments_xds_server_filter_chain_per_route, 1, false, true}, + {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, + additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, + {"call_tracer_in_transport", description_call_tracer_in_transport, + additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, + {"call_tracer_send_initial_metadata_is_an_annotation", + description_call_tracer_send_initial_metadata_is_an_annotation, + additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, + nullptr, 0, true, true}, + {"call_tracer_send_trailing_metadata_is_an_annotation", + description_call_tracer_send_trailing_metadata_is_an_annotation, + additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, + nullptr, 0, false, true}, + {"callv3_batch_validation", description_callv3_batch_validation, + additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, + {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, + additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, + false}, + {"chaotic_good_send_supported_features", + description_chaotic_good_send_supported_features, + additional_constraints_chaotic_good_send_supported_features, nullptr, 0, + true, true}, + {"custom_frame_check", description_custom_frame_check, + additional_constraints_custom_frame_check, nullptr, 0, true, false}, + {"event_engine_client", description_event_engine_client, + additional_constraints_event_engine_client, nullptr, 0, true, false}, + {"event_engine_dns", description_event_engine_dns, + additional_constraints_event_engine_dns, nullptr, 0, true, false}, + {"event_engine_dns_non_client_channel", + description_event_engine_dns_non_client_channel, + additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, + true, false}, + {"event_engine_fork", description_event_engine_fork, + additional_constraints_event_engine_fork, nullptr, 0, true, false}, + {"event_engine_listener", description_event_engine_listener, + additional_constraints_event_engine_listener, nullptr, 0, true, false}, + {"event_engine_callback_cq", description_event_engine_callback_cq, + additional_constraints_event_engine_callback_cq, + required_experiments_event_engine_callback_cq, 2, true, true}, + {"event_engine_for_all_other_endpoints", + description_event_engine_for_all_other_endpoints, + additional_constraints_event_engine_for_all_other_endpoints, + required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, + {"fail_recv_metadata_on_deadline_exceeded", + description_fail_recv_metadata_on_deadline_exceeded, + additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, + false, false}, + {"free_large_allocator", description_free_large_allocator, + additional_constraints_free_large_allocator, nullptr, 0, false, true}, + {"fuse_filters", description_fuse_filters, + additional_constraints_fuse_filters, nullptr, 0, false, false}, + {"h2_max_deallocating_streams_headroom", + description_h2_max_deallocating_streams_headroom, + additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, + false, true}, + {"inproc_cancel_stream", description_inproc_cancel_stream, + additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, + {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, + additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, + true}, + {"local_connector_secure", description_local_connector_secure, + additional_constraints_local_connector_secure, nullptr, 0, false, true}, + {"memory_optimization_01", description_memory_optimization_01, + additional_constraints_memory_optimization_01, nullptr, 0, false, false}, + {"memory_optimization_02", description_memory_optimization_02, + additional_constraints_memory_optimization_02, nullptr, 0, false, false}, + {"message_size_refactoring", description_message_size_refactoring, + additional_constraints_message_size_refactoring, nullptr, 0, false, true}, + {"metadata_outstanding_token_refactor", + description_metadata_outstanding_token_refactor, + additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, + false, true}, + {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, + additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, + true}, + {"monitoring_experiment", description_monitoring_experiment, + additional_constraints_monitoring_experiment, nullptr, 0, true, true}, + {"optimization_01", description_optimization_01, + additional_constraints_optimization_01, nullptr, 0, true, true}, + {"optimization_02", description_optimization_02, + additional_constraints_optimization_02, nullptr, 0, true, true}, + {"optimization_03", description_optimization_03, + additional_constraints_optimization_03, nullptr, 0, true, true}, + {"optimization_04", description_optimization_04, + additional_constraints_optimization_04, nullptr, 0, true, true}, + {"optimization_05", description_optimization_05, + additional_constraints_optimization_05, nullptr, 0, false, true}, + {"optimization_06", description_optimization_06, + additional_constraints_optimization_06, nullptr, 0, false, true}, + {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, + additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, + true}, + {"ph2_client", description_ph2_client, additional_constraints_ph2_client, + nullptr, 0, false, true}, + {"ph2_client_server", description_ph2_client_server, + additional_constraints_ph2_client_server, nullptr, 0, false, true}, + {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, + nullptr, 0, false, true}, + {"ph2_server", description_ph2_server, additional_constraints_ph2_server, + nullptr, 0, false, true}, + {"pick_first_ignore_empty_updates", + description_pick_first_ignore_empty_updates, + additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, + true}, + {"pipelined_read_secure_endpoint", + description_pipelined_read_secure_endpoint, + additional_constraints_pipelined_read_secure_endpoint, + required_experiments_pipelined_read_secure_endpoint, 2, false, false}, + {"pollset_alternative", description_pollset_alternative, + additional_constraints_pollset_alternative, + required_experiments_pollset_alternative, 2, false, false}, + {"prioritize_finished_requests", description_prioritize_finished_requests, + additional_constraints_prioritize_finished_requests, nullptr, 0, false, + true}, + {"promise_based_inproc_transport", + description_promise_based_inproc_transport, + additional_constraints_promise_based_inproc_transport, nullptr, 0, false, + false}, + {"promise_batch_cleanup_on_cancel", + description_promise_batch_cleanup_on_cancel, + additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, + true}, + {"promise_filter_send_cancel_metadata", + description_promise_filter_send_cancel_metadata, + additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, + true, true}, + {"recv_message_filter_bypass_fix", + description_recv_message_filter_bypass_fix, + additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, + true}, + {"retry_in_callv3", description_retry_in_callv3, + additional_constraints_retry_in_callv3, nullptr, 0, false, true}, + {"return_preexisting_errors", description_return_preexisting_errors, + additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, + {"schedule_cancellation_over_write", + description_schedule_cancellation_over_write, + additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, + true}, + {"secure_endpoint_offload_large_reads", + description_secure_endpoint_offload_large_reads, + additional_constraints_secure_endpoint_offload_large_reads, + required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, + {"secure_endpoint_offload_large_writes", + description_secure_endpoint_offload_large_writes, + additional_constraints_secure_endpoint_offload_large_writes, + required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, + {"secure_endpoint_read_coalescing", + description_secure_endpoint_read_coalescing, + additional_constraints_secure_endpoint_read_coalescing, + required_experiments_secure_endpoint_read_coalescing, 2, false, true}, + {"skip_clear_peer_on_cancellation", + description_skip_clear_peer_on_cancellation, + additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, + true}, + {"subchannel_connection_scaling", description_subchannel_connection_scaling, + additional_constraints_subchannel_connection_scaling, nullptr, 0, true, + true}, + {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, + additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, + {"tcp_rcv_lowat", description_tcp_rcv_lowat, + additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, + {"tsi_frame_protector_without_locks", + description_tsi_frame_protector_without_locks, + additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, + false, true}, + {"unconstrained_max_quota_buffer_size", + description_unconstrained_max_quota_buffer_size, + additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, + false, true}, + {"use_call_event_engine_in_completion_queue", + description_use_call_event_engine_in_completion_queue, + additional_constraints_use_call_event_engine_in_completion_queue, nullptr, + 0, false, true}, + {"v2_non_owning_waker_implementation", + description_v2_non_owning_waker_implementation, + additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, + false, true}, + {"verbose_channelz_connection_logging", + description_verbose_channelz_connection_logging, + additional_constraints_verbose_channelz_connection_logging, nullptr, 0, + false, true}, + {"wildcard_ip_expansion_restriction", + description_wildcard_ip_expansion_restriction, + additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, + false, true}, + {"xds_server_filter_chain_per_route", + description_xds_server_filter_chain_per_route, + additional_constraints_xds_server_filter_chain_per_route, + required_experiments_xds_server_filter_chain_per_route, 1, false, true}, }; } // namespace grpc_core #else namespace { -const char* const description_buffer_list_deletion_prep = "Gate the removal of old TCP timestamp collection mechanism."; +const char* const description_buffer_list_deletion_prep = + "Gate the removal of old TCP timestamp collection mechanism."; const char* const additional_constraints_buffer_list_deletion_prep = "{}"; -const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; +const char* const description_call_tracer_in_transport = + "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const description_call_tracer_send_initial_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; -const char* const additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = "{}"; -const char* const description_call_tracer_send_trailing_metadata_is_an_annotation = "Use the new annotation-based CallTracer API."; -const char* const additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = "{}"; -const char* const description_callv3_batch_validation = "If enabled, perform validations on receiving a new batch."; +const char* const + description_call_tracer_send_initial_metadata_is_an_annotation = + "Use the new annotation-based CallTracer API."; +const char* const + additional_constraints_call_tracer_send_initial_metadata_is_an_annotation = + "{}"; +const char* const + description_call_tracer_send_trailing_metadata_is_an_annotation = + "Use the new annotation-based CallTracer API."; +const char* const + additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation = + "{}"; +const char* const description_callv3_batch_validation = + "If enabled, perform validations on receiving a new batch."; const char* const additional_constraints_callv3_batch_validation = "{}"; -const char* const description_chaotic_good_framing_layer = "Enable the chaotic good framing layer."; +const char* const description_chaotic_good_framing_layer = + "Enable the chaotic good framing layer."; const char* const additional_constraints_chaotic_good_framing_layer = "{}"; -const char* const description_chaotic_good_send_supported_features = "Send supported features in chaotic good settings frames."; -const char* const additional_constraints_chaotic_good_send_supported_features = "{}"; -const char* const description_custom_frame_check = "Adding checks to custom HTTP2 frame."; +const char* const description_chaotic_good_send_supported_features = + "Send supported features in chaotic good settings frames."; +const char* const additional_constraints_chaotic_good_send_supported_features = + "{}"; +const char* const description_custom_frame_check = + "Adding checks to custom HTTP2 frame."; const char* const additional_constraints_custom_frame_check = "{}"; -const char* const description_event_engine_client = "Use EventEngine clients instead of iomgr's grpc_tcp_client"; +const char* const description_event_engine_client = + "Use EventEngine clients instead of iomgr's grpc_tcp_client"; const char* const additional_constraints_event_engine_client = "{}"; -const char* const description_event_engine_dns = "If set, use EventEngine DNSResolver for client channel resolution"; +const char* const description_event_engine_dns = + "If set, use EventEngine DNSResolver for client channel resolution"; const char* const additional_constraints_event_engine_dns = "{}"; -const char* const description_event_engine_dns_non_client_channel = "If set, use EventEngine DNSResolver in other places besides client channel."; -const char* const additional_constraints_event_engine_dns_non_client_channel = "{}"; -const char* const description_event_engine_fork = "Enables event engine fork handling, including onfork events and file descriptor generations"; +const char* const description_event_engine_dns_non_client_channel = + "If set, use EventEngine DNSResolver in other places besides client " + "channel."; +const char* const additional_constraints_event_engine_dns_non_client_channel = + "{}"; +const char* const description_event_engine_fork = + "Enables event engine fork handling, including onfork events and file " + "descriptor generations"; const char* const additional_constraints_event_engine_fork = "{}"; -const char* const description_event_engine_listener = "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; +const char* const description_event_engine_listener = + "Use EventEngine listeners instead of iomgr's grpc_tcp_server"; const char* const additional_constraints_event_engine_listener = "{}"; -const char* const description_event_engine_callback_cq = "Use EventEngine instead of the CallbackAlternativeCQ."; +const char* const description_event_engine_callback_cq = + "Use EventEngine instead of the CallbackAlternativeCQ."; const char* const additional_constraints_event_engine_callback_cq = "{}"; -const uint8_t required_experiments_event_engine_callback_cq[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_event_engine_for_all_other_endpoints = "Use EventEngine endpoints for all call sites, including direct uses of grpc_tcp_create."; -const char* const additional_constraints_event_engine_for_all_other_endpoints = "{}"; -const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineDns),static_cast(grpc_core::kExperimentIdEventEngineDnsNonClientChannel),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_fail_recv_metadata_on_deadline_exceeded = "Fail recv initial metadata when the deadline is exceeded."; -const char* const additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; -const char* const description_free_large_allocator = "If set, return all free bytes from a \042big\042 allocator"; +const uint8_t required_experiments_event_engine_callback_cq[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_event_engine_for_all_other_endpoints = + "Use EventEngine endpoints for all call sites, including direct uses of " + "grpc_tcp_create."; +const char* const additional_constraints_event_engine_for_all_other_endpoints = + "{}"; +const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineDns), + static_cast( + grpc_core::kExperimentIdEventEngineDnsNonClientChannel), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_fail_recv_metadata_on_deadline_exceeded = + "Fail recv initial metadata when the deadline is exceeded."; +const char* const + additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}"; +const char* const description_free_large_allocator = + "If set, return all free bytes from a \042big\042 allocator"; const char* const additional_constraints_free_large_allocator = "{}"; -const char* const description_fuse_filters = "If set, individual filters are merged into fused filters"; +const char* const description_fuse_filters = + "If set, individual filters are merged into fused filters"; const char* const additional_constraints_fuse_filters = "{}"; -const char* const description_h2_max_deallocating_streams_headroom = "Separate allocated max concurrent streams."; -const char* const additional_constraints_h2_max_deallocating_streams_headroom = "{}"; -const char* const description_inproc_cancel_stream = "If set, cancel inproc stream inside the transport mutex."; +const char* const description_h2_max_deallocating_streams_headroom = + "Separate allocated max concurrent streams."; +const char* const additional_constraints_h2_max_deallocating_streams_headroom = + "{}"; +const char* const description_inproc_cancel_stream = + "If set, cancel inproc stream inside the transport mutex."; const char* const additional_constraints_inproc_cancel_stream = "{}"; -const char* const description_keep_alive_ping_timer_batch = "Avoid explicitly cancelling the keepalive timer. Instead adjust the callback to re-schedule itself to the next ping interval."; +const char* const description_keep_alive_ping_timer_batch = + "Avoid explicitly cancelling the keepalive timer. Instead adjust the " + "callback to re-schedule itself to the next ping interval."; const char* const additional_constraints_keep_alive_ping_timer_batch = "{}"; -const char* const description_local_connector_secure = "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections."; +const char* const description_local_connector_secure = + "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP " + "connections."; const char* const additional_constraints_local_connector_secure = "{}"; const char* const description_memory_optimization_01 = "Memory Optimization"; const char* const additional_constraints_memory_optimization_01 = "{}"; const char* const description_memory_optimization_02 = "Memory Optimization 02"; const char* const additional_constraints_memory_optimization_02 = "{}"; -const char* const description_message_size_refactoring = "Refactoring the message size config parsing."; +const char* const description_message_size_refactoring = + "Refactoring the message size config parsing."; const char* const additional_constraints_message_size_refactoring = "{}"; -const char* const description_metadata_outstanding_token_refactor = "Refactor ClientInitialMetadataOutstandingToken."; -const char* const additional_constraints_metadata_outstanding_token_refactor = "{}"; -const char* const description_metadata_publish_to_app_tag = "Publish metadata to the app using the kPublishToApp metadata field."; +const char* const description_metadata_outstanding_token_refactor = + "Refactor ClientInitialMetadataOutstandingToken."; +const char* const additional_constraints_metadata_outstanding_token_refactor = + "{}"; +const char* const description_metadata_publish_to_app_tag = + "Publish metadata to the app using the kPublishToApp metadata field."; const char* const additional_constraints_metadata_publish_to_app_tag = "{}"; -const char* const description_monitoring_experiment = "Placeholder experiment to prove/disprove our monitoring is working"; +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_optimization_01 = "Optimization"; const char* const additional_constraints_optimization_01 = "{}"; @@ -516,141 +1051,334 @@ const char* const description_optimization_05 = "Optimization"; const char* const additional_constraints_optimization_05 = "{}"; const char* const description_optimization_06 = "Optimization"; const char* const additional_constraints_optimization_06 = "{}"; -const char* const description_otel_export_telemetry_domains = "Export telemetry domains in OpenTelemetry metrics."; +const char* const description_otel_export_telemetry_domains = + "Export telemetry domains in OpenTelemetry metrics."; const char* const additional_constraints_otel_export_telemetry_domains = "{}"; -const char* const description_ph2_client = "Use promises for the http2 client transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test PH2 Client with CHTTP2 Server."; +const char* const description_ph2_client = + "Use promises for the http2 client transport. We have kept client and " + "server transport experiments separate to help with smoother roll outs. " + "When this flag is enabled for the test suites, it would test PH2 Client " + "with CHTTP2 Server."; const char* const additional_constraints_ph2_client = "{}"; -const char* const description_ph2_client_server = "This is a combination of ph2_server and ph2_client experiments. When this flag is enabled for the test suites, it would test PH2 Client with PH2 Server. We will NEVER be rolling out this experiment, because the roll out would be done using ph2_server and ph2_client. This experiment MUST be deleted when either ph2_server or ph2_client experiments are deleted."; +const char* const description_ph2_client_server = + "This is a combination of ph2_server and ph2_client experiments. When this " + "flag is enabled for the test suites, it would test PH2 Client with PH2 " + "Server. We will NEVER be rolling out this experiment, because the roll " + "out would be done using ph2_server and ph2_client. This experiment MUST " + "be deleted when either ph2_server or ph2_client experiments are deleted."; const char* const additional_constraints_ph2_client_server = "{}"; -const char* const description_ph2_perf_01 = "Different performance experiments for PH2 Transport"; +const char* const description_ph2_perf_01 = + "Different performance experiments for PH2 Transport"; const char* const additional_constraints_ph2_perf_01 = "{}"; -const char* const description_ph2_server = "Use promises for the http2 server transport. We have kept client and server transport experiments separate to help with smoother roll outs. When this flag is enabled for the test suites, it would test CHTTP2 Client with PH2 Server."; +const char* const description_ph2_server = + "Use promises for the http2 server transport. We have kept client and " + "server transport experiments separate to help with smoother roll outs. " + "When this flag is enabled for the test suites, it would test CHTTP2 " + "Client with PH2 Server."; const char* const additional_constraints_ph2_server = "{}"; -const char* const description_pick_first_ignore_empty_updates = "Ignore empty resolutions in pick_first (delete)"; +const char* const description_pick_first_ignore_empty_updates = + "Ignore empty resolutions in pick_first (delete)"; const char* const additional_constraints_pick_first_ignore_empty_updates = "{}"; -const char* const description_pipelined_read_secure_endpoint = "Enable pipelined reads for EventEngine secure endpoints"; +const char* const description_pipelined_read_secure_endpoint = + "Enable pipelined reads for EventEngine secure endpoints"; const char* const additional_constraints_pipelined_read_secure_endpoint = "{}"; -const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_pollset_alternative = "Code outside iomgr that relies directly on pollsets will use non-pollset alternatives when enabled."; +const uint8_t required_experiments_pipelined_read_secure_endpoint[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_pollset_alternative = + "Code outside iomgr that relies directly on pollsets will use non-pollset " + "alternatives when enabled."; const char* const additional_constraints_pollset_alternative = "{}"; -const uint8_t required_experiments_pollset_alternative[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_prioritize_finished_requests = "Prioritize flushing out finished requests over other in-flight requests during transport writes."; +const uint8_t required_experiments_pollset_alternative[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_prioritize_finished_requests = + "Prioritize flushing out finished requests over other in-flight requests " + "during transport writes."; const char* const additional_constraints_prioritize_finished_requests = "{}"; -const char* const description_promise_based_inproc_transport = "Use call-v3 for the in-process transport."; +const char* const description_promise_based_inproc_transport = + "Use call-v3 for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; -const char* const description_promise_batch_cleanup_on_cancel = "Fix completion queue tag handling during promise batch cancellation."; +const char* const description_promise_batch_cleanup_on_cancel = + "Fix completion queue tag handling during promise batch cancellation."; const char* const additional_constraints_promise_batch_cleanup_on_cancel = "{}"; -const char* const description_promise_filter_send_cancel_metadata = "Enables sending all trailing metadata fields from server side promise-based filters upon stream cancellation."; -const char* const additional_constraints_promise_filter_send_cancel_metadata = "{}"; -const char* const description_recv_message_filter_bypass_fix = "Receive message bypass happen if trailing metadata is received while Server Initial Metadata is getting processed."; +const char* const description_promise_filter_send_cancel_metadata = + "Enables sending all trailing metadata fields from server side " + "promise-based filters upon stream cancellation."; +const char* const additional_constraints_promise_filter_send_cancel_metadata = + "{}"; +const char* const description_recv_message_filter_bypass_fix = + "Receive message bypass happen if trailing metadata is received while " + "Server Initial Metadata is getting processed."; const char* const additional_constraints_recv_message_filter_bypass_fix = "{}"; const char* const description_retry_in_callv3 = "Support retries with call-v3"; const char* const additional_constraints_retry_in_callv3 = "{}"; -const char* const description_return_preexisting_errors = "Return errors that exist before the start of the call in RunHandler."; +const char* const description_return_preexisting_errors = + "Return errors that exist before the start of the call in RunHandler."; const char* const additional_constraints_return_preexisting_errors = "{}"; -const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; -const char* const additional_constraints_schedule_cancellation_over_write = "{}"; -const char* const description_secure_endpoint_offload_large_reads = "If a large read needs to be decrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_reads = "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_offload_large_writes = "If a large read write to be encrypted, use a separate thread."; -const char* const additional_constraints_secure_endpoint_offload_large_writes = "{}"; -const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_secure_endpoint_read_coalescing = "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; +const char* const description_schedule_cancellation_over_write = + "Allow cancellation op to be scheduled over a write"; +const char* const additional_constraints_schedule_cancellation_over_write = + "{}"; +const char* const description_secure_endpoint_offload_large_reads = + "If a large read needs to be decrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_reads = + "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_offload_large_writes = + "If a large read write to be encrypted, use a separate thread."; +const char* const additional_constraints_secure_endpoint_offload_large_writes = + "{}"; +const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_secure_endpoint_read_coalescing = + "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided."; const char* const additional_constraints_secure_endpoint_read_coalescing = "{}"; -const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {static_cast(grpc_core::kExperimentIdEventEngineClient),static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_skip_clear_peer_on_cancellation = "If set, skips clearing of peer string on call cancellation."; +const uint8_t required_experiments_secure_endpoint_read_coalescing[] = { + static_cast(grpc_core::kExperimentIdEventEngineClient), + static_cast(grpc_core::kExperimentIdEventEngineListener)}; +const char* const description_skip_clear_peer_on_cancellation = + "If set, skips clearing of peer string on call cancellation."; const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}"; -const char* const description_subchannel_connection_scaling = "Subchannel connection scaling support."; +const char* const description_subchannel_connection_scaling = + "Subchannel connection scaling support."; const char* const additional_constraints_subchannel_connection_scaling = "{}"; -const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP would not indicate completion of a read operation until a specified number of bytes have been read over the socket. Buffers are also allocated according to estimated RPC sizes."; +const char* const description_tcp_frame_size_tuning = + "If set, enables TCP to use RPC size estimation made by higher layers. TCP " + "would not indicate completion of a read operation until a specified " + "number of bytes have been read over the socket. Buffers are also " + "allocated according to estimated RPC sizes."; const char* const additional_constraints_tcp_frame_size_tuning = "{}"; -const char* const description_tcp_rcv_lowat = "Use SO_RCVLOWAT to avoid wakeups on the read path."; +const char* const description_tcp_rcv_lowat = + "Use SO_RCVLOWAT to avoid wakeups on the read path."; const char* const additional_constraints_tcp_rcv_lowat = "{}"; -const char* const description_tsi_frame_protector_without_locks = "Do not hold locks while using the tsi_frame_protector."; -const char* const additional_constraints_tsi_frame_protector_without_locks = "{}"; -const char* const description_unconstrained_max_quota_buffer_size = "Discard the cap on the max free pool size for one memory allocator"; -const char* const additional_constraints_unconstrained_max_quota_buffer_size = "{}"; -const char* const description_use_call_event_engine_in_completion_queue = "Use the call event engine to run callbacks in completion queue."; -const char* const additional_constraints_use_call_event_engine_in_completion_queue = "{}"; -const char* const description_v2_non_owning_waker_implementation = "Use non-owning wakers in v2 filter bridge."; -const char* const additional_constraints_v2_non_owning_waker_implementation = "{}"; -const char* const description_verbose_channelz_connection_logging = "Verbose logging of events into channelz during connection setup."; -const char* const additional_constraints_verbose_channelz_connection_logging = "{}"; -const char* const description_wildcard_ip_expansion_restriction = "If set, adds optional restriction on when to expand wildcard IPs."; -const char* const additional_constraints_wildcard_ip_expansion_restriction = "{}"; -const char* const description_xds_server_filter_chain_per_route = "xDS servers use a separate filter chain for each route."; -const char* const additional_constraints_xds_server_filter_chain_per_route = "{}"; -const uint8_t required_experiments_xds_server_filter_chain_per_route[] = {static_cast(grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; +const char* const description_tsi_frame_protector_without_locks = + "Do not hold locks while using the tsi_frame_protector."; +const char* const additional_constraints_tsi_frame_protector_without_locks = + "{}"; +const char* const description_unconstrained_max_quota_buffer_size = + "Discard the cap on the max free pool size for one memory allocator"; +const char* const additional_constraints_unconstrained_max_quota_buffer_size = + "{}"; +const char* const description_use_call_event_engine_in_completion_queue = + "Use the call event engine to run callbacks in completion queue."; +const char* const + additional_constraints_use_call_event_engine_in_completion_queue = "{}"; +const char* const description_v2_non_owning_waker_implementation = + "Use non-owning wakers in v2 filter bridge."; +const char* const additional_constraints_v2_non_owning_waker_implementation = + "{}"; +const char* const description_verbose_channelz_connection_logging = + "Verbose logging of events into channelz during connection setup."; +const char* const additional_constraints_verbose_channelz_connection_logging = + "{}"; +const char* const description_wildcard_ip_expansion_restriction = + "If set, adds optional restriction on when to expand wildcard IPs."; +const char* const additional_constraints_wildcard_ip_expansion_restriction = + "{}"; +const char* const description_xds_server_filter_chain_per_route = + "xDS servers use a separate filter chain for each route."; +const char* const additional_constraints_xds_server_filter_chain_per_route = + "{}"; +const uint8_t required_experiments_xds_server_filter_chain_per_route[] = { + static_cast( + grpc_core::kExperimentIdV2NonOwningWakerImplementation)}; } // namespace namespace grpc_core { const ExperimentMetadata g_experiment_metadata[] = { - {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, - {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, - {"call_tracer_send_initial_metadata_is_an_annotation", description_call_tracer_send_initial_metadata_is_an_annotation, additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, nullptr, 0, true, true}, - {"call_tracer_send_trailing_metadata_is_an_annotation", description_call_tracer_send_trailing_metadata_is_an_annotation, additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, nullptr, 0, false, true}, - {"callv3_batch_validation", description_callv3_batch_validation, additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, - {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, false}, - {"chaotic_good_send_supported_features", description_chaotic_good_send_supported_features, additional_constraints_chaotic_good_send_supported_features, nullptr, 0, true, true}, - {"custom_frame_check", description_custom_frame_check, additional_constraints_custom_frame_check, nullptr, 0, true, false}, - {"event_engine_client", description_event_engine_client, additional_constraints_event_engine_client, nullptr, 0, true, false}, - {"event_engine_dns", description_event_engine_dns, additional_constraints_event_engine_dns, nullptr, 0, true, false}, - {"event_engine_dns_non_client_channel", description_event_engine_dns_non_client_channel, additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, true, false}, - {"event_engine_fork", description_event_engine_fork, additional_constraints_event_engine_fork, nullptr, 0, true, false}, - {"event_engine_listener", description_event_engine_listener, additional_constraints_event_engine_listener, nullptr, 0, true, false}, - {"event_engine_callback_cq", description_event_engine_callback_cq, additional_constraints_event_engine_callback_cq, required_experiments_event_engine_callback_cq, 2, true, true}, - {"event_engine_for_all_other_endpoints", description_event_engine_for_all_other_endpoints, additional_constraints_event_engine_for_all_other_endpoints, required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, - {"fail_recv_metadata_on_deadline_exceeded", description_fail_recv_metadata_on_deadline_exceeded, additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, false, false}, - {"free_large_allocator", description_free_large_allocator, additional_constraints_free_large_allocator, nullptr, 0, false, true}, - {"fuse_filters", description_fuse_filters, additional_constraints_fuse_filters, nullptr, 0, false, false}, - {"h2_max_deallocating_streams_headroom", description_h2_max_deallocating_streams_headroom, additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, false, true}, - {"inproc_cancel_stream", description_inproc_cancel_stream, additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, - {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, true}, - {"local_connector_secure", description_local_connector_secure, additional_constraints_local_connector_secure, nullptr, 0, false, true}, - {"memory_optimization_01", description_memory_optimization_01, additional_constraints_memory_optimization_01, nullptr, 0, false, false}, - {"memory_optimization_02", description_memory_optimization_02, additional_constraints_memory_optimization_02, nullptr, 0, false, false}, - {"message_size_refactoring", description_message_size_refactoring, additional_constraints_message_size_refactoring, nullptr, 0, false, true}, - {"metadata_outstanding_token_refactor", description_metadata_outstanding_token_refactor, additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, false, true}, - {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, true}, - {"monitoring_experiment", description_monitoring_experiment, additional_constraints_monitoring_experiment, nullptr, 0, true, true}, - {"optimization_01", description_optimization_01, additional_constraints_optimization_01, nullptr, 0, true, true}, - {"optimization_02", description_optimization_02, additional_constraints_optimization_02, nullptr, 0, true, true}, - {"optimization_03", description_optimization_03, additional_constraints_optimization_03, nullptr, 0, true, true}, - {"optimization_04", description_optimization_04, additional_constraints_optimization_04, nullptr, 0, true, true}, - {"optimization_05", description_optimization_05, additional_constraints_optimization_05, nullptr, 0, false, true}, - {"optimization_06", description_optimization_06, additional_constraints_optimization_06, nullptr, 0, false, true}, - {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, true}, - {"ph2_client", description_ph2_client, additional_constraints_ph2_client, nullptr, 0, false, true}, - {"ph2_client_server", description_ph2_client_server, additional_constraints_ph2_client_server, nullptr, 0, false, true}, - {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, nullptr, 0, false, true}, - {"ph2_server", description_ph2_server, additional_constraints_ph2_server, nullptr, 0, false, true}, - {"pick_first_ignore_empty_updates", description_pick_first_ignore_empty_updates, additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, true}, - {"pipelined_read_secure_endpoint", description_pipelined_read_secure_endpoint, additional_constraints_pipelined_read_secure_endpoint, required_experiments_pipelined_read_secure_endpoint, 2, false, false}, - {"pollset_alternative", description_pollset_alternative, additional_constraints_pollset_alternative, required_experiments_pollset_alternative, 2, false, false}, - {"prioritize_finished_requests", description_prioritize_finished_requests, additional_constraints_prioritize_finished_requests, nullptr, 0, false, true}, - {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, - {"promise_batch_cleanup_on_cancel", description_promise_batch_cleanup_on_cancel, additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, true}, - {"promise_filter_send_cancel_metadata", description_promise_filter_send_cancel_metadata, additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, true, true}, - {"recv_message_filter_bypass_fix", description_recv_message_filter_bypass_fix, additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, true}, - {"retry_in_callv3", description_retry_in_callv3, additional_constraints_retry_in_callv3, nullptr, 0, false, true}, - {"return_preexisting_errors", description_return_preexisting_errors, additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, - {"schedule_cancellation_over_write", description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, - {"secure_endpoint_offload_large_reads", description_secure_endpoint_offload_large_reads, additional_constraints_secure_endpoint_offload_large_reads, required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, - {"secure_endpoint_offload_large_writes", description_secure_endpoint_offload_large_writes, additional_constraints_secure_endpoint_offload_large_writes, required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, - {"secure_endpoint_read_coalescing", description_secure_endpoint_read_coalescing, additional_constraints_secure_endpoint_read_coalescing, required_experiments_secure_endpoint_read_coalescing, 2, false, true}, - {"skip_clear_peer_on_cancellation", description_skip_clear_peer_on_cancellation, additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, true}, - {"subchannel_connection_scaling", description_subchannel_connection_scaling, additional_constraints_subchannel_connection_scaling, nullptr, 0, true, true}, - {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, - {"tcp_rcv_lowat", description_tcp_rcv_lowat, additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, - {"tsi_frame_protector_without_locks", description_tsi_frame_protector_without_locks, additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, false, true}, - {"unconstrained_max_quota_buffer_size", description_unconstrained_max_quota_buffer_size, additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, false, true}, - {"use_call_event_engine_in_completion_queue", description_use_call_event_engine_in_completion_queue, additional_constraints_use_call_event_engine_in_completion_queue, nullptr, 0, false, true}, - {"v2_non_owning_waker_implementation", description_v2_non_owning_waker_implementation, additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, false, true}, - {"verbose_channelz_connection_logging", description_verbose_channelz_connection_logging, additional_constraints_verbose_channelz_connection_logging, nullptr, 0, false, true}, - {"wildcard_ip_expansion_restriction", description_wildcard_ip_expansion_restriction, additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, false, true}, - {"xds_server_filter_chain_per_route", description_xds_server_filter_chain_per_route, additional_constraints_xds_server_filter_chain_per_route, required_experiments_xds_server_filter_chain_per_route, 1, false, true}, + {"buffer_list_deletion_prep", description_buffer_list_deletion_prep, + additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true}, + {"call_tracer_in_transport", description_call_tracer_in_transport, + additional_constraints_call_tracer_in_transport, nullptr, 0, true, false}, + {"call_tracer_send_initial_metadata_is_an_annotation", + description_call_tracer_send_initial_metadata_is_an_annotation, + additional_constraints_call_tracer_send_initial_metadata_is_an_annotation, + nullptr, 0, true, true}, + {"call_tracer_send_trailing_metadata_is_an_annotation", + description_call_tracer_send_trailing_metadata_is_an_annotation, + additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation, + nullptr, 0, false, true}, + {"callv3_batch_validation", description_callv3_batch_validation, + additional_constraints_callv3_batch_validation, nullptr, 0, true, true}, + {"chaotic_good_framing_layer", description_chaotic_good_framing_layer, + additional_constraints_chaotic_good_framing_layer, nullptr, 0, true, + false}, + {"chaotic_good_send_supported_features", + description_chaotic_good_send_supported_features, + additional_constraints_chaotic_good_send_supported_features, nullptr, 0, + true, true}, + {"custom_frame_check", description_custom_frame_check, + additional_constraints_custom_frame_check, nullptr, 0, true, false}, + {"event_engine_client", description_event_engine_client, + additional_constraints_event_engine_client, nullptr, 0, true, false}, + {"event_engine_dns", description_event_engine_dns, + additional_constraints_event_engine_dns, nullptr, 0, true, false}, + {"event_engine_dns_non_client_channel", + description_event_engine_dns_non_client_channel, + additional_constraints_event_engine_dns_non_client_channel, nullptr, 0, + true, false}, + {"event_engine_fork", description_event_engine_fork, + additional_constraints_event_engine_fork, nullptr, 0, true, false}, + {"event_engine_listener", description_event_engine_listener, + additional_constraints_event_engine_listener, nullptr, 0, true, false}, + {"event_engine_callback_cq", description_event_engine_callback_cq, + additional_constraints_event_engine_callback_cq, + required_experiments_event_engine_callback_cq, 2, true, true}, + {"event_engine_for_all_other_endpoints", + description_event_engine_for_all_other_endpoints, + additional_constraints_event_engine_for_all_other_endpoints, + required_experiments_event_engine_for_all_other_endpoints, 4, true, false}, + {"fail_recv_metadata_on_deadline_exceeded", + description_fail_recv_metadata_on_deadline_exceeded, + additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0, + false, false}, + {"free_large_allocator", description_free_large_allocator, + additional_constraints_free_large_allocator, nullptr, 0, false, true}, + {"fuse_filters", description_fuse_filters, + additional_constraints_fuse_filters, nullptr, 0, false, false}, + {"h2_max_deallocating_streams_headroom", + description_h2_max_deallocating_streams_headroom, + additional_constraints_h2_max_deallocating_streams_headroom, nullptr, 0, + false, true}, + {"inproc_cancel_stream", description_inproc_cancel_stream, + additional_constraints_inproc_cancel_stream, nullptr, 0, true, true}, + {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch, + additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false, + true}, + {"local_connector_secure", description_local_connector_secure, + additional_constraints_local_connector_secure, nullptr, 0, false, true}, + {"memory_optimization_01", description_memory_optimization_01, + additional_constraints_memory_optimization_01, nullptr, 0, false, false}, + {"memory_optimization_02", description_memory_optimization_02, + additional_constraints_memory_optimization_02, nullptr, 0, false, false}, + {"message_size_refactoring", description_message_size_refactoring, + additional_constraints_message_size_refactoring, nullptr, 0, false, true}, + {"metadata_outstanding_token_refactor", + description_metadata_outstanding_token_refactor, + additional_constraints_metadata_outstanding_token_refactor, nullptr, 0, + false, true}, + {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag, + additional_constraints_metadata_publish_to_app_tag, nullptr, 0, false, + true}, + {"monitoring_experiment", description_monitoring_experiment, + additional_constraints_monitoring_experiment, nullptr, 0, true, true}, + {"optimization_01", description_optimization_01, + additional_constraints_optimization_01, nullptr, 0, true, true}, + {"optimization_02", description_optimization_02, + additional_constraints_optimization_02, nullptr, 0, true, true}, + {"optimization_03", description_optimization_03, + additional_constraints_optimization_03, nullptr, 0, true, true}, + {"optimization_04", description_optimization_04, + additional_constraints_optimization_04, nullptr, 0, true, true}, + {"optimization_05", description_optimization_05, + additional_constraints_optimization_05, nullptr, 0, false, true}, + {"optimization_06", description_optimization_06, + additional_constraints_optimization_06, nullptr, 0, false, true}, + {"otel_export_telemetry_domains", description_otel_export_telemetry_domains, + additional_constraints_otel_export_telemetry_domains, nullptr, 0, false, + true}, + {"ph2_client", description_ph2_client, additional_constraints_ph2_client, + nullptr, 0, false, true}, + {"ph2_client_server", description_ph2_client_server, + additional_constraints_ph2_client_server, nullptr, 0, false, true}, + {"ph2_perf_01", description_ph2_perf_01, additional_constraints_ph2_perf_01, + nullptr, 0, false, true}, + {"ph2_server", description_ph2_server, additional_constraints_ph2_server, + nullptr, 0, false, true}, + {"pick_first_ignore_empty_updates", + description_pick_first_ignore_empty_updates, + additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false, + true}, + {"pipelined_read_secure_endpoint", + description_pipelined_read_secure_endpoint, + additional_constraints_pipelined_read_secure_endpoint, + required_experiments_pipelined_read_secure_endpoint, 2, false, false}, + {"pollset_alternative", description_pollset_alternative, + additional_constraints_pollset_alternative, + required_experiments_pollset_alternative, 2, false, false}, + {"prioritize_finished_requests", description_prioritize_finished_requests, + additional_constraints_prioritize_finished_requests, nullptr, 0, false, + true}, + {"promise_based_inproc_transport", + description_promise_based_inproc_transport, + additional_constraints_promise_based_inproc_transport, nullptr, 0, false, + false}, + {"promise_batch_cleanup_on_cancel", + description_promise_batch_cleanup_on_cancel, + additional_constraints_promise_batch_cleanup_on_cancel, nullptr, 0, true, + true}, + {"promise_filter_send_cancel_metadata", + description_promise_filter_send_cancel_metadata, + additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0, + true, true}, + {"recv_message_filter_bypass_fix", + description_recv_message_filter_bypass_fix, + additional_constraints_recv_message_filter_bypass_fix, nullptr, 0, false, + true}, + {"retry_in_callv3", description_retry_in_callv3, + additional_constraints_retry_in_callv3, nullptr, 0, false, true}, + {"return_preexisting_errors", description_return_preexisting_errors, + additional_constraints_return_preexisting_errors, nullptr, 0, true, true}, + {"schedule_cancellation_over_write", + description_schedule_cancellation_over_write, + additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, + true}, + {"secure_endpoint_offload_large_reads", + description_secure_endpoint_offload_large_reads, + additional_constraints_secure_endpoint_offload_large_reads, + required_experiments_secure_endpoint_offload_large_reads, 2, false, true}, + {"secure_endpoint_offload_large_writes", + description_secure_endpoint_offload_large_writes, + additional_constraints_secure_endpoint_offload_large_writes, + required_experiments_secure_endpoint_offload_large_writes, 2, false, true}, + {"secure_endpoint_read_coalescing", + description_secure_endpoint_read_coalescing, + additional_constraints_secure_endpoint_read_coalescing, + required_experiments_secure_endpoint_read_coalescing, 2, false, true}, + {"skip_clear_peer_on_cancellation", + description_skip_clear_peer_on_cancellation, + additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false, + true}, + {"subchannel_connection_scaling", description_subchannel_connection_scaling, + additional_constraints_subchannel_connection_scaling, nullptr, 0, true, + true}, + {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, + additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, + {"tcp_rcv_lowat", description_tcp_rcv_lowat, + additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true}, + {"tsi_frame_protector_without_locks", + description_tsi_frame_protector_without_locks, + additional_constraints_tsi_frame_protector_without_locks, nullptr, 0, + false, true}, + {"unconstrained_max_quota_buffer_size", + description_unconstrained_max_quota_buffer_size, + additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0, + false, true}, + {"use_call_event_engine_in_completion_queue", + description_use_call_event_engine_in_completion_queue, + additional_constraints_use_call_event_engine_in_completion_queue, nullptr, + 0, false, true}, + {"v2_non_owning_waker_implementation", + description_v2_non_owning_waker_implementation, + additional_constraints_v2_non_owning_waker_implementation, nullptr, 0, + false, true}, + {"verbose_channelz_connection_logging", + description_verbose_channelz_connection_logging, + additional_constraints_verbose_channelz_connection_logging, nullptr, 0, + false, true}, + {"wildcard_ip_expansion_restriction", + description_wildcard_ip_expansion_restriction, + additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0, + false, true}, + {"xds_server_filter_chain_per_route", + description_xds_server_filter_chain_per_route, + additional_constraints_xds_server_filter_chain_per_route, + required_experiments_xds_server_filter_chain_per_route, 1, false, true}, }; } // namespace grpc_core diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index 1359949d96b00..661df3cce2146 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -61,8 +61,12 @@ inline bool IsBufferListDeletionPrepEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return true; } -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return false; } +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { + return true; +} +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { + return false; +} #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION inline bool IsCallv3BatchValidationEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER @@ -150,8 +154,12 @@ inline bool IsBufferListDeletionPrepEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return true; } -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return false; } +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { + return true; +} +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { + return false; +} #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION inline bool IsCallv3BatchValidationEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER @@ -239,8 +247,12 @@ inline bool IsBufferListDeletionPrepEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return true; } -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return false; } +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { + return true; +} +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { + return false; +} #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION inline bool IsCallv3BatchValidationEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER @@ -393,133 +405,264 @@ enum ExperimentIds { kNumExperiments }; #define GRPC_EXPERIMENT_IS_INCLUDED_BUFFER_LIST_DELETION_PREP -inline bool IsBufferListDeletionPrepEnabled() { return IsExperimentEnabled(); } +inline bool IsBufferListDeletionPrepEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT -inline bool IsCallTracerInTransportEnabled() { return IsExperimentEnabled(); } +inline bool IsCallTracerInTransportEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_INITIAL_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { return IsExperimentEnabled(); } +inline bool IsCallTracerSendInitialMetadataIsAnAnnotationEnabled() { + return IsExperimentEnabled< + kExperimentIdCallTracerSendInitialMetadataIsAnAnnotation>(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_SEND_TRAILING_METADATA_IS_AN_ANNOTATION -inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { return IsExperimentEnabled(); } +inline bool IsCallTracerSendTrailingMetadataIsAnAnnotationEnabled() { + return IsExperimentEnabled< + kExperimentIdCallTracerSendTrailingMetadataIsAnAnnotation>(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_CALLV3_BATCH_VALIDATION -inline bool IsCallv3BatchValidationEnabled() { return IsExperimentEnabled(); } +inline bool IsCallv3BatchValidationEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_FRAMING_LAYER -inline bool IsChaoticGoodFramingLayerEnabled() { return IsExperimentEnabled(); } +inline bool IsChaoticGoodFramingLayerEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_SEND_SUPPORTED_FEATURES -inline bool IsChaoticGoodSendSupportedFeaturesEnabled() { return IsExperimentEnabled(); } +inline bool IsChaoticGoodSendSupportedFeaturesEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_CUSTOM_FRAME_CHECK -inline bool IsCustomFrameCheckEnabled() { return IsExperimentEnabled(); } +inline bool IsCustomFrameCheckEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_CLIENT -inline bool IsEventEngineClientEnabled() { return IsExperimentEnabled(); } +inline bool IsEventEngineClientEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_DNS -inline bool IsEventEngineDnsEnabled() { return IsExperimentEnabled(); } +inline bool IsEventEngineDnsEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_DNS_NON_CLIENT_CHANNEL -inline bool IsEventEngineDnsNonClientChannelEnabled() { return IsExperimentEnabled(); } +inline bool IsEventEngineDnsNonClientChannelEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_FORK -inline bool IsEventEngineForkEnabled() { return IsExperimentEnabled(); } +inline bool IsEventEngineForkEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_LISTENER -inline bool IsEventEngineListenerEnabled() { return IsExperimentEnabled(); } +inline bool IsEventEngineListenerEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_CALLBACK_CQ -inline bool IsEventEngineCallbackCqEnabled() { return IsExperimentEnabled(); } +inline bool IsEventEngineCallbackCqEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_FOR_ALL_OTHER_ENDPOINTS -inline bool IsEventEngineForAllOtherEndpointsEnabled() { return IsExperimentEnabled(); } +inline bool IsEventEngineForAllOtherEndpointsEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_FAIL_RECV_METADATA_ON_DEADLINE_EXCEEDED -inline bool IsFailRecvMetadataOnDeadlineExceededEnabled() { return IsExperimentEnabled(); } +inline bool IsFailRecvMetadataOnDeadlineExceededEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_FREE_LARGE_ALLOCATOR -inline bool IsFreeLargeAllocatorEnabled() { return IsExperimentEnabled(); } +inline bool IsFreeLargeAllocatorEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_FUSE_FILTERS -inline bool IsFuseFiltersEnabled() { return IsExperimentEnabled(); } +inline bool IsFuseFiltersEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_H2_MAX_DEALLOCATING_STREAMS_HEADROOM -inline bool IsH2MaxDeallocatingStreamsHeadroomEnabled() { return IsExperimentEnabled(); } +inline bool IsH2MaxDeallocatingStreamsHeadroomEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_INPROC_CANCEL_STREAM -inline bool IsInprocCancelStreamEnabled() { return IsExperimentEnabled(); } +inline bool IsInprocCancelStreamEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_KEEP_ALIVE_PING_TIMER_BATCH -inline bool IsKeepAlivePingTimerBatchEnabled() { return IsExperimentEnabled(); } +inline bool IsKeepAlivePingTimerBatchEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_LOCAL_CONNECTOR_SECURE -inline bool IsLocalConnectorSecureEnabled() { return IsExperimentEnabled(); } +inline bool IsLocalConnectorSecureEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_MEMORY_OPTIMIZATION_01 -inline bool IsMemoryOptimization01Enabled() { return IsExperimentEnabled(); } +inline bool IsMemoryOptimization01Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_MEMORY_OPTIMIZATION_02 -inline bool IsMemoryOptimization02Enabled() { return IsExperimentEnabled(); } +inline bool IsMemoryOptimization02Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_MESSAGE_SIZE_REFACTORING -inline bool IsMessageSizeRefactoringEnabled() { return IsExperimentEnabled(); } +inline bool IsMessageSizeRefactoringEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_METADATA_OUTSTANDING_TOKEN_REFACTOR -inline bool IsMetadataOutstandingTokenRefactorEnabled() { return IsExperimentEnabled(); } +inline bool IsMetadataOutstandingTokenRefactorEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_METADATA_PUBLISH_TO_APP_TAG -inline bool IsMetadataPublishToAppTagEnabled() { return IsExperimentEnabled(); } +inline bool IsMetadataPublishToAppTagEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_MONITORING_EXPERIMENT -inline bool IsMonitoringExperimentEnabled() { return IsExperimentEnabled(); } +inline bool IsMonitoringExperimentEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_01 -inline bool IsOptimization01Enabled() { return IsExperimentEnabled(); } +inline bool IsOptimization01Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_02 -inline bool IsOptimization02Enabled() { return IsExperimentEnabled(); } +inline bool IsOptimization02Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_03 -inline bool IsOptimization03Enabled() { return IsExperimentEnabled(); } +inline bool IsOptimization03Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_04 -inline bool IsOptimization04Enabled() { return IsExperimentEnabled(); } +inline bool IsOptimization04Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_05 -inline bool IsOptimization05Enabled() { return IsExperimentEnabled(); } +inline bool IsOptimization05Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_OPTIMIZATION_06 -inline bool IsOptimization06Enabled() { return IsExperimentEnabled(); } +inline bool IsOptimization06Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_OTEL_EXPORT_TELEMETRY_DOMAINS -inline bool IsOtelExportTelemetryDomainsEnabled() { return IsExperimentEnabled(); } +inline bool IsOtelExportTelemetryDomainsEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_CLIENT -inline bool IsPh2ClientEnabled() { return IsExperimentEnabled(); } +inline bool IsPh2ClientEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_CLIENT_SERVER -inline bool IsPh2ClientServerEnabled() { return IsExperimentEnabled(); } +inline bool IsPh2ClientServerEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_PERF_01 -inline bool IsPh2Perf01Enabled() { return IsExperimentEnabled(); } +inline bool IsPh2Perf01Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PH2_SERVER -inline bool IsPh2ServerEnabled() { return IsExperimentEnabled(); } +inline bool IsPh2ServerEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_IGNORE_EMPTY_UPDATES -inline bool IsPickFirstIgnoreEmptyUpdatesEnabled() { return IsExperimentEnabled(); } +inline bool IsPickFirstIgnoreEmptyUpdatesEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PIPELINED_READ_SECURE_ENDPOINT -inline bool IsPipelinedReadSecureEndpointEnabled() { return IsExperimentEnabled(); } +inline bool IsPipelinedReadSecureEndpointEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_POLLSET_ALTERNATIVE -inline bool IsPollsetAlternativeEnabled() { return IsExperimentEnabled(); } +inline bool IsPollsetAlternativeEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PRIORITIZE_FINISHED_REQUESTS -inline bool IsPrioritizeFinishedRequestsEnabled() { return IsExperimentEnabled(); } +inline bool IsPrioritizeFinishedRequestsEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_INPROC_TRANSPORT -inline bool IsPromiseBasedInprocTransportEnabled() { return IsExperimentEnabled(); } +inline bool IsPromiseBasedInprocTransportEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BATCH_CLEANUP_ON_CANCEL -inline bool IsPromiseBatchCleanupOnCancelEnabled() { return IsExperimentEnabled(); } +inline bool IsPromiseBatchCleanupOnCancelEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_FILTER_SEND_CANCEL_METADATA -inline bool IsPromiseFilterSendCancelMetadataEnabled() { return IsExperimentEnabled(); } +inline bool IsPromiseFilterSendCancelMetadataEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_RECV_MESSAGE_FILTER_BYPASS_FIX -inline bool IsRecvMessageFilterBypassFixEnabled() { return IsExperimentEnabled(); } +inline bool IsRecvMessageFilterBypassFixEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_RETRY_IN_CALLV3 -inline bool IsRetryInCallv3Enabled() { return IsExperimentEnabled(); } +inline bool IsRetryInCallv3Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_RETURN_PREEXISTING_ERRORS -inline bool IsReturnPreexistingErrorsEnabled() { return IsExperimentEnabled(); } +inline bool IsReturnPreexistingErrorsEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_SCHEDULE_CANCELLATION_OVER_WRITE -inline bool IsScheduleCancellationOverWriteEnabled() { return IsExperimentEnabled(); } +inline bool IsScheduleCancellationOverWriteEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_SECURE_ENDPOINT_OFFLOAD_LARGE_READS -inline bool IsSecureEndpointOffloadLargeReadsEnabled() { return IsExperimentEnabled(); } +inline bool IsSecureEndpointOffloadLargeReadsEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_SECURE_ENDPOINT_OFFLOAD_LARGE_WRITES -inline bool IsSecureEndpointOffloadLargeWritesEnabled() { return IsExperimentEnabled(); } +inline bool IsSecureEndpointOffloadLargeWritesEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_SECURE_ENDPOINT_READ_COALESCING -inline bool IsSecureEndpointReadCoalescingEnabled() { return IsExperimentEnabled(); } +inline bool IsSecureEndpointReadCoalescingEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_SKIP_CLEAR_PEER_ON_CANCELLATION -inline bool IsSkipClearPeerOnCancellationEnabled() { return IsExperimentEnabled(); } +inline bool IsSkipClearPeerOnCancellationEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_SUBCHANNEL_CONNECTION_SCALING -inline bool IsSubchannelConnectionScalingEnabled() { return IsExperimentEnabled(); } +inline bool IsSubchannelConnectionScalingEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_TCP_FRAME_SIZE_TUNING -inline bool IsTcpFrameSizeTuningEnabled() { return IsExperimentEnabled(); } +inline bool IsTcpFrameSizeTuningEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_TCP_RCV_LOWAT -inline bool IsTcpRcvLowatEnabled() { return IsExperimentEnabled(); } +inline bool IsTcpRcvLowatEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_TSI_FRAME_PROTECTOR_WITHOUT_LOCKS -inline bool IsTsiFrameProtectorWithoutLocksEnabled() { return IsExperimentEnabled(); } +inline bool IsTsiFrameProtectorWithoutLocksEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_UNCONSTRAINED_MAX_QUOTA_BUFFER_SIZE -inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { return IsExperimentEnabled(); } +inline bool IsUnconstrainedMaxQuotaBufferSizeEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_USE_CALL_EVENT_ENGINE_IN_COMPLETION_QUEUE -inline bool IsUseCallEventEngineInCompletionQueueEnabled() { return IsExperimentEnabled(); } +inline bool IsUseCallEventEngineInCompletionQueueEnabled() { + return IsExperimentEnabled< + kExperimentIdUseCallEventEngineInCompletionQueue>(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_V2_NON_OWNING_WAKER_IMPLEMENTATION -inline bool IsV2NonOwningWakerImplementationEnabled() { return IsExperimentEnabled(); } +inline bool IsV2NonOwningWakerImplementationEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_VERBOSE_CHANNELZ_CONNECTION_LOGGING -inline bool IsVerboseChannelzConnectionLoggingEnabled() { return IsExperimentEnabled(); } +inline bool IsVerboseChannelzConnectionLoggingEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_WILDCARD_IP_EXPANSION_RESTRICTION -inline bool IsWildcardIpExpansionRestrictionEnabled() { return IsExperimentEnabled(); } +inline bool IsWildcardIpExpansionRestrictionEnabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_XDS_SERVER_FILTER_CHAIN_PER_ROUTE -inline bool IsXdsServerFilterChainPerRouteEnabled() { return IsExperimentEnabled(); } +inline bool IsXdsServerFilterChainPerRouteEnabled() { + return IsExperimentEnabled(); +} extern const ExperimentMetadata g_experiment_metadata[kNumExperiments]; diff --git a/test/core/experiments/experiments_test.cc b/test/core/experiments/experiments_test.cc index aa982e8fa4c28..da5fc6094ab30 100644 --- a/test/core/experiments/experiments_test.cc +++ b/test/core/experiments/experiments_test.cc @@ -14,115 +14,86 @@ // Auto generated by tools/codegen/core/gen_experiments.py +#include "test/core/experiments/fixtures/experiments.h" #include -#include "test/core/experiments/fixtures/experiments.h" - #include -#include "gtest/gtest.h" - #include "src/core/lib/experiments/config.h" +#include "gtest/gtest.h" #ifndef GRPC_EXPERIMENTS_ARE_FINAL #if defined(GRPC_CFSTREAM) -bool GetExperimentTestExperiment1ExpectedValue() { -return false; -} +bool GetExperimentTestExperiment1ExpectedValue() { return false; } -bool GetExperimentTestExperiment2ExpectedValue() { -return true; -} +bool GetExperimentTestExperiment2ExpectedValue() { return true; } bool GetExperimentTestExperiment3ExpectedValue() { - #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } -bool GetExperimentTestExperiment4ExpectedValue() { -return true; -} +bool GetExperimentTestExperiment4ExpectedValue() { return true; } -bool GetExperimentTestExperiment5ExpectedValue() { -return false; -} +bool GetExperimentTestExperiment5ExpectedValue() { return false; } #elif defined(GPR_WINDOWS) -bool GetExperimentTestExperiment1ExpectedValue() { -return false; -} +bool GetExperimentTestExperiment1ExpectedValue() { return false; } -bool GetExperimentTestExperiment2ExpectedValue() { -return false; -} +bool GetExperimentTestExperiment2ExpectedValue() { return false; } bool GetExperimentTestExperiment3ExpectedValue() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } -bool GetExperimentTestExperiment4ExpectedValue() { -return true; -} +bool GetExperimentTestExperiment4ExpectedValue() { return true; } -bool GetExperimentTestExperiment5ExpectedValue() { -return false; -} +bool GetExperimentTestExperiment5ExpectedValue() { return false; } #else bool GetExperimentTestExperiment1ExpectedValue() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } bool GetExperimentTestExperiment2ExpectedValue() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } bool GetExperimentTestExperiment3ExpectedValue() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } -bool GetExperimentTestExperiment4ExpectedValue() { -return false; -} +bool GetExperimentTestExperiment4ExpectedValue() { return false; } -bool GetExperimentTestExperiment5ExpectedValue() { -return false; -} +bool GetExperimentTestExperiment5ExpectedValue() { return false; } #endif TEST(ExperimentsTest, CheckExperimentValuesTest) { - ASSERT_EQ(grpc_core::IsTestExperiment1Enabled(), GetExperimentTestExperiment1ExpectedValue()); @@ -137,15 +108,13 @@ TEST(ExperimentsTest, CheckExperimentValuesTest) { ASSERT_EQ(grpc_core::IsTestExperiment5Enabled(), GetExperimentTestExperiment5ExpectedValue()); - } -#endif // GRPC_EXPERIMENTS_ARE_FINAL +#endif // GRPC_EXPERIMENTS_ARE_FINAL int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); grpc_core::LoadTestOnlyExperimentsFromMetadata( - grpc_core::g_test_experiment_metadata, grpc_core::kNumTestExperiments); + grpc_core::g_test_experiment_metadata, grpc_core::kNumTestExperiments); return RUN_ALL_TESTS(); } - diff --git a/test/core/experiments/fixtures/experiments.cc b/test/core/experiments/fixtures/experiments.cc index 5c53a46a85575..c95664dfae69d 100644 --- a/test/core/experiments/fixtures/experiments.cc +++ b/test/core/experiments/fixtures/experiments.cc @@ -14,10 +14,10 @@ // Auto generated by tools/codegen/core/gen_experiments.py -#include - #include "test/core/experiments/fixtures/experiments.h" +#include + #ifndef GRPC_EXPERIMENTS_ARE_FINAL #if defined(GRPC_CFSTREAM) @@ -42,11 +42,17 @@ const bool kDefaultForDebugOnly = true; namespace grpc_core { const ExperimentMetadata g_test_experiment_metadata[] = { - {"test_experiment_1", description_test_experiment_1, additional_constraints_test_experiment_1, nullptr, 0, false, true}, - {"test_experiment_2", description_test_experiment_2, additional_constraints_test_experiment_2, nullptr, 0, true, true}, - {"test_experiment_3", description_test_experiment_3, additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, true}, - {"test_experiment_4", description_test_experiment_4, additional_constraints_test_experiment_4, nullptr, 0, true, true}, - {"test_experiment_5", description_test_experiment_5, additional_constraints_test_experiment_5, nullptr, 0, false, true}, + {"test_experiment_1", description_test_experiment_1, + additional_constraints_test_experiment_1, nullptr, 0, false, true}, + {"test_experiment_2", description_test_experiment_2, + additional_constraints_test_experiment_2, nullptr, 0, true, true}, + {"test_experiment_3", description_test_experiment_3, + additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, + true}, + {"test_experiment_4", description_test_experiment_4, + additional_constraints_test_experiment_4, nullptr, 0, true, true}, + {"test_experiment_5", description_test_experiment_5, + additional_constraints_test_experiment_5, nullptr, 0, false, true}, }; } // namespace grpc_core @@ -73,11 +79,17 @@ const bool kDefaultForDebugOnly = true; namespace grpc_core { const ExperimentMetadata g_test_experiment_metadata[] = { - {"test_experiment_1", description_test_experiment_1, additional_constraints_test_experiment_1, nullptr, 0, false, true}, - {"test_experiment_2", description_test_experiment_2, additional_constraints_test_experiment_2, nullptr, 0, false, true}, - {"test_experiment_3", description_test_experiment_3, additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, true}, - {"test_experiment_4", description_test_experiment_4, additional_constraints_test_experiment_4, nullptr, 0, true, true}, - {"test_experiment_5", description_test_experiment_5, additional_constraints_test_experiment_5, nullptr, 0, false, true}, + {"test_experiment_1", description_test_experiment_1, + additional_constraints_test_experiment_1, nullptr, 0, false, true}, + {"test_experiment_2", description_test_experiment_2, + additional_constraints_test_experiment_2, nullptr, 0, false, true}, + {"test_experiment_3", description_test_experiment_3, + additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, + true}, + {"test_experiment_4", description_test_experiment_4, + additional_constraints_test_experiment_4, nullptr, 0, true, true}, + {"test_experiment_5", description_test_experiment_5, + additional_constraints_test_experiment_5, nullptr, 0, false, true}, }; } // namespace grpc_core @@ -104,11 +116,19 @@ const bool kDefaultForDebugOnly = true; namespace grpc_core { const ExperimentMetadata g_test_experiment_metadata[] = { - {"test_experiment_1", description_test_experiment_1, additional_constraints_test_experiment_1, nullptr, 0, kDefaultForDebugOnly, true}, - {"test_experiment_2", description_test_experiment_2, additional_constraints_test_experiment_2, nullptr, 0, kDefaultForDebugOnly, true}, - {"test_experiment_3", description_test_experiment_3, additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, true}, - {"test_experiment_4", description_test_experiment_4, additional_constraints_test_experiment_4, nullptr, 0, false, true}, - {"test_experiment_5", description_test_experiment_5, additional_constraints_test_experiment_5, nullptr, 0, false, true}, + {"test_experiment_1", description_test_experiment_1, + additional_constraints_test_experiment_1, nullptr, 0, kDefaultForDebugOnly, + true}, + {"test_experiment_2", description_test_experiment_2, + additional_constraints_test_experiment_2, nullptr, 0, kDefaultForDebugOnly, + true}, + {"test_experiment_3", description_test_experiment_3, + additional_constraints_test_experiment_3, nullptr, 0, kDefaultForDebugOnly, + true}, + {"test_experiment_4", description_test_experiment_4, + additional_constraints_test_experiment_4, nullptr, 0, false, true}, + {"test_experiment_5", description_test_experiment_5, + additional_constraints_test_experiment_5, nullptr, 0, false, true}, }; } // namespace grpc_core diff --git a/test/core/experiments/fixtures/experiments.h b/test/core/experiments/fixtures/experiments.h index 4c83ed86fff70..dd99b58e6287b 100644 --- a/test/core/experiments/fixtures/experiments.h +++ b/test/core/experiments/fixtures/experiments.h @@ -63,13 +63,13 @@ inline bool IsTestExperiment2Enabled() { return true; } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 #endif -inline bool IsTestExperiment3Enabled() { +inline bool IsTestExperiment3Enabled() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } +} #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_4 inline bool IsTestExperiment4Enabled() { return true; } inline bool IsTestExperiment5Enabled() { return false; } @@ -80,13 +80,13 @@ inline bool IsTestExperiment2Enabled() { return false; } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 #endif -inline bool IsTestExperiment3Enabled() { +inline bool IsTestExperiment3Enabled() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } +} #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_4 inline bool IsTestExperiment4Enabled() { return true; } inline bool IsTestExperiment5Enabled() { return false; } @@ -95,33 +95,33 @@ inline bool IsTestExperiment5Enabled() { return false; } #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_1 #endif -inline bool IsTestExperiment1Enabled() { +inline bool IsTestExperiment1Enabled() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } +} #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_2 #endif -inline bool IsTestExperiment2Enabled() { +inline bool IsTestExperiment2Enabled() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } +} #ifndef NDEBUG #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 #endif -inline bool IsTestExperiment3Enabled() { +inline bool IsTestExperiment3Enabled() { #ifdef NDEBUG -return false; + return false; #else -return true; + return true; #endif - } +} inline bool IsTestExperiment4Enabled() { return false; } inline bool IsTestExperiment5Enabled() { return false; } #endif @@ -136,15 +136,25 @@ enum ExperimentIds { kNumTestExperiments }; #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_1 -inline bool IsTestExperiment1Enabled() { return IsTestExperimentEnabled(); } +inline bool IsTestExperiment1Enabled() { + return IsTestExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_2 -inline bool IsTestExperiment2Enabled() { return IsTestExperimentEnabled(); } +inline bool IsTestExperiment2Enabled() { + return IsTestExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_3 -inline bool IsTestExperiment3Enabled() { return IsTestExperimentEnabled(); } +inline bool IsTestExperiment3Enabled() { + return IsTestExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_4 -inline bool IsTestExperiment4Enabled() { return IsTestExperimentEnabled(); } +inline bool IsTestExperiment4Enabled() { + return IsTestExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_TEST_EXPERIMENT_5 -inline bool IsTestExperiment5Enabled() { return IsTestExperimentEnabled(); } +inline bool IsTestExperiment5Enabled() { + return IsTestExperimentEnabled(); +} extern const ExperimentMetadata g_test_experiment_metadata[kNumTestExperiments]; diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 36b2cf00dfac8..54566efb1cc24 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -3336,7 +3336,6 @@ src/cpp/util/status.cc \ src/cpp/util/string_ref.cc \ src/cpp/util/time_cc.cc \ third_party/upb/upb/generated_code_support.h \ -third_party/utf8_range/utf8_validity.h \ third_party/xxhash/xxhash.h # This tag can be used to specify the character encoding of the source files From 680db9bc55e5332dbe59a061807478f452c8b96d Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 4 Aug 2026 01:56:50 +0530 Subject: [PATCH 28/29] buildgen: add utf8_validity.h to build_autogenerated.yaml and Doxyfile --- build_autogenerated.yaml | 1 + tools/doxygen/Doxyfile.c++.internal | 1 + 2 files changed, 2 insertions(+) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 04e99273eb104..bf23bd023f761 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -4250,6 +4250,7 @@ libs: - src/cpp/server/secure_server_credentials.h - src/cpp/server/thread_pool_interface.h - src/cpp/thread_manager/thread_manager.h + - third_party/utf8_range/utf8_validity.h src: - src/core/client_channel/virtual_channel.cc - src/cpp/client/call_context_registry.cc diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 54566efb1cc24..36b2cf00dfac8 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -3336,6 +3336,7 @@ src/cpp/util/status.cc \ src/cpp/util/string_ref.cc \ src/cpp/util/time_cc.cc \ third_party/upb/upb/generated_code_support.h \ +third_party/utf8_range/utf8_validity.h \ third_party/xxhash/xxhash.h # This tag can be used to specify the character encoding of the source files From 9f098b0f6267b6eaae3a30bc56449655400b2f9d Mon Sep 17 00:00:00 2001 From: AgraVator <81427947+AgraVator@users.noreply.github.com> Date: Mon, 3 Aug 2026 20:32:09 +0000 Subject: [PATCH 29/29] Automated change: Fix sanity tests --- CMakeLists.txt | 65 +++++++---------- MODULE.bazel | 1 - build_autogenerated.yaml | 70 ++++++++++--------- gRPC-C++.podspec | 4 ++ src/core/lib/debug/trace_flags.cc | 20 ++++-- .../grpcio_tests/tests/interop/client.py | 1 - .../tests/interop/otel_interop_helper.py | 5 +- test/cpp/interop/client.cc | 10 +-- test/cpp/interop/interop_server.cc | 1 - test/cpp/interop/otel_helper.cc | 5 +- test/cpp/interop/otlp_collector.cc | 11 +-- 11 files changed, 96 insertions(+), 97 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bd28d336abb1..b450360640312 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,6 +209,7 @@ set(gRPC_ABSL_USED_TARGETS absl_nullability absl_numeric_representation absl_optional + absl_overload absl_prefetch absl_random_bit_gen_ref absl_random_distributions @@ -5065,7 +5066,9 @@ target_link_libraries(grpc++ ${_gRPC_ALLTARGETS_LIBRARIES} absl::dynamic_annotations absl::prefetch + absl::fixed_array absl::layout + absl::overload absl::absl_check absl::absl_log absl::charset @@ -5813,7 +5816,9 @@ target_link_libraries(grpc++_unsecure ${_gRPC_ALLTARGETS_LIBRARIES} absl::dynamic_annotations absl::prefetch + absl::fixed_array absl::layout + absl::overload absl::absl_check absl::absl_log absl::charset @@ -12076,8 +12081,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) target_link_libraries(channelz_tool_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpcpp_channelz ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -12489,8 +12492,6 @@ target_include_directories(cli_call_test target_link_libraries(cli_call_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc++_test_util ) @@ -19836,8 +19837,6 @@ target_include_directories(grpc_cli target_link_libraries(grpc_cli ${_gRPC_ALLTARGETS_LIBRARIES} - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc++_test_config @@ -20622,8 +20621,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) target_link_libraries(grpc_tool_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++_reflection ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc++_test_config @@ -23176,6 +23173,9 @@ add_executable(interop_client ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h + src/cpp/ext/otel/otel_client_call_tracer.cc + src/cpp/ext/otel/otel_plugin.cc + src/cpp/ext/otel/otel_server_call_tracer.cc test/core/credentials/call/oauth2/oauth2_utils.cc test/cpp/interop/backend_metrics_lb_policy.cc test/cpp/interop/client.cc @@ -23211,16 +23211,11 @@ target_include_directories(interop_client target_link_libraries(interop_client ${_gRPC_ALLTARGETS_LIBRARIES} + opentelemetry-cpp::api + opentelemetry-cpp::trace grpc++_test_config grpc++_test_util ) -if(TARGET grpcpp_otel_plugin) - target_link_libraries(interop_client grpcpp_otel_plugin) -endif() -if(TARGET opentelemetry-cpp::otlp_grpc_exporter) - target_link_libraries(interop_client opentelemetry-cpp::otlp_grpc_exporter) -endif() - endif() @@ -23239,6 +23234,9 @@ add_executable(interop_server ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h + src/cpp/ext/otel/otel_client_call_tracer.cc + src/cpp/ext/otel/otel_plugin.cc + src/cpp/ext/otel/otel_server_call_tracer.cc src/cpp/server/orca/orca_service.cc test/cpp/interop/interop_server.cc test/cpp/interop/interop_server_bootstrap.cc @@ -23273,16 +23271,11 @@ target_include_directories(interop_server target_link_libraries(interop_server ${_gRPC_ALLTARGETS_LIBRARIES} + opentelemetry-cpp::api + opentelemetry-cpp::trace grpc++_test_config grpc++_test_util ) -if(TARGET grpcpp_otel_plugin) - target_link_libraries(interop_server grpcpp_otel_plugin) -endif() -if(TARGET opentelemetry-cpp::otlp_grpc_exporter) - target_link_libraries(interop_server opentelemetry-cpp::otlp_grpc_exporter) -endif() - endif() @@ -24200,8 +24193,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) target_link_libraries(latent_see_tool_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -34156,7 +34147,9 @@ target_link_libraries(status_test gtest absl::dynamic_annotations absl::prefetch + absl::fixed_array absl::layout + absl::overload absl::absl_check absl::absl_log absl::charset @@ -39761,8 +39754,6 @@ target_include_directories(xds_audit_logger_registry_test target_link_libraries(xds_audit_logger_registry_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -40485,7 +40476,9 @@ target_link_libraries(xds_client_test gtest absl::dynamic_annotations absl::prefetch + absl::fixed_array absl::layout + absl::overload absl::absl_check absl::absl_log absl::charset @@ -41569,7 +41562,9 @@ target_link_libraries(xds_cluster_resource_type_test gtest absl::dynamic_annotations absl::prefetch + absl::fixed_array absl::layout + absl::overload absl::absl_check absl::absl_log absl::charset @@ -42584,8 +42579,6 @@ target_include_directories(xds_common_types_test target_link_libraries(xds_common_types_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -45315,7 +45308,9 @@ target_link_libraries(xds_endpoint_resource_type_test gtest absl::dynamic_annotations absl::prefetch + absl::fixed_array absl::layout + absl::overload absl::absl_check absl::absl_log absl::charset @@ -48033,8 +48028,6 @@ target_include_directories(xds_http_filters_test target_link_libraries(xds_http_filters_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -48485,8 +48478,6 @@ target_include_directories(xds_lb_policy_registry_test target_link_libraries(xds_lb_policy_registry_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -49005,8 +48996,6 @@ target_include_directories(xds_listener_resource_type_test target_link_libraries(xds_listener_resource_type_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -53063,8 +53052,6 @@ target_include_directories(xds_route_config_resource_type_test target_link_libraries(xds_route_config_resource_type_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::fixed_array - absl::overload grpc++ ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} grpc_test_util @@ -56173,7 +56160,7 @@ generate_pkgconfig( "gRPC++" "C++ wrapper for gRPC" "${gRPC_CPP_VERSION}" - "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_btree absl_charset absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_dynamic_annotations absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_layout absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_node_hash_map absl_optional absl_prefetch absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_string_view absl_strings absl_strings_internal absl_synchronization absl_time absl_type_traits absl_utility gpr grpc" + "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_btree absl_charset absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_dynamic_annotations absl_fixed_array absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_layout absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_node_hash_map absl_optional absl_overload absl_prefetch absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_string_view absl_strings absl_strings_internal absl_synchronization absl_time absl_type_traits absl_utility gpr grpc" "libcares openssl re2 zlib" "-lgrpc++" "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_reflection_lib -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_descriptor_lib -lupb_mini_descriptor_lib -lupb_mini_table_lib -lupb_hash_lib -lupb_mem_lib -lupb_base_lib -lupb_lex_lib" @@ -56184,7 +56171,7 @@ generate_pkgconfig( "gRPC++ unsecure" "C++ wrapper for gRPC without SSL" "${gRPC_CPP_VERSION}" - "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_btree absl_charset absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_dynamic_annotations absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_layout absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_node_hash_map absl_optional absl_prefetch absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_string_view absl_strings absl_strings_internal absl_synchronization absl_time absl_type_traits absl_utility gpr grpc_unsecure" + "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_btree absl_charset absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_dynamic_annotations absl_fixed_array absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_layout absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_node_hash_map absl_optional absl_overload absl_prefetch absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_string_view absl_strings absl_strings_internal absl_synchronization absl_time absl_type_traits absl_utility gpr grpc_unsecure" "libcares zlib" "-lgrpc++_unsecure" "-laddress_sorting -lupb_textformat_lib -lupb_reflection_lib -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_descriptor_lib -lupb_mini_descriptor_lib -lupb_mini_table_lib -lupb_hash_lib -lupb_mem_lib -lupb_base_lib -lupb_lex_lib" @@ -56196,7 +56183,7 @@ if(gRPC_BUILD_GRPCPP_OTEL_PLUGIN) "gRPC++ OpenTelemetry Plugin" "OpenTelemetry Plugin for gRPC C++" "${gRPC_CPP_VERSION}" - "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_btree absl_charset absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_dynamic_annotations absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_layout absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_node_hash_map absl_optional absl_prefetch absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_string_view absl_strings absl_strings_internal absl_synchronization absl_time absl_type_traits absl_utility gpr grpc grpc++ opentelemetry_api" + "absl_absl_check absl_absl_log absl_algorithm_container absl_any_invocable absl_base absl_bind_front absl_bits absl_btree absl_charset absl_check absl_cleanup absl_config absl_cord absl_core_headers absl_dynamic_annotations absl_fixed_array absl_flags absl_flags_marshalling absl_flat_hash_map absl_flat_hash_set absl_function_ref absl_hash absl_inlined_vector absl_layout absl_log absl_log_globals absl_log_severity absl_memory absl_no_destructor absl_node_hash_map absl_optional absl_overload absl_prefetch absl_random_bit_gen_ref absl_random_distributions absl_random_random absl_span absl_status absl_statusor absl_str_format absl_string_view absl_strings absl_strings_internal absl_synchronization absl_time absl_type_traits absl_utility gpr grpc grpc++ opentelemetry_api" "libcares openssl re2 zlib" "-lgrpcpp_otel_plugin" "-laddress_sorting -lupb_textformat_lib -lupb_json_lib -lupb_reflection_lib -lupb_wire_lib -lupb_message_lib -lutf8_range_lib -lupb_descriptor_lib -lupb_mini_descriptor_lib -lupb_mini_table_lib -lupb_hash_lib -lupb_mem_lib -lupb_base_lib -lupb_lex_lib" diff --git a/MODULE.bazel b/MODULE.bazel index 73154141a9807..bbb0219f4cac3 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -51,7 +51,6 @@ bazel_dep(name = "googletest", version = "1.17.0", repo_name = "com_google_googl bazel_dep(name = "opencensus-cpp", version = "0.0.0-20230502-50eb5de.bcr.2", repo_name = "io_opencensus_cpp") bazel_dep(name = "openssl", version = "3.3.1.bcr.1") bazel_dep(name = "opentelemetry-cpp", version = "1.19.0", repo_name = "io_opentelemetry_cpp") -bazel_dep(name = "opentelemetry-proto", version = "1.8.0", repo_name = "opentelemetry_proto") # --- Protobuf related packages. bazel_dep(name = "protobuf", version = "35.1", repo_name = "com_google_protobuf") diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index bf23bd023f761..6940e2691c620 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -4307,7 +4307,9 @@ libs: deps: - absl/base:dynamic_annotations - absl/base:prefetch + - absl/container:fixed_array - absl/container:layout + - absl/functional:overload - absl/log:absl_check - absl/log:absl_log - absl/strings:charset @@ -4634,6 +4636,7 @@ libs: - src/cpp/server/health/default_health_check_service.h - src/cpp/server/thread_pool_interface.h - src/cpp/thread_manager/thread_manager.h + - third_party/utf8_range/utf8_validity.h src: - src/core/client_channel/virtual_channel.cc - src/cpp/client/call_context_registry.cc @@ -4680,7 +4683,9 @@ libs: deps: - absl/base:dynamic_annotations - absl/base:prefetch + - absl/container:fixed_array - absl/container:layout + - absl/functional:overload - absl/log:absl_check - absl/log:absl_log - absl/strings:charset @@ -9015,7 +9020,6 @@ targets: - test/cpp/util/proto_file_parser.h - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - - third_party/utf8_range/utf8_validity.h src: - src/core/ext/transport/chaotic_good/chaotic_good_frame.proto - src/proto/grpc/channelz/v2/latent_see.proto @@ -9071,8 +9075,6 @@ targets: - third_party/googletest/googlemock/src/gmock_main.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpcpp_channelz - protoc - grpc_test_util @@ -9366,7 +9368,6 @@ targets: - test/cpp/util/proto_file_parser.h - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/reflection/v1alpha/reflection.proto - src/proto/grpc/testing/echo.proto @@ -9385,8 +9386,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - protoc - grpc++_test_util - name: client_auth_filter_test @@ -15032,7 +15031,6 @@ targets: - test/cpp/util/proto_file_parser.h - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/reflection/v1alpha/reflection.proto - test/cpp/util/cli_call.cc @@ -15043,8 +15041,6 @@ targets: - test/cpp/util/proto_reflection_descriptor_database.cc - test/cpp/util/service_describer.cc deps: - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc++_test_config @@ -15236,7 +15232,6 @@ targets: - test/cpp/util/proto_file_parser.h - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/testing/echo.proto - src/proto/grpc/testing/echo_messages.proto @@ -15254,8 +15249,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++_reflection - protoc - grpc++_test_config @@ -17202,6 +17195,10 @@ targets: run: false language: c++ headers: + - src/cpp/ext/otel/key_value_iterable.h + - src/cpp/ext/otel/otel_client_call_tracer.h + - src/cpp/ext/otel/otel_plugin.h + - src/cpp/ext/otel/otel_server_call_tracer.h - test/core/credentials/call/oauth2/oauth2_utils.h - test/cpp/interop/backend_metrics_lb_policy.h - test/cpp/interop/client_helper.h @@ -17211,6 +17208,9 @@ targets: - src/proto/grpc/testing/empty.proto - src/proto/grpc/testing/messages.proto - src/proto/grpc/testing/test.proto + - src/cpp/ext/otel/otel_client_call_tracer.cc + - src/cpp/ext/otel/otel_plugin.cc + - src/cpp/ext/otel/otel_server_call_tracer.cc - test/core/credentials/call/oauth2/oauth2_utils.cc - test/cpp/interop/backend_metrics_lb_policy.cc - test/cpp/interop/client.cc @@ -17218,6 +17218,8 @@ targets: - test/cpp/interop/interop_client.cc - test/cpp/interop/otel_helper.cc deps: + - opentelemetry-cpp::api + - opentelemetry-cpp::trace - grpc++_test_config - grpc++_test_util - name: interop_server @@ -17225,6 +17227,10 @@ targets: run: false language: c++ headers: + - src/cpp/ext/otel/key_value_iterable.h + - src/cpp/ext/otel/otel_client_call_tracer.h + - src/cpp/ext/otel/otel_plugin.h + - src/cpp/ext/otel/otel_server_call_tracer.h - src/cpp/server/orca/orca_service.h - test/cpp/interop/otel_helper.h - test/cpp/interop/server_helper.h @@ -17232,12 +17238,17 @@ targets: - src/proto/grpc/testing/empty.proto - src/proto/grpc/testing/messages.proto - src/proto/grpc/testing/test.proto + - src/cpp/ext/otel/otel_client_call_tracer.cc + - src/cpp/ext/otel/otel_plugin.cc + - src/cpp/ext/otel/otel_server_call_tracer.cc - src/cpp/server/orca/orca_service.cc - test/cpp/interop/interop_server.cc - test/cpp/interop/interop_server_bootstrap.cc - test/cpp/interop/otel_helper.cc - test/cpp/interop/server_helper.cc deps: + - opentelemetry-cpp::api + - opentelemetry-cpp::trace - grpc++_test_config - grpc++_test_util - name: invalid_call_argument_test @@ -18060,7 +18071,6 @@ targets: - test/cpp/util/proto_file_parser.h - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - - third_party/utf8_range/utf8_validity.h src: - src/core/ext/transport/chaotic_good/chaotic_good_frame.proto - src/proto/grpc/channelz/v2/channelz.proto @@ -18113,8 +18123,6 @@ targets: - third_party/googletest/googlemock/src/gmock_main.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc_test_util @@ -24270,7 +24278,8 @@ targets: gtest: true build: test language: c++ - headers: [] + headers: + - third_party/utf8_range/utf8_validity.h src: - third_party/googleapis/google/rpc/status.proto - src/cpp/client/global_callback_hook.cc @@ -24280,7 +24289,9 @@ targets: - gtest - absl/base:dynamic_annotations - absl/base:prefetch + - absl/container:fixed_array - absl/container:layout + - absl/functional:overload - absl/log:absl_check - absl/log:absl_log - absl/strings:charset @@ -28344,7 +28355,6 @@ targets: - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - third_party/protoc-gen-validate/validate/validate.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/reflection/v1alpha/reflection.proto - third_party/cel-spec/proto/cel/expr/checked.proto @@ -28444,8 +28454,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc_test_util @@ -28492,6 +28500,7 @@ targets: - test/core/xds/xds_client_test_peer.h - test/core/xds/xds_transport_fake.h - third_party/protoc-gen-validate/validate/validate.h + - third_party/utf8_range/utf8_validity.h src: - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto - third_party/cel-spec/proto/cel/expr/checked.proto @@ -28639,7 +28648,9 @@ targets: - gtest - absl/base:dynamic_annotations - absl/base:prefetch + - absl/container:fixed_array - absl/container:layout + - absl/functional:overload - absl/log:absl_check - absl/log:absl_log - absl/strings:charset @@ -28808,6 +28819,7 @@ targets: headers: - test/core/test_util/scoped_env_var.h - third_party/protoc-gen-validate/validate/validate.h + - third_party/utf8_range/utf8_validity.h src: - third_party/cel-spec/proto/cel/expr/checked.proto - third_party/cel-spec/proto/cel/expr/syntax.proto @@ -28937,7 +28949,9 @@ targets: - gtest - absl/base:dynamic_annotations - absl/base:prefetch + - absl/container:fixed_array - absl/container:layout + - absl/functional:overload - absl/log:absl_check - absl/log:absl_log - absl/strings:charset @@ -29266,7 +29280,6 @@ targets: - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - third_party/protoc-gen-validate/validate/validate.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/reflection/v1alpha/reflection.proto - third_party/cel-spec/proto/cel/expr/checked.proto @@ -29437,8 +29450,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc_test_util @@ -30114,6 +30125,7 @@ targets: headers: - test/core/test_util/scoped_env_var.h - third_party/protoc-gen-validate/validate/validate.h + - third_party/utf8_range/utf8_validity.h src: - third_party/envoy-api/envoy/annotations/deprecation.proto - third_party/envoy-api/envoy/annotations/resource.proto @@ -30190,7 +30202,9 @@ targets: - gtest - absl/base:dynamic_annotations - absl/base:prefetch + - absl/container:fixed_array - absl/container:layout + - absl/functional:overload - absl/log:absl_check - absl/log:absl_log - absl/strings:charset @@ -30820,7 +30834,6 @@ targets: - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - third_party/protoc-gen-validate/validate/validate.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/reflection/v1alpha/reflection.proto - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto @@ -30948,8 +30961,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc_test_util @@ -30966,7 +30977,6 @@ targets: - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - third_party/protoc-gen-validate/validate/validate.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/reflection/v1alpha/reflection.proto - third_party/cel-spec/proto/cel/expr/checked.proto @@ -31076,8 +31086,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc_test_util @@ -31093,7 +31101,6 @@ targets: - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - third_party/protoc-gen-validate/validate/validate.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/reflection/v1alpha/reflection.proto - third_party/cel-spec/proto/cel/expr/checked.proto @@ -31220,8 +31227,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc_test_util @@ -32335,7 +32340,6 @@ targets: - test/cpp/util/proto_reflection_descriptor_database.h - test/cpp/util/service_describer.h - third_party/protoc-gen-validate/validate/validate.h - - third_party/utf8_range/utf8_validity.h src: - src/proto/grpc/lookup/v1/rls_config.proto - src/proto/grpc/reflection/v1alpha/reflection.proto @@ -32437,8 +32441,6 @@ targets: - test/cpp/util/service_describer.cc deps: - gtest - - absl/container:fixed_array - - absl/functional:overload - grpc++ - protoc - grpc_test_util diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 7a43530841b04..5fa37e957ebc2 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -245,6 +245,7 @@ Pod::Spec.new do |s| ss.dependency 'abseil/base/prefetch', abseil_version ss.dependency 'abseil/cleanup/cleanup', abseil_version ss.dependency 'abseil/container/btree', abseil_version + ss.dependency 'abseil/container/fixed_array', abseil_version ss.dependency 'abseil/container/flat_hash_map', abseil_version ss.dependency 'abseil/container/flat_hash_set', abseil_version ss.dependency 'abseil/container/inlined_vector', abseil_version @@ -255,6 +256,7 @@ Pod::Spec.new do |s| ss.dependency 'abseil/functional/any_invocable', abseil_version ss.dependency 'abseil/functional/bind_front', abseil_version ss.dependency 'abseil/functional/function_ref', abseil_version + ss.dependency 'abseil/functional/overload', abseil_version ss.dependency 'abseil/hash/hash', abseil_version ss.dependency 'abseil/log/absl_check', abseil_version ss.dependency 'abseil/log/absl_log', abseil_version @@ -1715,6 +1717,7 @@ Pod::Spec.new do |s| 'third_party/utf8_range/utf8_range.h', 'third_party/utf8_range/utf8_range_neon.inc', 'third_party/utf8_range/utf8_range_sse.inc', + 'third_party/utf8_range/utf8_validity.h', 'third_party/xxhash/xxhash.h', 'third_party/zlib/crc32.h', 'third_party/zlib/deflate.h', @@ -3110,6 +3113,7 @@ Pod::Spec.new do |s| 'third_party/utf8_range/utf8_range.h', 'third_party/utf8_range/utf8_range_neon.inc', 'third_party/utf8_range/utf8_range_sse.inc', + 'third_party/utf8_range/utf8_validity.h', 'third_party/xxhash/xxhash.h', 'third_party/zlib/crc32.h', 'third_party/zlib/deflate.h', diff --git a/src/core/lib/debug/trace_flags.cc b/src/core/lib/debug/trace_flags.cc index 176ec794f93e4..4b6457e2f2ec2 100644 --- a/src/core/lib/debug/trace_flags.cc +++ b/src/core/lib/debug/trace_flags.cc @@ -16,9 +16,9 @@ // Automatically generated by tools/codegen/core/generate_trace_flags.cc // -#include "absl/container/flat_hash_map.h" #include "src/core/lib/debug/trace.h" #include "src/core/util/no_destruct.h" +#include "absl/container/flat_hash_map.h" namespace grpc_core { @@ -26,7 +26,8 @@ DebugOnlyTraceFlag auth_context_refcount_trace(false, "auth_context_refcount"); DebugOnlyTraceFlag call_combiner_trace(false, "call_combiner"); DebugOnlyTraceFlag call_refcount_trace(false, "call_refcount"); DebugOnlyTraceFlag call_state_trace(false, "call_state"); -DebugOnlyTraceFlag chttp2_server_refcount_trace(false, "chttp2_server_refcount"); +DebugOnlyTraceFlag chttp2_server_refcount_trace(false, + "chttp2_server_refcount"); DebugOnlyTraceFlag closure_trace(false, "closure"); DebugOnlyTraceFlag combiner_trace(false, "combiner"); DebugOnlyTraceFlag cq_refcount_trace(false, "cq_refcount"); @@ -41,7 +42,8 @@ DebugOnlyTraceFlag polling_trace(false, "polling"); DebugOnlyTraceFlag polling_api_trace(false, "polling_api"); DebugOnlyTraceFlag promise_primitives_trace(false, "promise_primitives"); DebugOnlyTraceFlag resolver_refcount_trace(false, "resolver_refcount"); -DebugOnlyTraceFlag security_connector_refcount_trace(false, "security_connector_refcount"); +DebugOnlyTraceFlag security_connector_refcount_trace( + false, "security_connector_refcount"); DebugOnlyTraceFlag slice_refcount_trace(false, "slice_refcount"); DebugOnlyTraceFlag stream_refcount_trace(false, "stream_refcount"); DebugOnlyTraceFlag subchannel_refcount_trace(false, "subchannel_refcount"); @@ -71,7 +73,8 @@ TraceFlag connectivity_state_trace(false, "connectivity_state"); TraceFlag dns_resolver_trace(false, "dns_resolver"); TraceFlag environment_autodetect_trace(false, "environment_autodetect"); TraceFlag event_engine_trace(false, "event_engine"); -TraceFlag event_engine_client_channel_resolver_trace(false, "event_engine_client_channel_resolver"); +TraceFlag event_engine_client_channel_resolver_trace( + false, "event_engine_client_channel_resolver"); TraceFlag event_engine_dns_trace(false, "event_engine_dns"); TraceFlag event_engine_endpoint_trace(false, "event_engine_endpoint"); TraceFlag event_engine_endpoint_data_trace(false, "event_engine_endpoint_data"); @@ -106,7 +109,8 @@ TraceFlag rls_lb_trace(false, "rls_lb"); TraceFlag round_robin_trace(false, "round_robin"); TraceFlag secure_endpoint_trace(false, "secure_endpoint"); TraceFlag server_channel_trace(false, "server_channel"); -TraceFlag server_config_selector_interceptor_trace(false, "server_config_selector_interceptor"); +TraceFlag server_config_selector_interceptor_trace( + false, "server_config_selector_interceptor"); TraceFlag stateful_session_filter_trace(false, "stateful_session_filter"); TraceFlag subchannel_trace(false, "subchannel"); TraceFlag subchannel_call_trace(false, "subchannel_call"); @@ -154,7 +158,8 @@ const absl::flat_hash_map& GetAllTraceFlags() { {"dns_resolver", &dns_resolver_trace}, {"environment_autodetect", &environment_autodetect_trace}, {"event_engine", &event_engine_trace}, - {"event_engine_client_channel_resolver", &event_engine_client_channel_resolver_trace}, + {"event_engine_client_channel_resolver", + &event_engine_client_channel_resolver_trace}, {"event_engine_dns", &event_engine_dns_trace}, {"event_engine_endpoint", &event_engine_endpoint_trace}, {"event_engine_endpoint_data", &event_engine_endpoint_data_trace}, @@ -189,7 +194,8 @@ const absl::flat_hash_map& GetAllTraceFlags() { {"round_robin", &round_robin_trace}, {"secure_endpoint", &secure_endpoint_trace}, {"server_channel", &server_channel_trace}, - {"server_config_selector_interceptor", &server_config_selector_interceptor_trace}, + {"server_config_selector_interceptor", + &server_config_selector_interceptor_trace}, {"stateful_session_filter", &stateful_session_filter_trace}, {"subchannel", &subchannel_trace}, {"subchannel_call", &subchannel_call_trace}, diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 9e76fb161f916..f0cf0bffa7ca9 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -319,4 +319,3 @@ def test_interoperability(args): if __name__ == "__main__": app.run(test_interoperability, flags_parser=parse_interop_client_args) - diff --git a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py index 23c513f7825cf..4b9fdbdaed813 100644 --- a/src/python/grpcio_tests/tests/interop/otel_interop_helper.py +++ b/src/python/grpcio_tests/tests/interop/otel_interop_helper.py @@ -11,8 +11,7 @@ # 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. -"""OpenTelemetry Tracing Interop Helper for Python gRPC Interop Client/Server -""" +"""OpenTelemetry Tracing Interop Helper for Python gRPC Interop Client/Server""" import os from typing import Optional, Tuple @@ -254,6 +253,7 @@ def intercept_service(self, continuation, handler_call_details): if handler.unary_unary: orig_func = handler.unary_unary + def wrapper(request, context): try: res = orig_func(request, context) @@ -262,6 +262,7 @@ def wrapper(request, context): finally: server_span.end() flush_tracer_provider() + return grpc.unary_unary_rpc_method_handler( wrapper, request_deserializer=handler.request_deserializer, diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index d19294b56f02f..199e7cfb283e3 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -222,13 +222,15 @@ int main(int argc, char** argv) { grpc::experimental::ClientInterceptorFactoryInterface>> factories; if (!additional_metadata->empty()) { - factories.emplace_back(std::make_unique< - grpc::testing::AdditionalMetadataInterceptorFactory>( + factories.emplace_back( + std::make_unique< + grpc::testing::AdditionalMetadataInterceptorFactory>( *additional_metadata)); } if (absl::GetFlag(FLAGS_log_metadata_and_status)) { - factories.emplace_back(std::make_unique< - grpc::testing::MetadataAndStatusLoggerInterceptorFactory>()); + factories.emplace_back( + std::make_unique< + grpc::testing::MetadataAndStatusLoggerInterceptorFactory>()); } std::string service_config_json = absl::GetFlag(FLAGS_service_config_json); diff --git a/test/cpp/interop/interop_server.cc b/test/cpp/interop/interop_server.cc index 10306e34ff52d..626f515d23a99 100644 --- a/test/cpp/interop/interop_server.cc +++ b/test/cpp/interop/interop_server.cc @@ -41,7 +41,6 @@ #include "test/cpp/interop/otel_helper.h" #include "test/cpp/interop/server_helper.h" #include "test/cpp/util/test_config.h" - #include "absl/flags/flag.h" #include "absl/log/log.h" diff --git a/test/cpp/interop/otel_helper.cc b/test/cpp/interop/otel_helper.cc index ca360274f76d2..75d3be208f146 100644 --- a/test/cpp/interop/otel_helper.cc +++ b/test/cpp/interop/otel_helper.cc @@ -76,9 +76,8 @@ void MaybeRegisterOpenTelemetry() { auto processor = opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create( std::move(exporter)); - auto provider = - std::make_shared( - std::move(processor)); + auto provider = std::make_shared( + std::move(processor)); std::atomic_store(&g_tracer_provider, provider); auto status = diff --git a/test/cpp/interop/otlp_collector.cc b/test/cpp/interop/otlp_collector.cc index 9c3d993e6243f..f7397a1272fbe 100644 --- a/test/cpp/interop/otlp_collector.cc +++ b/test/cpp/interop/otlp_collector.cc @@ -16,6 +16,9 @@ // // +#include +#include + #include #include #include @@ -26,14 +29,11 @@ #include #include +#include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h" #include "absl/flags/flag.h" #include "absl/flags/parse.h" #include "absl/log/log.h" -#include -#include -#include "opentelemetry/proto/collector/trace/v1/trace_service.grpc.pb.h" - ABSL_FLAG(int, port, 0, "Port to listen on"); ABSL_FLAG(std::string, file, "", "File to write JSON spans to"); @@ -66,7 +66,8 @@ class TraceServiceServiceImpl final std::lock_guard lock(mu_); requests_json_.push_back(json_string); - // Write to a temporary file first and rename to avoid read-during-write data race + // Write to a temporary file first and rename to avoid read-during-write + // data race std::string tmp_file = file_path_ + ".tmp"; std::ofstream out(tmp_file, std::ios::trunc); if (!out) {