Merge branch 'tiefling-buffer' into tiefling-chunky-monkey

pull/38052/head
Craig Tiller 7 days ago
commit feaf65d5f4
  1. 6
      BUILD
  2. 45
      CMakeLists.txt
  3. 1
      bazel/grpc_build_system.bzl
  4. 17
      bazel/grpc_deps.bzl
  5. 19
      build_autogenerated.yaml
  6. 1
      examples/cpp/csm/csm_greeter_client.cc
  7. 1
      examples/cpp/csm/csm_greeter_server.cc
  8. 1
      examples/cpp/csm/observability/csm_greeter_client.cc
  9. 1
      examples/cpp/csm/observability/csm_greeter_server.cc
  10. 1
      examples/cpp/otel/greeter_callback_client.cc
  11. 1
      examples/cpp/otel/greeter_callback_server.cc
  12. 4
      examples/python/metadata/metadata_client.py
  13. 19
      include/grpcpp/ext/orca_service.h
  14. 6
      src/core/BUILD
  15. 2
      src/core/client_channel/client_channel.cc
  16. 3
      src/core/ext/transport/chaotic_good/client_transport.cc
  17. 10
      src/core/ext/transport/chaotic_good/data_endpoints.h
  18. 9
      src/core/ext/transport/chaotic_good/server_transport.cc
  19. 3
      src/core/ext/transport/chaotic_good_legacy/client_transport.cc
  20. 9
      src/core/ext/transport/chaotic_good_legacy/server_transport.cc
  21. 2
      src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc
  22. 2
      src/core/lib/experiments/experiments.yaml
  23. 360
      src/core/lib/promise/detail/seq_state.h
  24. 9
      src/core/lib/promise/loop.h
  25. 39
      src/core/lib/promise/mpsc.h
  26. 3
      src/core/lib/promise/party.cc
  27. 2
      src/core/lib/promise/party.h
  28. 13
      src/core/lib/promise/poll.h
  29. 4
      src/core/lib/surface/call_utils.h
  30. 3
      src/core/lib/surface/client_call.cc
  31. 1
      src/core/lib/transport/metadata_batch.cc
  32. 10
      src/core/lib/transport/metadata_batch.h
  33. 17
      src/core/load_balancing/pick_first/pick_first.cc
  34. 2
      src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc
  35. 27
      src/core/telemetry/metrics.cc
  36. 10
      src/core/telemetry/metrics.h
  37. 1
      src/core/util/latent_see.h
  38. 1
      src/core/xds/grpc/xds_route_config.cc
  39. 192
      src/cpp/server/orca/orca_service.cc
  40. 79
      src/cpp/server/orca/orca_service.h
  41. 60
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/crash-51da145780c554748a3b50f17821258aa088bd14
  42. 64
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/crash-86eea2a15836777de17bc2d6e56539cf57b7b0c4
  43. 157
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/crash-ab14db9484705f3c1fae5acc5f698b68277860a2
  44. 42
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-01f3b3b908f6c91e179372702beea56104dbbeae
  45. 51
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-282ee81c5da8640f117316997c28d3832e03c323
  46. 21
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-2b4770b7bfdfa07761772ea78d6e193c1f358db2
  47. 243
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-355f067da6fced94f53d79f2f8191a55732bd38f
  48. 7
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-35f2fe7cdc0b01e612a5bcd763d02b395a23459b
  49. 8
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-42643963f7665f943324ee9268fc8497f3f261c5
  50. 3653
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-58dd4fb75919890fd9aa054446dde4314bb40428
  51. 165
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-6604945faa8a634180cdd6a6ff76cc0c7e7f0955
  52. 141
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-6871f52d69716105bb356413a8696cfebe3b8e2c
  53. 175
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-7850852d1c9d55767ae6a68d6609a7b784fdf622
  54. 3
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-7a66fd2d4c1845e418f169831a55fbef412b7aee
  55. 131
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-84512246deb127ceefd908071ef03a9550d6713f
  56. 1035
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-87aeddb04083a927133abd47f02c836c7f6553e2
  57. 196
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-8da4d298fdb97e9d602263d3fc7b89ab3251fde3
  58. 19
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-a75b653b4aca4326427881ed4097be2cb9acdeee
  59. 10
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-c3e44cf4b9dbb305c2d1e89d7e902b01ab4b3f68
  60. 26
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-e8ef53e9d8b6d9d75cd2bd2d4d7da6272e7d368f
  61. 154
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/slow-unit-ff2d24dccc2d7dec0ce026c4ceebe20ee7ae13d2
  62. 74
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-0071ce9138d8f4bc8b782b23583c27e9d8aec3a0
  63. 80
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-322183212199184ea80a5f87144fcc1132b03269
  64. 93
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-35b83693ea7aa759763a4ee6f96af404203f8208
  65. 82
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-3a2d4a3f187a18600f9c4d8efb14f6247bae2997
  66. 84
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-3dab877a51e9514709fd2329f48c20e4c23d1664
  67. 82
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-4180ae90011d0ff884f7dcd006ca839d0da56d23
  68. 84
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-41bd6daf0da4226f55a72ae1600dd1850fedbf32
  69. 86
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-4c01992cb7f48b5a84bdc2cdfdf1136352a3ac0a
  70. 84
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-4e6584241b4ffef717ebb6e7a13f70ca48744acc
  71. 85
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-52e67504a1cae3af3fb00e8e78ffed722bf5fda0
  72. 80
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-56f879d33ebdf637b560322631fe6e325fc22704
  73. 82
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-5e5335486b9ef10d47370cf751d129646b21b9d5
  74. 87
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-6924de21e5c13977752c917f9f82f000a08c3c5d
  75. 82
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-8c6f58d20aa747197584a8bc77dd60ebbfb76fd9
  76. 85
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-8e269390dda3f4f77bdacf227f5470f7c8ce8bcd
  77. 67
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-901f7773effe375769b6b2333d28c634302fce2f
  78. 74
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-b9c292c8613a7afc59fb97dea793eb4c83585460
  79. 84
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-d3c3ccf999334b30b974ffc3afb02d0973b9c4cd
  80. 75
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-dc68844bb6ceff31d33f2224be6c4d24b45c0ed7
  81. 85
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-e03bbc7be62f55b4de75b6c72ed7ed8ba48f9a31
  82. 79
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-e08b68b1deaacadff85af8547566e1b5e1008150
  83. 84
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-e565d70ccda2a54869f677ae5a5bf8604014757e
  84. 160
      test/core/end2end/end2end_test_corpus/cancel_after_invoke/timeout-eedf408008ff1bd6997e4ef8b01b05ca7837d242
  85. 2
      test/core/end2end/tests/disappearing_server.cc
  86. 69
      test/core/http/httpcli_test_util.cc
  87. 40
      test/core/load_balancing/lb_policy_test_lib.h
  88. 68
      test/core/load_balancing/pick_first_test.cc
  89. 12
      test/core/promise/mpsc_test.cc
  90. 35
      test/core/telemetry/metrics_test.cc
  91. 5
      test/core/test_util/BUILD
  92. 10
      test/core/test_util/fake_stats_plugin.h
  93. 18
      test/core/test_util/fuzzer_one_entry_runner.sh
  94. 39
      test/core/test_util/one_corpus_entry_fuzzer.cc
  95. 1
      test/core/transport/chaotic_good/BUILD
  96. 9
      test/core/transport/chaotic_good/control_endpoint_test.cc
  97. 9
      test/core/transport/chaotic_good/data_endpoints_test.cc
  98. 59
      test/cpp/end2end/orca_service_end2end_test.cc
  99. 1
      test/cpp/interop/xds_interop_client.cc
  100. 1
      test/cpp/interop/xds_interop_server.cc
  101. Some files were not shown because too many files have changed in this diff Show More

@ -2600,9 +2600,13 @@ grpc_cc_library(
srcs = [ srcs = [
"src/cpp/server/orca/orca_service.cc", "src/cpp/server/orca/orca_service.cc",
], ],
hdrs = [
"src/cpp/server/orca/orca_service.h",
],
external_deps = [ external_deps = [
"absl/base:core_headers", "absl/base:core_headers",
"absl/log:check", "absl/log:check",
"absl/log:log",
"absl/strings", "absl/strings",
"absl/time", "absl/time",
"absl/types:optional", "absl/types:optional",
@ -2729,7 +2733,7 @@ grpc_cc_library(
"include/grpcpp/test/mock_stream.h", "include/grpcpp/test/mock_stream.h",
"include/grpcpp/test/server_context_test_spouse.h", "include/grpcpp/test/server_context_test_spouse.h",
], ],
visibility = ["@grpc:grpc++_test"], visibility = ["@grpc:public"],
deps = [ deps = [
"channel", "channel",
"grpc++", "grpc++",

45
CMakeLists.txt generated

@ -1615,6 +1615,7 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx oracle_event_engine_posix_test) add_dependencies(buildtests_cxx oracle_event_engine_posix_test)
endif() endif()
add_dependencies(buildtests_cxx orca_service_end2end_test) add_dependencies(buildtests_cxx orca_service_end2end_test)
add_dependencies(buildtests_cxx orca_service_test)
add_dependencies(buildtests_cxx orphanable_test) add_dependencies(buildtests_cxx orphanable_test)
add_dependencies(buildtests_cxx osa_distance_test) add_dependencies(buildtests_cxx osa_distance_test)
add_dependencies(buildtests_cxx out_of_bounds_bad_client_test) add_dependencies(buildtests_cxx out_of_bounds_bad_client_test)
@ -23082,6 +23083,50 @@ target_link_libraries(orca_service_end2end_test
) )
endif()
if(gRPC_BUILD_TESTS)
add_executable(orca_service_test
src/cpp/server/orca/orca_service.cc
test/cpp/server/orca_service_test.cc
)
if(WIN32 AND MSVC)
if(BUILD_SHARED_LIBS)
target_compile_definitions(orca_service_test
PRIVATE
"GPR_DLL_IMPORTS"
"GRPC_DLL_IMPORTS"
"GRPCXX_DLL_IMPORTS"
)
endif()
endif()
target_compile_features(orca_service_test PUBLIC cxx_std_14)
target_include_directories(orca_service_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(orca_service_test
${_gRPC_ALLTARGETS_LIBRARIES}
gtest
grpc++_test_util
)
endif() endif()
if(gRPC_BUILD_TESTS) if(gRPC_BUILD_TESTS)

@ -117,7 +117,6 @@ def _update_visibility(visibility):
"grpcpp_gcp_observability": PUBLIC, "grpcpp_gcp_observability": PUBLIC,
"grpc_resolver_fake": PRIVATE, "grpc_resolver_fake": PRIVATE,
"grpc++_public_hdrs": PUBLIC, "grpc++_public_hdrs": PUBLIC,
"grpc++_test": PRIVATE,
"http": PRIVATE, "http": PRIVATE,
"httpcli": PRIVATE, "httpcli": PRIVATE,
"iomgr_internal_errqueue": PRIVATE, "iomgr_internal_errqueue": PRIVATE,

@ -109,11 +109,12 @@ def grpc_deps():
if "com_github_google_benchmark" not in native.existing_rules(): if "com_github_google_benchmark" not in native.existing_rules():
http_archive( http_archive(
name = "com_github_google_benchmark", name = "com_github_google_benchmark",
sha256 = "8e7b955f04bc6984e4f14074d0d191474f76a6c8e849e04a9dced49bc975f2d4", sha256 = "11f344710a80fd73db0fc686b4fe40867dc34d914d9cdfd7a4b416a65d1e692f",
strip_prefix = "benchmark-344117638c8ff7e239044fd0fa7085839fc03021", strip_prefix = "benchmark-12235e24652fc7f809373e7c11a5f73c5763fc4c",
urls = [ urls = [
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/benchmark/archive/344117638c8ff7e239044fd0fa7085839fc03021.tar.gz", # v1.9.0
"https://github.com/google/benchmark/archive/344117638c8ff7e239044fd0fa7085839fc03021.tar.gz", "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/benchmark/archive/12235e24652fc7f809373e7c11a5f73c5763fc4c.tar.gz",
"https://github.com/google/benchmark/archive/12235e24652fc7f809373e7c11a5f73c5763fc4c.tar.gz",
], ],
) )
@ -340,11 +341,11 @@ def grpc_deps():
if "io_opentelemetry_cpp" not in native.existing_rules(): if "io_opentelemetry_cpp" not in native.existing_rules():
http_archive( http_archive(
name = "io_opentelemetry_cpp", name = "io_opentelemetry_cpp",
sha256 = "ed681d20a684b7d485a49288e7cfb2d182bf882e5c112c5f2fa3f9e9da2278fc", sha256 = "4b822a2f137b8c2ea403c5ec9a661addcc048aa8ba3afebffd58cbcf218457bc",
strip_prefix = "opentelemetry-cpp-4bd64c9a336fd438d6c4c9dad2e6b61b0585311f", strip_prefix = "opentelemetry-cpp-a388e87d72b8321c189c8d41edb746ffa687ce3c",
urls = [ urls = [
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/4bd64c9a336fd438d6c4c9dad2e6b61b0585311f.tar.gz", "https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/a388e87d72b8321c189c8d41edb746ffa687ce3c.tar.gz",
"https://github.com/open-telemetry/opentelemetry-cpp/archive/4bd64c9a336fd438d6c4c9dad2e6b61b0585311f.tar.gz", "https://github.com/open-telemetry/opentelemetry-cpp/archive/a388e87d72b8321c189c8d41edb746ffa687ce3c.tar.gz",
], ],
) )

@ -5933,6 +5933,7 @@ targets:
build: test build: test
language: c++ language: c++
headers: headers:
- src/cpp/server/orca/orca_service.h
- test/cpp/interop/backend_metrics_lb_policy.h - test/cpp/interop/backend_metrics_lb_policy.h
src: src:
- src/proto/grpc/testing/empty.proto - src/proto/grpc/testing/empty.proto
@ -9135,6 +9136,7 @@ targets:
run: false run: false
language: c++ language: c++
headers: headers:
- src/cpp/server/orca/orca_service.h
- test/core/test_util/test_lb_policies.h - test/core/test_util/test_lb_policies.h
- test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/connection_attempt_injector.h
- test/cpp/end2end/test_service_impl.h - test/cpp/end2end/test_service_impl.h
@ -13109,6 +13111,7 @@ targets:
run: false run: false
language: c++ language: c++
headers: headers:
- src/cpp/server/orca/orca_service.h
- test/cpp/interop/server_helper.h - test/cpp/interop/server_helper.h
src: src:
- src/proto/grpc/testing/empty.proto - src/proto/grpc/testing/empty.proto
@ -14490,6 +14493,7 @@ targets:
- src/core/lib/promise/mpsc.h - src/core/lib/promise/mpsc.h
- src/core/lib/promise/poll.h - src/core/lib/promise/poll.h
- src/core/lib/promise/promise.h - src/core/lib/promise/promise.h
- src/core/lib/promise/status_flag.h
- src/core/lib/promise/wait_set.h - src/core/lib/promise/wait_set.h
- src/core/util/atomic_utils.h - src/core/util/atomic_utils.h
- src/core/util/down_cast.h - src/core/util/down_cast.h
@ -14934,7 +14938,8 @@ targets:
gtest: true gtest: true
build: test build: test
language: c++ language: c++
headers: [] headers:
- src/cpp/server/orca/orca_service.h
src: src:
- src/proto/grpc/testing/xds/v3/orca_service.proto - src/proto/grpc/testing/xds/v3/orca_service.proto
- third_party/googleapis/google/api/annotations.proto - third_party/googleapis/google/api/annotations.proto
@ -14947,6 +14952,18 @@ targets:
deps: deps:
- gtest - gtest
- grpc++_test_util - grpc++_test_util
- name: orca_service_test
gtest: true
build: test
language: c++
headers:
- src/cpp/server/orca/orca_service.h
src:
- src/cpp/server/orca/orca_service.cc
- test/cpp/server/orca_service_test.cc
deps:
- gtest
- grpc++_test_util
- name: orphanable_test - name: orphanable_test
gtest: true gtest: true
build: test build: test

@ -161,6 +161,7 @@ absl::StatusOr<grpc::CsmObservability> InitializeObservability() {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts; opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods // default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464"; opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

@ -103,6 +103,7 @@ int main(int argc, char** argv) {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts; opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods // default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464"; opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

@ -45,6 +45,7 @@ absl::StatusOr<grpc::CsmObservability> InitializeObservability() {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts; opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods // default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464"; opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

@ -50,6 +50,7 @@ int main(int argc, char** argv) {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts; opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods // default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464"; opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

@ -49,6 +49,7 @@ int main(int argc, char** argv) {
// exporter. // exporter.
opentelemetry::exporter::metrics::PrometheusExporterOptions opts; opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
opts.url = absl::GetFlag(FLAGS_prometheus_endpoint); opts.url = absl::GetFlag(FLAGS_prometheus_endpoint);
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

@ -52,6 +52,7 @@ int main(int argc, char** argv) {
// exporter. // exporter.
opentelemetry::exporter::metrics::PrometheusExporterOptions opts; opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
opts.url = absl::GetFlag(FLAGS_prometheus_endpoint); opts.url = absl::GetFlag(FLAGS_prometheus_endpoint);
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

@ -31,10 +31,10 @@ def run():
response, call = stub.SayHello.with_call( response, call = stub.SayHello.with_call(
helloworld_pb2.HelloRequest(name="you"), helloworld_pb2.HelloRequest(name="you"),
metadata=( metadata=(
("initial-metadata-1", "The value should be str"), ("initial-metadata-1", "The value must be str"),
( (
"binary-metadata-bin", "binary-metadata-bin",
b"With -bin surffix, the value can be bytes", b"With -bin surffix, the value must be bytes",
), ),
("accesstoken", "gRPC Python is great"), ("accesstoken", "gRPC Python is great"),
), ),

@ -17,20 +17,27 @@
#ifndef GRPCPP_EXT_ORCA_SERVICE_H #ifndef GRPCPP_EXT_ORCA_SERVICE_H
#define GRPCPP_EXT_ORCA_SERVICE_H #define GRPCPP_EXT_ORCA_SERVICE_H
#include <grpc/event_engine/event_engine.h>
#include <grpcpp/ext/server_metric_recorder.h> #include <grpcpp/ext/server_metric_recorder.h>
#include <grpcpp/impl/service_type.h> #include <grpcpp/impl/service_type.h>
#include <grpcpp/impl/sync.h> #include <grpcpp/impl/sync.h>
#include <grpcpp/server_builder.h> #include <grpcpp/server_builder.h>
#include <grpcpp/support/server_callback.h> #include <grpcpp/support/server_callback.h>
#include <grpcpp/support/slice.h> #include <grpcpp/support/slice.h>
#include <grpcpp/support/status.h>
#include <map> #include <cstdint>
#include <string>
#include "absl/base/thread_annotations.h"
#include "absl/time/time.h" #include "absl/time/time.h"
#include "absl/types/optional.h" #include "absl/types/optional.h"
namespace grpc { namespace grpc {
namespace testing {
class OrcaServiceTest;
} // namespace testing
namespace experimental { namespace experimental {
// RPC service implementation for supplying out-of-band backend // RPC service implementation for supplying out-of-band backend
@ -54,7 +61,15 @@ class OrcaService : public Service {
Options options); Options options);
private: private:
class ReactorHook {
public:
virtual ~ReactorHook() = default;
virtual void OnFinish(grpc::Status status) = 0;
virtual void OnStartWrite(const ByteBuffer* response) = 0;
};
class Reactor; class Reactor;
friend class testing::OrcaServiceTest;
Slice GetOrCreateSerializedResponse(); Slice GetOrCreateSerializedResponse();

@ -894,6 +894,7 @@ grpc_cc_library(
"poll", "poll",
"promise_factory", "promise_factory",
"//:gpr_platform", "//:gpr_platform",
"//:grpc_trace",
], ],
) )
@ -983,6 +984,7 @@ grpc_cc_library(
deps = [ deps = [
"construct_destruct", "construct_destruct",
"poll", "poll",
"promise_factory",
"//:gpr_platform", "//:gpr_platform",
], ],
) )
@ -1265,8 +1267,10 @@ grpc_cc_library(
language = "c++", language = "c++",
deps = [ deps = [
"activity", "activity",
"dump_args",
"poll", "poll",
"ref_counted", "ref_counted",
"status_flag",
"wait_set", "wait_set",
"//:gpr", "//:gpr",
"//:ref_counted_ptr", "//:ref_counted_ptr",
@ -8239,6 +8243,7 @@ grpc_cc_library(
"absl/random:bit_gen_ref", "absl/random:bit_gen_ref",
"absl/status", "absl/status",
"absl/status:statusor", "absl/status:statusor",
"absl/cleanup",
"absl/types:optional", "absl/types:optional",
"absl/types:variant", "absl/types:variant",
], ],
@ -8380,6 +8385,7 @@ grpc_cc_library(
"absl/random:bit_gen_ref", "absl/random:bit_gen_ref",
"absl/status", "absl/status",
"absl/status:statusor", "absl/status:statusor",
"absl/cleanup",
"absl/types:optional", "absl/types:optional",
"absl/types:variant", "absl/types:variant",
], ],

@ -260,7 +260,7 @@ class ClientChannel::SubchannelWrapper::WatcherWrapper
<< subchannel_wrapper_.get() << " subchannel " << subchannel_wrapper_.get() << " subchannel "
<< subchannel_wrapper_->subchannel_.get() << subchannel_wrapper_->subchannel_.get()
<< " watcher=" << watcher_.get() << " watcher=" << watcher_.get()
<< "state=" << ConnectivityStateName(state) << " status=" << status; << " state=" << ConnectivityStateName(state) << " status=" << status;
absl::optional<absl::Cord> keepalive_throttling = absl::optional<absl::Cord> keepalive_throttling =
status.GetPayload(kKeepaliveThrottlingKey); status.GetPayload(kKeepaliveThrottlingKey);
if (keepalive_throttling.has_value()) { if (keepalive_throttling.has_value()) {

@ -256,6 +256,9 @@ void ChaoticGoodClientTransport::AbortWithError() {
ReleasableMutexLock lock(&mu_); ReleasableMutexLock lock(&mu_);
StreamMap stream_map = std::move(stream_map_); StreamMap stream_map = std::move(stream_map_);
stream_map_.clear(); stream_map_.clear();
state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN,
absl::UnavailableError("transport closed"),
"transport closed");
lock.Release(); lock.Release();
for (const auto& pair : stream_map) { for (const auto& pair : stream_map) {
auto stream = std::move(pair.second); auto stream = std::move(pair.second);

@ -88,8 +88,14 @@ class InputQueues : public RefCounted<InputQueues> {
ReadTicket(const ReadTicket&) = delete; ReadTicket(const ReadTicket&) = delete;
ReadTicket& operator=(const ReadTicket&) = delete; ReadTicket& operator=(const ReadTicket&) = delete;
ReadTicket(ReadTicket&&) noexcept = default; ReadTicket(ReadTicket&& other) noexcept
ReadTicket& operator=(ReadTicket&&) noexcept = default; : ticket_(std::move(other.ticket_)),
input_queues_(std::move(other.input_queues_)) {}
ReadTicket& operator=(ReadTicket&& other) noexcept {
ticket_ = std::move(other.ticket_);
input_queues_ = std::move(other.input_queues_);
return *this;
}
~ReadTicket() { ~ReadTicket() {
if (input_queues_ != nullptr && ticket_.ok()) { if (input_queues_ != nullptr && ticket_.ok()) {

@ -23,6 +23,7 @@
#include <string> #include <string>
#include <tuple> #include <tuple>
#include "absl/cleanup/cleanup.h"
#include "absl/log/check.h" #include "absl/log/check.h"
#include "absl/log/log.h" #include "absl/log/log.h"
#include "absl/random/bit_gen_ref.h" #include "absl/random/bit_gen_ref.h"
@ -463,6 +464,12 @@ absl::Status ChaoticGoodServerTransport::NewStream(
void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) { void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
RefCountedPtr<Party> cancelled_party; RefCountedPtr<Party> cancelled_party;
bool close_outgoing_frames = false;
auto cleanup = absl::MakeCleanup([&close_outgoing_frames, this]() {
if (close_outgoing_frames) {
outgoing_frames_.MarkClosed();
}
});
MutexLock lock(&mu_); MutexLock lock(&mu_);
bool did_stuff = false; bool did_stuff = false;
if (op->start_connectivity_watch != nullptr) { if (op->start_connectivity_watch != nullptr) {
@ -484,7 +491,7 @@ void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
} }
if (!op->goaway_error.ok() || !op->disconnect_with_error.ok()) { if (!op->goaway_error.ok() || !op->disconnect_with_error.ok()) {
cancelled_party = std::move(party_); cancelled_party = std::move(party_);
outgoing_frames_.MarkClosed(); close_outgoing_frames = true;
state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN, state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN,
absl::UnavailableError("transport closed"), absl::UnavailableError("transport closed"),
"transport closed"); "transport closed");

@ -237,6 +237,9 @@ void ChaoticGoodClientTransport::AbortWithError() {
ReleasableMutexLock lock(&mu_); ReleasableMutexLock lock(&mu_);
StreamMap stream_map = std::move(stream_map_); StreamMap stream_map = std::move(stream_map_);
stream_map_.clear(); stream_map_.clear();
state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN,
absl::UnavailableError("transport closed"),
"transport closed");
lock.Release(); lock.Release();
for (const auto& pair : stream_map) { for (const auto& pair : stream_map) {
auto call_handler = pair.second; auto call_handler = pair.second;

@ -23,6 +23,7 @@
#include <string> #include <string>
#include <tuple> #include <tuple>
#include "absl/cleanup/cleanup.h"
#include "absl/log/check.h" #include "absl/log/check.h"
#include "absl/log/log.h" #include "absl/log/log.h"
#include "absl/random/bit_gen_ref.h" #include "absl/random/bit_gen_ref.h"
@ -488,6 +489,12 @@ absl::Status ChaoticGoodServerTransport::NewStream(
void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) { void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
RefCountedPtr<Party> cancelled_party; RefCountedPtr<Party> cancelled_party;
bool close_outgoing_frames = false;
auto cleanup = absl::MakeCleanup([&close_outgoing_frames, this]() {
if (close_outgoing_frames) {
outgoing_frames_.MarkClosed();
}
});
MutexLock lock(&mu_); MutexLock lock(&mu_);
bool did_stuff = false; bool did_stuff = false;
if (op->start_connectivity_watch != nullptr) { if (op->start_connectivity_watch != nullptr) {
@ -509,7 +516,7 @@ void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
} }
if (!op->goaway_error.ok() || !op->disconnect_with_error.ok()) { if (!op->goaway_error.ok() || !op->disconnect_with_error.ok()) {
cancelled_party = std::move(party_); cancelled_party = std::move(party_);
outgoing_frames_.MarkClosed(); close_outgoing_frames = true;
state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN, state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN,
absl::UnavailableError("transport closed"), absl::UnavailableError("transport closed"),
"transport closed"); "transport closed");

@ -224,7 +224,7 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
// c-ares overloads this recv_from virtual socket function to receive // c-ares overloads this recv_from virtual socket function to receive
// data on both UDP and TCP sockets, and from is nullptr for TCP. // data on both UDP and TCP sockets, and from is nullptr for TCP.
if (from != nullptr) { if (from != nullptr) {
CHECK(*from_len <= recv_from_source_addr_len_); CHECK(*from_len >= recv_from_source_addr_len_);
memcpy(from, &recv_from_source_addr_, recv_from_source_addr_len_); memcpy(from, &recv_from_source_addr_, recv_from_source_addr_len_);
*from_len = recv_from_source_addr_len_; *from_len = recv_from_source_addr_len_;
} }

@ -54,7 +54,7 @@
allow_in_fuzzing_config: false allow_in_fuzzing_config: false
- name: chaotic_good_legacy_protocol - name: chaotic_good_legacy_protocol
description: If set, use the first version of the chaotic-good protocol when that protocol is enabled. description: If set, use the first version of the chaotic-good protocol when that protocol is enabled.
expiry: 2024/12/01 expiry: 2025/01/15
owner: ctiller@google.com owner: ctiller@google.com
test_tags: [core_end2end_test] test_tags: [core_end2end_test]
- name: client_privacy - name: client_privacy

File diff suppressed because it is too large Load Diff

@ -22,6 +22,7 @@
#include "absl/status/status.h" #include "absl/status/status.h"
#include "absl/status/statusor.h" #include "absl/status/statusor.h"
#include "absl/types/variant.h" #include "absl/types/variant.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/promise/detail/promise_factory.h" #include "src/core/lib/promise/detail/promise_factory.h"
#include "src/core/lib/promise/poll.h" #include "src/core/lib/promise/poll.h"
#include "src/core/util/construct_destruct.h" #include "src/core/util/construct_destruct.h"
@ -100,6 +101,8 @@ class Loop {
Loop& operator=(const Loop& loop) = delete; Loop& operator=(const Loop& loop) = delete;
GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION Poll<Result> operator()() { GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION Poll<Result> operator()() {
GRPC_TRACE_LOG(promise_primitives, INFO)
<< "loop[" << this << "] begin poll started=" << started_;
if (!started_) { if (!started_) {
started_ = true; started_ = true;
Construct(&promise_, factory_.Make()); Construct(&promise_, factory_.Make());
@ -113,14 +116,20 @@ class Loop {
// from our factory. // from our factory.
auto lc = LoopTraits<PromiseResult>::ToLoopCtl(std::move(*p)); auto lc = LoopTraits<PromiseResult>::ToLoopCtl(std::move(*p));
if (absl::holds_alternative<Continue>(lc)) { if (absl::holds_alternative<Continue>(lc)) {
GRPC_TRACE_LOG(promise_primitives, INFO)
<< "loop[" << this << "] iteration complete, continue";
Destruct(&promise_); Destruct(&promise_);
Construct(&promise_, factory_.Make()); Construct(&promise_, factory_.Make());
continue; continue;
} }
GRPC_TRACE_LOG(promise_primitives, INFO)
<< "loop[" << this << "] iteration complete, return";
// - otherwise there's our result... return it out. // - otherwise there's our result... return it out.
return absl::get<Result>(std::move(lc)); return absl::get<Result>(std::move(lc));
} else { } else {
// Otherwise the inner promise was pending, so we are pending. // Otherwise the inner promise was pending, so we are pending.
GRPC_TRACE_LOG(promise_primitives, INFO)
<< "loop[" << this << "] pending";
return Pending(); return Pending();
} }
} }

@ -28,7 +28,9 @@
#include "absl/log/check.h" #include "absl/log/check.h"
#include "src/core/lib/promise/activity.h" #include "src/core/lib/promise/activity.h"
#include "src/core/lib/promise/poll.h" #include "src/core/lib/promise/poll.h"
#include "src/core/lib/promise/status_flag.h"
#include "src/core/lib/promise/wait_set.h" #include "src/core/lib/promise/wait_set.h"
#include "src/core/util/dump_args.h"
#include "src/core/util/ref_counted.h" #include "src/core/util/ref_counted.h"
#include "src/core/util/ref_counted_ptr.h" #include "src/core/util/ref_counted_ptr.h"
#include "src/core/util/sync.h" #include "src/core/util/sync.h"
@ -54,18 +56,23 @@ class Center : public RefCounted<Center<T>> {
// - Returns true if new items were obtained, in which case they are contained // - Returns true if new items were obtained, in which case they are contained
// in dest in the order they were added. Wakes up all pending senders since // in dest in the order they were added. Wakes up all pending senders since
// there will now be space to send. // there will now be space to send.
// - If receives have been closed, returns false.
// - If no new items are available, returns // - If no new items are available, returns
// false and sets up a waker to be awoken when more items are available. // Pending and sets up a waker to be awoken when more items are available.
// TODO(ctiller): consider the problem of thundering herds here. There may be // TODO(ctiller): consider the problem of thundering herds here. There may be
// more senders than there are queue spots, and so the strategy of waking up // more senders than there are queue spots, and so the strategy of waking up
// all senders is ill-advised. // all senders is ill-advised.
// That said, some senders may have been cancelled by the time we wake them, // That said, some senders may have been cancelled by the time we wake them,
// and so waking a subset could cause starvation. // and so waking a subset could cause starvation.
bool PollReceiveBatch(std::vector<T>& dest) { Poll<bool> PollReceiveBatch(std::vector<T>& dest) {
ReleasableMutexLock lock(&mu_); ReleasableMutexLock lock(&mu_);
GRPC_TRACE_LOG(promise_primitives, INFO)
<< "MPSC::PollReceiveBatch: "
<< GRPC_DUMP_ARGS(this, batch_, queue_.size());
if (queue_.empty()) { if (queue_.empty()) {
if (batch_ == kClosedBatch) return false;
receive_waker_ = GetContext<Activity>()->MakeNonOwningWaker(); receive_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
return false; return Pending{};
} }
dest.swap(queue_); dest.swap(queue_);
queue_.clear(); queue_.clear();
@ -97,18 +104,24 @@ class Center : public RefCounted<Center<T>> {
// Poll until a particular batch number is received. // Poll until a particular batch number is received.
Poll<Empty> PollReceiveBatch(uint64_t batch) { Poll<Empty> PollReceiveBatch(uint64_t batch) {
ReleasableMutexLock lock(&mu_); ReleasableMutexLock lock(&mu_);
GRPC_TRACE_LOG(promise_primitives, INFO)
<< "MPSC::PollReceiveBatch: " << GRPC_DUMP_ARGS(this, batch_, batch);
if (batch_ >= batch) return Empty{}; if (batch_ >= batch) return Empty{};
send_wakers_.AddPending(GetContext<Activity>()->MakeNonOwningWaker()); send_wakers_.AddPending(GetContext<Activity>()->MakeNonOwningWaker());
return Pending{}; return Pending{};
} }
// Mark that the receiver is closed. // Mark that the receiver is closed.
void ReceiverClosed() { void ReceiverClosed(bool wake_receiver) {
ReleasableMutexLock lock(&mu_); ReleasableMutexLock lock(&mu_);
GRPC_TRACE_LOG(promise_primitives, INFO)
<< "MPSC::ReceiverClosed: " << GRPC_DUMP_ARGS(this, batch_);
if (batch_ == kClosedBatch) return; if (batch_ == kClosedBatch) return;
batch_ = kClosedBatch; batch_ = kClosedBatch;
auto wakeups = send_wakers_.TakeWakeupSet(); auto wakeups = send_wakers_.TakeWakeupSet();
auto receive_waker = std::move(receive_waker_);
lock.Release(); lock.Release();
if (wake_receiver) receive_waker.Wakeup();
wakeups.Wakeup(); wakeups.Wakeup();
} }
@ -188,10 +201,10 @@ class MpscReceiver {
: center_(MakeRefCounted<mpscpipe_detail::Center<T>>( : center_(MakeRefCounted<mpscpipe_detail::Center<T>>(
std::max(static_cast<size_t>(1), max_buffer_hint / 2))) {} std::max(static_cast<size_t>(1), max_buffer_hint / 2))) {}
~MpscReceiver() { ~MpscReceiver() {
if (center_ != nullptr) center_->ReceiverClosed(); if (center_ != nullptr) center_->ReceiverClosed(false);
} }
void MarkClosed() { void MarkClosed() {
if (center_ != nullptr) center_->ReceiverClosed(); if (center_ != nullptr) center_->ReceiverClosed(true);
} }
MpscReceiver(const MpscReceiver&) = delete; MpscReceiver(const MpscReceiver&) = delete;
MpscReceiver& operator=(const MpscReceiver&) = delete; MpscReceiver& operator=(const MpscReceiver&) = delete;
@ -210,15 +223,19 @@ class MpscReceiver {
// Construct a new sender for this receiver. // Construct a new sender for this receiver.
MpscSender<T> MakeSender() { return MpscSender<T>(center_); } MpscSender<T> MakeSender() { return MpscSender<T>(center_); }
// Return a promise that will resolve to the next item (and remove said item). // Return a promise that will resolve to ValueOrFailure<T>.
// If receiving is closed, it will resolve to failure.
// Otherwise, resolves to the next item (and removes said item).
auto Next() { auto Next() {
return [this]() -> Poll<T> { return [this]() -> Poll<ValueOrFailure<T>> {
if (buffer_it_ != buffer_.end()) { if (buffer_it_ != buffer_.end()) {
return Poll<T>(std::move(*buffer_it_++)); return Poll<ValueOrFailure<T>>(std::move(*buffer_it_++));
} }
if (center_->PollReceiveBatch(buffer_)) { auto p = center_->PollReceiveBatch(buffer_);
if (bool* r = p.value_if_ready()) {
if (!*r) return Failure{};
buffer_it_ = buffer_.begin(); buffer_it_ = buffer_.begin();
return Poll<T>(std::move(*buffer_it_++)); return Poll<ValueOrFailure<T>>(std::move(*buffer_it_++));
} }
return Pending{}; return Pending{};
}; };

@ -360,6 +360,7 @@ void Party::RunPartyAndUnref(uint64_t prev_state) {
} }
void Party::AddParticipants(Participant** participants, size_t count) { void Party::AddParticipants(Participant** participants, size_t count) {
GRPC_LATENT_SEE_INNER_SCOPE("Party::AddParticipants");
uint64_t state = state_.load(std::memory_order_acquire); uint64_t state = state_.load(std::memory_order_acquire);
uint64_t allocated; uint64_t allocated;
@ -403,6 +404,7 @@ void Party::AddParticipants(Participant** participants, size_t count) {
} }
void Party::AddParticipant(Participant* participant) { void Party::AddParticipant(Participant* participant) {
GRPC_LATENT_SEE_INNER_SCOPE("Party::AddParticipant");
uint64_t state = state_.load(std::memory_order_acquire); uint64_t state = state_.load(std::memory_order_acquire);
uint64_t allocated; uint64_t allocated;
size_t slot; size_t slot;
@ -471,6 +473,7 @@ void Party::WakeupAsync(WakeupMask wakeup_mask) {
wakeup_mask_ |= wakeup_mask; wakeup_mask_ |= wakeup_mask;
arena_->GetContext<grpc_event_engine::experimental::EventEngine>()->Run( arena_->GetContext<grpc_event_engine::experimental::EventEngine>()->Run(
[this, prev_state]() { [this, prev_state]() {
GRPC_LATENT_SEE_PARENT_SCOPE("Party::WakeupAsync");
ApplicationCallbackExecCtx app_exec_ctx; ApplicationCallbackExecCtx app_exec_ctx;
ExecCtx exec_ctx; ExecCtx exec_ctx;
RunLockedAndUnref(this, prev_state); RunLockedAndUnref(this, prev_state);

@ -342,6 +342,7 @@ class Party : public Activity, private Wakeable {
// Wakeable implementation // Wakeable implementation
void Wakeup(WakeupMask wakeup_mask) final { void Wakeup(WakeupMask wakeup_mask) final {
GRPC_LATENT_SEE_INNER_SCOPE("Party::Wakeup");
if (Activity::current() == this) { if (Activity::current() == this) {
wakeup_mask_ |= wakeup_mask; wakeup_mask_ |= wakeup_mask;
Unref(); Unref();
@ -352,6 +353,7 @@ class Party : public Activity, private Wakeable {
GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void WakeupFromState( GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void WakeupFromState(
uint64_t cur_state, WakeupMask wakeup_mask) { uint64_t cur_state, WakeupMask wakeup_mask) {
GRPC_LATENT_SEE_INNER_SCOPE("Party::WakeupFromState");
DCHECK_NE(wakeup_mask & kWakeupMask, 0u) DCHECK_NE(wakeup_mask & kWakeupMask, 0u)
<< "Wakeup mask must be non-zero: " << wakeup_mask; << "Wakeup mask must be non-zero: " << wakeup_mask;
while (true) { while (true) {

@ -286,6 +286,19 @@ void AbslStringify(Sink& sink, const Poll<T>& poll) {
absl::Format(&sink, "%v", poll.value()); absl::Format(&sink, "%v", poll.value());
} }
template <typename Sink, typename T>
void AbslStringify(Sink& sink, const Poll<absl::StatusOr<T>>& poll) {
if (poll.pending()) {
absl::Format(&sink, "<<pending>>");
return;
}
if (poll.value().ok()) {
absl::Format(&sink, "%v", *poll.value());
} else {
absl::Format(&sink, "%v", poll.value().status());
}
}
template <typename Sink, typename T> template <typename Sink, typename T>
void AbslStringify(Sink& sink, const Poll<absl::optional<T>>& poll) { void AbslStringify(Sink& sink, const Poll<absl::optional<T>>& poll) {
if (poll.pending()) { if (poll.pending()) {

@ -95,6 +95,10 @@ class PublishToAppEncoder {
Append(LbTokenMetadata::key(), slice); Append(LbTokenMetadata::key(), slice);
} }
void Encode(W3CTraceParentMetadata, const Slice& slice) {
Append(W3CTraceParentMetadata::key(), slice);
}
private: private:
void Append(absl::string_view key, int64_t value) { void Append(absl::string_view key, int64_t value) {
Append(StaticSlice::FromStaticString(key).c_slice(), Append(StaticSlice::FromStaticString(key).c_slice(),

@ -184,6 +184,7 @@ void ClientCall::CancelWithError(grpc_error_handle error) {
template <typename Batch> template <typename Batch>
void ClientCall::ScheduleCommittedBatch(Batch batch) { void ClientCall::ScheduleCommittedBatch(Batch batch) {
GRPC_LATENT_SEE_INNER_SCOPE("ClientCall::ScheduleCommittedBatch");
auto cur_state = call_state_.load(std::memory_order_acquire); auto cur_state = call_state_.load(std::memory_order_acquire);
while (true) { while (true) {
switch (cur_state) { switch (cur_state) {
@ -225,6 +226,7 @@ void ClientCall::ScheduleCommittedBatch(Batch batch) {
} }
void ClientCall::StartCall(const grpc_op& send_initial_metadata_op) { void ClientCall::StartCall(const grpc_op& send_initial_metadata_op) {
GRPC_LATENT_SEE_INNER_SCOPE("ClientCall::StartCall");
auto cur_state = call_state_.load(std::memory_order_acquire); auto cur_state = call_state_.load(std::memory_order_acquire);
CToMetadata(send_initial_metadata_op.data.send_initial_metadata.metadata, CToMetadata(send_initial_metadata_op.data.send_initial_metadata.metadata,
send_initial_metadata_op.data.send_initial_metadata.count, send_initial_metadata_op.data.send_initial_metadata.count,
@ -271,6 +273,7 @@ void ClientCall::StartCall(const grpc_op& send_initial_metadata_op) {
void ClientCall::CommitBatch(const grpc_op* ops, size_t nops, void* notify_tag, void ClientCall::CommitBatch(const grpc_op* ops, size_t nops, void* notify_tag,
bool is_notify_tag_closure) { bool is_notify_tag_closure) {
GRPC_LATENT_SEE_INNER_SCOPE("ClientCall::CommitBatch");
if (nops == 1 && ops[0].op == GRPC_OP_SEND_INITIAL_METADATA) { if (nops == 1 && ops[0].op == GRPC_OP_SEND_INITIAL_METADATA) {
StartCall(ops[0]); StartCall(ops[0]);
EndOpImmediately(cq_, notify_tag, is_notify_tag_closure); EndOpImmediately(cq_, notify_tag, is_notify_tag_closure);

@ -83,6 +83,7 @@ bool DebugStringBuilder::IsAllowListed(const absl::string_view key) const {
allow_list.insert(std::string(LbTokenMetadata::key())); allow_list.insert(std::string(LbTokenMetadata::key()));
allow_list.insert(std::string(TeMetadata::key())); allow_list.insert(std::string(TeMetadata::key()));
allow_list.insert(std::string(UserAgentMetadata::key())); allow_list.insert(std::string(UserAgentMetadata::key()));
allow_list.insert(std::string(W3CTraceParentMetadata::key()));
allow_list.insert(std::string(XEnvoyPeerMetadata::key())); allow_list.insert(std::string(XEnvoyPeerMetadata::key()));
// go/keep-sorted end // go/keep-sorted end
// go/keep-sorted start // go/keep-sorted start

@ -468,6 +468,14 @@ struct LbCostBinMetadata {
MetadataParseErrorFn on_error); MetadataParseErrorFn on_error);
}; };
// traceparent metadata
struct W3CTraceParentMetadata : public SimpleSliceBasedMetadata {
static constexpr bool kRepeatable = false;
static constexpr bool kTransferOnTrailersOnly = false;
using CompressionTraits = NoCompressionCompressor;
static absl::string_view key() { return "traceparent"; }
};
// Annotation added by a transport to note whether a failed request was never // Annotation added by a transport to note whether a failed request was never
// placed on the wire, or never seen by a server. // placed on the wire, or never seen by a server.
struct GrpcStreamNetworkState { struct GrpcStreamNetworkState {
@ -1582,7 +1590,7 @@ using grpc_metadata_batch_base = grpc_core::MetadataMap<
grpc_core::GrpcServerStatsBinMetadata, grpc_core::GrpcTraceBinMetadata, grpc_core::GrpcServerStatsBinMetadata, grpc_core::GrpcTraceBinMetadata,
grpc_core::GrpcTagsBinMetadata, grpc_core::GrpcLbClientStatsMetadata, grpc_core::GrpcTagsBinMetadata, grpc_core::GrpcLbClientStatsMetadata,
grpc_core::LbCostBinMetadata, grpc_core::LbTokenMetadata, grpc_core::LbCostBinMetadata, grpc_core::LbTokenMetadata,
grpc_core::XEnvoyPeerMetadata, grpc_core::XEnvoyPeerMetadata, grpc_core::W3CTraceParentMetadata,
// Non-encodable things // Non-encodable things
grpc_core::GrpcStreamNetworkState, grpc_core::PeerString, grpc_core::GrpcStreamNetworkState, grpc_core::PeerString,
grpc_core::GrpcStatusContext, grpc_core::GrpcStatusFromWire, grpc_core::GrpcStatusContext, grpc_core::GrpcStatusFromWire,

@ -423,7 +423,7 @@ PickFirst::PickFirst(Args args)
PickFirst::~PickFirst() { PickFirst::~PickFirst() {
GRPC_TRACE_LOG(pick_first, INFO) << "Destroying Pick First " << this; GRPC_TRACE_LOG(pick_first, INFO) << "Destroying Pick First " << this;
CHECK(subchannel_list_ == nullptr); CHECK_EQ(subchannel_list_.get(), nullptr);
} }
void PickFirst::ShutdownLocked() { void PickFirst::ShutdownLocked() {
@ -744,6 +744,8 @@ void PickFirst::SubchannelList::SubchannelData::SubchannelState::
// If we're still part of a subchannel list trying to connect, check // If we're still part of a subchannel list trying to connect, check
// if we're connected. // if we're connected.
if (subchannel_data_ != nullptr) { if (subchannel_data_ != nullptr) {
CHECK_EQ(pick_first_->subchannel_list_.get(),
subchannel_data_->subchannel_list_);
// If the subchannel is READY, use it. // If the subchannel is READY, use it.
// Otherwise, tell the subchannel list to keep trying. // Otherwise, tell the subchannel list to keep trying.
if (new_state == GRPC_CHANNEL_READY) { if (new_state == GRPC_CHANNEL_READY) {
@ -754,7 +756,7 @@ void PickFirst::SubchannelList::SubchannelData::SubchannelState::
return; return;
} }
// We aren't trying to connect, so we must be the selected subchannel. // We aren't trying to connect, so we must be the selected subchannel.
CHECK(pick_first_->selected_.get() == this); CHECK_EQ(pick_first_->selected_.get(), this);
GRPC_TRACE_LOG(pick_first, INFO) GRPC_TRACE_LOG(pick_first, INFO)
<< "Pick First " << pick_first_.get() << "Pick First " << pick_first_.get()
<< " selected subchannel connectivity changed to " << " selected subchannel connectivity changed to "
@ -803,15 +805,14 @@ void PickFirst::SubchannelList::SubchannelData::OnConnectivityStateChange(
<< ", p->subchannel_list_=" << p->subchannel_list_.get() << ", p->subchannel_list_=" << p->subchannel_list_.get()
<< ", p->subchannel_list_->shutting_down_=" << ", p->subchannel_list_->shutting_down_="
<< p->subchannel_list_->shutting_down_; << p->subchannel_list_->shutting_down_;
if (subchannel_list_->shutting_down_) return; if (subchannel_list_->shutting_down_) return;
// The notification must be for a subchannel in the current list. // The notification must be for a subchannel in the current list.
CHECK(subchannel_list_ == p->subchannel_list_.get()); CHECK_EQ(subchannel_list_, p->subchannel_list_.get());
// SHUTDOWN should never happen. // SHUTDOWN should never happen.
CHECK(new_state != GRPC_CHANNEL_SHUTDOWN); CHECK_NE(new_state, GRPC_CHANNEL_SHUTDOWN);
// READY should be caught by SubchannelState, in which case it will // READY should be caught by SubchannelState, in which case it will
// not call us in the first place. // not call us in the first place.
CHECK(new_state != GRPC_CHANNEL_READY); CHECK_NE(new_state, GRPC_CHANNEL_READY);
// Update state. // Update state.
absl::optional<grpc_connectivity_state> old_state = connectivity_state_; absl::optional<grpc_connectivity_state> old_state = connectivity_state_;
connectivity_state_ = new_state; connectivity_state_ = new_state;
@ -935,7 +936,7 @@ void PickFirst::SubchannelList::SubchannelData::RequestConnectionWithTimer() {
if (connectivity_state_ == GRPC_CHANNEL_IDLE) { if (connectivity_state_ == GRPC_CHANNEL_IDLE) {
subchannel_state_->RequestConnection(); subchannel_state_->RequestConnection();
} else { } else {
CHECK(connectivity_state_ == GRPC_CHANNEL_CONNECTING); CHECK_EQ(connectivity_state_.value(), GRPC_CHANNEL_CONNECTING);
} }
// If this is not the last subchannel in the list, start the timer. // If this is not the last subchannel in the list, start the timer.
if (index_ != subchannel_list_->size() - 1) { if (index_ != subchannel_list_->size() - 1) {
@ -1021,6 +1022,8 @@ void PickFirst::SubchannelList::Orphan() {
<< "[PF " << policy_.get() << "] Shutting down subchannel_list " << this; << "[PF " << policy_.get() << "] Shutting down subchannel_list " << this;
CHECK(!shutting_down_); CHECK(!shutting_down_);
shutting_down_ = true; shutting_down_ = true;
// Shut down subchannels.
subchannels_.clear();
// Cancel Happy Eyeballs timer, if any. // Cancel Happy Eyeballs timer, if any.
if (timer_handle_.has_value()) { if (timer_handle_.has_value()) {
policy_->channel_control_helper()->GetEventEngine()->Cancel(*timer_handle_); policy_->channel_control_helper()->GetEventEngine()->Cancel(*timer_handle_);

@ -307,7 +307,7 @@ class GrpcPolledFdWindows final : public GrpcPolledFd {
// c-ares overloads this recv_from virtual socket function to receive // c-ares overloads this recv_from virtual socket function to receive
// data on both UDP and TCP sockets, and from is nullptr for TCP. // data on both UDP and TCP sockets, and from is nullptr for TCP.
if (from != nullptr) { if (from != nullptr) {
CHECK(*from_len <= recv_from_source_addr_len_); CHECK(*from_len >= recv_from_source_addr_len_);
memcpy(from, &recv_from_source_addr_, recv_from_source_addr_len_); memcpy(from, &recv_from_source_addr_, recv_from_source_addr_len_);
*from_len = recv_from_source_addr_len_; *from_len = recv_from_source_addr_len_;
} }

@ -120,27 +120,30 @@ void GlobalStatsPluginRegistry::StatsPluginGroup::AddServerCallTracers(
} }
} }
NoDestruct<Mutex> GlobalStatsPluginRegistry::mutex_; std::atomic<GlobalStatsPluginRegistry::GlobalStatsPluginNode*>
NoDestruct<std::vector<std::shared_ptr<StatsPlugin>>>
GlobalStatsPluginRegistry::plugins_; GlobalStatsPluginRegistry::plugins_;
void GlobalStatsPluginRegistry::RegisterStatsPlugin( void GlobalStatsPluginRegistry::RegisterStatsPlugin(
std::shared_ptr<StatsPlugin> plugin) { std::shared_ptr<StatsPlugin> plugin) {
MutexLock lock(&*mutex_); GlobalStatsPluginNode* node = new GlobalStatsPluginNode();
plugins_->push_back(std::move(plugin)); node->plugin = std::move(plugin);
node->next = plugins_.load(std::memory_order_relaxed);
while (!plugins_.compare_exchange_weak(
node->next, node, std::memory_order_acq_rel, std::memory_order_relaxed)) {
}
} }
GlobalStatsPluginRegistry::StatsPluginGroup GlobalStatsPluginRegistry::StatsPluginGroup
GlobalStatsPluginRegistry::GetStatsPluginsForChannel( GlobalStatsPluginRegistry::GetStatsPluginsForChannel(
const experimental::StatsPluginChannelScope& scope) { const experimental::StatsPluginChannelScope& scope) {
MutexLock lock(&*mutex_);
StatsPluginGroup group; StatsPluginGroup group;
for (const auto& plugin : *plugins_) { for (GlobalStatsPluginNode* node = plugins_.load(std::memory_order_acquire);
node != nullptr; node = node->next) {
bool is_enabled = false; bool is_enabled = false;
std::shared_ptr<StatsPlugin::ScopeConfig> config; std::shared_ptr<StatsPlugin::ScopeConfig> config;
std::tie(is_enabled, config) = plugin->IsEnabledForChannel(scope); std::tie(is_enabled, config) = node->plugin->IsEnabledForChannel(scope);
if (is_enabled) { if (is_enabled) {
group.AddStatsPlugin(plugin, std::move(config)); group.AddStatsPlugin(node->plugin, std::move(config));
} }
} }
return group; return group;
@ -148,14 +151,14 @@ GlobalStatsPluginRegistry::GetStatsPluginsForChannel(
GlobalStatsPluginRegistry::StatsPluginGroup GlobalStatsPluginRegistry::StatsPluginGroup
GlobalStatsPluginRegistry::GetStatsPluginsForServer(const ChannelArgs& args) { GlobalStatsPluginRegistry::GetStatsPluginsForServer(const ChannelArgs& args) {
MutexLock lock(&*mutex_);
StatsPluginGroup group; StatsPluginGroup group;
for (const auto& plugin : *plugins_) { for (GlobalStatsPluginNode* node = plugins_.load(std::memory_order_acquire);
node != nullptr; node = node->next) {
bool is_enabled = false; bool is_enabled = false;
std::shared_ptr<StatsPlugin::ScopeConfig> config; std::shared_ptr<StatsPlugin::ScopeConfig> config;
std::tie(is_enabled, config) = plugin->IsEnabledForServer(args); std::tie(is_enabled, config) = node->plugin->IsEnabledForServer(args);
if (is_enabled) { if (is_enabled) {
group.AddStatsPlugin(plugin, std::move(config)); group.AddStatsPlugin(node->plugin, std::move(config));
} }
} }
return group; return group;

@ -446,6 +446,8 @@ class GlobalStatsPluginRegistry {
return false; return false;
} }
size_t size() const { return plugins_state_.size(); }
// Registers a callback to be used to populate callback metrics. // Registers a callback to be used to populate callback metrics.
// The callback will update the specified metrics. The callback // The callback will update the specified metrics. The callback
// will be invoked no more often than min_interval. Multiple callbacks may // will be invoked no more often than min_interval. Multiple callbacks may
@ -508,13 +510,15 @@ class GlobalStatsPluginRegistry {
static StatsPluginGroup GetStatsPluginsForServer(const ChannelArgs& args); static StatsPluginGroup GetStatsPluginsForServer(const ChannelArgs& args);
private: private:
struct GlobalStatsPluginNode {
std::shared_ptr<StatsPlugin> plugin;
GlobalStatsPluginNode* next = nullptr;
};
friend class GlobalStatsPluginRegistryTestPeer; friend class GlobalStatsPluginRegistryTestPeer;
GlobalStatsPluginRegistry() = default; GlobalStatsPluginRegistry() = default;
static NoDestruct<Mutex> mutex_; static std::atomic<GlobalStatsPluginNode*> plugins_;
static NoDestruct<std::vector<std::shared_ptr<StatsPlugin>>> plugins_
ABSL_GUARDED_BY(mutex_);
}; };
// A metric callback that is registered with a stats plugin group. // A metric callback that is registered with a stats plugin group.

@ -35,6 +35,7 @@
#include "absl/functional/function_ref.h" #include "absl/functional/function_ref.h"
#include "absl/log/log.h" #include "absl/log/log.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/util/per_cpu.h" #include "src/core/util/per_cpu.h"
#include "src/core/util/sync.h" #include "src/core/util/sync.h"

@ -199,6 +199,7 @@ std::string XdsRouteConfigResource::Route::RouteAction::ToString() const {
if (max_stream_duration.has_value()) { if (max_stream_duration.has_value()) {
contents.push_back(max_stream_duration->ToString()); contents.push_back(max_stream_duration->ToString());
} }
if (auto_host_rewrite) contents.push_back("auto_host_rewrite=true");
return absl::StrCat("{", absl::StrJoin(contents, ", "), "}"); return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
} }

@ -14,6 +14,8 @@
// limitations under the License. // limitations under the License.
// //
#include "src/cpp/server/orca/orca_service.h"
#include <grpc/event_engine/event_engine.h> #include <grpc/event_engine/event_engine.h>
#include <grpcpp/ext/orca_service.h> #include <grpcpp/ext/orca_service.h>
#include <grpcpp/ext/server_metric_recorder.h> #include <grpcpp/ext/server_metric_recorder.h>
@ -32,8 +34,8 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include "absl/base/thread_annotations.h"
#include "absl/log/check.h" #include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "absl/time/time.h" #include "absl/time/time.h"
#include "absl/types/optional.h" #include "absl/types/optional.h"
@ -42,8 +44,6 @@
#include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/load_balancing/backend_metric_data.h" #include "src/core/load_balancing/backend_metric_data.h"
#include "src/core/util/debug_location.h" #include "src/core/util/debug_location.h"
#include "src/core/util/ref_counted.h"
#include "src/core/util/ref_counted_ptr.h"
#include "src/core/util/time.h" #include "src/core/util/time.h"
#include "src/cpp/server/backend_metric_recorder.h" #include "src/cpp/server/backend_metric_recorder.h"
#include "upb/base/string_view.h" #include "upb/base/string_view.h"
@ -54,114 +54,118 @@
namespace grpc { namespace grpc {
namespace experimental { namespace experimental {
using ::grpc_event_engine::experimental::EventEngine;
// //
// OrcaService::Reactor // OrcaService::Reactor
// //
class OrcaService::Reactor : public ServerWriteReactor<ByteBuffer>, OrcaService::Reactor::Reactor(OrcaService* service, absl::string_view peer,
public grpc_core::RefCounted<Reactor> { const ByteBuffer* request_buffer,
public: std::shared_ptr<ReactorHook> hook)
explicit Reactor(OrcaService* service, const ByteBuffer* request_buffer) : service_(service),
: RefCounted("OrcaService::Reactor"), hook_(std::move(hook)),
service_(service), engine_(grpc_event_engine::experimental::GetDefaultEventEngine()) {
engine_(grpc_event_engine::experimental::GetDefaultEventEngine()) { // Get slice from request.
// Get slice from request. Slice slice;
Slice slice; grpc::Status status = request_buffer->DumpToSingleSlice(&slice);
CHECK(request_buffer->DumpToSingleSlice(&slice).ok()); if (!status.ok()) {
// Parse request proto. LOG_EVERY_N_SEC(WARNING, 1)
upb::Arena arena; << "OrcaService failed to extract request from peer: " << peer
xds_service_orca_v3_OrcaLoadReportRequest* request = << " error:" << status.error_message();
xds_service_orca_v3_OrcaLoadReportRequest_parse( FinishRpc(Status(StatusCode::INTERNAL, status.error_message()));
reinterpret_cast<const char*>(slice.begin()), slice.size(), return;
arena.ptr());
if (request == nullptr) {
Finish(Status(StatusCode::INTERNAL, "could not parse request proto"));
return;
}
const auto* duration_proto =
xds_service_orca_v3_OrcaLoadReportRequest_report_interval(request);
if (duration_proto != nullptr) {
report_interval_ = grpc_core::Duration::FromSecondsAndNanoseconds(
google_protobuf_Duration_seconds(duration_proto),
google_protobuf_Duration_nanos(duration_proto));
}
auto min_interval = grpc_core::Duration::Milliseconds(
service_->min_report_duration_ / absl::Milliseconds(1));
if (report_interval_ < min_interval) report_interval_ = min_interval;
// Send initial response.
SendResponse();
} }
// Parse request proto.
void OnWriteDone(bool ok) override { upb::Arena arena;
if (!ok) { xds_service_orca_v3_OrcaLoadReportRequest* request =
Finish(Status(StatusCode::UNKNOWN, "write failed")); xds_service_orca_v3_OrcaLoadReportRequest_parse(
return; reinterpret_cast<const char*>(slice.begin()), slice.size(),
} arena.ptr());
response_.Clear(); if (request == nullptr) {
if (!MaybeScheduleTimer()) { LOG_EVERY_N_SEC(WARNING, 1)
Finish(Status(StatusCode::UNKNOWN, "call cancelled by client")); << "OrcaService failed to parse request proto from peer: " << peer;
} FinishRpc(Status(StatusCode::INTERNAL, "could not parse request proto"));
return;
} }
const auto* duration_proto =
void OnCancel() override { xds_service_orca_v3_OrcaLoadReportRequest_report_interval(request);
if (MaybeCancelTimer()) { grpc_core::Duration report_interval;
Finish(Status(StatusCode::UNKNOWN, "call cancelled by client")); if (duration_proto != nullptr) {
} report_interval = grpc_core::Duration::FromSecondsAndNanoseconds(
google_protobuf_Duration_seconds(duration_proto),
google_protobuf_Duration_nanos(duration_proto));
} }
auto min_interval = grpc_core::Duration::Milliseconds(
service_->min_report_duration_ / absl::Milliseconds(1));
report_interval_ = std::max(report_interval, min_interval);
// Send initial response.
SendResponse();
}
void OnDone() override { void OrcaService::Reactor::OnWriteDone(bool ok) {
// Free the initial ref from instantiation. if (!ok) {
Unref(DEBUG_LOCATION, "OnDone"); FinishRpc(Status(StatusCode::UNKNOWN, "write failed"));
return;
} }
response_.Clear();
private: if (!MaybeScheduleTimer()) {
void SendResponse() { FinishRpc(Status(StatusCode::UNKNOWN, "call cancelled by client"));
Slice response_slice = service_->GetOrCreateSerializedResponse();
ByteBuffer response_buffer(&response_slice, 1);
response_.Swap(&response_buffer);
StartWrite(&response_);
} }
}
bool MaybeScheduleTimer() { void OrcaService::Reactor::OnCancel() {
grpc::internal::MutexLock lock(&timer_mu_); if (MaybeCancelTimer()) {
if (cancelled_) return false; FinishRpc(Status(StatusCode::UNKNOWN, "call cancelled by client"));
timer_handle_ = engine_->RunAfter(
report_interval_,
[self = Ref(DEBUG_LOCATION, "Orca Service")] { self->OnTimer(); });
return true;
} }
}
bool MaybeCancelTimer() { void OrcaService::Reactor::OnDone() {
grpc::internal::MutexLock lock(&timer_mu_); // Free the initial ref from instantiation.
cancelled_ = true; Unref(DEBUG_LOCATION, "OnDone");
if (timer_handle_.has_value() && engine_->Cancel(*timer_handle_)) { }
timer_handle_.reset();
return true; void OrcaService::Reactor::FinishRpc(grpc::Status status) {
} if (hook_ != nullptr) {
return false; hook_->OnFinish(status);
} }
Finish(status);
}
void OnTimer() { void OrcaService::Reactor::SendResponse() {
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; Slice response_slice = service_->GetOrCreateSerializedResponse();
grpc_core::ExecCtx exec_ctx; ByteBuffer response_buffer(&response_slice, 1);
grpc::internal::MutexLock lock(&timer_mu_); response_.Swap(&response_buffer);
timer_handle_.reset(); if (hook_ != nullptr) {
SendResponse(); hook_->OnStartWrite(&response_);
} }
StartWrite(&response_);
}
OrcaService* service_; bool OrcaService::Reactor::MaybeScheduleTimer() {
grpc::internal::MutexLock lock(&timer_mu_);
if (cancelled_) return false;
timer_handle_ = engine_->RunAfter(
report_interval_,
[self = Ref(DEBUG_LOCATION, "Orca Service")] { self->OnTimer(); });
return true;
}
grpc::internal::Mutex timer_mu_; bool OrcaService::Reactor::MaybeCancelTimer() {
absl::optional<EventEngine::TaskHandle> timer_handle_ grpc::internal::MutexLock lock(&timer_mu_);
ABSL_GUARDED_BY(&timer_mu_); cancelled_ = true;
bool cancelled_ ABSL_GUARDED_BY(&timer_mu_) = false; if (timer_handle_.has_value() && engine_->Cancel(*timer_handle_)) {
timer_handle_.reset();
return true;
}
return false;
}
grpc_core::Duration report_interval_; void OrcaService::Reactor::OnTimer() {
ByteBuffer response_; grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine_; grpc_core::ExecCtx exec_ctx;
}; grpc::internal::MutexLock lock(&timer_mu_);
timer_handle_.reset();
SendResponse();
}
// //
// OrcaService // OrcaService
@ -177,8 +181,8 @@ OrcaService::OrcaService(ServerMetricRecorder* const server_metric_recorder,
internal::RpcMethod::SERVER_STREAMING, /*handler=*/nullptr)); internal::RpcMethod::SERVER_STREAMING, /*handler=*/nullptr));
MarkMethodCallback( MarkMethodCallback(
0, new internal::CallbackServerStreamingHandler<ByteBuffer, ByteBuffer>( 0, new internal::CallbackServerStreamingHandler<ByteBuffer, ByteBuffer>(
[this](CallbackServerContext* /*ctx*/, const ByteBuffer* request) { [this](CallbackServerContext* ctx, const ByteBuffer* request) {
return new Reactor(this, request); return new Reactor(this, ctx->peer(), request, nullptr);
})); }));
} }

@ -0,0 +1,79 @@
//
// Copyright 2024 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef GRPC_SRC_CPP_SERVER_ORCA_ORCA_SERVICE_H
#define GRPC_SRC_CPP_SERVER_ORCA_ORCA_SERVICE_H
#include <grpc/event_engine/event_engine.h>
#include <grpcpp/ext/orca_service.h>
#include <grpcpp/impl/sync.h>
#include <grpcpp/support/byte_buffer.h>
#include <grpcpp/support/server_callback.h>
#include <grpcpp/support/status.h>
#include <atomic>
#include <memory>
#include "absl/base/thread_annotations.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/util/ref_counted.h"
namespace grpc {
namespace experimental {
class OrcaService::Reactor
: public ServerWriteReactor<ByteBuffer>,
public grpc_core::RefCounted<OrcaService::Reactor> {
public:
explicit Reactor(OrcaService* service, absl::string_view peer,
const ByteBuffer* request_buffer,
std::shared_ptr<OrcaService::ReactorHook> hook);
void OnWriteDone(bool ok) override;
void OnCancel() override;
void OnDone() override;
private:
void FinishRpc(grpc::Status status);
void SendResponse();
bool MaybeScheduleTimer();
bool MaybeCancelTimer();
void OnTimer();
OrcaService* service_;
grpc::internal::Mutex timer_mu_;
absl::optional<grpc_event_engine::experimental::EventEngine::TaskHandle>
timer_handle_ ABSL_GUARDED_BY(&timer_mu_);
bool cancelled_ ABSL_GUARDED_BY(&timer_mu_) = false;
grpc_event_engine::experimental::EventEngine::Duration report_interval_;
ByteBuffer response_;
std::shared_ptr<ReactorHook> hook_;
std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine_;
};
} // namespace experimental
} // namespace grpc
#endif // GRPC_SRC_CPP_SERVER_ORCA_ORCA_SERVICE_H

@ -0,0 +1,60 @@
test_id: 102
event_engine_actions {
run_delay: 25122
run_delay: 27519
run_delay: 34012
run_delay: 2199023294550
run_delay: 730
run_delay: 19885
run_delay: 2138
run_delay: 15205
run_delay: 0
run_delay: 36939
run_delay: 12737
run_delay: 7305964495501793720
run_delay: 9757
run_delay: 206158449291
run_delay: 19555
run_delay: 16159
run_delay: 281474976398479
run_delay: 2167
run_delay: 6962
run_delay: 7261
run_delay: 64207512928256
run_delay: 25235
run_delay: 42834
run_delay: 5400
run_delay: 25222
run_delay: 14303
run_delay: 25649
run_delay: 12219
run_delay: 37578
run_delay: 13706
run_delay: 20473
run_delay: 4703
run_delay: 11207
run_delay: 4503599627370496
run_delay: 35013
run_delay: 27997
run_delay: 25235
run_delay: 6738
run_delay: 10995116279898
run_delay: 17891
run_delay: 16751
run_delay: 40348
run_delay: 9315
run_delay: 16039
run_delay: 37599
run_delay: 275977418581091
run_delay: 19924
run_delay: 4460
run_delay: 2304
run_delay: 15993
assign_ports: 102
assign_ports: 7
assign_ports: 102
connections {
write_size: 102
write_size: 134217728
}
}

@ -0,0 +1,64 @@
test_id: 102
event_engine_actions {
run_delay: 25122
run_delay: 27519
run_delay: 34012
run_delay: 2199023294550
run_delay: 730
run_delay: 19885
run_delay: 2138
run_delay: 15205
run_delay: 0
run_delay: 36939
run_delay: 12737
run_delay: 7305964495501793720
run_delay: 9757
run_delay: 206158449291
run_delay: 19555
run_delay: 16159
run_delay: 281474976398479
run_delay: 2167
run_delay: 6962
run_delay: 7261
run_delay: 64207512928256
run_delay: 25235
run_delay: 42834
run_delay: 5400
run_delay: 25222
run_delay: 14303
run_delay: 25649
run_delay: 12219
run_delay: 37578
run_delay: 13706
run_delay: 20473
run_delay: 4703
run_delay: 11207
run_delay: 4503599627370496
run_delay: 35013
run_delay: 27997
run_delay: 25235
run_delay: 6738
run_delay: 10995116279898
run_delay: 17891
run_delay: 16751
run_delay: 40348
run_delay: 9315
run_delay: 16039
run_delay: 37599
run_delay: 275977418581091
run_delay: 19924
run_delay: 4460
run_delay: 2304
run_delay: 15993
assign_ports: 102
assign_ports: 7
assign_ports: 102
connections {
write_size: 1593835520
write_size: 134217728
}
connections {
write_size: 102
write_size: 134217728
}
}

@ -0,0 +1,157 @@
test_id: 102
event_engine_actions {
run_delay: 29111
run_delay: 48596
run_delay: 1592
run_delay: 21410
run_delay: 6357
run_delay: 15367
run_delay: 2976
run_delay: 10060
run_delay: 9793
run_delay: 18030
run_delay: 4398046511104
run_delay: 18824
run_delay: 17226
run_delay: 878
run_delay: 30447
run_delay: 8146
run_delay: 35610
run_delay: 1946173909
run_delay: 34546
run_delay: 4364
run_delay: 28432
run_delay: 2670
run_delay: 13401
run_delay: 45356
run_delay: 18025
run_delay: 37145
run_delay: 37248
run_delay: 32848
run_delay: 32339
run_delay: 32534
run_delay: 6620
run_delay: 48634
run_delay: 1910
run_delay: 20042
run_delay: 1520
run_delay: 37196
run_delay: 36231
run_delay: 33841
run_delay: 9273
run_delay: 9239
run_delay: 28432
run_delay: 16032
run_delay: 17322
run_delay: 40010
run_delay: 31478
run_delay: 48988
run_delay: 42442
run_delay: 32598
run_delay: 1205
run_delay: 42684
run_delay: 34642
run_delay: 16973
run_delay: 10763
run_delay: 18034
run_delay: 13006
run_delay: 41391
run_delay: 2746
run_delay: 33922
run_delay: 36209
run_delay: 48822
run_delay: 31884
run_delay: 18355
run_delay: 3180
run_delay: 45419
run_delay: 16683
run_delay: 47077
run_delay: 29131
run_delay: 44380
run_delay: 11380
run_delay: 40225
run_delay: 18419
run_delay: 23273
run_delay: 10227
run_delay: 31468
run_delay: 25412
run_delay: 29513
run_delay: 38742
run_delay: 5102
run_delay: 47157
run_delay: 48937
run_delay: 18693
run_delay: 20012
run_delay: 39041
run_delay: 37603
run_delay: 10508
run_delay: 49835
run_delay: 48063
run_delay: 33540
run_delay: 32058
run_delay: 44114
run_delay: 6693
run_delay: 5483
run_delay: 18223
run_delay: 20065
run_delay: 14845
run_delay: 42293
run_delay: 49936
run_delay: 10112
run_delay: 34019
run_delay: 35919
run_delay: 29216
run_delay: 40882
run_delay: 7190
run_delay: 48100
run_delay: 3257
run_delay: 1910
run_delay: 10900
run_delay: 26774
run_delay: 9761
run_delay: 49490
run_delay: 41633
run_delay: 35919
run_delay: 45695
run_delay: 11825
run_delay: 19332
run_delay: 1228
run_delay: 48539
run_delay: 5737
run_delay: 10786
run_delay: 7435
run_delay: 25915
run_delay: 16205
run_delay: 29880
run_delay: 30311
run_delay: 24679
run_delay: 5685
run_delay: 18308
run_delay: 46612
run_delay: 9393
run_delay: 22091
run_delay: 19943
run_delay: 39455
run_delay: 2473
run_delay: 18014398509481984000
run_delay: 29075
run_delay: 1205
run_delay: 21968
run_delay: 43329
run_delay: 34506
run_delay: 24223
run_delay: 46918
run_delay: 31442
run_delay: 44810
run_delay: 29610
run_delay: 32778
run_delay: 5621
run_delay: 17598
run_delay: 32337
run_delay: 14088
run_delay: 15172
run_delay: 13258
run_delay: 41569
connections {
}
}

@ -0,0 +1,42 @@
event_engine_actions {
run_delay: 29874
run_delay: 42345
run_delay: 18882
run_delay: 38723
run_delay: 9297
run_delay: 24268
run_delay: 9297
run_delay: 30739
run_delay: 26770
run_delay: 15644
run_delay: 26770
run_delay: 37432
run_delay: 42595
run_delay: 8544
run_delay: 10409
run_delay: 46819
run_delay: 45333
run_delay: 19246
run_delay: 22274
run_delay: 15617
run_delay: 67070209338799
run_delay: 30941
run_delay: 9395
run_delay: 7151
run_delay: 16127
run_delay: 7010
run_delay: 7071
run_delay: 33425
run_delay: 20527
run_delay: 5219
run_delay: 22758
assign_ports: 0
assign_ports: 7237376
}
config_vars {
enable_fork_support: false
verbosity: "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"
dns_resolver: "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"
trace: "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"
experiments: 7071
}

@ -0,0 +1,51 @@
test_id: 29696
event_engine_actions {
run_delay: 15146
run_delay: 16971
run_delay: 19327
run_delay: 4404
run_delay: 16159
run_delay: 24896
run_delay: 29
run_delay: 6722
run_delay: 48015
run_delay: 2824
run_delay: 2351
run_delay: 39689
run_delay: 346
run_delay: 24262
run_delay: 6722
run_delay: 11635
run_delay: 7704
run_delay: 31884
run_delay: 35833
run_delay: 40201
run_delay: 26685
run_delay: 8273
run_delay: 31193
run_delay: 9015
run_delay: 17078
run_delay: 29994
run_delay: 8332
run_delay: 0
run_delay: 3479
run_delay: 29337
run_delay: 401
run_delay: 25011
run_delay: 1413
run_delay: 32871
run_delay: 21729
run_delay: 38443
run_delay: 40799
run_delay: 806380109824
run_delay: 17769
assign_ports: 29696
assign_ports: 29696
assign_ports: 29696
connections {
write_size: 1795162112
}
connections {
write_size: 2097152
}
}

@ -0,0 +1,21 @@
test_id: 4294967295
event_engine_actions {
run_delay: 2147483645
run_delay: 134217728
run_delay: 0
run_delay: 2097152
run_delay: 150994945
run_delay: 134217728
connections {
write_size: 67108864
write_size: 256
}
connections {
}
}
config_vars {
enable_fork_support: false
verbosity: "\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177"
trace: "8"
experiments: 2147483645
}

@ -0,0 +1,243 @@
test_id: 167772160
event_engine_actions {
run_delay: 37660
run_delay: 46554
run_delay: 49060
run_delay: 2450
run_delay: 30171
run_delay: 9557
run_delay: 7254
run_delay: 47104
run_delay: 39141
run_delay: 12590
run_delay: 22365
run_delay: 22772
run_delay: 16155
run_delay: 9007199254740992
run_delay: 116
run_delay: 44133
run_delay: 21432
run_delay: 32425
run_delay: 35839
run_delay: 7204
run_delay: 25779
run_delay: 1034
run_delay: 32870
run_delay: 2400
run_delay: 36028
run_delay: 45713
run_delay: 49656
run_delay: 30680
run_delay: 47400
run_delay: 38013
run_delay: 25377
run_delay: 6515
run_delay: 3615
run_delay: 12032
run_delay: 38691
run_delay: 45316
run_delay: 12312
run_delay: 34916
run_delay: 25248
run_delay: 30566
run_delay: 15608
run_delay: 12207
run_delay: 30629
run_delay: 21254
run_delay: 34001
run_delay: 47400
run_delay: 40368
run_delay: 2550
run_delay: 36135
run_delay: 8544
run_delay: 29460
run_delay: 44235
run_delay: 31828
run_delay: 29213
run_delay: 3683
run_delay: 17643
run_delay: 17077
run_delay: 36146
run_delay: 9973
run_delay: 5316
run_delay: 20510
run_delay: 1985
run_delay: 48304
run_delay: 42558
run_delay: 19358
run_delay: 34354
run_delay: 13978
run_delay: 21790
run_delay: 738
run_delay: 47543
run_delay: 3143
run_delay: 47049
run_delay: 12404
run_delay: 40260
run_delay: 4457
run_delay: 47899
run_delay: 48885
run_delay: 2122
run_delay: 18117
run_delay: 37121
run_delay: 29912
run_delay: 10941
run_delay: 39918
run_delay: 8686
run_delay: 19648
run_delay: 32858
run_delay: 36810
run_delay: 7780
run_delay: 19992
run_delay: 41054
run_delay: 4074
run_delay: 20885
run_delay: 26539
run_delay: 35547
run_delay: 40268
run_delay: 18034
run_delay: 40310
run_delay: 23568
run_delay: 32001
run_delay: 3561
run_delay: 42725
run_delay: 6802
run_delay: 2604
run_delay: 5586
run_delay: 25162
run_delay: 34076
run_delay: 43663
run_delay: 9816
run_delay: 35357
run_delay: 7069
run_delay: 27371
run_delay: 44000
run_delay: 2144
run_delay: 39671
run_delay: 15114
run_delay: 41968
run_delay: 7120
run_delay: 25904
run_delay: 10380
run_delay: 43886
run_delay: 9489
run_delay: 13594
run_delay: 20675
run_delay: 30385
run_delay: 34303
run_delay: 35993
assign_ports: 0
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 0
write_size: 7
write_size: 7
write_size: 67108864
}
connections {
write_size: 7
write_size: 0
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 28261
write_size: 7
write_size: 67108864
}
connections {
write_size: 0
}
connections {
write_size: 7
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 28261
write_size: 7
}
connections {
write_size: 1
write_size: 28261
write_size: 28261
write_size: 0
write_size: 0
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 0
write_size: 7
write_size: 7
write_size: 67108864
}
connections {
write_size: 7
write_size: 33619968
write_size: 7
write_size: 1
write_size: 0
}
connections {
write_size: 7
write_size: 0
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 28261
write_size: 7
write_size: 67108864
}
connections {
write_size: 31232
write_size: 7
write_size: 655360
write_size: 7
write_size: 2
write_size: 33619968
write_size: 0
write_size: 16
write_size: 262144
write_size: 0
}
connections {
write_size: 7
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 7
}
}
config_vars {
enable_fork_support: false
verbosity: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
dns_resolver: ""
trace: "ddddddddd@dddddddddddddddddddddddddd@dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
experiments: 2441237
}

@ -0,0 +1,7 @@
test_id: 1711276032
config_vars {
enable_fork_support: true
dns_resolver: "\177\177\177\177\177\177\177\177\177\177\177\177"
trace: "\177\177\177\001"
experiments: 2585189
}

@ -0,0 +1,8 @@
event_engine_actions {
run_delay: 288230376151711744
run_delay: 37311
run_delay: 133459337372672
run_delay: 37311
}
config_vars {
}

@ -0,0 +1,165 @@
test_id: 655360
event_engine_actions {
run_delay: 37660
run_delay: 46554
run_delay: 49060
run_delay: 2450
run_delay: 30171
run_delay: 9557
run_delay: 7254
run_delay: 47104
run_delay: 39141
run_delay: 34076
run_delay: 12590
run_delay: 22365
run_delay: 22772
run_delay: 16155
run_delay: 9007199254740992
run_delay: 116
run_delay: 44133
run_delay: 540702976
run_delay: 21432
run_delay: 32425
run_delay: 35839
run_delay: 7204
run_delay: 25779
run_delay: 1034
run_delay: 32870
run_delay: 2400
run_delay: 36028
run_delay: 45713
run_delay: 49656
run_delay: 30680
run_delay: 38013
run_delay: 25377
run_delay: 6515
run_delay: 3615
run_delay: 12032
run_delay: 38691
run_delay: 45316
run_delay: 12312
run_delay: 34916
run_delay: 25248
run_delay: 30566
run_delay: 15608
run_delay: 12207
run_delay: 30629
run_delay: 21254
run_delay: 34001
run_delay: 47400
run_delay: 40368
run_delay: 2550
run_delay: 36135
run_delay: 8544
run_delay: 29460
run_delay: 44235
run_delay: 31828
run_delay: 29213
run_delay: 3683
run_delay: 17643
run_delay: 17077
run_delay: 36146
run_delay: 9973
run_delay: 5316
run_delay: 20510
run_delay: 1985
run_delay: 48304
run_delay: 42558
run_delay: 19358
run_delay: 34354
run_delay: 13978
run_delay: 21790
run_delay: 738
run_delay: 47543
run_delay: 3143
run_delay: 47049
run_delay: 39940
run_delay: 40260
run_delay: 4457
run_delay: 47899
run_delay: 48885
run_delay: 2122
run_delay: 18117
run_delay: 37121
run_delay: 29912
run_delay: 10941
run_delay: 39918
run_delay: 8686
run_delay: 19648
run_delay: 32858
run_delay: 36810
run_delay: 7780
run_delay: 19992
run_delay: 41054
run_delay: 4074
run_delay: 20885
run_delay: 26539
run_delay: 35547
run_delay: 40268
run_delay: 18034
run_delay: 40310
run_delay: 23568
run_delay: 32001
run_delay: 24145
run_delay: 3561
run_delay: 42725
run_delay: 6802
run_delay: 2604
run_delay: 5586
run_delay: 25162
run_delay: 34076
run_delay: 43663
run_delay: 9816
run_delay: 35357
run_delay: 7069
run_delay: 27371
run_delay: 44000
run_delay: 2144
run_delay: 39671
run_delay: 15114
run_delay: 41968
run_delay: 7120
run_delay: 25904
run_delay: 10380
run_delay: 43886
run_delay: 9489
run_delay: 13594
run_delay: 4539628424389459968
run_delay: 20675
run_delay: 30385
run_delay: 34303
run_delay: 35993
connections {
write_size: 7
write_size: 655360
write_size: 32
write_size: 7
write_size: 0
write_size: 0
}
connections {
write_size: 655360
write_size: 65534
write_size: 35072
}
connections {
}
connections {
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 0
}
connections {
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 0
}
connections {
write_size: 1
write_size: 0
}
}

@ -0,0 +1,141 @@
event_engine_actions {
run_delay: 39728
run_delay: 22967
run_delay: 11019
run_delay: 8589950525
run_delay: 1957
run_delay: 40499
run_delay: 35774
run_delay: 14871
run_delay: 28722
run_delay: 13483
run_delay: 25867
run_delay: 7848
run_delay: 18250
run_delay: 9314
run_delay: 17212
run_delay: 22973
run_delay: 42257
run_delay: 7769
run_delay: 35988
run_delay: 6301
run_delay: 43504
run_delay: 722
run_delay: 19051
run_delay: 6162
run_delay: 41532
run_delay: 39125
run_delay: 68719497515
run_delay: 5114
run_delay: 4159
run_delay: 35618
run_delay: 25337
run_delay: 14232
run_delay: 10249
run_delay: 46357
run_delay: 31288
run_delay: 34391
run_delay: 8489
run_delay: 17898
run_delay: 41214
run_delay: 45554
run_delay: 33785
run_delay: 23653
run_delay: 6535
run_delay: 8980
run_delay: 7312272889232061545
run_delay: 22809
run_delay: 29047
run_delay: 7690
run_delay: 14355223812281474
run_delay: 19754
run_delay: 34636
run_delay: 39912
run_delay: 28561
run_delay: 38236
run_delay: 21732
run_delay: 46535
run_delay: 21748
run_delay: 22484
run_delay: 40871
run_delay: 27462
run_delay: 20377
run_delay: 5604
run_delay: 8424
run_delay: 25851
run_delay: 7490
run_delay: 27650
run_delay: 3254
run_delay: 14951
run_delay: 34581
run_delay: 13774
run_delay: 9253
run_delay: 15855
run_delay: 13576
run_delay: 17779
run_delay: 17060
run_delay: 33615
run_delay: 36728
run_delay: 22604
run_delay: 10430
run_delay: 6121
run_delay: 34263
run_delay: 32994
run_delay: 32266
run_delay: 5054
run_delay: 14234
run_delay: 3275
run_delay: 39481
run_delay: 7473
run_delay: 46876
run_delay: 26183
run_delay: 49101
run_delay: 28261
run_delay: 0
run_delay: 37959
run_delay: 938
run_delay: 42463
run_delay: 20497
run_delay: 10426
run_delay: 5100
run_delay: 18715
run_delay: 40262
run_delay: 45301
run_delay: 19440
run_delay: 17221
run_delay: 17091
run_delay: 35396
run_delay: 6028
run_delay: 7253
run_delay: 10459
run_delay: 37926
run_delay: 37844
run_delay: 39048
run_delay: 9111
run_delay: 10792
run_delay: 24396
run_delay: 25162
run_delay: 44087
run_delay: 28719
run_delay: 313
run_delay: 44070
run_delay: 933
run_delay: 12152
run_delay: 47440
connections {
}
connections {
}
connections {
write_size: 2
}
connections {
write_size: 655360
}
}
config_vars {
enable_fork_support: true
verbosity: ""
trace: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
experiments: 37432
}

@ -0,0 +1,175 @@
test_id: 10
event_engine_actions {
run_delay: 10698
run_delay: 24185
run_delay: 43894
run_delay: 8883
run_delay: 38097
run_delay: 47102
run_delay: 38563
run_delay: 1113
run_delay: 49214
run_delay: 47627
run_delay: 36881
run_delay: 23284
run_delay: 15342
run_delay: 21518
run_delay: 9665
run_delay: 24903
run_delay: 29911
run_delay: 27577
run_delay: 11257
run_delay: 25761
run_delay: 7668
run_delay: 25003
run_delay: 41414
run_delay: 24130
run_delay: 46321
run_delay: 35819
run_delay: 43121
run_delay: 49971
run_delay: 870
run_delay: 45457
run_delay: 25537
run_delay: 45826
run_delay: 35046
run_delay: 232834241699
run_delay: 44327
run_delay: 6783
run_delay: 43182
run_delay: 23306
run_delay: 5809
run_delay: 22374
run_delay: 42874
run_delay: 11077
run_delay: 31754
run_delay: 43638
run_delay: 24093
run_delay: 34045
run_delay: 9466
run_delay: 38133
run_delay: 46688
run_delay: 28934
run_delay: 45726
run_delay: 2045
run_delay: 11618
run_delay: 35394
run_delay: 45070
run_delay: 41619
run_delay: 5087
run_delay: 40776
run_delay: 28535
run_delay: 27572
run_delay: 23106
run_delay: 40839
run_delay: 9350
run_delay: 5377
run_delay: 16509
run_delay: 29754
run_delay: 22346
run_delay: 10990
run_delay: 17015
run_delay: 24780
run_delay: 30981
run_delay: 381
run_delay: 32583
run_delay: 24658
run_delay: 22036
run_delay: 24992
run_delay: 7053
run_delay: 45833
run_delay: 13049
run_delay: 24923
run_delay: 41655
run_delay: 1426
run_delay: 44321
run_delay: 19768
run_delay: 25694
run_delay: 17162
run_delay: 13982
run_delay: 10795
run_delay: 34604
run_delay: 47385
run_delay: 30947
run_delay: 9100
run_delay: 10263
run_delay: 16151
run_delay: 12947
run_delay: 32981
run_delay: 25602
run_delay: 28397
run_delay: 38887
run_delay: 16629
run_delay: 45278
run_delay: 13231
run_delay: 10232
run_delay: 8563
run_delay: 21906
run_delay: 2766
run_delay: 2529
run_delay: 47995
run_delay: 33960
run_delay: 42991
run_delay: 19824
run_delay: 11212
run_delay: 4767
run_delay: 19997
run_delay: 23340
run_delay: 28846
run_delay: 35550
run_delay: 49502
run_delay: 11787
run_delay: 39155
run_delay: 18705
run_delay: 26095
run_delay: 4778
run_delay: 28463
run_delay: 17108
run_delay: 17932
run_delay: 20320
run_delay: 47174
run_delay: 20034
run_delay: 7747
run_delay: 1126
run_delay: 10011
run_delay: 0
run_delay: 13314
run_delay: 40908
run_delay: 39475
run_delay: 28045
run_delay: 20130
run_delay: 46150
run_delay: 46218
run_delay: 4151
run_delay: 24750
run_delay: 47313
run_delay: 46881
run_delay: 35219
run_delay: 19013
run_delay: 47321
run_delay: 27130
run_delay: 32506
run_delay: 45371
run_delay: 27016
run_delay: 21426
run_delay: 1255
run_delay: 45773
run_delay: 2075
run_delay: 11641
run_delay: 17917
run_delay: 28606
run_delay: 28473
run_delay: 24967
run_delay: 25785
run_delay: 37172
assign_ports: 128
assign_ports: 3801092
assign_ports: 10
assign_ports: 64512
connections {
write_size: 29696
}
connections {
write_size: 29696
}
}

@ -0,0 +1,131 @@
test_id: 7
event_engine_actions {
run_delay: 39728
run_delay: 22967
run_delay: 11019
run_delay: 8589950525
run_delay: 1957
run_delay: 40499
run_delay: 35774
run_delay: 14871
run_delay: 13483
run_delay: 25867
run_delay: 7848
run_delay: 18250
run_delay: 9314
run_delay: 17212
run_delay: 22973
run_delay: 42257
run_delay: 7769
run_delay: 35988
run_delay: 6301
run_delay: 44134
run_delay: 9783
run_delay: 43504
run_delay: 722
run_delay: 19051
run_delay: 6162
run_delay: 41532
run_delay: 39125
run_delay: 20779
run_delay: 5114
run_delay: 4159
run_delay: 35618
run_delay: 25337
run_delay: 14232
run_delay: 10249
run_delay: 3602879701896396800
run_delay: 46357
run_delay: 31288
run_delay: 34391
run_delay: 8489
run_delay: 17898
run_delay: 41214
run_delay: 45554
run_delay: 33785
run_delay: 23653
run_delay: 32115
run_delay: 3514
run_delay: 22809
run_delay: 29047
run_delay: 7690
run_delay: 38018
run_delay: 19754
run_delay: 34636
run_delay: 39912
run_delay: 28561
run_delay: 38236
run_delay: 21732
run_delay: 46535
run_delay: 21748
run_delay: 22484
run_delay: 40871
run_delay: 27462
run_delay: 20377
run_delay: 5604
run_delay: 8424
run_delay: 25851
run_delay: 7490
run_delay: 27650
run_delay: 3254
run_delay: 14951
run_delay: 34581
run_delay: 13774
run_delay: 9253
run_delay: 15855
run_delay: 13576
run_delay: 17779
run_delay: 17060
run_delay: 33615
run_delay: 36728
run_delay: 22604
run_delay: 10430
run_delay: 6121
run_delay: 34263
run_delay: 32994
run_delay: 32266
run_delay: 5054
run_delay: 14234
run_delay: 3275
run_delay: 39481
run_delay: 7473
run_delay: 46876
run_delay: 26183
run_delay: 49101
run_delay: 28261
run_delay: 0
run_delay: 37959
run_delay: 938
run_delay: 42463
run_delay: 20497
run_delay: 10426
run_delay: 5100
run_delay: 18715
run_delay: 40262
run_delay: 45301
run_delay: 19440
run_delay: 17221
run_delay: 17091
run_delay: 35396
run_delay: 6028
run_delay: 7253
run_delay: 10459
run_delay: 37926
run_delay: 37844
run_delay: 39048
run_delay: 9111
run_delay: 10792
run_delay: 24396
run_delay: 38235
run_delay: 44087
run_delay: 28719
run_delay: 313
run_delay: 44070
run_delay: 933
run_delay: 12152
run_delay: 47440
connections {
write_size: 7
write_size: 0
}
}

@ -0,0 +1,196 @@
test_id: 3276850
event_engine_actions {
run_delay: 37660
run_delay: 46554
run_delay: 49060
run_delay: 2450
run_delay: 30171
run_delay: 9557
run_delay: 7254
run_delay: 47104
run_delay: 39141
run_delay: 12590
run_delay: 22365
run_delay: 22772
run_delay: 16155
run_delay: 9007199254740992
run_delay: 116
run_delay: 44133
run_delay: 21432
run_delay: 32425
run_delay: 35839
run_delay: 7204
run_delay: 25779
run_delay: 1034
run_delay: 279172907110
run_delay: 2400
run_delay: 36028
run_delay: 45713
run_delay: 49656
run_delay: 30680
run_delay: 38013
run_delay: 25377
run_delay: 6515
run_delay: 3615
run_delay: 12032
run_delay: 38691
run_delay: 45316
run_delay: 12312
run_delay: 34916
run_delay: 25248
run_delay: 30566
run_delay: 15608
run_delay: 12207
run_delay: 30629
run_delay: 21254
run_delay: 34001
run_delay: 47400
run_delay: 40368
run_delay: 2550
run_delay: 36135
run_delay: 8544
run_delay: 29460
run_delay: 44235
run_delay: 31828
run_delay: 29213
run_delay: 3683
run_delay: 17643
run_delay: 17077
run_delay: 36146
run_delay: 9973
run_delay: 5316
run_delay: 20510
run_delay: 1985
run_delay: 48304
run_delay: 42558
run_delay: 19358
run_delay: 34354
run_delay: 13978
run_delay: 21790
run_delay: 738
run_delay: 47543
run_delay: 3143
run_delay: 47049
run_delay: 12404
run_delay: 40260
run_delay: 4457
run_delay: 47899
run_delay: 48885
run_delay: 2122
run_delay: 18117
run_delay: 37121
run_delay: 29912
run_delay: 167503724544
run_delay: 10941
run_delay: 39918
run_delay: 8686
run_delay: 19648
run_delay: 32858
run_delay: 36810
run_delay: 7780
run_delay: 49060
run_delay: 41054
run_delay: 4074
run_delay: 20885
run_delay: 26539
run_delay: 35547
run_delay: 40268
run_delay: 18034
run_delay: 40310
run_delay: 23568
run_delay: 32001
run_delay: 24145
run_delay: 3561
run_delay: 42725
run_delay: 6802
run_delay: 2604
run_delay: 5586
run_delay: 25162
run_delay: 34076
run_delay: 43663
run_delay: 9816
run_delay: 35357
run_delay: 7069
run_delay: 27371
run_delay: 44000
run_delay: 2144
run_delay: 39671
run_delay: 15114
run_delay: 41968
run_delay: 7120
run_delay: 25904
run_delay: 10380
run_delay: 43886
run_delay: 9489
run_delay: 13594
run_delay: 20675
run_delay: 30385
run_delay: 34303
run_delay: 35993
assign_ports: 256
connections {
write_size: 536900608
}
connections {
write_size: 544407552
write_size: 131072
write_size: 0
write_size: 536872192
}
connections {
write_size: 67108864
write_size: 3604480
}
connections {
write_size: 29696
}
connections {
write_size: 65532
}
connections {
write_size: 131072
write_size: 108
}
connections {
write_size: 132
write_size: 132
}
connections {
write_size: 2097152
write_size: 1
write_size: 16384
}
connections {
write_size: 0
}
connections {
write_size: 536900608
}
connections {
write_size: 67108864
write_size: 24832
}
connections {
}
connections {
write_size: 536872192
write_size: 29696
write_size: 29696
write_size: 536870912
}
connections {
write_size: 132
write_size: 29696
}
connections {
write_size: 256
write_size: 0
write_size: 0
}
connections {
}
}
config_vars {
verbosity: "2"
experiments: 6409910
}

@ -0,0 +1,19 @@
test_id: 905969664
event_engine_actions {
run_delay: 24412
run_delay: 39940
run_delay: 15630
run_delay: 8780
run_delay: 35475
run_delay: 3594
connections {
write_size: 905969664
}
}
config_vars {
enable_fork_support: false
verbosity: "\003NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\000\000\000"
dns_resolver: "\003NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\000\000\000"
trace: "#####################################################################################"
experiments: 3834873572111317248
}

@ -0,0 +1,10 @@
test_id: 102
event_engine_actions {
run_delay: 1796537
run_delay: 1298992
run_delay: 4501376
run_delay: 3848683
}
config_vars {
verbosity: "\177\177\177\177"
}

@ -0,0 +1,26 @@
test_id: 1950351360
event_engine_actions {
assign_ports: 9
assign_ports: 8191744
connections {
write_size: 32
}
connections {
write_size: 29285
write_size: 64
write_size: 10
write_size: 32
write_size: 0
}
connections {
}
connections {
}
connections {
write_size: 61184
}
}
config_vars {
dns_resolver: ""
experiments: 8796093022208
}

@ -0,0 +1,154 @@
test_id: 2030068321
event_engine_actions {
run_delay: 30590
run_delay: 1956
run_delay: 46322
run_delay: 25476
run_delay: 9902
run_delay: 43205
run_delay: 2697
run_delay: 2724
run_delay: 13370
run_delay: 11002
run_delay: 13684
run_delay: 32151
run_delay: 32187
run_delay: 111548890626036
run_delay: 14641
run_delay: 25717
run_delay: 37600
run_delay: 36773
run_delay: 33829
run_delay: 43122
run_delay: 3829
run_delay: 24184
run_delay: 7798
run_delay: 10941
run_delay: 45741
run_delay: 34276
run_delay: 17452
run_delay: 2724
run_delay: 14165
run_delay: 23017
run_delay: 9436
run_delay: 35239
run_delay: 7175
run_delay: 35276
run_delay: 28105
run_delay: 15124
run_delay: 41588
run_delay: 17133
run_delay: 4144
run_delay: 16349
run_delay: 11342
run_delay: 809
run_delay: 24269
run_delay: 43766
run_delay: 10996
run_delay: 13130
run_delay: 40726
run_delay: 14656
run_delay: 32048
run_delay: 16039
run_delay: 5682
run_delay: 29929
run_delay: 36742
run_delay: 31107
run_delay: 7893
run_delay: 25142
run_delay: 41479
run_delay: 7568
connections {
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 2
write_size: 7
write_size: 7
write_size: 0
write_size: 1024
}
connections {
write_size: 0
}
connections {
write_size: 0
write_size: 7
write_size: 7
write_size: 0
write_size: 2
write_size: 7
write_size: 5
write_size: 1024
}
connections {
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 2
write_size: 7
write_size: 7
write_size: 0
write_size: 1024
}
connections {
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 0
write_size: 1024
write_size: 7
write_size: 2
}
connections {
write_size: 7
write_size: 7
write_size: 0
write_size: 654311424
write_size: 0
write_size: 1024
}
connections {
write_size: 7
write_size: 7
write_size: 0
write_size: 7
write_size: 0
write_size: 1024
}
connections {
write_size: 0
}
connections {
write_size: 7
write_size: 7
write_size: 0
write_size: 654311424
write_size: 0
write_size: 1024
}
connections {
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 2
write_size: 7
write_size: 7
write_size: 0
write_size: 1024
}
}
config_vars {
enable_fork_support: true
verbosity: "U"
dns_resolver: "2"
trace: "2"
experiments: 11342
}

@ -0,0 +1,74 @@
test_id: 102
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 576460752303434402
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 0
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 576460752303434402
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
}
}
config_vars {
enable_fork_support: true
dns_resolver: "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
experiments: 8
}

@ -0,0 +1,80 @@
test_id: 167772167
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 576460752303434402
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 113
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 0
run_delay: 1024
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 576460752303434402
run_delay: 32780
run_delay: 1125899906842624
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 10944512
assign_ports: 102
connections {
write_size: 0
write_size: 10944512
}
connections {
}
connections {
write_size: 0
write_size: 4
write_size: 0
}
connections {
}
}
config_vars {
}

@ -0,0 +1,93 @@
test_id: 6647397
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 25780
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 10914
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 3530822107858487029
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 3530822107858487029
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 26112
connections {
write_size: 1818584159
write_size: 536870912
write_size: 0
write_size: 49
write_size: 1534787584
}
connections {
write_size: 1818584159
}
connections {
write_size: 49
write_size: 56
write_size: 0
}
connections {
write_size: 1818584159
write_size: 536870912
write_size: 0
write_size: 49
write_size: 1534787584
}
connections {
write_size: 0
}
}
config_vars {
enable_fork_support: true
verbosity: "\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177\177"
experiments: 29668
}

@ -0,0 +1,82 @@
test_id: 7
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 25780
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 10914
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 3530822107858487029
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 16437125078802333
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 17169973579350016
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 26112
assign_ports: 0
connections {
write_size: 0
write_size: 7
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 26112
write_size: 0
}
connections {
write_size: 0
}
}
config_vars {
enable_fork_support: true
experiments: 8
}

@ -0,0 +1,84 @@
test_id: 102
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 14672134305573989
run_delay: 26364
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 511640101855
run_delay: 28429470863982592
run_delay: 0
run_delay: 25780
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 10914
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 67070209294336
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 28429470863982592
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 36028797018996748
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 9
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 36028797018996748
run_delay: 0
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 7237376
assign_ports: 13056
connections {
write_size: 0
}
connections {
write_size: 9984
write_size: 7229184
write_size: 0
}
connections {
write_size: 28416
write_size: 7229184
write_size: 7229184
write_size: 0
}
}
config_vars {
experiments: 34276
}

@ -0,0 +1,82 @@
test_id: 102
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
verbosity: "?"
trace: "?"
experiments: 5843
}

@ -0,0 +1,84 @@
test_id: 7
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 25780
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 10914
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 3530822107858487029
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 3530822107858487029
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 38899
run_delay: 16032
run_delay: 3530822107858487029
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 26112
connections {
write_size: 2
write_size: 56
write_size: 8191744
write_size: 1534787584
}
connections {
write_size: 0
}
connections {
write_size: 0
}
connections {
write_size: 0
}
}
config_vars {
enable_fork_support: true
dns_resolver: "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
experiments: 43876102196
}

@ -0,0 +1,86 @@
test_id: 102
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 33923
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 10
assign_ports: 102
connections {
write_size: 10
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 102
write_size: 7
write_size: 10
write_size: 7
write_size: 0
}
connections {
write_size: 8257536
}
}

@ -0,0 +1,84 @@
test_id: 7
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 25780
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 10914
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 3530822107858487029
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 3530822107858487029
run_delay: 44858
run_delay: 7236
run_delay: 38899
run_delay: 38899
run_delay: 4213398926381826153
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 2
assign_ports: 26112
connections {
write_size: 2
write_size: 56
write_size: 8191744
write_size: 1534787584
}
connections {
write_size: 0
}
connections {
write_size: 1694498816
}
connections {
write_size: 0
}
}
config_vars {
enable_fork_support: true
dns_resolver: "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
trace: "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
experiments: 8
}

@ -0,0 +1,85 @@
test_id: 7
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 7253
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 12090332974693
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 1
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 655360
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
verbosity: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
dns_resolver: ""
trace: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
experiments: 8
}

@ -0,0 +1,80 @@
test_id: 1476395015
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 0
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 12090332974693
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 98029278931
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 128
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 0
}
}
config_vars {
verbosity: "\0012"
}

@ -0,0 +1,82 @@
test_id: 7
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
dns_resolver: ""
trace: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
experiments: 8
}

@ -0,0 +1,87 @@
test_id: 622596
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 281470681743360
run_delay: 36698
run_delay: 12090332974693
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 10
assign_ports: 102
connections {
write_size: 7
write_size: 0
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 102
write_size: 10
write_size: 7
}
}
config_vars {
dns_resolver: "2"
trace: "2"
experiments: 16489
}

@ -0,0 +1,82 @@
test_id: 7
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 12090332974693
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
dns_resolver: ""
trace: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
experiments: 8
}

@ -0,0 +1,85 @@
test_id: 7
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 3143
run_delay: 10941
run_delay: 12090332974693
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 56733
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 41
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
dns_resolver: ""
trace: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
experiments: 8
}

@ -0,0 +1,67 @@
test_id: 7
event_engine_actions {
run_delay: 25122
run_delay: 27519
run_delay: 34012
run_delay: 2199023294550
run_delay: 730
run_delay: 19885
run_delay: 42880
run_delay: 0
run_delay: 2138
run_delay: 15205
run_delay: 0
run_delay: 36939
run_delay: 12737
run_delay: 7305964495501793720
run_delay: 9757
run_delay: 19083
run_delay: 19555
run_delay: 16159
run_delay: 281474976398479
run_delay: 2167
run_delay: 6962
run_delay: 7261
run_delay: 64207512928256
run_delay: 25235
run_delay: 42834
run_delay: 5400
run_delay: 25222
run_delay: 14303
run_delay: 25649
run_delay: 12219
run_delay: 37578
run_delay: 1135
run_delay: 20473
run_delay: 4703
run_delay: 11207
run_delay: 4503599627370496
run_delay: 0
run_delay: 40348
run_delay: 27997
run_delay: 25235
run_delay: 6738
run_delay: 10995116279898
run_delay: 17891
run_delay: 16751
run_delay: 40348
run_delay: 9315
run_delay: 16039
run_delay: 37599
run_delay: 9315
run_delay: 19924
run_delay: 2304
run_delay: 15993
assign_ports: 102
assign_ports: 7
assign_ports: 102
connections {
write_size: 102
}
connections {
write_size: 102
}
connections {
write_size: 0
}
}

@ -0,0 +1,74 @@
test_id: 7
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 576460752303434402
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 0
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 576460752303434402
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 0
write_size: 0
}
}
config_vars {
enable_fork_support: false
verbosity: "D"
trace: "D"
}

@ -0,0 +1,84 @@
test_id: 15
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 47741
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 65865144550309993
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
assign_ports: 7
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 6648839
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
trace: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
experiments: 8
}

@ -0,0 +1,75 @@
test_id: 7
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 25780
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 10914
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 3530822107858487029
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 3530822107858487029
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 38899
run_delay: 288230376151728233
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 26112
assign_ports: 1534787584
assign_ports: 2
connections {
write_size: 2
write_size: 655360
write_size: 26112
write_size: 8191744
write_size: 1534787584
}
connections {
write_size: 2
}
}

@ -0,0 +1,85 @@
test_id: 7
event_engine_actions {
run_delay: 45156
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 25780
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 766
run_delay: 10914
run_delay: 36698
run_delay: 36453
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 3530822107858487029
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 3530822107858487029
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 38899
run_delay: 16489
run_delay: 100055558127616
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 26112
connections {
write_size: 2
write_size: 56
write_size: 8191744
write_size: 1534787584
}
connections {
write_size: 4
}
connections {
write_size: 67108864
}
connections {
write_size: 0
}
}
config_vars {
enable_fork_support: true
dns_resolver: ""
trace: "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
experiments: 8
}

@ -0,0 +1,79 @@
test_id: 102
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 25567
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 11980
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 191
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 10
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
verbosity: "\003NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\000\000\000"
dns_resolver: "\003\000\000\000"
trace: "\003NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\000\000\000"
experiments: 5764607523034234879
}

@ -0,0 +1,84 @@
test_id: 7
event_engine_actions {
run_delay: 49101
run_delay: 13706
run_delay: 19231
run_delay: 550652
run_delay: 368
run_delay: 6367
run_delay: 35792
run_delay: 10191
run_delay: 49036
run_delay: 47632
run_delay: 47741
run_delay: 48763
run_delay: 157
run_delay: 0
run_delay: 35115
run_delay: 7086
run_delay: 35419
run_delay: 196096
run_delay: 576460752303434402
run_delay: 36698
run_delay: 12090332974693
run_delay: 16098
run_delay: 33923
run_delay: 22468
run_delay: 35757
run_delay: 44598
run_delay: 33139
run_delay: 35792
run_delay: 18165
run_delay: 8180
run_delay: 18287
run_delay: 37167
run_delay: 10815
run_delay: 31992
run_delay: 49689
run_delay: 29102
run_delay: 37311
run_delay: 32780
run_delay: 34899
run_delay: 33091
run_delay: 39262
run_delay: 14840
run_delay: 49599
run_delay: 37257
run_delay: 157
run_delay: 47695
run_delay: 13345
run_delay: 44858
run_delay: 5843
run_delay: 7236
run_delay: 38899
run_delay: 16489
run_delay: 44057
run_delay: 40549
run_delay: 11980
run_delay: 12444
run_delay: 32256
run_delay: 4020
assign_ports: 16777216
assign_ports: 102
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
connections {
write_size: 7
write_size: 7
write_size: 7
write_size: 0
write_size: 7
}
}
config_vars {
enable_fork_support: false
verbosity: "\002\000\000\000\000\000\000\000"
dns_resolver: ""
trace: "\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
experiments: 8
}

@ -0,0 +1,160 @@
test_id: 1634493703
event_engine_actions {
run_delay: 37660
run_delay: 46554
run_delay: 49060
run_delay: 21955048183433618
run_delay: 30171
run_delay: 9557
run_delay: 7254
run_delay: 47104
run_delay: 39141
run_delay: 12590
run_delay: 22365
run_delay: 22772
run_delay: 16155
run_delay: 9007199254740992
run_delay: 116
run_delay: 44133
run_delay: 21432
run_delay: 32425
run_delay: 35839
run_delay: 7204
run_delay: 25779
run_delay: 1034
run_delay: 32870
run_delay: 2400
run_delay: 36028
run_delay: 45713
run_delay: 49656
run_delay: 30680
run_delay: 38013
run_delay: 25377
run_delay: 6515
run_delay: 3615
run_delay: 12032
run_delay: 38691
run_delay: 9007199254740992
run_delay: 45316
run_delay: 12312
run_delay: 34916
run_delay: 25248
run_delay: 30566
run_delay: 144115188075871480
run_delay: 12207
run_delay: 30629
run_delay: 21254
run_delay: 34001
run_delay: 47400
run_delay: 40368
run_delay: 2550
run_delay: 36135
run_delay: 8544
run_delay: 29460
run_delay: 44235
run_delay: 31828
run_delay: 29213
run_delay: 3683
run_delay: 17643
run_delay: 17077
run_delay: 36146
run_delay: 9973
run_delay: 5316
run_delay: 20510
run_delay: 1985
run_delay: 48304
run_delay: 42558
run_delay: 19358
run_delay: 34354
run_delay: 13978
run_delay: 21790
run_delay: 738
run_delay: 47543
run_delay: 3143
run_delay: 47049
run_delay: 12404
run_delay: 40260
run_delay: 4457
run_delay: 47899
run_delay: 48885
run_delay: 2122
run_delay: 18117
run_delay: 37121
run_delay: 29912
run_delay: 10941
run_delay: 39918
run_delay: 8686
run_delay: 19648
run_delay: 32858
run_delay: 36810
run_delay: 7780
run_delay: 49060
run_delay: 41054
run_delay: 4074
run_delay: 20885
run_delay: 26539
run_delay: 35547
run_delay: 40268
run_delay: 18034
run_delay: 40310
run_delay: 23568
run_delay: 32001
run_delay: 24145
run_delay: 3561
run_delay: 42725
run_delay: 6802
run_delay: 2604
run_delay: 5586
run_delay: 25162
run_delay: 34076
run_delay: 43663
run_delay: 0
run_delay: 9816
run_delay: 35357
run_delay: 7069
run_delay: 27371
run_delay: 44000
run_delay: 2144
run_delay: 39671
run_delay: 15114
run_delay: 41968
run_delay: 7120
run_delay: 25904
run_delay: 10380
run_delay: 43886
run_delay: 9489
run_delay: 13594
run_delay: 20675
run_delay: 30385
run_delay: 34303
run_delay: 35993
connections {
}
connections {
write_size: 45
write_size: 0
}
connections {
write_size: 0
write_size: 45
write_size: 0
}
connections {
write_size: 0
write_size: 45
}
connections {
}
connections {
write_size: 0
write_size: 1914699776
}
connections {
write_size: 0
write_size: 0
}
}
config_vars {
enable_fork_support: true
experiments: 24412
}

@ -26,7 +26,6 @@
#include "src/core/util/time.h" #include "src/core/util/time.h"
#include "test/core/end2end/end2end_tests.h" #include "test/core/end2end/end2end_tests.h"
#ifndef GPR_WINDOWS // b/148110727 for more details
namespace grpc_core { namespace grpc_core {
static void OneRequestAndShutdownServer(CoreEnd2endTest& test) { static void OneRequestAndShutdownServer(CoreEnd2endTest& test) {
@ -77,4 +76,3 @@ CORE_END2END_TEST(CoreClientChannelTest, DisappearingServer) {
} }
} // namespace grpc_core } // namespace grpc_core
#endif // GPR_WINDOWS

@ -28,7 +28,9 @@
#include "absl/log/check.h" #include "absl/log/check.h"
#include "absl/log/log.h" #include "absl/log/log.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h" #include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h" #include "absl/types/optional.h"
#include "src/core/lib/config/config_vars.h" #include "src/core/lib/config/config_vars.h"
#include "src/core/util/subprocess.h" #include "src/core/util/subprocess.h"
@ -39,46 +41,43 @@ namespace testing {
HttpRequestTestServer StartHttpRequestTestServer(int argc, char** argv, HttpRequestTestServer StartHttpRequestTestServer(int argc, char** argv,
bool use_ssl) { bool use_ssl) {
char* me = argv[0];
char* lslash = strrchr(me, '/');
std::vector<char*> args;
int server_port = grpc_pick_unused_port_or_die(); int server_port = grpc_pick_unused_port_or_die();
// figure out where we are // Find root path. The logic is different for bazel vs. cmake.
char* root; std::string root;
if (lslash != nullptr) { absl::string_view me(argv[0]);
// Hack for bazel target size_t last_slash = me.rfind('/');
if (static_cast<unsigned>(lslash - me) >= (sizeof("http") - 1) && if (last_slash != me.npos) {
strncmp(me + (lslash - me) - sizeof("http") + 1, "http", absl::string_view dirname = me.substr(0, last_slash);
sizeof("http") - 1) == 0) { if (absl::EndsWith(dirname, "/http")) {
lslash = me + (lslash - me) - sizeof("http"); // Bazel paths will end in "test/core/http".
root = absl::StrCat(dirname, "/../../..");
} else {
// Cmake paths will be "cmake/build".
root = absl::StrCat(dirname, "/../..");
} }
root = static_cast<char*>(
gpr_malloc(static_cast<size_t>(lslash - me + sizeof("/../.."))));
memcpy(root, me, static_cast<size_t>(lslash - me));
memcpy(root + (lslash - me), "/../..", sizeof("/../.."));
} else { } else {
root = gpr_strdup("."); root = ".";
} }
// Construct args.
std::vector<const char*> args;
std::string python_wrapper_path;
std::string test_server_path;
CHECK_LE(argc, 2); CHECK_LE(argc, 2);
if (argc == 2) { if (argc == 2) {
args.push_back(gpr_strdup(argv[1])); args.push_back(argv[1]);
} else { } else {
char* python_wrapper_arg; python_wrapper_path =
char* test_server_arg; absl::StrCat(root, "/test/core/http/python_wrapper.sh");
gpr_asprintf(&python_wrapper_arg, "%s/test/core/http/python_wrapper.sh", test_server_path = absl::StrCat(root, "/test/core/http/test_server.py");
root); args.push_back(python_wrapper_path.c_str());
gpr_asprintf(&test_server_arg, "%s/test/core/http/test_server.py", root); args.push_back(test_server_path.c_str());
args.push_back(python_wrapper_arg);
args.push_back(test_server_arg);
} }
// start the server args.push_back("--port");
args.push_back(gpr_strdup("--port")); std::string port_number = absl::StrCat(server_port);
char* server_port_str; args.push_back(port_number.c_str());
gpr_asprintf(&server_port_str, "%d", server_port);
args.push_back(server_port_str);
if (use_ssl) { if (use_ssl) {
args.push_back(gpr_strdup("--ssl")); args.push_back("--ssl");
// Set the environment variable for the SSL certificate file // Set the environment variable for the SSL certificate file.
ConfigVars::Overrides overrides; ConfigVars::Overrides overrides;
overrides.default_ssl_roots_file_path = overrides.default_ssl_roots_file_path =
absl::StrCat(root, "/src/core/tsi/test_creds/ca.pem"); absl::StrCat(root, "/src/core/tsi/test_creds/ca.pem");
@ -89,13 +88,9 @@ HttpRequestTestServer StartHttpRequestTestServer(int argc, char** argv,
LOG(INFO) << " HttpRequest test server subprocess argv[" << i LOG(INFO) << " HttpRequest test server subprocess argv[" << i
<< "]: " << args[i]; << "]: " << args[i];
} }
gpr_subprocess* server = // Start the server.
gpr_subprocess_create(args.size(), const_cast<const char**>(args.data())); gpr_subprocess* server = gpr_subprocess_create(args.size(), args.data());
CHECK(server); CHECK(server);
for (size_t i = 0; i < args.size(); i++) {
gpr_free(args[i]);
}
gpr_free(root);
gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
gpr_time_from_seconds(5, GPR_TIMESPAN))); gpr_time_from_seconds(5, GPR_TIMESPAN)));
return {server, server_port}; return {server, server_port};

@ -60,6 +60,7 @@
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h" #include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/default_event_engine.h" #include "src/core/lib/event_engine/default_event_engine.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/resolved_address.h" #include "src/core/lib/iomgr/resolved_address.h"
#include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/credentials/credentials.h"
@ -92,6 +93,9 @@ namespace testing {
class LoadBalancingPolicyTest : public ::testing::Test { class LoadBalancingPolicyTest : public ::testing::Test {
protected: protected:
using FuzzingEventEngine =
grpc_event_engine::experimental::FuzzingEventEngine;
using CallAttributes = using CallAttributes =
std::vector<ServiceConfigCallData::CallAttributeInterface*>; std::vector<ServiceConfigCallData::CallAttributeInterface*>;
@ -573,7 +577,9 @@ class LoadBalancingPolicyTest : public ::testing::Test {
MutexLock lock(&mu_); MutexLock lock(&mu_);
StateUpdate update{ StateUpdate update{
state, status, state, status,
MakeRefCounted<PickerWrapper>(test_, std::move(picker))}; IsWorkSerializerDispatchEnabled()
? std::move(picker)
: MakeRefCounted<PickerWrapper>(test_, std::move(picker))};
LOG(INFO) << "enqueuing state update from LB policy: " LOG(INFO) << "enqueuing state update from LB policy: "
<< update.ToString(); << update.ToString();
queue_.push_back(std::move(update)); queue_.push_back(std::move(update));
@ -698,10 +704,7 @@ class LoadBalancingPolicyTest : public ::testing::Test {
// Order is important here: Fuzzing EE needs to be created before // Order is important here: Fuzzing EE needs to be created before
// grpc_init(), and the POSIX EE (which is used by the WorkSerializer) // grpc_init(), and the POSIX EE (which is used by the WorkSerializer)
// needs to be created after grpc_init(). // needs to be created after grpc_init().
fuzzing_ee_ = fuzzing_ee_ = MakeFuzzingEventEngine();
std::make_shared<grpc_event_engine::experimental::FuzzingEventEngine>(
grpc_event_engine::experimental::FuzzingEventEngine::Options(),
fuzzing_event_engine::Actions());
grpc_init(); grpc_init();
event_engine_ = grpc_event_engine::experimental::GetDefaultEventEngine(); event_engine_ = grpc_event_engine::experimental::GetDefaultEventEngine();
work_serializer_ = std::make_shared<WorkSerializer>(event_engine_); work_serializer_ = std::make_shared<WorkSerializer>(event_engine_);
@ -723,14 +726,16 @@ class LoadBalancingPolicyTest : public ::testing::Test {
WaitForWorkSerializerToFlush(); WaitForWorkSerializerToFlush();
work_serializer_.reset(); work_serializer_.reset();
exec_ctx.Flush(); exec_ctx.Flush();
// Note: Can't safely trigger this from inside the FakeHelper dtor, if (lb_policy_ != nullptr) {
// because if there is a picker in the queue that is holding a ref // Note: Can't safely trigger this from inside the FakeHelper dtor,
// to the LB policy, that will prevent the LB policy from being // because if there is a picker in the queue that is holding a ref
// destroyed, and therefore the FakeHelper will not be destroyed. // to the LB policy, that will prevent the LB policy from being
// (This will cause an ASAN failure, but it will not display the // destroyed, and therefore the FakeHelper will not be destroyed.
// queued events, so the failure will be harder to diagnose.) // (This will cause an ASAN failure, but it will not display the
helper_->ExpectQueueEmpty(); // queued events, so the failure will be harder to diagnose.)
lb_policy_.reset(); helper_->ExpectQueueEmpty();
lb_policy_.reset();
}
fuzzing_ee_->TickUntilIdle(); fuzzing_ee_->TickUntilIdle();
grpc_event_engine::experimental::WaitForSingleOwner( grpc_event_engine::experimental::WaitForSingleOwner(
std::move(event_engine_)); std::move(event_engine_));
@ -739,6 +744,12 @@ class LoadBalancingPolicyTest : public ::testing::Test {
fuzzing_ee_.reset(); fuzzing_ee_.reset();
} }
virtual std::shared_ptr<FuzzingEventEngine> MakeFuzzingEventEngine() {
return std::make_shared<FuzzingEventEngine>(
grpc_event_engine::experimental::FuzzingEventEngine::Options(),
fuzzing_event_engine::Actions());
}
LoadBalancingPolicy* lb_policy() const { LoadBalancingPolicy* lb_policy() const {
CHECK(lb_policy_ != nullptr); CHECK(lb_policy_ != nullptr);
return lb_policy_.get(); return lb_policy_.get();
@ -1465,8 +1476,7 @@ class LoadBalancingPolicyTest : public ::testing::Test {
} }
} }
std::shared_ptr<grpc_event_engine::experimental::FuzzingEventEngine> std::shared_ptr<FuzzingEventEngine> fuzzing_ee_;
fuzzing_ee_;
// TODO(ctiller): this is a normal event engine, yet it gets its time measure // TODO(ctiller): this is a normal event engine, yet it gets its time measure
// from fuzzing_ee_ -- results are likely to be a little funky, but seem to do // from fuzzing_ee_ -- results are likely to be a little funky, but seem to do
// well enough for the tests we have today. // well enough for the tests we have today.

@ -75,7 +75,7 @@ class PickFirstTest : public LoadBalancingPolicyTest {
} }
// Gets order the addresses are being picked. Return type is void so // Gets order the addresses are being picked. Return type is void so
// assertions can be used // assertions can be used.
void GetOrderAddressesArePicked( void GetOrderAddressesArePicked(
absl::Span<const absl::string_view> addresses, absl::Span<const absl::string_view> addresses,
std::vector<absl::string_view>* out_address_order) { std::vector<absl::string_view>* out_address_order) {
@ -1172,6 +1172,72 @@ TEST_F(PickFirstTest, AddressUpdateRetainsSelectedAddress) {
EXPECT_FALSE(subchannel2->ConnectionRequested()); EXPECT_FALSE(subchannel2->ConnectionRequested());
} }
// DO NOT USE!
//
// A test class that overrides the FuzzingEventEngine to make timer
// cancellation always fail. This is used to simulate cases where, at
// the moment that the timer is cancelled, the timer has already fired
// but the timer callback has not yet run in the WorkSerializer.
//
// TODO(roth): This is a really ugly hack. As part of changing these
// tests to use the FuzzingEventEngine exclusively, we should instead
// find a way to tick the FuzzingEventEngine to the right point so that
// we don't need this ugliness.
class PickFirstNoCancelTimerTest : public PickFirstTest {
protected:
class FuzzingEventEngineWithoutTimerCancellation : public FuzzingEventEngine {
public:
using FuzzingEventEngine::FuzzingEventEngine;
bool Cancel(TaskHandle) override { return false; }
};
std::shared_ptr<FuzzingEventEngine> MakeFuzzingEventEngine() override {
return std::make_shared<FuzzingEventEngineWithoutTimerCancellation>(
grpc_event_engine::experimental::FuzzingEventEngine::Options(),
fuzzing_event_engine::Actions());
}
};
// This exercizes a bug seen in the wild that caused a crash. For
// details, see https://github.com/grpc/grpc/pull/38144.
TEST_F(PickFirstNoCancelTimerTest, SubchannelNotificationAfterShutdown) {
// Send an update containing one address.
constexpr std::array<absl::string_view, 2> kAddresses = {
"ipv4:127.0.0.1:443", "ipv4:127.0.0.1:444"};
absl::Status status = ApplyUpdate(
BuildUpdate(kAddresses, MakePickFirstConfig(false)), lb_policy());
EXPECT_TRUE(status.ok()) << status;
// LB policy should have created a subchannel for each address.
auto* subchannel = FindSubchannel(kAddresses[0]);
ASSERT_NE(subchannel, nullptr);
auto* subchannel2 = FindSubchannel(kAddresses[1]);
ASSERT_NE(subchannel2, nullptr);
// When the LB policy receives the first subchannel's initial connectivity
// state notification (IDLE), it will request a connection.
EXPECT_TRUE(subchannel->ConnectionRequested());
// This causes the subchannel to start to connect, so it reports CONNECTING.
subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING);
// LB policy should have reported CONNECTING state.
ExpectConnectingUpdate();
// Now shut down the LB policy.
// This will cancel the Happy Eyeballs timer, but since we're using a
// FuzzingEventEngine that fails timer cancellations, it simulates the
// case where the timer has already fired but the timer callback has
// not yet run inside the WorkSerializer.
lb_policy_.reset();
// Now the subchannel reports READY. Before the bug fix, this caused
// us to select the subchannel instead of ignoring the notification.
// With the bug fix, this update should never actually be delivered to
// the LB policy, since it will have already shut down the subchannel.
subchannel->SetConnectivityState(GRPC_CHANNEL_READY);
// Now trigger the Happy Eyeballs timer to fire.
IncrementTimeBy(Duration::Milliseconds(250));
// Now the subchannel reports IDLE. Before the bug fix, this
// triggered a crash.
subchannel->SetConnectivityState(GRPC_CHANNEL_IDLE);
}
TEST_F(PickFirstTest, WithShuffle) { TEST_F(PickFirstTest, WithShuffle) {
constexpr std::array<absl::string_view, 6> kAddresses = { constexpr std::array<absl::string_view, 6> kAddresses = {
"ipv4:127.0.0.1:443", "ipv4:127.0.0.1:444", "ipv4:127.0.0.1:445", "ipv4:127.0.0.1:443", "ipv4:127.0.0.1:444", "ipv4:127.0.0.1:445",

@ -192,6 +192,18 @@ TEST(MpscTest, ImmediateSendWorks) {
activity.Deactivate(); activity.Deactivate();
} }
TEST(MpscTest, CloseFailsNext) {
StrictMock<MockActivity> activity;
MpscReceiver<Payload> receiver(1);
activity.Activate();
auto next = receiver.Next();
EXPECT_THAT(next(), IsPending());
EXPECT_CALL(activity, WakeupRequested());
receiver.MarkClosed();
EXPECT_THAT(next(), IsReady(Failure{}));
activity.Deactivate();
}
} // namespace } // namespace
} // namespace grpc_core } // namespace grpc_core

@ -15,6 +15,7 @@
#include "src/core/telemetry/metrics.h" #include "src/core/telemetry/metrics.h"
#include <memory> #include <memory>
#include <thread>
#include "absl/log/log.h" #include "absl/log/log.h"
#include "gmock/gmock.h" #include "gmock/gmock.h"
@ -648,6 +649,40 @@ TEST_F(MetricsTest, FindInstrumentByName) {
::testing::Eq(uint64_counter_handle.index)))); ::testing::Eq(uint64_counter_handle.index))));
} }
TEST_F(MetricsTest, ParallelStatsPluginRegistrationAndLookup) {
std::vector<std::thread> register_threads;
std::vector<std::thread> lookup_threads;
register_threads.reserve(100);
lookup_threads.reserve(100);
// 100 threads that register 100 stats plugins each
for (int i = 0; i < 100; ++i) {
register_threads.emplace_back([] {
for (int j = 0; j < 100; ++j) {
FakeStatsPluginBuilder().BuildAndRegister();
}
});
}
// 100 threads that keep looking up stats plugins till they see 10000 stats
// plugins
for (int i = 0; i < 100; ++i) {
lookup_threads.emplace_back([this] {
while (GlobalStatsPluginRegistry::GetStatsPluginsForChannel(
StatsPluginChannelScope("", "", endpoint_config_))
.size() < 10000) {
// Yield to avoid starving the register threads.
std::this_thread::yield();
};
});
}
for (int i = 0; i < 100; ++i) {
register_threads[i].join();
lookup_threads[i].join();
}
EXPECT_THAT(GlobalStatsPluginRegistry::GetStatsPluginsForChannel(
StatsPluginChannelScope("", "", endpoint_config_)),
::testing::SizeIs(10000));
}
using MetricsDeathTest = MetricsTest; using MetricsDeathTest = MetricsTest;
TEST_F(MetricsDeathTest, RegisterTheSameMetricNameWouldCrash) { TEST_F(MetricsDeathTest, RegisterTheSameMetricNameWouldCrash) {

@ -263,11 +263,6 @@ grpc_cc_test(
], ],
) )
sh_library(
name = "fuzzer_one_entry_runner",
srcs = ["fuzzer_one_entry_runner.sh"],
)
grpc_cc_library( grpc_cc_library(
name = "stack_tracer", name = "stack_tracer",
srcs = [ srcs = [

@ -696,8 +696,14 @@ class GlobalInstrumentsRegistryTestPeer {
class GlobalStatsPluginRegistryTestPeer { class GlobalStatsPluginRegistryTestPeer {
public: public:
static void ResetGlobalStatsPluginRegistry() { static void ResetGlobalStatsPluginRegistry() {
MutexLock lock(&*GlobalStatsPluginRegistry::mutex_); GlobalStatsPluginRegistry::GlobalStatsPluginNode* node =
GlobalStatsPluginRegistry::plugins_->clear(); GlobalStatsPluginRegistry::plugins_.exchange(nullptr,
std::memory_order_acq_rel);
while (node != nullptr) {
GlobalStatsPluginRegistry::GlobalStatsPluginNode* next = node->next;
delete node;
node = next;
}
} }
}; };

@ -1,18 +0,0 @@
#!/bin/sh
# Test runner for fuzzer tests from bazel
# Copyright 2017 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.
"$1" "$2"

@ -1,39 +0,0 @@
//
//
// Copyright 2016 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#include <grpc/grpc.h>
#include <stdbool.h>
#include "absl/log/check.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/util/crash.h"
#include "test/core/test_util/tls_utils.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
extern bool squelch;
extern bool leak_check;
int main(int argc, char** argv) {
squelch = false;
leak_check = false;
CHECK_GT(argc, 1); // Make sure that we have a filename argument
std::string buffer = grpc_core::testing::GetFileContents(argv[1]);
LLVMFuzzerTestOneInput(buffer.data(), buffer.size());
return 0;
}

@ -13,6 +13,7 @@
# limitations under the License. # limitations under the License.
load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_package") load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_package")
load("//test/core/call/yodel:grpc_yodel_test.bzl", "grpc_yodel_simple_test")
load("//test/core/test_util:grpc_fuzzer.bzl", "grpc_fuzzer", "grpc_proto_fuzzer") load("//test/core/test_util:grpc_fuzzer.bzl", "grpc_fuzzer", "grpc_proto_fuzzer")
load("//test/core/call/yodel:grpc_yodel_test.bzl", "grpc_yodel_simple_test") load("//test/core/call/yodel:grpc_yodel_test.bzl", "grpc_yodel_simple_test")

@ -43,12 +43,3 @@ CONTROL_ENDPOINT_TEST(CanWrite) {
} }
} // namespace grpc_core } // namespace grpc_core
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
// Must call to create default EventEngine.
grpc_init();
int ret = RUN_ALL_TESTS();
grpc_shutdown();
return ret;
}

@ -117,12 +117,3 @@ DATA_ENDPOINTS_TEST(CanRead) {
} }
} // namespace grpc_core } // namespace grpc_core
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
// Must call to create default EventEngine.
grpc_init();
int ret = RUN_ALL_TESTS();
grpc_shutdown();
return ret;
}

@ -22,14 +22,21 @@
#include <grpcpp/ext/call_metric_recorder.h> #include <grpcpp/ext/call_metric_recorder.h>
#include <grpcpp/ext/orca_service.h> #include <grpcpp/ext/orca_service.h>
#include <grpcpp/ext/server_metric_recorder.h> #include <grpcpp/ext/server_metric_recorder.h>
#include <grpcpp/generic/generic_stub.h>
#include <grpcpp/server.h> #include <grpcpp/server.h>
#include <grpcpp/server_builder.h> #include <grpcpp/server_builder.h>
#include <grpcpp/server_context.h> #include <grpcpp/server_context.h>
#include <grpcpp/support/byte_buffer.h>
#include <grpcpp/support/status.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <memory>
#include "absl/log/log.h" #include "absl/log/log.h"
#include "absl/strings/str_cat.h" #include "absl/strings/str_cat.h"
#include "absl/time/time.h"
#include "absl/types/optional.h" #include "absl/types/optional.h"
#include "src/core/util/notification.h"
#include "src/core/util/time.h" #include "src/core/util/time.h"
#include "src/proto/grpc/testing/xds/v3/orca_service.grpc.pb.h" #include "src/proto/grpc/testing/xds/v3/orca_service.grpc.pb.h"
#include "src/proto/grpc/testing/xds/v3/orca_service.pb.h" #include "src/proto/grpc/testing/xds/v3/orca_service.pb.h"
@ -93,6 +100,34 @@ class OrcaServiceEnd2endTest : public ::testing::Test {
absl::optional<grpc_core::Timestamp> last_response_time_; absl::optional<grpc_core::Timestamp> last_response_time_;
}; };
class GenericOrcaClientReactor
: public grpc::ClientBidiReactor<grpc::ByteBuffer, grpc::ByteBuffer> {
public:
explicit GenericOrcaClientReactor(GenericStub* stub) : stub_(stub) {}
void Prepare() {
stub_->PrepareBidiStreamingCall(
&cli_ctx_, "/xds.service.orca.v3.OpenRcaService/StreamCoreMetrics",
StubOptions(), this);
}
grpc::Status Await() {
notification_.WaitForNotification();
return status_;
}
void OnDone(const grpc::Status& s) override {
status_ = s;
notification_.Notify();
}
private:
GenericStub* stub_;
grpc::ClientContext cli_ctx_;
grpc_core::Notification notification_;
grpc::Status status_;
};
OrcaServiceEnd2endTest() OrcaServiceEnd2endTest()
: server_metric_recorder_(ServerMetricRecorder::Create()), : server_metric_recorder_(ServerMetricRecorder::Create()),
orca_service_(server_metric_recorder_.get(), orca_service_(server_metric_recorder_.get(),
@ -101,21 +136,19 @@ class OrcaServiceEnd2endTest : public ::testing::Test {
std::string server_address = std::string server_address =
absl::StrCat("localhost:", grpc_pick_unused_port_or_die()); absl::StrCat("localhost:", grpc_pick_unused_port_or_die());
ServerBuilder builder; ServerBuilder builder;
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.AddListeningPort(server_address, InsecureServerCredentials());
builder.RegisterService(&orca_service_); builder.RegisterService(&orca_service_);
server_ = builder.BuildAndStart(); server_ = builder.BuildAndStart();
LOG(INFO) << "server started on " << server_address_; LOG(INFO) << "server started on " << server_address;
auto channel = CreateChannel(server_address, InsecureChannelCredentials()); channel_ = CreateChannel(server_address, InsecureChannelCredentials());
stub_ = OpenRcaService::NewStub(channel);
} }
~OrcaServiceEnd2endTest() override { server_->Shutdown(); } ~OrcaServiceEnd2endTest() override { server_->Shutdown(); }
std::string server_address_;
std::unique_ptr<ServerMetricRecorder> server_metric_recorder_; std::unique_ptr<ServerMetricRecorder> server_metric_recorder_;
OrcaService orca_service_; OrcaService orca_service_;
std::unique_ptr<Server> server_; std::unique_ptr<Server> server_;
std::unique_ptr<OpenRcaService::Stub> stub_; std::shared_ptr<Channel> channel_;
}; };
TEST_F(OrcaServiceEnd2endTest, Basic) { TEST_F(OrcaServiceEnd2endTest, Basic) {
@ -123,11 +156,12 @@ TEST_F(OrcaServiceEnd2endTest, Basic) {
constexpr char kMetricName2[] = "bar"; constexpr char kMetricName2[] = "bar";
constexpr char kMetricName3[] = "baz"; constexpr char kMetricName3[] = "baz";
constexpr char kMetricName4[] = "quux"; constexpr char kMetricName4[] = "quux";
auto stub = OpenRcaService::NewStub(channel_);
// Start stream1 with 5s interval and stream2 with 2.5s interval. // Start stream1 with 5s interval and stream2 with 2.5s interval.
// Throughout the test, we should get two responses on stream2 for // Throughout the test, we should get two responses on stream2 for
// every one response on stream1. // every one response on stream1.
Stream stream1(stub_.get(), grpc_core::Duration::Milliseconds(5000)); Stream stream1(stub.get(), grpc_core::Duration::Milliseconds(5000));
Stream stream2(stub_.get(), grpc_core::Duration::Milliseconds(2500)); Stream stream2(stub.get(), grpc_core::Duration::Milliseconds(2500));
auto ReadResponses = [&](std::function<void(const OrcaLoadReport&)> checker) { auto ReadResponses = [&](std::function<void(const OrcaLoadReport&)> checker) {
LOG(INFO) << "reading response from stream1"; LOG(INFO) << "reading response from stream1";
OrcaLoadReport response = stream1.ReadResponse(); OrcaLoadReport response = stream1.ReadResponse();
@ -204,6 +238,15 @@ TEST_F(OrcaServiceEnd2endTest, Basic) {
}); });
} }
TEST_F(OrcaServiceEnd2endTest, ClientClosesBeforeSendingMessage) {
auto stub = std::make_unique<GenericStub>(channel_);
GenericOrcaClientReactor reactor(stub.get());
reactor.Prepare();
reactor.StartWritesDone();
reactor.StartCall();
EXPECT_EQ(reactor.Await().error_code(), grpc::StatusCode::INTERNAL);
}
} // namespace } // namespace
} // namespace testing } // namespace testing
} // namespace grpc } // namespace grpc

@ -430,6 +430,7 @@ grpc::CsmObservability EnableCsmObservability() {
// default was "localhost:9464" which causes connection issue across GKE // default was "localhost:9464" which causes connection issue across GKE
// pods // pods
opts.url = "0.0.0.0:9464"; opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

@ -49,6 +49,7 @@ grpc::CsmObservability EnableCsmObservability() {
// default was "localhost:9464" which causes connection issue across GKE // default was "localhost:9464" which causes connection issue across GKE
// pods // pods
opts.url = "0.0.0.0:9464"; opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter = auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider = auto meter_provider =

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save