From 2aa4aa2b9c07e81a53b7857bebbfaed0644609d7 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Mon, 9 Dec 2024 16:16:24 -0800 Subject: [PATCH 01/17] [Test] Fix error_details_test (#38233) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This test incorrectly assumes that a gRPC status of OK can include Status-Details. However, according to https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md, Status-Details are not permitted when the Status is OK. To align this test with the specification, we should remove the test case that checks for Status-Details with an OK status.   Closes #38233 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38233 from veblush:status-details 706693f91a848f7bf58770d3b9cdd083f366af28 PiperOrigin-RevId: 704453063 --- test/cpp/util/error_details_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/util/error_details_test.cc b/test/cpp/util/error_details_test.cc index 9d04de6ec9c4e..99681b5fca912 100644 --- a/test/cpp/util/error_details_test.cc +++ b/test/cpp/util/error_details_test.cc @@ -98,7 +98,7 @@ TEST(SetTest, OutOfScopeErrorCode) { } TEST(SetTest, ValidScopeErrorCode) { - for (int c = StatusCode::OK; c <= StatusCode::UNAUTHENTICATED; c++) { + for (int c = StatusCode::CANCELLED; c <= StatusCode::UNAUTHENTICATED; c++) { google::rpc::Status expected; expected.set_code(c); expected.set_message("I am an error message"); From 190fdf19f321991cb612a13c6b1971d1b71223b9 Mon Sep 17 00:00:00 2001 From: Sourabh Singh Date: Mon, 9 Dec 2024 23:24:17 -0800 Subject: [PATCH 02/17] decrease concurrency for windows grpc_distribtests_python (#38161) Decrease concurrency for Python distribution tests on Windows ``` Compiler terminating. Please wait........... Abort complete. Traceback (most recent call last): File "C:\Python310\lib\site-packages\setuptools\_distutils\_msvccompiler.py", line 508, in link self.spawn([self.linker] + ld_args) File "C:\Python310\lib\site-packages\setuptools\_distutils\_msvccompiler.py", line 517, in spawn return super().spawn(cmd, env=env) File "T:\altsrc\github\grpc\workspace_python_windows_x64_Python310\src\python\grpcio\_spawn_patch.py", line 54, in _commandfile_spawn _classic_spawn(self, modified_command, **kwargs) File "C:\Python310\lib\site-packages\setuptools\_distutils\ccompiler.py", line 1041, in spawn spawn(cmd, dry_run=self.dry_run, **kwargs) File "C:\Python310\lib\site-packages\setuptools\_distutils\spawn.py", line 68, in spawn raise DistutilsExecError(f"command {cmd!r} failed with exit code {exitcode}") distutils.errors.DistutilsExecError: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Tools\\MSVC\\14.40.33807\\bin\\HostX86\\x64\\link.exe' failed with exit code 4 ``` What is [exit code 4 ](https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-#:~:text=ERROR_TOO_MANY_OPEN_FILES,open%20the%20file.) The tests are timing out on kokoro windows We have added support for 3.12 python version but have not dropped support for any older version. hence overall number of tests have increased. Closes #38161 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38161 from sourabhsinghs:bugfix/kokoro-windows 94e51a51e42c480a0531a560eb7925eff1d6d662 PiperOrigin-RevId: 704568179 --- tools/internal_ci/windows/grpc_distribtests_python.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/internal_ci/windows/grpc_distribtests_python.bat b/tools/internal_ci/windows/grpc_distribtests_python.bat index 434fb0ef93895..742d61adf473d 100644 --- a/tools/internal_ci/windows/grpc_distribtests_python.bat +++ b/tools/internal_ci/windows/grpc_distribtests_python.bat @@ -29,7 +29,7 @@ set PREPARE_BUILD_INSTALL_DEPS_PYTHON=true call tools/internal_ci/helper_scripts/prepare_build_windows.bat || exit /b 1 @rem Build all python windows artifacts -python tools/run_tests/task_runner.py -f artifact windows python %TASK_RUNNER_EXTRA_FILTERS% -j 4 --inner_jobs 4 -x build_artifacts_python/sponge_log.xml || set FAILED=true +python tools/run_tests/task_runner.py -f artifact windows python %TASK_RUNNER_EXTRA_FILTERS% -j 4 --inner_jobs 3 -x build_artifacts_python/sponge_log.xml || set FAILED=true @rem the next step expects to find the artifacts from the previous step in the "input_artifacts" folder. bash -c "rm -rf input_artifacts; mkdir -p input_artifacts; cp -r artifacts/* input_artifacts/ || true" From cd57733b50101f5f65d215161d34c73276e73521 Mon Sep 17 00:00:00 2001 From: Sourabh Singh Date: Mon, 9 Dec 2024 23:24:58 -0800 Subject: [PATCH 03/17] Revert "increased timeout for windows grpc basictests python" (#38174) This reverts commit 999fd351ed206903374d1e325df4fe3856c04b8c. Closes #38174 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38174 from sourabhsinghs:bugfix/revert-kokoro-time 636b0abd8a0538a203da650cb88fb4a9d41c60ab PiperOrigin-RevId: 704568380 --- tools/internal_ci/windows/grpc_basictests_python.cfg | 2 +- .../internal_ci/windows/pull_request/grpc_basictests_python.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/internal_ci/windows/grpc_basictests_python.cfg b/tools/internal_ci/windows/grpc_basictests_python.cfg index 979f263d2de14..09137a9df5577 100644 --- a/tools/internal_ci/windows/grpc_basictests_python.cfg +++ b/tools/internal_ci/windows/grpc_basictests_python.cfg @@ -16,7 +16,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat" -timeout_mins: 240 +timeout_mins: 180 action { define_artifacts { regex: "**/*sponge_log.*" diff --git a/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg b/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg index c1cf2be234e59..ab541436b407b 100644 --- a/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg +++ b/tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg @@ -16,7 +16,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat" -timeout_mins: 180 +timeout_mins: 90 action { define_artifacts { regex: "**/*sponge_log.*" From 25813a0b7fae0dc13d669cdf3d8dc21c7dca9b13 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 10 Dec 2024 01:05:36 -0800 Subject: [PATCH 04/17] [call-v3] Put retries under an experiment (#38255) I've observed a few test flakes with the new retry code... put it under an experiment for now so that those flakes don't block submission of unrelated code. Closes #38255 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38255 from ctiller:retry-experiment 1ca6a188c445f5b845f962c50f3e5d3495018d5b PiperOrigin-RevId: 704596499 --- bazel/experiments.bzl | 4 ++++ src/core/lib/experiments/experiments.cc | 12 ++++++++++++ src/core/lib/experiments/experiments.h | 8 ++++++++ src/core/lib/experiments/experiments.yaml | 5 +++++ test/core/end2end/end2end_test_suites.cc | 1 + test/core/end2end/tests/retry.cc | 1 + .../tests/retry_cancel_after_first_attempt_starts.cc | 1 + test/core/end2end/tests/retry_cancellation.cc | 2 ++ .../core/end2end/tests/retry_non_retriable_status.cc | 1 + .../retry_non_retriable_status_before_trailers.cc | 1 + .../end2end/tests/retry_recv_initial_metadata.cc | 1 + test/core/end2end/tests/retry_recv_message.cc | 1 + .../tests/retry_send_initial_metadata_refs.cc | 1 + .../end2end/tests/retry_server_pushback_delay.cc | 1 + .../end2end/tests/retry_server_pushback_disabled.cc | 1 + test/core/end2end/tests/retry_throttled.cc | 1 + test/core/end2end/tests/retry_too_many_attempts.cc | 1 + test/core/end2end/tests/retry_unref_before_finish.cc | 1 + test/core/end2end/tests/retry_unref_before_recv.cc | 1 + 19 files changed, 45 insertions(+) diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl index e30d05a75c987..2167f16497de3 100644 --- a/bazel/experiments.bzl +++ b/bazel/experiments.bzl @@ -39,6 +39,7 @@ EXPERIMENT_ENABLES = { "promise_based_http2_client_transport": "promise_based_http2_client_transport", "promise_based_http2_server_transport": "promise_based_http2_server_transport", "promise_based_inproc_transport": "promise_based_inproc_transport", + "retry_in_callv3": "retry_in_callv3", "rq_fast_reject": "rq_fast_reject", "schedule_cancellation_over_write": "schedule_cancellation_over_write", "server_privacy": "server_privacy", @@ -66,6 +67,7 @@ EXPERIMENTS = { "chaotic_good_legacy_protocol", "event_engine_dns_non_client_channel", "local_connector_secure", + "retry_in_callv3", ], "endpoint_test": [ "tcp_frame_size_tuning", @@ -123,6 +125,7 @@ EXPERIMENTS = { "chaotic_good_legacy_protocol", "event_engine_dns_non_client_channel", "local_connector_secure", + "retry_in_callv3", ], "endpoint_test": [ "tcp_frame_size_tuning", @@ -166,6 +169,7 @@ EXPERIMENTS = { "chaotic_good_legacy_protocol", "event_engine_dns_non_client_channel", "local_connector_secure", + "retry_in_callv3", ], "endpoint_test": [ "tcp_frame_size_tuning", diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index f60b3648e6be9..703a8a171e924 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -108,6 +108,8 @@ const char* const additional_constraints_promise_based_http2_server_transport = const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; +const char* const description_retry_in_callv3 = "Support retries with call-v3"; +const char* const additional_constraints_retry_in_callv3 = "{}"; const char* const description_rq_fast_reject = "Resource quota rejects requests immediately (before allocating the " "request structure) under very high memory pressure."; @@ -208,6 +210,8 @@ const ExperimentMetadata g_experiment_metadata[] = { description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, + {"retry_in_callv3", description_retry_in_callv3, + additional_constraints_retry_in_callv3, nullptr, 0, false, true}, {"rq_fast_reject", description_rq_fast_reject, additional_constraints_rq_fast_reject, nullptr, 0, false, true}, {"schedule_cancellation_over_write", @@ -321,6 +325,8 @@ const char* const additional_constraints_promise_based_http2_server_transport = const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; +const char* const description_retry_in_callv3 = "Support retries with call-v3"; +const char* const additional_constraints_retry_in_callv3 = "{}"; const char* const description_rq_fast_reject = "Resource quota rejects requests immediately (before allocating the " "request structure) under very high memory pressure."; @@ -421,6 +427,8 @@ const ExperimentMetadata g_experiment_metadata[] = { description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, + {"retry_in_callv3", description_retry_in_callv3, + additional_constraints_retry_in_callv3, nullptr, 0, false, true}, {"rq_fast_reject", description_rq_fast_reject, additional_constraints_rq_fast_reject, nullptr, 0, false, true}, {"schedule_cancellation_over_write", @@ -534,6 +542,8 @@ const char* const additional_constraints_promise_based_http2_server_transport = const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; +const char* const description_retry_in_callv3 = "Support retries with call-v3"; +const char* const additional_constraints_retry_in_callv3 = "{}"; const char* const description_rq_fast_reject = "Resource quota rejects requests immediately (before allocating the " "request structure) under very high memory pressure."; @@ -634,6 +644,8 @@ const ExperimentMetadata g_experiment_metadata[] = { description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, nullptr, 0, false, false}, + {"retry_in_callv3", description_retry_in_callv3, + additional_constraints_retry_in_callv3, nullptr, 0, false, true}, {"rq_fast_reject", description_rq_fast_reject, additional_constraints_rq_fast_reject, nullptr, 0, false, true}, {"schedule_cancellation_over_write", diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index fe71a55bd25f4..66341e3826046 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -85,6 +85,7 @@ inline bool IsPrioritizeFinishedRequestsEnabled() { return false; } inline bool IsPromiseBasedHttp2ClientTransportEnabled() { return false; } inline bool IsPromiseBasedHttp2ServerTransportEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } +inline bool IsRetryInCallv3Enabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsServerPrivacyEnabled() { return false; } @@ -130,6 +131,7 @@ inline bool IsPrioritizeFinishedRequestsEnabled() { return false; } inline bool IsPromiseBasedHttp2ClientTransportEnabled() { return false; } inline bool IsPromiseBasedHttp2ServerTransportEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } +inline bool IsRetryInCallv3Enabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsServerPrivacyEnabled() { return false; } @@ -175,6 +177,7 @@ inline bool IsPrioritizeFinishedRequestsEnabled() { return false; } inline bool IsPromiseBasedHttp2ClientTransportEnabled() { return false; } inline bool IsPromiseBasedHttp2ServerTransportEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } +inline bool IsRetryInCallv3Enabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsServerPrivacyEnabled() { return false; } @@ -213,6 +216,7 @@ enum ExperimentIds { kExperimentIdPromiseBasedHttp2ClientTransport, kExperimentIdPromiseBasedHttp2ServerTransport, kExperimentIdPromiseBasedInprocTransport, + kExperimentIdRetryInCallv3, kExperimentIdRqFastReject, kExperimentIdScheduleCancellationOverWrite, kExperimentIdServerPrivacy, @@ -313,6 +317,10 @@ inline bool IsPromiseBasedHttp2ServerTransportEnabled() { inline bool IsPromiseBasedInprocTransportEnabled() { return IsExperimentEnabled(); } +#define GRPC_EXPERIMENT_IS_INCLUDED_RETRY_IN_CALLV3 +inline bool IsRetryInCallv3Enabled() { + return IsExperimentEnabled(); +} #define GRPC_EXPERIMENT_IS_INCLUDED_RQ_FAST_REJECT inline bool IsRqFastRejectEnabled() { return IsExperimentEnabled(); diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index 612eb937950fd..f7862622f806b 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -177,6 +177,11 @@ owner: ctiller@google.com test_tags: [] allow_in_fuzzing_config: false # experiment currently crashes if enabled +- name: retry_in_callv3 + description: Support retries with call-v3 + expiry: 2025/06/06 + owner: ctiller@google.com + test_tags: [core_end2end_test] - name: rq_fast_reject description: Resource quota rejects requests immediately (before allocating the request diff --git a/test/core/end2end/end2end_test_suites.cc b/test/core/end2end/end2end_test_suites.cc index a0dd15f1e42da..2f592ea657704 100644 --- a/test/core/end2end/end2end_test_suites.cc +++ b/test/core/end2end/end2end_test_suites.cc @@ -536,6 +536,7 @@ class ChaoticGoodFixture : public CoreTestFixture { args.Set(GRPC_ARG_CHAOTIC_GOOD_DATA_CONNECTIONS, data_connections_) .Set(GRPC_ARG_CHAOTIC_GOOD_MAX_RECV_CHUNK_SIZE, chunk_size_) .Set(GRPC_ARG_CHAOTIC_GOOD_MAX_SEND_CHUNK_SIZE, chunk_size_) + .Set(GRPC_ARG_ENABLE_RETRIES, IsRetryInCallv3Enabled()) .ToC() .get(), nullptr); diff --git a/test/core/end2end/tests/retry.cc b/test/core/end2end/tests/retry.cc index e2a9361336ac1..8405c92e91bd3 100644 --- a/test/core/end2end/tests/retry.cc +++ b/test/core/end2end/tests/retry.cc @@ -34,6 +34,7 @@ namespace grpc_core { // - first attempt returns ABORTED // - second attempt returns OK CORE_END2END_TEST(RetryTest, Retry) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_cancel_after_first_attempt_starts.cc b/test/core/end2end/tests/retry_cancel_after_first_attempt_starts.cc index abef13e894c43..ce7625a5f3d86 100644 --- a/test/core/end2end/tests/retry_cancel_after_first_attempt_starts.cc +++ b/test/core/end2end/tests/retry_cancel_after_first_attempt_starts.cc @@ -30,6 +30,7 @@ namespace { // Tests that we can unref a call after the first attempt starts but // before any ops complete. This should not cause a memory leak. CORE_END2END_TEST(RetryTest, RetryCancelAfterFirstAttemptStarts) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); // This is a workaround for the flakiness that if the server ever enters // GracefulShutdown for whatever reason while the client has already been // shutdown, the test would not timeout and fail. diff --git a/test/core/end2end/tests/retry_cancellation.cc b/test/core/end2end/tests/retry_cancellation.cc index be20108ba4985..1e371f2d32e50 100644 --- a/test/core/end2end/tests/retry_cancellation.cc +++ b/test/core/end2end/tests/retry_cancellation.cc @@ -94,10 +94,12 @@ void TestRetryCancellation(CoreEnd2endTest& test, } CORE_END2END_TEST(RetryTest, RetryCancellation) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); TestRetryCancellation(*this, std::make_unique()); } CORE_END2END_TEST(RetryTest, RetryDeadline) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); TestRetryCancellation(*this, std::make_unique()); } diff --git a/test/core/end2end/tests/retry_non_retriable_status.cc b/test/core/end2end/tests/retry_non_retriable_status.cc index 43287d16d4679..481796464c6ef 100644 --- a/test/core/end2end/tests/retry_non_retriable_status.cc +++ b/test/core/end2end/tests/retry_non_retriable_status.cc @@ -34,6 +34,7 @@ namespace { // - 1 retry allowed for ABORTED status // - first attempt gets INVALID_ARGUMENT, so no retry is done CORE_END2END_TEST(RetryTest, RetryNonRetriableStatus) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_non_retriable_status_before_trailers.cc b/test/core/end2end/tests/retry_non_retriable_status_before_trailers.cc index dfb33ba1ec3bb..dc93b5886dfba 100644 --- a/test/core/end2end/tests/retry_non_retriable_status_before_trailers.cc +++ b/test/core/end2end/tests/retry_non_retriable_status_before_trailers.cc @@ -36,6 +36,7 @@ namespace { // - first attempt gets INVALID_ARGUMENT, so no retry is done CORE_END2END_TEST(RetryTest, RetryNonRetriableStatusBeforeRecvTrailingMetadataStarted) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_recv_initial_metadata.cc b/test/core/end2end/tests/retry_recv_initial_metadata.cc index 01d8ba37e17d0..f98e7b6f9d3bb 100644 --- a/test/core/end2end/tests/retry_recv_initial_metadata.cc +++ b/test/core/end2end/tests/retry_recv_initial_metadata.cc @@ -35,6 +35,7 @@ namespace { // - first attempt receives initial metadata before trailing metadata, // so no retry is done even though status was ABORTED CORE_END2END_TEST(RetryTest, RetryRecvInitialMetadata) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_recv_message.cc b/test/core/end2end/tests/retry_recv_message.cc index 93d282684e988..9f62368b45f6c 100644 --- a/test/core/end2end/tests/retry_recv_message.cc +++ b/test/core/end2end/tests/retry_recv_message.cc @@ -35,6 +35,7 @@ namespace { // - first attempt receives a message and therefore does not retry even // though the final status is ABORTED CORE_END2END_TEST(RetryTest, RetryRecvMessage) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_send_initial_metadata_refs.cc b/test/core/end2end/tests/retry_send_initial_metadata_refs.cc index 2f8bc7ea21a5d..cd921707c7984 100644 --- a/test/core/end2end/tests/retry_send_initial_metadata_refs.cc +++ b/test/core/end2end/tests/retry_send_initial_metadata_refs.cc @@ -37,6 +37,7 @@ namespace { // - first attempt returns ABORTED // - second attempt returns OK CORE_END2END_TEST(RetryTest, RetrySendInitialMetadataRefs) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_server_pushback_delay.cc b/test/core/end2end/tests/retry_server_pushback_delay.cc index b1acf7c380236..6826a89eeee3e 100644 --- a/test/core/end2end/tests/retry_server_pushback_delay.cc +++ b/test/core/end2end/tests/retry_server_pushback_delay.cc @@ -35,6 +35,7 @@ namespace { // - first attempt gets ABORTED with a long delay // - second attempt succeeds CORE_END2END_TEST(RetryTest, RetryServerPushbackDelay) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_server_pushback_disabled.cc b/test/core/end2end/tests/retry_server_pushback_disabled.cc index e63f92a3b3cac..d1e339b890b63 100644 --- a/test/core/end2end/tests/retry_server_pushback_disabled.cc +++ b/test/core/end2end/tests/retry_server_pushback_disabled.cc @@ -35,6 +35,7 @@ namespace { // - first attempt gets ABORTED // - second attempt gets ABORTED but server push back disables retrying CORE_END2END_TEST(RetryTest, RetryServerPushbackDisabled) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_throttled.cc b/test/core/end2end/tests/retry_throttled.cc index 0f973c59a6698..cb39a9ec95019 100644 --- a/test/core/end2end/tests/retry_throttled.cc +++ b/test/core/end2end/tests/retry_throttled.cc @@ -34,6 +34,7 @@ namespace { // - 1 retry allowed for ABORTED status // - first attempt gets ABORTED but is over limit, so no retry is done CORE_END2END_TEST(RetryTest, RetryThrottled) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, "{\n" diff --git a/test/core/end2end/tests/retry_too_many_attempts.cc b/test/core/end2end/tests/retry_too_many_attempts.cc index 6cbbe9529efb1..95f7dfbc031c1 100644 --- a/test/core/end2end/tests/retry_too_many_attempts.cc +++ b/test/core/end2end/tests/retry_too_many_attempts.cc @@ -34,6 +34,7 @@ namespace { // - first attempt gets ABORTED // - second attempt gets ABORTED but does not retry CORE_END2END_TEST(RetryTest, RetryTooManyAttempts) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_unref_before_finish.cc b/test/core/end2end/tests/retry_unref_before_finish.cc index c38fcb99c1283..b02303fbedcc6 100644 --- a/test/core/end2end/tests/retry_unref_before_finish.cc +++ b/test/core/end2end/tests/retry_unref_before_finish.cc @@ -29,6 +29,7 @@ namespace { // Tests that we can unref a call whose status is cached but not yet // requested by the application. This should not cause a memory leak. CORE_END2END_TEST(RetryTest, RetryUnrefBeforeFinish) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, diff --git a/test/core/end2end/tests/retry_unref_before_recv.cc b/test/core/end2end/tests/retry_unref_before_recv.cc index a8665bfad4b9f..9a96a7751d45b 100644 --- a/test/core/end2end/tests/retry_unref_before_recv.cc +++ b/test/core/end2end/tests/retry_unref_before_recv.cc @@ -32,6 +32,7 @@ namespace { // they complete. This ensures that we don't drop callbacks or cause a // memory leak. CORE_END2END_TEST(RetryTest, UnrefBeforeRecv) { + if (!IsRetryInCallv3Enabled()) SKIP_IF_V3(); InitServer(ChannelArgs()); InitClient(ChannelArgs().Set( GRPC_ARG_SERVICE_CONFIG, From cb5563ce84d2757c06f3ce08c36b1522dc2793de Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 10 Dec 2024 11:11:57 -0800 Subject: [PATCH 05/17] Automated rollback of commit f36c6aed760b739cb8d1ff8375f756de4f8c7dca. PiperOrigin-RevId: 704778619 --- fuzztest/core/util/BUILD | 12 --- .../core/util/kolmogorov_smirnov_fuzztest.cc | 96 ------------------- src/core/BUILD | 14 --- src/core/util/kolmogorov_smirnov.cc | 48 ---------- src/core/util/kolmogorov_smirnov.h | 42 -------- 5 files changed, 212 deletions(-) delete mode 100644 fuzztest/core/util/kolmogorov_smirnov_fuzztest.cc delete mode 100644 src/core/util/kolmogorov_smirnov.cc delete mode 100644 src/core/util/kolmogorov_smirnov.h diff --git a/fuzztest/core/util/BUILD b/fuzztest/core/util/BUILD index 33300fb2678f9..66fd6f062dc90 100644 --- a/fuzztest/core/util/BUILD +++ b/fuzztest/core/util/BUILD @@ -25,15 +25,3 @@ grpc_fuzz_test( ], deps = ["//src/core:tdigest"], ) - -grpc_fuzz_test( - name = "kolmogorov_smirnov_fuzztest", - srcs = ["kolmogorov_smirnov_fuzztest.cc"], - external_deps = [ - "absl/types:variant", - "fuzztest", - "fuzztest_main", - "gtest", - ], - deps = ["//src/core:kolmogorov_smirnov"], -) diff --git a/fuzztest/core/util/kolmogorov_smirnov_fuzztest.cc b/fuzztest/core/util/kolmogorov_smirnov_fuzztest.cc deleted file mode 100644 index 2840a62fbe43a..0000000000000 --- a/fuzztest/core/util/kolmogorov_smirnov_fuzztest.cc +++ /dev/null @@ -1,96 +0,0 @@ -// 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. - -#include -#include -#include - -#include "fuzztest/fuzztest.h" -#include "gtest/gtest.h" -#include "src/core/util/kolmogorov_smirnov.h" - -using fuzztest::VectorOf; -using fuzztest::InRange; - -namespace grpc_core { -namespace { - -void TestThresholdSensitivityAlpha(double alpha, double a_count, double b_count, double delta) { - EXPECT_GT( - KolmogorovSmirnovThreshold(alpha, a_count, b_count), - KolmogorovSmirnovThreshold(alpha + delta, a_count, b_count) - ); -} -FUZZ_TEST(KolmogorovSmirnov, TestThresholdSensitivityAlpha) - .WithDomains(InRange(0.001, 0.2), InRange(1.0, 100000.0), InRange(1.0, 100000.0), InRange(0.001, 0.1)); - -void TestThresholdSensitivityReversedCount(double alpha, double a_count, double b_count) { - EXPECT_NEAR( - KolmogorovSmirnovThreshold(alpha, a_count, b_count), - KolmogorovSmirnovThreshold(alpha, b_count, a_count), - 0.00001 - ); -} -FUZZ_TEST(KolmogorovSmirnov, TestThresholdSensitivityReversedCount) - .WithDomains(InRange(0.001, 0.2), InRange(1.0, 100000.0), InRange(1.0, 100000.0)); - -void TestThresholdSensitivityCount(double alpha, double a_count, double b_count, double delta) { - EXPECT_LT( - KolmogorovSmirnovThreshold(alpha, a_count, b_count), - KolmogorovSmirnovThreshold(alpha, a_count + delta, b_count) - ); -} -FUZZ_TEST(KolmogorovSmirnov, TestThresholdSensitivityCount) - .WithDomains(InRange(0.001, 0.2), InRange(1.0, 100000.0), InRange(1.0, 100000.0), InRange(1.0, 1000.0)); - -double ExactStatistic(std::vector& a, std::vector& b) { - std::sort(a.begin(), a.end()); - std::sort(b.begin(), b.end()); - double max_diff = 0.0; - for (size_t i=0, j=0; i(i) / a.size(); - double d2 = static_cast(j) / b.size(); - double diff = std::abs(d1 - d2); - if (diff > max_diff) { - max_diff = diff; - } - if (a[i] <= b[j]) { - ++i; - } else { - ++j; - } - } - return max_diff; -} - -void TestStatistic(std::vector a, std::vector b, double a_compression, double b_compression, uint32_t num_samples) { - TDigest a_digest(a_compression); - for (double x : a) { - a_digest.Add(x); - } - TDigest b_digest(b_compression); - for (double x : b) { - b_digest.Add(x); - } - EXPECT_NEAR( - KolmogorovSmirnovStatistic(a_digest, b_digest, num_samples), - ExactStatistic(a, b), - 0.5 - ); -} -FUZZ_TEST(KolmogorovSmirnov, TestStatistic) - .WithDomains(VectorOf(InRange(0.0, 1000.0)).WithMinSize(100), VectorOf(InRange(0.0, 1000.0)).WithMinSize(100), InRange(50.0, 1000.0), InRange(50.0, 1000.0), InRange(10, 100)); - -} -} diff --git a/src/core/BUILD b/src/core/BUILD index ccfb1b8d03977..d58ddbd994294 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -4021,20 +4021,6 @@ grpc_cc_library( deps = ["//:gpr_platform"], ) -grpc_cc_library( - name = "kolmogorov_smirnov", - srcs = [ - "util/kolmogorov_smirnov.cc", - ], - hdrs = [ - "util/kolmogorov_smirnov.h", - ], - external_deps = [ - ], - language = "c++", - deps = ["tdigest"], -) - grpc_cc_library( name = "certificate_provider_factory", hdrs = [ diff --git a/src/core/util/kolmogorov_smirnov.cc b/src/core/util/kolmogorov_smirnov.cc deleted file mode 100644 index 9dd9711e72bf5..0000000000000 --- a/src/core/util/kolmogorov_smirnov.cc +++ /dev/null @@ -1,48 +0,0 @@ -// 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. - -#include "src/core/util/kolmogorov_smirnov.h" - -namespace grpc_core { - -bool KolmogorovSmirnovTest(TDigest& a, TDigest& b, double alpha, - uint32_t num_samples) { - return KolmogorovSmirnovStatistic(a, b, num_samples) > - KolmogorovSmirnovThreshold(alpha, a.Count(), b.Count()); -} - -double KolmogorovSmirnovStatistic(TDigest& a, TDigest& b, - uint32_t num_samples) { - const double min_value = std::min(a.Min(), b.Min()); - const double max_value = std::max(a.Max(), b.Max()); - // We don't step to max_value because we know the CDF is 1 there for a & b - // so we use our samples for the parts of the curve where the CDF actually - // varies - const double step = (max_value - min_value) / (num_samples + 1); - double max_diff = 0; - for (size_t i = 0; i < num_samples; ++i) { - const double a_cdf = a.Cdf(min_value + (i + 1) * step); - const double b_cdf = b.Cdf(min_value + (i + 1) * step); - max_diff = std::max(max_diff, std::abs(a_cdf - b_cdf)); - } - return max_diff; -} - -double KolmogorovSmirnovThreshold(double alpha, double a_count, - double b_count) { - const double sample_scaling = a_count * b_count / (a_count + b_count); - return std::sqrt(-0.5 * std::log(alpha / 2) * sample_scaling); -} - -} // namespace grpc_core diff --git a/src/core/util/kolmogorov_smirnov.h b/src/core/util/kolmogorov_smirnov.h deleted file mode 100644 index ed7af5c171851..0000000000000 --- a/src/core/util/kolmogorov_smirnov.h +++ /dev/null @@ -1,42 +0,0 @@ -// 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_CORE_UTIL_KOLMOGOROV_SMIRNOV_H -#define GRPC_SRC_CORE_UTIL_KOLMOGOROV_SMIRNOV_H - -#include "src/core/util/tdigest.h" - -namespace grpc_core { - -// Perform a Kolmogorov-Smirnov test to determine if two TDigests are -// significantly different (returns true), or not (returns false). -// -// alpha is a real numbered value between 0 and 1, representing the -// significance level of the test. -// -// num_samples is the number of cdf samples to take from each TDigest. -// -// Computational complexity roughly num_samples * (a.NumCentroids() + -// b.NumCentroids()). -bool KolmogorovSmirnovTest(TDigest& a, TDigest& b, double alpha, - uint32_t num_samples = 10); - -double KolmogorovSmirnovStatistic(TDigest& a, TDigest& b, - uint32_t num_samples = 10); - -double KolmogorovSmirnovThreshold(double alpha, double a_count, double b_count); - -} // namespace grpc_core - -#endif // GRPC_SRC_CORE_UTIL_KOLMOGOROV_SMIRNOV_H From 4309f97f7c25f09aeacba76cb0786eabb5344c87 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 10 Dec 2024 13:02:51 -0800 Subject: [PATCH 06/17] [chaotic-good] Lazy connection establishment (#38244) This change builds on #38032 but moves connection establishment into the transport. This allows the listener and connector implementations to be much simpler, and opens the door for a future change where we dynamically resize the connection pool in response to load. Closes #38244 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38244 from ctiller:tiefling-lazy 7f06bf38d939686dd1287aed2c339a7a17f79576 PiperOrigin-RevId: 704817804 --- CMakeLists.txt | 10 + build_autogenerated.yaml | 114 +++++ .../transport/chaotic_good/config_test.cc | 19 +- src/core/BUILD | 30 ++ .../chaotic_good/chaotic_good_frame.proto | 9 + .../chaotic_good/chaotic_good_transport.h | 7 +- .../client/chaotic_good_connector.cc | 469 +++++++----------- .../client/chaotic_good_connector.h | 68 ++- .../chaotic_good/client_transport.cc | 26 +- .../transport/chaotic_good/client_transport.h | 10 +- src/core/ext/transport/chaotic_good/config.h | 125 ++++- .../chaotic_good/control_endpoint.cc | 33 +- .../transport/chaotic_good/control_endpoint.h | 11 +- .../transport/chaotic_good/data_endpoints.cc | 220 +++++--- .../transport/chaotic_good/data_endpoints.h | 48 +- .../chaotic_good/pending_connection.h | 74 +++ .../server/chaotic_good_server.cc | 240 +++++---- .../chaotic_good/server/chaotic_good_server.h | 66 ++- .../chaotic_good/server_transport.cc | 17 +- .../transport/chaotic_good/server_transport.h | 10 +- src/core/lib/promise/map.h | 42 ++ src/core/lib/promise/party.h | 10 +- test/core/call/yodel/yodel_test.h | 12 +- test/core/promise/bm_party.cc | 12 +- test/core/promise/map_test.cc | 23 + .../transport/benchmarks/bm_chaotic_good.cc | 41 +- .../chaotic_good/chaotic_good_server_test.cc | 3 +- .../client_transport_error_test.cc | 49 +- .../chaotic_good/client_transport_test.cc | 44 +- .../chaotic_good/data_endpoints_test.cc | 31 +- .../chaotic_good/server_transport_test.cc | 37 +- test/core/transport/test_suite/BUILD | 1 + .../test_suite/chaotic_good_fixture.cc | 17 +- .../test_suite/chaotic_good_fixture_helpers.h | 18 + .../chaotic_good_one_byte_chunk_fixture.cc | 16 +- .../chaotic_good_single_connection_fixture.cc | 12 +- .../transport/test_suite/transport_test.h | 21 + 37 files changed, 1293 insertions(+), 702 deletions(-) create mode 100644 src/core/ext/transport/chaotic_good/pending_connection.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f65d783fa5c3d..6f87003724006 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19713,10 +19713,19 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) add_executable(inproc_test + ${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h ${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.cc ${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h ${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.grpc.pb.h + src/core/ext/transport/chaotic_good/control_endpoint.cc + src/core/ext/transport/chaotic_good/data_endpoints.cc + src/core/ext/transport/chaotic_good/frame.cc + src/core/ext/transport/chaotic_good/frame_header.cc + src/core/lib/transport/promise_endpoint.cc test/core/call/yodel/test_main.cc test/core/call/yodel/yodel_test.cc test/core/event_engine/event_engine_test_utils.cc @@ -25432,6 +25441,7 @@ target_link_libraries(promise_map_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest absl::type_traits + absl::statusor gpr ) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 4b1cff62d680a..f56edca2ca40d 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -5988,6 +5988,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -6240,6 +6241,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -6458,6 +6460,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -6714,6 +6717,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -7458,6 +7462,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -7547,6 +7552,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -7637,6 +7643,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -7726,6 +7733,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -7832,6 +7840,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -8025,6 +8034,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -8115,6 +8125,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -8717,6 +8728,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/lib/promise/detail/promise_variant.h - src/core/lib/promise/event_engine_wakeup_scheduler.h @@ -8774,6 +8786,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/lib/promise/detail/promise_variant.h - src/core/lib/promise/event_engine_wakeup_scheduler.h @@ -9251,6 +9264,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -9451,6 +9465,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -9669,6 +9684,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -9872,6 +9888,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -10002,6 +10019,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -10179,6 +10197,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -10741,6 +10760,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -10830,6 +10850,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -10937,6 +10958,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -11512,6 +11534,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -11737,6 +11760,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -12334,6 +12358,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -12554,6 +12579,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -12739,6 +12765,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -12952,12 +12979,31 @@ targets: build: test language: c++ headers: + - src/core/ext/transport/chaotic_good/chaotic_good_transport.h + - src/core/ext/transport/chaotic_good/config.h + - src/core/ext/transport/chaotic_good/control_endpoint.h + - src/core/ext/transport/chaotic_good/data_endpoints.h + - src/core/ext/transport/chaotic_good/frame.h + - src/core/ext/transport/chaotic_good/frame_header.h + - src/core/ext/transport/chaotic_good/message_chunker.h + - src/core/ext/transport/chaotic_good/pending_connection.h + - src/core/lib/promise/detail/promise_variant.h + - src/core/lib/promise/match_promise.h + - src/core/lib/promise/mpsc.h + - src/core/lib/promise/wait_set.h + - src/core/lib/transport/promise_endpoint.h - test/core/call/yodel/yodel_test.h - test/core/event_engine/event_engine_test_utils.h - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h - test/core/transport/test_suite/transport_test.h src: + - src/core/ext/transport/chaotic_good/chaotic_good_frame.proto - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto + - src/core/ext/transport/chaotic_good/control_endpoint.cc + - src/core/ext/transport/chaotic_good/data_endpoints.cc + - src/core/ext/transport/chaotic_good/frame.cc + - src/core/ext/transport/chaotic_good/frame_header.cc + - src/core/lib/transport/promise_endpoint.cc - test/core/call/yodel/test_main.cc - test/core/call/yodel/yodel_test.cc - test/core/event_engine/event_engine_test_utils.cc @@ -13250,6 +13296,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -13482,6 +13529,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -13583,6 +13631,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -14070,6 +14119,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -14159,6 +14209,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -14248,6 +14299,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -14337,6 +14389,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -14675,6 +14728,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -14776,6 +14830,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -14865,6 +14920,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -15301,6 +15357,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -15564,6 +15621,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -15683,6 +15741,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -16131,6 +16190,7 @@ targets: deps: - gtest - absl/meta:type_traits + - absl/status:statusor - gpr uses_polling: false - name: promise_mutex_test @@ -16273,6 +16333,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -16560,6 +16621,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -16832,6 +16894,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -16921,6 +16984,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17162,6 +17226,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17262,6 +17327,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17351,6 +17417,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17440,6 +17507,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17529,6 +17597,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17618,6 +17687,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17707,6 +17777,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17796,6 +17867,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17885,6 +17957,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -17997,6 +18070,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18086,6 +18160,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18175,6 +18250,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18264,6 +18340,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18353,6 +18430,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18442,6 +18520,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18531,6 +18610,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18620,6 +18700,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18709,6 +18790,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18798,6 +18880,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18887,6 +18970,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -18976,6 +19060,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19065,6 +19150,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19154,6 +19240,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19243,6 +19330,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19343,6 +19431,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19432,6 +19521,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19521,6 +19611,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19610,6 +19701,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19710,6 +19802,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19799,6 +19892,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19888,6 +19982,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -19977,6 +20072,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -20066,6 +20162,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -20155,6 +20252,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -20244,6 +20342,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -20736,6 +20835,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -20919,6 +21019,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -21078,6 +21179,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -21167,6 +21269,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -21275,6 +21378,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -21364,6 +21468,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -21467,6 +21572,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -21853,6 +21959,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -22268,6 +22375,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -22553,6 +22661,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/lib/promise/detail/promise_variant.h - src/core/lib/promise/event_engine_wakeup_scheduler.h @@ -22659,6 +22768,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -22883,6 +22993,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -23145,6 +23256,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -23582,6 +23694,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h @@ -23671,6 +23784,7 @@ targets: - src/core/ext/transport/chaotic_good/frame_header.h - src/core/ext/transport/chaotic_good/message_chunker.h - src/core/ext/transport/chaotic_good/message_reassembly.h + - src/core/ext/transport/chaotic_good/pending_connection.h - src/core/ext/transport/chaotic_good/server/chaotic_good_server.h - src/core/ext/transport/chaotic_good/server_transport.h - src/core/ext/transport/chaotic_good_legacy/chaotic_good_transport.h diff --git a/fuzztest/core/transport/chaotic_good/config_test.cc b/fuzztest/core/transport/chaotic_good/config_test.cc index 98dfc2eb64153..9d08a1b6f0670 100644 --- a/fuzztest/core/transport/chaotic_good/config_test.cc +++ b/fuzztest/core/transport/chaotic_good/config_test.cc @@ -50,6 +50,15 @@ struct FuzzerChannelArgs { } }; +class FakeClientConnectionFactory + : public chaotic_good::ClientConnectionFactory { + public: + chaotic_good::PendingConnection Connect(absl::string_view id) override { + Crash("Connect not implemented"); + } + void Orphaned() override {} +}; + void ConfigTest(FuzzerChannelArgs client_args_input, FuzzerChannelArgs server_args_input) { // Create channel args @@ -62,14 +71,16 @@ void ConfigTest(FuzzerChannelArgs client_args_input, VLOG(2) << "server_config: " << server_config; // Perform handshake chaotic_good_frame::Settings client_settings; - client_config.PrepareOutgoingSettings(client_settings); + client_config.PrepareClientOutgoingSettings(client_settings); VLOG(2) << "client settings: " << client_settings.ShortDebugString(); - CHECK_OK(server_config.ReceiveIncomingSettings(client_settings)); + CHECK_OK(server_config.ReceiveClientIncomingSettings(client_settings)); VLOG(2) << "server_config': " << server_config; chaotic_good_frame::Settings server_settings; - server_config.PrepareOutgoingSettings(server_settings); + server_config.PrepareServerOutgoingSettings(server_settings); VLOG(2) << "server settings: " << server_settings.ShortDebugString(); - CHECK_OK(client_config.ReceiveIncomingSettings(server_settings)); + FakeClientConnectionFactory fake_factory; + CHECK_OK(client_config.ReceiveServerIncomingSettings(server_settings, + fake_factory)); VLOG(2) << "client_config': " << client_config; // Generate results const chaotic_good::ChaoticGoodTransport::Options client_options = diff --git a/src/core/BUILD b/src/core/BUILD index d58ddbd994294..2dd07ce65edaa 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -689,6 +689,11 @@ grpc_cc_library( grpc_cc_library( name = "map", + external_deps = [ + "absl/status", + "absl/status:statusor", + "absl/strings", + ], language = "c++", public_hdrs = ["lib/promise/map.h"], deps = [ @@ -8161,10 +8166,14 @@ grpc_cc_library( hdrs = [ "ext/transport/chaotic_good/config.h", ], + external_deps = [ + "absl/container:flat_hash_set", + ], deps = [ "channel_args", "chaotic_good_frame_cc_proto", "chaotic_good_message_chunker", + "chaotic_good_pending_connection", "chaotic_good_transport", "event_engine_extensions", ], @@ -8216,6 +8225,19 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "chaotic_good_pending_connection", + hdrs = [ + "ext/transport/chaotic_good/pending_connection.h", + ], + external_deps = ["absl/status:statusor"], + deps = [ + "dual_ref_counted", + "grpc_promise_endpoint", + "//:promise", + ], +) + grpc_cc_library( name = "chaotic_good_data_endpoints", srcs = [ @@ -8230,7 +8252,11 @@ grpc_cc_library( ], deps = [ "1999", + "chaotic_good_pending_connection", "event_engine_context", + "event_engine_extensions", + "event_engine_query_extensions", + "event_engine_tcp_socket_utils", "grpc_promise_endpoint", "loop", "seq", @@ -8253,6 +8279,7 @@ grpc_cc_library( "chaotic_good_data_endpoints", "chaotic_good_frame", "chaotic_good_frame_header", + "chaotic_good_pending_connection", "event_engine_context", "event_engine_tcp_socket_utils", "grpc_promise_endpoint", @@ -8295,6 +8322,7 @@ grpc_cc_library( "chaotic_good_frame", "chaotic_good_frame_header", "chaotic_good_message_reassembly", + "chaotic_good_pending_connection", "chaotic_good_transport", "context", "event_engine_context", @@ -8355,6 +8383,7 @@ grpc_cc_library( "chaotic_good_frame", "chaotic_good_frame_header", "chaotic_good_message_reassembly", + "chaotic_good_pending_connection", "chaotic_good_transport", "context", "default_event_engine", @@ -8879,6 +8908,7 @@ grpc_cc_library( "chaotic_good_frame", "chaotic_good_frame_header", "chaotic_good_legacy_server", + "chaotic_good_pending_connection", "chaotic_good_server_transport", "chaotic_good_transport", "closure", diff --git a/src/core/ext/transport/chaotic_good/chaotic_good_frame.proto b/src/core/ext/transport/chaotic_good/chaotic_good_frame.proto index 52be0fd40523a..bf5bb2577243c 100644 --- a/src/core/ext/transport/chaotic_good/chaotic_good_frame.proto +++ b/src/core/ext/transport/chaotic_good/chaotic_good_frame.proto @@ -17,6 +17,11 @@ syntax = "proto3"; package chaotic_good_frame; message Settings { + enum Features { + UNSPECIFIED = 0; + CHUNKING = 1; + } + // Connection id // - sent server->client on the control channel to specify the // data channel connection id, one for each desired connection @@ -31,6 +36,10 @@ message Settings { // Max chunk size allowed to be sent to a peer (0 or omitted: no limit) // Sent on the control channel, applies to all messages. uint32 max_chunk_size = 4; + // Set of feature flags supported by this endpoint. + // Sent client->server on the control channel to advertise its list + // And server->client to confirm the set that will be used. + repeated Features supported_features = 5; } message UnknownMetadata { diff --git a/src/core/ext/transport/chaotic_good/chaotic_good_transport.h b/src/core/ext/transport/chaotic_good/chaotic_good_transport.h index f7440d900968f..4136d9752ae20 100644 --- a/src/core/ext/transport/chaotic_good/chaotic_good_transport.h +++ b/src/core/ext/transport/chaotic_good/chaotic_good_transport.h @@ -95,13 +95,14 @@ class ChaoticGoodTransport : public RefCounted { ChaoticGoodTransport( PromiseEndpoint control_endpoint, - std::vector data_endpoints, + std::vector pending_data_endpoints, std::shared_ptr event_engine, - Options options) + Options options, bool enable_tracing) : event_engine_(std::move(event_engine)), control_endpoint_(std::move(control_endpoint), event_engine_.get()), - data_endpoints_(std::move(data_endpoints), event_engine_.get()), + data_endpoints_(std::move(pending_data_endpoints), event_engine_.get(), + enable_tracing), options_(options) {} auto WriteFrame(const FrameInterface& frame) { diff --git a/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc b/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc index 8bf7fe98ad04c..1eeb1f2f487e1 100644 --- a/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc +++ b/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc @@ -67,309 +67,220 @@ #include "src/core/util/ref_counted_ptr.h" #include "src/core/util/time.h" +using grpc_event_engine::experimental::ChannelArgsEndpointConfig; +using grpc_event_engine::experimental::EventEngine; + namespace grpc_core { namespace chaotic_good { -using grpc_event_engine::experimental::EventEngine; + namespace { -const int32_t kDataAlignmentBytes = 64; + const int32_t kTimeoutSecs = 120; -} // namespace -ChaoticGoodConnector::ChaoticGoodConnector( - std::shared_ptr event_engine) - : event_engine_(std::move(event_engine)), - handshake_mgr_(MakeRefCounted()) { - arena_->SetContext( - event_engine_.get()); -} +struct ConnectPromiseEndpointResult { + PromiseEndpoint endpoint; + ChannelArgs channel_args; +}; + +using ConnectResultLatch = std::shared_ptr< + InterActivityLatch>>; -ChaoticGoodConnector::~ChaoticGoodConnector() { - CHECK_EQ(notify_, nullptr); - if (connect_activity_ != nullptr) { - connect_activity_.reset(); +absl::StatusOr ResultFromHandshake( + absl::StatusOr result) { + if (!result.ok()) { + return result.status(); + } + HandshakerArgs* args = *result; + if (args->endpoint == nullptr) { + return absl::InternalError("Handshake complete with empty endpoint."); } + return ConnectPromiseEndpointResult{ + PromiseEndpoint(grpc_event_engine::experimental:: + grpc_take_wrapped_event_engine_endpoint( + (*result)->endpoint.release()), + std::move(args->read_buffer)), + args->args}; } -auto ChaoticGoodConnector::DataEndpointReadSettingsFrame( - RefCountedPtr self, uint32_t data_connection_index) { - return TrySeq( - self->data_endpoints_[data_connection_index].ReadSlice( - FrameHeader::kFrameHeaderSize), - [self, data_connection_index](Slice slice) mutable { - // Read setting frame; - // Parse frame header - auto frame_header_ = - FrameHeader::Parse(reinterpret_cast( - GRPC_SLICE_START_PTR(slice.c_slice()))); - return If( - frame_header_.ok(), - [data_connection_index, frame_header_ = *frame_header_, self]() { - auto frame_header_length = frame_header_.payload_length; - return TrySeq(self->data_endpoints_[data_connection_index].Read( - frame_header_length), - []() { return absl::OkStatus(); }); - }, - [status = frame_header_.status()]() { return status; }); +void OnConnect(absl::StatusOr> endpoint, + RefCountedPtr handshake_mgr, + const ChannelArgs& channel_args, Timestamp deadline, + ConnectResultLatch result_latch) { + if (!endpoint.ok()) { + auto endpoint_status = endpoint.status(); + auto error = GRPC_ERROR_CREATE_REFERENCING("connect endpoint failed", + &endpoint_status, 1); + result_latch->Set(error); + return; + } + auto* chaotic_good_ext = grpc_event_engine::experimental::QueryExtension< + grpc_event_engine::experimental::ChaoticGoodExtension>(endpoint->get()); + if (chaotic_good_ext != nullptr) { + chaotic_good_ext->EnableStatsCollection(/*is_control_channel=*/true); + chaotic_good_ext->UseMemoryQuota(ResourceQuota::Default()->memory_quota()); + } + handshake_mgr->DoHandshake( + OrphanablePtr( + grpc_event_engine_endpoint_create(std::move(*endpoint))), + channel_args, deadline, nullptr /* acceptor */, + [result_latch = std::move(result_latch), + handshake_mgr](absl::StatusOr result) { + result_latch->Set(ResultFromHandshake(std::move(result))); }); } -auto ChaoticGoodConnector::DataEndpointWriteSettingsFrame( - RefCountedPtr self, uint32_t data_connection_index) { - // Serialize setting frame. - SettingsFrame frame; - frame.body.set_data_channel(true); - frame.body.add_connection_id(self->connection_ids_[data_connection_index]); - frame.body.set_alignment(kDataAlignmentBytes); - SliceBuffer write_buffer; - frame.MakeHeader().Serialize( - write_buffer.AddTiny(FrameHeader::kFrameHeaderSize)); - frame.SerializePayload(write_buffer); - // ignore encoding errors: they will be logged separately already - return self->data_endpoints_[data_connection_index].Write( - std::move(write_buffer)); -} - -auto ChaoticGoodConnector::WaitForDataEndpointSetup( - RefCountedPtr self, uint32_t data_connection_index) { - // Data endpoint on_connect callback. - grpc_event_engine::experimental::EventEngine::OnConnectCallback - on_data_endpoint_connect = - [self, data_connection_index]( - absl::StatusOr> - endpoint) mutable { - ExecCtx exec_ctx; - if (!endpoint.ok() || self->handshake_mgr_ == nullptr) { - MutexLock lock(&self->mu_); - if (self->notify_ != nullptr) { - ExecCtx::Run(DEBUG_LOCATION, - std::exchange(self->notify_, nullptr), - GRPC_ERROR_CREATE("connect endpoint failed")); - } - return; - } - auto* chaotic_good_ext = - grpc_event_engine::experimental::QueryExtension< - grpc_event_engine::experimental::ChaoticGoodExtension>( - endpoint.value().get()); - if (chaotic_good_ext != nullptr) { - chaotic_good_ext->EnableStatsCollection( - /*is_control_channel=*/false); - } - self->data_endpoints_[data_connection_index] = - PromiseEndpoint(std::move(endpoint.value()), SliceBuffer()); - self->data_endpoint_ready_[data_connection_index]->Set(); - }; - self->event_engine_->Connect( - std::move(on_data_endpoint_connect), *self->resolved_addr_, - grpc_event_engine::experimental::ChannelArgsEndpointConfig( - self->args_.channel_args), +auto ConnectPromiseEndpoint(EventEngine::ResolvedAddress addr, + const ChannelArgs& channel_args, + Timestamp deadline) { + auto event_engine = channel_args.GetObjectRef(); + auto result_latch = std::make_shared< + InterActivityLatch>>(); + auto handshake_mgr = MakeRefCounted(); + auto connect_hdl = event_engine->Connect( + [result_latch, channel_args, handshake_mgr, + deadline](absl::StatusOr> + endpoint) mutable { + ExecCtx exec_ctx; + OnConnect(std::move(endpoint), std::move(handshake_mgr), channel_args, + deadline, std::move(result_latch)); + }, + addr, ChannelArgsEndpointConfig(channel_args), ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator( "data_endpoint_connection"), std::chrono::seconds(kTimeoutSecs)); - return TrySeq(Race( - TrySeq(self->data_endpoint_ready_[data_connection_index]->Wait(), - [self, data_connection_index]() mutable { - return TrySeq( - DataEndpointWriteSettingsFrame(self, data_connection_index), - DataEndpointReadSettingsFrame(self, data_connection_index), - []() -> absl::Status { return absl::OkStatus(); }); - }), - TrySeq(Sleep(Timestamp::Now() + Duration::Seconds(kTimeoutSecs)), - []() -> absl::Status { - return absl::DeadlineExceededError( - "Data endpoint connect deadline exceeded."); - }))); + return OnCancel( + [result_latch, await = result_latch->Wait()]() { return await(); }, + [handshake_mgr, connect_hdl, event_engine]() { + handshake_mgr->Shutdown(absl::CancelledError()); + event_engine->CancelConnect(connect_hdl); + }); } -auto ChaoticGoodConnector::ControlEndpointReadSettingsFrame( - RefCountedPtr self) { +struct ConnectChaoticGoodResult { + ConnectPromiseEndpointResult connect_result; + chaotic_good_frame::Settings server_settings; +}; + +class SettingsHandshake : public RefCounted { + public: + explicit SettingsHandshake(ConnectPromiseEndpointResult connect_result) + : connect_result_(std::move(connect_result)) {} + + auto Handshake(chaotic_good_frame::Settings client_settings) { + SettingsFrame frame; + frame.body = client_settings; + SliceBuffer send_buffer; + frame.MakeHeader().Serialize( + send_buffer.AddTiny(FrameHeader::kFrameHeaderSize)); + frame.SerializePayload(send_buffer); + return TrySeq( + connect_result_.endpoint.Write(std::move(send_buffer)), + [this]() { + return connect_result_.endpoint.ReadSlice( + FrameHeader::kFrameHeaderSize); + }, + [](Slice frame_header) { + return FrameHeader::Parse(frame_header.data()); + }, + [this](FrameHeader frame_header) { + server_header_ = frame_header; + return connect_result_.endpoint.Read(frame_header.payload_length); + }, + [this](SliceBuffer payload) { + return server_frame_.Deserialize(server_header_, std::move(payload)); + }, + [self = Ref()]() { + return ConnectChaoticGoodResult{std::move(self->connect_result_), + std::move(self->server_frame_.body)}; + }); + } + + private: + ConnectPromiseEndpointResult connect_result_; + FrameHeader server_header_; + SettingsFrame server_frame_; +}; + +auto ConnectChaoticGood(EventEngine::ResolvedAddress addr, + const ChannelArgs& channel_args, Timestamp deadline, + chaotic_good_frame::Settings client_settings) { return TrySeq( - self->control_endpoint_.ReadSlice(FrameHeader::kFrameHeaderSize), - [self](Slice slice) { - // Parse frame header - auto frame_header = FrameHeader::Parse(reinterpret_cast( - GRPC_SLICE_START_PTR(slice.c_slice()))); - return If( - frame_header.ok(), - TrySeq( - self->control_endpoint_.Read(frame_header->payload_length), - [frame_header = *frame_header, self](SliceBuffer buffer) { - // Deserialize setting frame. - SettingsFrame frame; - auto status = - frame.Deserialize(frame_header, std::move(buffer)); - if (!status.ok()) return status; - if (frame.body.connection_id().empty()) { - return absl::UnavailableError( - "no connection id in settings frame"); - } - for (const auto& connection_id : frame.body.connection_id()) { - self->connection_ids_.push_back(connection_id); - } - auto settings_status = - self->config_->ReceiveIncomingSettings(frame.body); - if (!settings_status.ok()) return settings_status; - self->data_endpoints_.resize(self->connection_ids_.size()); - for (size_t i = 0; i < self->connection_ids_.size(); ++i) { - self->data_endpoint_ready_.emplace_back( - std::make_unique>()); - } - return absl::OkStatus(); - }, - [self]() { - // TODO(ctiller): find a better way than this - std::vector connection_ids; - for (uint32_t i = 0; i < self->connection_ids_.size(); i++) { - connection_ids.push_back(i); - } - return AllOkIter( - connection_ids.begin(), connection_ids.end(), - [self](uint32_t connection_id) { - return WaitForDataEndpointSetup(self, connection_id); - }); - }), - [status = frame_header.status()]() { return status; }); + ConnectPromiseEndpoint(addr, channel_args, deadline), + [client_settings](ConnectPromiseEndpointResult connect_result) { + return MakeRefCounted(std::move(connect_result)) + ->Handshake(client_settings); }); } -auto ChaoticGoodConnector::ControlEndpointWriteSettingsFrame( - RefCountedPtr self) { - // Serialize setting frame. - SettingsFrame frame; - // frame.header set connectiion_type: control - frame.body.set_data_channel(false); - self->config_->PrepareOutgoingSettings(frame.body); - SliceBuffer write_buffer; - frame.MakeHeader().Serialize( - write_buffer.AddTiny(FrameHeader::kFrameHeaderSize)); - frame.SerializePayload(write_buffer); - // ignore encoding errors: they will be logged separately already - return self->control_endpoint_.Write(std::move(write_buffer)); -} +} // namespace void ChaoticGoodConnector::Connect(const Args& args, Result* result, grpc_closure* notify) { - { - MutexLock lock(&mu_); - result_ = result; - if (is_shutdown_) { - CHECK_EQ(notify_, nullptr); - ExecCtx::Run(DEBUG_LOCATION, notify, - GRPC_ERROR_CREATE("connector shutdown")); - return; - } - notify_ = notify; - } - args_ = args; - config_ = std::make_unique(args.channel_args); - resolved_addr_ = EventEngine::ResolvedAddress( - reinterpret_cast(args_.address->addr), - args_.address->len); - CHECK_NE(resolved_addr_.value().address(), nullptr); - grpc_event_engine::experimental::EventEngine::OnConnectCallback on_connect = - [self = RefAsSubclass()]( - absl::StatusOr> - endpoint) mutable { - ExecCtx exec_ctx; - if (!endpoint.ok() || self->handshake_mgr_ == nullptr) { - MutexLock lock(&self->mu_); - if (self->notify_ != nullptr) { - auto endpoint_status = endpoint.status(); - auto error = GRPC_ERROR_CREATE_REFERENCING( - "connect endpoint failed", &endpoint_status, 1); - ExecCtx::Run(DEBUG_LOCATION, std::exchange(self->notify_, nullptr), - error); - } - return; - } - auto* chaotic_good_ext = - grpc_event_engine::experimental::QueryExtension< - grpc_event_engine::experimental::ChaoticGoodExtension>( - endpoint->get()); - if (chaotic_good_ext != nullptr) { - chaotic_good_ext->EnableStatsCollection(/*is_control_channel=*/true); - chaotic_good_ext->UseMemoryQuota( - ResourceQuota::Default()->memory_quota()); - } - auto* p = self.get(); - p->handshake_mgr_->DoHandshake( - OrphanablePtr( - grpc_event_engine_endpoint_create(std::move(*endpoint))), - p->args_.channel_args, p->args_.deadline, nullptr /* acceptor */, - [self = std::move(self)](absl::StatusOr result) { - self->OnHandshakeDone(std::move(result)); + auto event_engine = args.channel_args.GetObjectRef(); + auto arena = SimpleArenaAllocator(0)->MakeArena(); + auto result_notifier = std::make_unique(args, result, notify); + arena->SetContext(event_engine.get()); + auto resolved_addr = EventEngine::ResolvedAddress( + reinterpret_cast(args.address->addr), args.address->len); + CHECK_NE(resolved_addr.address(), nullptr); + auto* result_notifier_ptr = result_notifier.get(); + auto activity = MakeActivity( + [result_notifier_ptr, resolved_addr]() mutable { + chaotic_good_frame::Settings client_settings; + client_settings.set_data_channel(false); + result_notifier_ptr->config.PrepareClientOutgoingSettings( + client_settings); + return TrySeq( + ConnectChaoticGood( + resolved_addr, result_notifier_ptr->args.channel_args, + Timestamp::Now() + Duration::FromSecondsAsDouble(kTimeoutSecs), + std::move(client_settings)), + [resolved_addr, + result_notifier_ptr](ConnectChaoticGoodResult result) { + auto connector = MakeRefCounted( + resolved_addr, result.connect_result.channel_args); + auto parse_status = + result_notifier_ptr->config.ReceiveServerIncomingSettings( + result.server_settings, *connector); + if (!parse_status.ok()) { + return parse_status; + } + auto transport = MakeOrphanable( + result.connect_result.channel_args, + std::move(result.connect_result.endpoint), + std::move(result_notifier_ptr->config), std::move(connector)); + result_notifier_ptr->result->transport = transport.release(); + result_notifier_ptr->result->channel_args = + result.connect_result.channel_args; + return absl::OkStatus(); }); - }; - event_engine_->Connect( - std::move(on_connect), *resolved_addr_, - grpc_event_engine::experimental::ChannelArgsEndpointConfig( - args_.channel_args), - ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator( - "data_endpoint_connection"), - std::chrono::seconds(kTimeoutSecs)); + }, + EventEngineWakeupScheduler(event_engine), + [result_notifier = std::move(result_notifier)](absl::Status status) { + result_notifier->Run(status); + }, + arena); + MutexLock lock(&mu_); + if (is_shutdown_) return; + connect_activity_ = std::move(activity); } -void ChaoticGoodConnector::OnHandshakeDone( - absl::StatusOr result) { - // Start receiving setting frames; - { - MutexLock lock(&mu_); - if (!result.ok() || is_shutdown_) { - absl::Status error = result.status(); - if (result.ok()) { - error = GRPC_ERROR_CREATE("connector shutdown"); - } - result_->Reset(); - ExecCtx::Run(DEBUG_LOCATION, std::exchange(notify_, nullptr), error); - return; - } - } - if ((*result)->endpoint != nullptr) { - CHECK(grpc_event_engine::experimental::grpc_is_event_engine_endpoint( - (*result)->endpoint.get())); - control_endpoint_ = - PromiseEndpoint(grpc_event_engine::experimental:: - grpc_take_wrapped_event_engine_endpoint( - (*result)->endpoint.release()), - SliceBuffer()); - auto activity = MakeActivity( - [self = RefAsSubclass()] { - return TrySeq(ControlEndpointWriteSettingsFrame(self), - ControlEndpointReadSettingsFrame(self), - []() { return absl::OkStatus(); }); - }, - EventEngineWakeupScheduler(event_engine_), - [self = RefAsSubclass()](absl::Status status) { - GRPC_TRACE_LOG(chaotic_good, INFO) - << "ChaoticGoodConnector::OnHandshakeDone: " << status; - MutexLock lock(&self->mu_); - if (status.ok()) { - self->result_->transport = new ChaoticGoodClientTransport( - std::move(self->control_endpoint_), - std::move(self->data_endpoints_), self->args_.channel_args, - self->event_engine_, *self->config_); - self->result_->channel_args = self->args_.channel_args; - ExecCtx::Run(DEBUG_LOCATION, std::exchange(self->notify_, nullptr), - status); - } else if (self->notify_ != nullptr) { - ExecCtx::Run(DEBUG_LOCATION, std::exchange(self->notify_, nullptr), - status); - } - }, - arena_); - MutexLock lock(&mu_); - if (!is_shutdown_) { - connect_activity_ = std::move(activity); - } - } else { - // Handshaking succeeded but there is no endpoint. - MutexLock lock(&mu_); - result_->Reset(); - auto error = GRPC_ERROR_CREATE("handshake complete with empty endpoint."); - ExecCtx::Run( - DEBUG_LOCATION, std::exchange(notify_, nullptr), - absl::InternalError("handshake complete with empty endpoint.")); - } +PendingConnection ChaoticGoodConnector::ConnectionCreator::Connect( + absl::string_view id) { + chaotic_good_frame::Settings settings; + settings.set_data_channel(true); + settings.add_connection_id(id); + return PendingConnection( + id, + Map(ConnectChaoticGood( + address_, args_, + Timestamp::Now() + Duration::FromSecondsAsDouble(kTimeoutSecs), + std::move(settings)), + [](absl::StatusOr result) + -> absl::StatusOr { + if (!result.ok()) return result.status(); + return std::move(result->connect_result.endpoint); + })); } namespace { @@ -378,10 +289,8 @@ class ChaoticGoodChannelFactory final : public ClientChannelFactory { public: RefCountedPtr CreateSubchannel( const grpc_resolved_address& address, const ChannelArgs& args) override { - return Subchannel::Create( - MakeOrphanable( - args.GetObjectRef()), - address, args); + return Subchannel::Create(MakeOrphanable(), address, + args); } }; diff --git a/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.h b/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.h index f6699d5aca3aa..2561ee57b9bf8 100644 --- a/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.h +++ b/src/core/ext/transport/chaotic_good/client/chaotic_good_connector.h @@ -46,55 +46,51 @@ namespace grpc_core { namespace chaotic_good { -class ChaoticGoodConnector : public SubchannelConnector { +class ChaoticGoodConnector final : public SubchannelConnector { public: - explicit ChaoticGoodConnector( - std::shared_ptr - event_engine); - ~ChaoticGoodConnector() override; void Connect(const Args& args, Result* result, grpc_closure* notify) override; - void Shutdown(grpc_error_handle error) override { + void Shutdown(grpc_error_handle) override { ActivityPtr connect_activity; MutexLock lock(&mu_); - if (is_shutdown_) return; is_shutdown_ = true; - if (handshake_mgr_ != nullptr) { - handshake_mgr_->Shutdown(error); - } connect_activity = std::move(connect_activity_); }; private: - static auto DataEndpointReadSettingsFrame( - RefCountedPtr self, uint32_t data_connection_index); - static auto DataEndpointWriteSettingsFrame( - RefCountedPtr self, uint32_t data_connection_index); - static auto ControlEndpointReadSettingsFrame( - RefCountedPtr self); - static auto ControlEndpointWriteSettingsFrame( - RefCountedPtr self); - static auto WaitForDataEndpointSetup(RefCountedPtr self, - uint32_t data_connection_index); - void OnHandshakeDone(absl::StatusOr result); + class ConnectionCreator final : public ClientConnectionFactory { + public: + ConnectionCreator( + grpc_event_engine::experimental::EventEngine::ResolvedAddress address, + const ChannelArgs& args) + : address_(address), args_(args) {} + PendingConnection Connect(absl::string_view id) override; + void Orphaned() override {}; + + private: + grpc_event_engine::experimental::EventEngine::ResolvedAddress address_; + ChannelArgs args_; + }; + + struct ResultNotifier { + ResultNotifier(const Args& args, Result* result, grpc_closure* notify) + : args(args), + config(args.channel_args), + result(result), + notify(notify) {} + + Args args; + Config config; + Result* result; + grpc_closure* notify; + + void Run(absl::Status status, DebugLocation location = {}) { + ExecCtx::Run(location, std::exchange(notify, nullptr), status); + } + }; - RefCountedPtr arena_ = SimpleArenaAllocator()->MakeArena(); Mutex mu_; - Args args_; - std::unique_ptr config_; - Result* result_ ABSL_GUARDED_BY(mu_); - grpc_closure* notify_ ABSL_GUARDED_BY(mu_) = nullptr; bool is_shutdown_ ABSL_GUARDED_BY(mu_) = false; - absl::StatusOr - resolved_addr_; - - PromiseEndpoint control_endpoint_; - std::vector data_endpoints_; - std::vector connection_ids_; ActivityPtr connect_activity_ ABSL_GUARDED_BY(mu_); - const std::shared_ptr - event_engine_; - RefCountedPtr handshake_mgr_; - std::vector>> data_endpoint_ready_; }; } // namespace chaotic_good } // namespace grpc_core diff --git a/src/core/ext/transport/chaotic_good/client_transport.cc b/src/core/ext/transport/chaotic_good/client_transport.cc index b1bffb22b6ce5..5d01f7dbfc13c 100644 --- a/src/core/ext/transport/chaotic_good/client_transport.cc +++ b/src/core/ext/transport/chaotic_good/client_transport.cc @@ -15,6 +15,7 @@ #include "src/core/ext/transport/chaotic_good/client_transport.h" #include +#include #include #include @@ -206,31 +207,18 @@ auto ChaoticGoodClientTransport::OnTransportActivityDone( } ChaoticGoodClientTransport::ChaoticGoodClientTransport( - PromiseEndpoint control_endpoint, - std::vector data_endpoints, const ChannelArgs& args, - std::shared_ptr event_engine, - const Config& config) + const ChannelArgs& args, PromiseEndpoint control_endpoint, Config config, + RefCountedPtr) : allocator_(args.GetObject() ->memory_quota() ->CreateMemoryAllocator("chaotic-good")), outgoing_frames_(4), message_chunker_(config.MakeMessageChunker()) { - CHECK(event_engine != nullptr); - // Set up TCP tracer if enabled. - if (config.tracing_enabled()) { - for (auto& ep : data_endpoints) { - auto* epte = grpc_event_engine::experimental::QueryExtension< - grpc_event_engine::experimental::TcpTraceExtension>( - ep.GetEventEngineEndpoint().get()); - if (epte != nullptr) { - epte->InitializeAndReturnTcpTracer(); - } - } - } - CHECK(event_engine != nullptr); + auto event_engine = + args.GetObjectRef(); auto transport = MakeRefCounted( - std::move(control_endpoint), std::move(data_endpoints), event_engine, - config.MakeTransportOptions()); + std::move(control_endpoint), config.TakePendingDataEndpoints(), + event_engine, config.MakeTransportOptions(), config.tracing_enabled()); auto party_arena = SimpleArenaAllocator(0)->MakeArena(); party_arena->SetContext( event_engine.get()); diff --git a/src/core/ext/transport/chaotic_good/client_transport.h b/src/core/ext/transport/chaotic_good/client_transport.h index 6b5be6f71390b..86fb6c395bc92 100644 --- a/src/core/ext/transport/chaotic_good/client_transport.h +++ b/src/core/ext/transport/chaotic_good/client_transport.h @@ -41,6 +41,7 @@ #include "src/core/ext/transport/chaotic_good/frame.h" #include "src/core/ext/transport/chaotic_good/frame_header.h" #include "src/core/ext/transport/chaotic_good/message_reassembly.h" +#include "src/core/ext/transport/chaotic_good/pending_connection.h" #include "src/core/lib/promise/activity.h" #include "src/core/lib/promise/context.h" #include "src/core/lib/promise/for_each.h" @@ -65,12 +66,9 @@ namespace chaotic_good { class ChaoticGoodClientTransport final : public ClientTransport { public: - ChaoticGoodClientTransport( - PromiseEndpoint control_endpoint, - std::vector data_endpoints, const ChannelArgs& args, - std::shared_ptr - event_engine, - const Config& config); + ChaoticGoodClientTransport(const ChannelArgs& args, + PromiseEndpoint control_endpoint, Config config, + RefCountedPtr connector); ~ChaoticGoodClientTransport() override; FilterStackTransport* filter_stack_transport() override { return nullptr; } diff --git a/src/core/ext/transport/chaotic_good/config.h b/src/core/ext/transport/chaotic_good/config.h index 964452567ce86..497ea1a15b2d1 100644 --- a/src/core/ext/transport/chaotic_good/config.h +++ b/src/core/ext/transport/chaotic_good/config.h @@ -15,9 +15,13 @@ #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_CONFIG_H #define GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_CONFIG_H +#include + +#include "absl/container/flat_hash_set.h" #include "src/core/ext/transport/chaotic_good/chaotic_good_frame.pb.h" #include "src/core/ext/transport/chaotic_good/chaotic_good_transport.h" #include "src/core/ext/transport/chaotic_good/message_chunker.h" +#include "src/core/ext/transport/chaotic_good/pending_connection.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/event_engine/extensions/tcp_trace.h" @@ -38,7 +42,11 @@ namespace chaotic_good { // server. class Config { public: - explicit Config(const ChannelArgs& channel_args) { + explicit Config( + const ChannelArgs& channel_args, + std::initializer_list + supported_features = {chaotic_good_frame::Settings::CHUNKING}) + : supported_features_(supported_features) { decode_alignment_ = std::max(1, channel_args.GetInt(GRPC_ARG_CHAOTIC_GOOD_ALIGNMENT) .value_or(decode_alignment_)); @@ -60,27 +68,78 @@ class Config { channel_args.GetBool(GRPC_ARG_TCP_TRACING_ENABLED).value_or(false); } - // Fill-in a settings frame to be sent with the results of the negotiation so - // far. For the client this will be whatever we got from channel args; for the - // server this is called *AFTER* ReceiveIncomingSettings and so contains the - // result of mixing the server channel args with the client settings frame. - void PrepareOutgoingSettings(chaotic_good_frame::Settings& settings) const { - settings.set_alignment(decode_alignment_); - settings.set_max_chunk_size(max_recv_chunk_size_); + Config(const Config&) = delete; + Config& operator=(const Config&) = delete; + Config(Config&&) = default; + Config& operator=(Config&&) = default; + + ~Config() = default; + + void ServerAddPendingDataEndpoint(PendingConnection endpoint) { + pending_data_endpoints_.emplace_back(std::move(endpoint)); } - // Receive a settings frame from our peer and integrate its settings with our - // own. - absl::Status ReceiveIncomingSettings( + std::vector TakePendingDataEndpoints() { + return std::move(pending_data_endpoints_); + } + + void PrepareServerOutgoingSettings(chaotic_good_frame::Settings& settings) { + for (const auto& pending_data_endpoint : pending_data_endpoints_) { + settings.add_connection_id(pending_data_endpoint.id()); + } + PrepareOutgoingSettings(settings); + } + + void PrepareClientOutgoingSettings(chaotic_good_frame::Settings& settings) { + CHECK_EQ(pending_data_endpoints_.size(), 0u); + PrepareOutgoingSettings(settings); + } + + absl::Status ReceiveServerIncomingSettings( + const chaotic_good_frame::Settings& settings, + ClientConnectionFactory& connector) { + absl::flat_hash_set + supported_features; + for (const auto feature : settings.supported_features()) { + if (chaotic_good_frame::Settings::Features_IsValid(feature)) { + const auto valid_feature = + static_cast(feature); + if (supported_features_.contains(valid_feature)) { + supported_features.insert(valid_feature); + } + } + } + supported_features_.swap(supported_features); + for (const auto& connection_id : settings.connection_id()) { + pending_data_endpoints_.emplace_back(connector.Connect(connection_id)); + } + return ReceiveIncomingSettings(settings); + } + + absl::Status ReceiveClientIncomingSettings( const chaotic_good_frame::Settings& settings) { - if (settings.alignment() != 0) encode_alignment_ = settings.alignment(); - max_send_chunk_size_ = - std::min(max_send_chunk_size_, settings.max_chunk_size()); - if (settings.max_chunk_size() == 0) { - max_recv_chunk_size_ = 0; - max_send_chunk_size_ = 0; + absl::flat_hash_set + supported_features; + for (const auto feature : settings.supported_features()) { + if (!chaotic_good_frame::Settings::Features_IsValid(feature)) { + return absl::InternalError(absl::StrCat( + "Unsupported feature present in chaotic-good handshake: ", + feature)); + } + const auto valid_feature = + static_cast(feature); + if (!supported_features_.contains(valid_feature)) { + return absl::InternalError(absl::StrCat( + "Unsupported feature present in chaotic-good handshake: ", + chaotic_good_frame::Settings::Features_Name(valid_feature))); + } + supported_features.insert(valid_feature); } - return absl::OkStatus(); + supported_features_.swap(supported_features); + if (settings.connection_id_size() != 0) { + return absl::InternalError("Client cannot specify connection ids"); + } + return ReceiveIncomingSettings(settings); } // Factory: make transport options from the settings derived here-in. @@ -125,13 +184,43 @@ class Config { sink.Append(config.ToString()); } + bool supports_chunking() const { + return supported_features_.contains(chaotic_good_frame::Settings::CHUNKING); + } + private: + // Fill-in a settings frame to be sent with the results of the negotiation so + // far. For the client this will be whatever we got from channel args; for the + // server this is called *AFTER* ReceiveIncomingSettings and so contains the + // result of mixing the server channel args with the client settings frame. + void PrepareOutgoingSettings(chaotic_good_frame::Settings& settings) const { + settings.set_alignment(decode_alignment_); + settings.set_max_chunk_size(max_recv_chunk_size_); + } + + // Receive a settings frame from our peer and integrate its settings with our + // own. + absl::Status ReceiveIncomingSettings( + const chaotic_good_frame::Settings& settings) { + if (settings.alignment() != 0) encode_alignment_ = settings.alignment(); + max_send_chunk_size_ = + std::min(max_send_chunk_size_, settings.max_chunk_size()); + if (!supports_chunking() || settings.max_chunk_size() == 0) { + max_recv_chunk_size_ = 0; + max_send_chunk_size_ = 0; + } + return absl::OkStatus(); + } + bool tracing_enabled_ = false; uint32_t encode_alignment_ = 64; uint32_t decode_alignment_ = 64; uint32_t max_send_chunk_size_ = 1024 * 1024; uint32_t max_recv_chunk_size_ = 1024 * 1024; uint32_t inline_payload_size_threshold_ = 8 * 1024; + std::vector pending_data_endpoints_; + absl::flat_hash_set + supported_features_; }; } // namespace chaotic_good diff --git a/src/core/ext/transport/chaotic_good/control_endpoint.cc b/src/core/ext/transport/chaotic_good/control_endpoint.cc index 0a6baad0a55aa..e2d4c1eecf422 100644 --- a/src/core/ext/transport/chaotic_good/control_endpoint.cc +++ b/src/core/ext/transport/chaotic_good/control_endpoint.cc @@ -40,26 +40,31 @@ ControlEndpoint::ControlEndpoint( PromiseEndpoint endpoint, grpc_event_engine::experimental::EventEngine* event_engine) : endpoint_(std::make_shared(std::move(endpoint))) { + auto arena = SimpleArenaAllocator(0)->MakeArena(); + arena->SetContext(event_engine); + write_party_ = Party::Make(arena); CHECK(event_engine != nullptr); write_party_->arena()->SetContext(event_engine); write_party_->Spawn( "flush-control", GRPC_LATENT_SEE_PROMISE( "FlushLoop", Loop([endpoint = endpoint_, buffer = buffer_]() { - return TrySeq( - // Pull one set of buffered writes - buffer->Pull(), - // And write them - [endpoint, buffer = buffer.get()](SliceBuffer flushing) { - GRPC_TRACE_LOG(chaotic_good, INFO) - << "CHAOTIC_GOOD: Flush " << flushing.Length() - << " bytes from " << buffer << " to " - << ResolvedAddressToString(endpoint->GetPeerAddress()) - .value_or("<>"); - return endpoint->Write(std::move(flushing)); - }, - // Then repeat - []() -> LoopCtl { return Continue{}; }); + return AddErrorPrefix( + "CONTROL_CHANNEL: ", + TrySeq( + // Pull one set of buffered writes + buffer->Pull(), + // And write them + [endpoint, buffer = buffer.get()](SliceBuffer flushing) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: Flush " << flushing.Length() + << " bytes from " << buffer << " to " + << ResolvedAddressToString(endpoint->GetPeerAddress()) + .value_or("<>"); + return endpoint->Write(std::move(flushing)); + }, + // Then repeat + []() -> LoopCtl { return Continue{}; })); })), [](absl::Status) {}); } diff --git a/src/core/ext/transport/chaotic_good/control_endpoint.h b/src/core/ext/transport/chaotic_good/control_endpoint.h index b139724b24037..d35eeccba7228 100644 --- a/src/core/ext/transport/chaotic_good/control_endpoint.h +++ b/src/core/ext/transport/chaotic_good/control_endpoint.h @@ -81,15 +81,18 @@ class ControlEndpoint { auto Write(SliceBuffer&& bytes) { return buffer_->Queue(std::move(bytes)); } // Read operations are simply passthroughs to the underlying promise endpoint. - auto ReadSlice(size_t length) { return endpoint_->ReadSlice(length); } - auto Read(size_t length) { return endpoint_->Read(length); } + auto ReadSlice(size_t length) { + return AddErrorPrefix("CONTROL_CHANNEL: ", endpoint_->ReadSlice(length)); + } + auto Read(size_t length) { + return AddErrorPrefix("CONTROL_CHANNEL: ", endpoint_->Read(length)); + } auto GetPeerAddress() const { return endpoint_->GetPeerAddress(); } auto GetLocalAddress() const { return endpoint_->GetLocalAddress(); } private: std::shared_ptr endpoint_; - RefCountedPtr write_party_ = - Party::Make(SimpleArenaAllocator(0)->MakeArena()); + RefCountedPtr write_party_; RefCountedPtr buffer_ = MakeRefCounted(); }; diff --git a/src/core/ext/transport/chaotic_good/data_endpoints.cc b/src/core/ext/transport/chaotic_good/data_endpoints.cc index 023bd81a70e17..37932cb0afa54 100644 --- a/src/core/ext/transport/chaotic_good/data_endpoints.cc +++ b/src/core/ext/transport/chaotic_good/data_endpoints.cc @@ -14,11 +14,17 @@ #include "src/core/ext/transport/chaotic_good/data_endpoints.h" +#include #include +#include #include "absl/cleanup/cleanup.h" #include "absl/strings/escaping.h" +#include "src/core/ext/transport/chaotic_good/pending_connection.h" #include "src/core/lib/event_engine/event_engine_context.h" +#include "src/core/lib/event_engine/extensions/tcp_trace.h" +#include "src/core/lib/event_engine/query_extensions.h" +#include "src/core/lib/event_engine/tcp_socket_utils.h" #include "src/core/lib/promise/loop.h" #include "src/core/lib/promise/seq.h" #include "src/core/lib/promise/try_seq.h" @@ -43,20 +49,17 @@ bool OutputBuffer::Accept(SliceBuffer& buffer) { /////////////////////////////////////////////////////////////////////////////// // OutputBuffers -OutputBuffers::OutputBuffers(uint32_t num_connections) - : buffers_(num_connections) {} - Poll OutputBuffers::PollWrite(SliceBuffer& output_buffer) { Waker waker; auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); }); const auto length = output_buffer.Length(); MutexLock lock(&mu_); for (size_t i = 0; i < buffers_.size(); ++i) { - if (buffers_[i].Accept(output_buffer)) { + if (buffers_[i].has_value() && buffers_[i]->Accept(output_buffer)) { GRPC_TRACE_LOG(chaotic_good, INFO) << "CHAOTIC_GOOD: Queue " << length << " data onto endpoint " << i << " queue " << this; - waker = buffers_[i].TakeWaker(); + waker = buffers_[i]->TakeWaker(); return i; } } @@ -72,19 +75,32 @@ Poll OutputBuffers::PollNext(uint32_t connection_id) { auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); }); MutexLock lock(&mu_); auto& buffer = buffers_[connection_id]; - if (buffer.HavePending()) { + CHECK(buffer.has_value()); + if (buffer->HavePending()) { waker = std::move(write_waker_); - return buffer.TakePending(); + return buffer->TakePending(); } - buffer.SetWaker(); + buffer->SetWaker(); return Pending{}; } +void OutputBuffers::AddEndpoint(uint32_t connection_id) { + Waker waker; + auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); }); + MutexLock lock(&mu_); + if (buffers_.size() < connection_id + 1) { + buffers_.resize(connection_id + 1); + } + CHECK(!buffers_[connection_id].has_value()) << GRPC_DUMP_ARGS(connection_id); + buffers_[connection_id].emplace(); + waker = std::move(write_waker_); + ready_endpoints_.fetch_add(1, std::memory_order_relaxed); +} + /////////////////////////////////////////////////////////////////////////////// // InputQueues -InputQueues::InputQueues(uint32_t num_connections) - : read_requests_(num_connections), read_request_waker_(num_connections) {} +InputQueues::InputQueues() : read_requests_(), read_request_waker_() {} absl::StatusOr InputQueues::CreateTicket(uint32_t connection_id, size_t length) { @@ -154,80 +170,130 @@ void InputQueues::CancelTicket(uint64_t ticket) { outstanding_reads_.erase(ticket); } +void InputQueues::AddEndpoint(uint32_t connection_id) { + MutexLock lock(&mu_); + CHECK_EQ(read_requests_.size(), read_request_waker_.size()); + if (read_requests_.size() <= connection_id) { + read_requests_.resize(connection_id + 1); + read_request_waker_.resize(connection_id + 1); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// Endpoint + +auto Endpoint::WriteLoop(uint32_t id, + RefCountedPtr output_buffers, + std::shared_ptr endpoint) { + output_buffers->AddEndpoint(id); + return Loop([id, endpoint = std::move(endpoint), + output_buffers = std::move(output_buffers)]() { + return TrySeq( + output_buffers->Next(id), + [endpoint, id](SliceBuffer buffer) { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: Write " << buffer.Length() + << "b to data endpoint #" << id; + return endpoint->Write(std::move(buffer)); + }, + []() -> LoopCtl { return Continue{}; }); + }); +} + +auto Endpoint::ReadLoop(uint32_t id, RefCountedPtr input_queues, + std::shared_ptr endpoint) { + return Loop([id, endpoint, input_queues = std::move(input_queues)]() { + return TrySeq( + input_queues->Next(id), + [endpoint, input_queues]( + std::vector + requests) { + return TrySeqContainer( + std::move(requests), Empty{}, + [endpoint, input_queues]( + data_endpoints_detail::InputQueues::ReadRequest read_request, + Empty) { + return Seq(endpoint->Read(read_request.length), + [ticket = read_request.ticket, + + input_queues](absl::StatusOr buffer) { + input_queues->CompleteRead(ticket, + std::move(buffer)); + return Empty{}; + }); + }); + }, + []() -> LoopCtl { return Continue{}; }); + }); +} + +Endpoint::Endpoint(uint32_t id, RefCountedPtr output_buffers, + RefCountedPtr input_queues, + PendingConnection pending_connection, bool enable_tracing, + grpc_event_engine::experimental::EventEngine* event_engine) { + input_queues->AddEndpoint(id); + auto arena = SimpleArenaAllocator(0)->MakeArena(); + arena->SetContext(event_engine); + party_ = Party::Make(arena); + party_->Spawn( + "write", + [id, enable_tracing, output_buffers = std::move(output_buffers), + input_queues = std::move(input_queues), + pending_connection = std::move(pending_connection), + arena = std::move(arena)]() mutable { + return TrySeq( + pending_connection.Await(), + [id, enable_tracing, output_buffers = std::move(output_buffers), + input_queues = std::move(input_queues), + arena = std::move(arena)](PromiseEndpoint ep) mutable { + GRPC_TRACE_LOG(chaotic_good, INFO) + << "CHAOTIC_GOOD: data endpoint " << id << " to " + << grpc_event_engine::experimental::ResolvedAddressToString( + ep.GetPeerAddress()) + .value_or("<>") + << " ready"; + auto endpoint = std::make_shared(std::move(ep)); + // Enable RxMemoryAlignment and RPC receive coalescing after the + // transport setup is complete. At this point all the settings + // frames should have been read. + endpoint->EnforceRxMemoryAlignmentAndCoalescing(); + if (enable_tracing) { + auto* epte = grpc_event_engine::experimental::QueryExtension< + grpc_event_engine::experimental::TcpTraceExtension>( + endpoint->GetEventEngineEndpoint().get()); + if (epte != nullptr) epte->InitializeAndReturnTcpTracer(); + } + auto read_party = Party::Make(std::move(arena)); + read_party->Spawn( + "read", + [id, input_queues = std::move(input_queues), endpoint]() { + return ReadLoop(id, input_queues, endpoint); + }, + [](absl::Status) {}); + return Map( + WriteLoop(id, std::move(output_buffers), std::move(endpoint)), + [read_party](auto x) { return x; }); + }); + }, + [](absl::Status) {}); +} + } // namespace data_endpoints_detail /////////////////////////////////////////////////////////////////////////////// // DataEndpoints DataEndpoints::DataEndpoints( - std::vector endpoints_vec, - grpc_event_engine::experimental::EventEngine* event_engine) - : output_buffers_(MakeRefCounted( - endpoints_vec.size())), - input_queues_(MakeRefCounted( - endpoints_vec.size())) { + std::vector endpoints_vec, + grpc_event_engine::experimental::EventEngine* event_engine, + bool enable_tracing) + : output_buffers_(MakeRefCounted()), + input_queues_(MakeRefCounted()) { CHECK(event_engine != nullptr); - for (auto& endpoint : endpoints_vec) { - // Enable RxMemoryAlignment and RPC receive coalescing after the transport - // setup is complete. At this point all the settings frames should have - // been read. - endpoint.EnforceRxMemoryAlignmentAndCoalescing(); - } - auto endpoints = MakeRefCounted(); - endpoints->endpoints = std::move(endpoints_vec); - parties_.reserve(2 * endpoints->endpoints.size()); - auto arena = SimpleArenaAllocator(0)->MakeArena(); - arena->SetContext(event_engine); - for (size_t i = 0; i < endpoints->endpoints.size(); ++i) { - auto write_party = Party::Make(arena); - auto read_party = Party::Make(arena); - write_party->Spawn( - "flush-data", - [i, endpoints, output_buffers = output_buffers_]() { - return Loop([i, endpoints, output_buffers]() { - return TrySeq( - output_buffers->Next(i), - [endpoints = endpoints.get(), i](SliceBuffer buffer) { - GRPC_TRACE_LOG(chaotic_good, INFO) - << "CHAOTIC_GOOD: Write " << buffer.Length() - << "b to data endpoint #" << i; - return endpoints->endpoints[i].Write(std::move(buffer)); - }, - []() -> LoopCtl { return Continue{}; }); - }); - }, - [](absl::Status) {}); - read_party->Spawn( - "read-data", - [i, endpoints, input_queues = input_queues_]() { - return Loop([i, endpoints, input_queues]() { - return TrySeq( - input_queues->Next(i), - [endpoints, i, input_queues]( - std::vector - requests) { - return TrySeqContainer( - std::move(requests), Empty{}, - [endpoints, i, input_queues]( - data_endpoints_detail::InputQueues::ReadRequest - read_request, - Empty) { - return Seq( - endpoints->endpoints[i].Read(read_request.length), - [ticket = read_request.ticket, - - input_queues](absl::StatusOr buffer) { - input_queues->CompleteRead(ticket, - std::move(buffer)); - }); - }); - }, - []() -> LoopCtl { return Continue{}; }); - }); - }, - [](absl::Status) {}); - parties_.emplace_back(std::move(write_party)); - parties_.emplace_back(std::move(read_party)); + for (size_t i = 0; i < endpoints_vec.size(); ++i) { + endpoints_.emplace_back(i, output_buffers_, input_queues_, + std::move(endpoints_vec[i]), enable_tracing, + event_engine); } } diff --git a/src/core/ext/transport/chaotic_good/data_endpoints.h b/src/core/ext/transport/chaotic_good/data_endpoints.h index 9837c00c3321a..991ad7486c419 100644 --- a/src/core/ext/transport/chaotic_good/data_endpoints.h +++ b/src/core/ext/transport/chaotic_good/data_endpoints.h @@ -15,8 +15,10 @@ #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_DATA_ENDPOINTS_H #define GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_DATA_ENDPOINTS_H +#include #include +#include "src/core/ext/transport/chaotic_good/pending_connection.h" #include "src/core/lib/promise/party.h" #include "src/core/lib/promise/promise.h" #include "src/core/lib/slice/slice_buffer.h" @@ -26,9 +28,6 @@ namespace grpc_core { namespace chaotic_good { namespace data_endpoints_detail { -struct Endpoints : public RefCounted { - std::vector endpoints; -}; // Buffered writes for one data endpoint class OutputBuffer { @@ -50,8 +49,6 @@ class OutputBuffer { // The set of output buffers for all connected data endpoints class OutputBuffers : public RefCounted { public: - explicit OutputBuffers(uint32_t num_connections); - auto Write(SliceBuffer output_buffer) { return [output_buffer = std::move(output_buffer), this]() mutable { return PollWrite(output_buffer); @@ -62,13 +59,20 @@ class OutputBuffers : public RefCounted { return [this, connection_id]() { return PollNext(connection_id); }; } + void AddEndpoint(uint32_t connection_id); + + uint32_t ReadyEndpoints() const { + return ready_endpoints_.load(std::memory_order_relaxed); + } + private: Poll PollWrite(SliceBuffer& output_buffer); Poll PollNext(uint32_t connection_id); Mutex mu_; - std::vector buffers_ ABSL_GUARDED_BY(mu_); + std::vector> buffers_ ABSL_GUARDED_BY(mu_); Waker write_waker_ ABSL_GUARDED_BY(mu_); + std::atomic ready_endpoints_{0}; }; class InputQueues : public RefCounted { @@ -132,7 +136,7 @@ class InputQueues : public RefCounted { } }; - explicit InputQueues(uint32_t num_connections); + explicit InputQueues(); ReadTicket Read(uint32_t connection_id, size_t length) { return ReadTicket(CreateTicket(connection_id, length), Ref()); @@ -146,6 +150,8 @@ class InputQueues : public RefCounted { void CancelTicket(uint64_t ticket); + void AddEndpoint(uint32_t connection_id); + private: using ReadState = absl::variant, Waker>; @@ -160,6 +166,24 @@ class InputQueues : public RefCounted { absl::flat_hash_map outstanding_reads_ ABSL_GUARDED_BY(mu_); }; + +class Endpoint final { + public: + Endpoint(uint32_t id, RefCountedPtr output_buffers, + RefCountedPtr input_queues, + PendingConnection pending_connection, bool enable_tracing, + grpc_event_engine::experimental::EventEngine* event_engine); + + private: + static auto WriteLoop(uint32_t id, + RefCountedPtr output_buffers, + std::shared_ptr endpoint); + static auto ReadLoop(uint32_t id, RefCountedPtr input_queues, + std::shared_ptr endpoint); + + RefCountedPtr party_; +}; + } // namespace data_endpoints_detail // Collection of data connections. @@ -168,8 +192,9 @@ class DataEndpoints { using ReadTicket = data_endpoints_detail::InputQueues::ReadTicket; explicit DataEndpoints( - std::vector endpoints, - grpc_event_engine::experimental::EventEngine* event_engine); + std::vector endpoints, + grpc_event_engine::experimental::EventEngine* event_engine, + bool enable_tracing); // Try to queue output_buffer against a data endpoint. // Returns a promise that resolves to the data endpoint connection id @@ -185,12 +210,13 @@ class DataEndpoints { return input_queues_->Read(connection_id, length); } - bool empty() const { return parties_.empty(); } + bool empty() const { return output_buffers_->ReadyEndpoints() == 0; } private: RefCountedPtr output_buffers_; RefCountedPtr input_queues_; - std::vector> parties_; + Mutex mu_; + std::vector endpoints_ ABSL_GUARDED_BY(mu_); }; } // namespace chaotic_good diff --git a/src/core/ext/transport/chaotic_good/pending_connection.h b/src/core/ext/transport/chaotic_good/pending_connection.h new file mode 100644 index 0000000000000..90c0f7df802f6 --- /dev/null +++ b/src/core/ext/transport/chaotic_good/pending_connection.h @@ -0,0 +1,74 @@ +// 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_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_PENDING_CONNECTION_H +#define GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_PENDING_CONNECTION_H + +#include + +#include "absl/status/statusor.h" +#include "src/core/lib/promise/promise.h" +#include "src/core/lib/transport/promise_endpoint.h" +#include "src/core/util/dual_ref_counted.h" + +namespace grpc_core { +namespace chaotic_good { + +// Essentially this is the promise of one endpoint in the future, with the +// addition of an id used for handshaking so that can be communicated around as +// necessary. +class PendingConnection { + public: + explicit PendingConnection(absl::string_view id, + Promise> connector) + : id_(id), connector_(std::move(connector)) {} + + PendingConnection(const PendingConnection&) = delete; + PendingConnection& operator=(const PendingConnection&) = delete; + PendingConnection(PendingConnection&&) = default; + PendingConnection& operator=(PendingConnection&&) = default; + + absl::string_view id() const { return id_; } + auto Await() { return std::move(connector_); } + + private: + std::string id_; + Promise> connector_; +}; + +class ServerConnectionFactory : public DualRefCounted { + public: + using DualRefCounted::DualRefCounted; + virtual PendingConnection RequestDataConnection() = 0; +}; + +class ClientConnectionFactory : public DualRefCounted { + public: + using DualRefCounted::DualRefCounted; + virtual PendingConnection Connect(absl::string_view id) = 0; +}; + +// Helper: convert an already existing endpoint into a pending connection +inline PendingConnection ImmediateConnection(absl::string_view id, + PromiseEndpoint endpoint) { + return PendingConnection( + id, + [endpoint = std::move(endpoint)]() mutable + -> absl::StatusOr { return std::move(endpoint); }); +} + +} // namespace chaotic_good +} // namespace grpc_core + +#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_PENDING_CONNECTION_H diff --git a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc index 4f8c6c73793af..4c2a14cf75144 100644 --- a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc +++ b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc @@ -86,7 +86,11 @@ ChaoticGoodServerListener::ChaoticGoodServerListener( args_(args), event_engine_( args.GetObjectRef()), - connection_id_generator_(std::move(connection_id_generator)) {} + data_connection_listener_(MakeRefCounted( + std::move(connection_id_generator), + args.GetDurationFromIntMillis(GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS) + .value_or(kConnectionDeadline), + event_engine_)) {} ChaoticGoodServerListener::~ChaoticGoodServerListener() { if (on_destroy_done_ != nullptr) { @@ -149,7 +153,7 @@ absl::Status ChaoticGoodServerListener::StartListening() { ChaoticGoodServerListener::ActiveConnection::ActiveConnection( RefCountedPtr listener, std::unique_ptr endpoint) - : listener_(std::move(listener)), config_(args()) { + : listener_(std::move(listener)) { arena_->SetContext( listener_->event_engine_.get()); handshaking_state_ = MakeRefCounted(Ref()); @@ -176,20 +180,79 @@ void ChaoticGoodServerListener::ActiveConnection::Orphan() { Unref(); } -void ChaoticGoodServerListener::ActiveConnection::NewConnectionIDs( - size_t count) { - MutexLock lock(&listener_->mu_); - for (size_t i = 0; i < count; i++) { - std::string connection_id; - while (true) { - connection_id = listener_->connection_id_generator_(); - if (!listener_->connectivity_map_.contains(connection_id)) { - break; - } - } - listener_->connectivity_map_.emplace( - connection_id, std::make_shared>()); - connection_ids_.emplace_back(std::move(connection_id)); +ChaoticGoodServerListener::DataConnectionListener::DataConnectionListener( + absl::AnyInvocable connection_id_generator, + Duration connect_timeout, + std::shared_ptr event_engine) + : connection_id_generator_(std::move(connection_id_generator)), + event_engine_(std::move(event_engine)), + connect_timeout_(connect_timeout) {} + +PendingConnection +ChaoticGoodServerListener::DataConnectionListener::RequestDataConnection() { + MutexLock lock(&mu_); + std::string connection_id; + while (true) { + connection_id = connection_id_generator_(); + if (!pending_connections_.contains(connection_id)) break; + } + if (shutdown_) { + return PendingConnection(connection_id, []() { + return absl::UnavailableError("Server shutdown"); + }); + } + auto latch = std::make_shared(); + auto timeout_task = event_engine_->RunAfter( + connect_timeout_, + [connection_id, self = WeakRefAsSubclass()]() { + self->ConnectionTimeout(connection_id); + }); + pending_connections_.emplace(connection_id, + PendingConnectionInfo{latch, timeout_task}); + return PendingConnection(connection_id, + Map(latch->Wait(), [latch](auto x) { return x; })); +} + +ChaoticGoodServerListener::DataConnectionListener::PromiseEndpointLatchPtr +ChaoticGoodServerListener::DataConnectionListener::Extract( + absl::string_view id) { + MutexLock lock(&mu_); + auto ex = pending_connections_.extract(id); + if (!ex.empty()) { + event_engine_->Cancel(ex.mapped().timeout); + return std::move(ex.mapped().latch); + } + return nullptr; +} + +void ChaoticGoodServerListener::DataConnectionListener::ConnectionTimeout( + absl::string_view id) { + auto latch = Extract(id); + if (latch != nullptr) { + latch->Set(absl::DeadlineExceededError("Connection timeout")); + } +} + +void ChaoticGoodServerListener::DataConnectionListener::FinishDataConnection( + absl::string_view id, PromiseEndpoint endpoint) { + auto latch = Extract(id); + if (latch != nullptr) { + latch->Set(std::move(endpoint)); + } +} + +void ChaoticGoodServerListener::DataConnectionListener::Orphaned() { + absl::flat_hash_map pending_connections; + { + MutexLock lock(&mu_); + CHECK(!shutdown_); + pending_connections = std::move(pending_connections_); + pending_connections_.clear(); + shutdown_ = true; + } + for (const auto& conn : pending_connections) { + event_engine_->Cancel(conn.second.timeout); + conn.second.latch->Set(absl::UnavailableError("Server shutdown")); } } @@ -215,8 +278,10 @@ void ChaoticGoodServerListener::ActiveConnection::HandshakingState::Start( handshake_mgr_->DoHandshake( OrphanablePtr( grpc_event_engine_endpoint_create(std::move(endpoint))), - connection_->args(), GetConnectionDeadline(), nullptr, - [self = Ref()](absl::StatusOr result) { + connection_->args(), + Timestamp::Now() + connection_->listener_->data_connection_listener_ + ->connection_timeout(), + nullptr, [self = Ref()](absl::StatusOr result) { self->OnHandshakeDone(std::move(result)); }); } @@ -257,21 +322,25 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState:: " connection ids in data endpoint " "settings frame (expect one)")); } - if (frame.body.alignment() == 0) { - return absl::UnavailableError( - "no alignment in data endpoint settings frame"); - } - // Get connection-id and data-alignment for data endpoint. - self->connection_->connection_ids_.clear(); - self->connection_->connection_ids_.push_back( + self->data_.emplace( frame.body.connection_id()[0]); - self->connection_->data_alignment_ = - frame.body.alignment(); } else { + Config config{self->connection_->args()}; auto settings_status = - self->connection_->config_.ReceiveIncomingSettings( - frame.body); + config.ReceiveClientIncomingSettings(frame.body); if (!settings_status.ok()) return settings_status; + const int num_data_connections = + self->connection_->listener_->args() + .GetInt(GRPC_ARG_CHAOTIC_GOOD_DATA_CONNECTIONS) + .value_or(1); + auto& data_connection_listener = + *self->connection_->listener_ + ->data_connection_listener_; + for (int i = 0; i < num_data_connections; i++) { + config.ServerAddPendingDataEndpoint( + data_connection_listener.RequestDataConnection()); + } + self->data_.emplace(std::move(config)); } return !frame.body.data_channel(); }); @@ -284,80 +353,26 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState:: }); } -auto ChaoticGoodServerListener::ActiveConnection::HandshakingState:: - WaitForDataEndpointSetup(RefCountedPtr self) { - return Race( - TrySeq( - []() { - // TODO(ladynana): find a way to resolve SeqState to actual - // value. - return absl::OkStatus(); - }, - [self]() { - MutexLock lock(&self->connection_->listener_->mu_); - return JoinIter( - self->connection_->connection_ids_.begin(), - self->connection_->connection_ids_.end(), - [self](const std::string& connection_id) { - self->connection_->listener_->mu_.AssertHeld(); - auto latch = self->connection_->listener_->connectivity_map_ - .find(connection_id) - ->second; - return latch->Wait(); - }); - }, - [self](std::vector ret) -> absl::Status { - MutexLock lock(&self->connection_->listener_->mu_); - GRPC_TRACE_LOG(chaotic_good, INFO) - << self->connection_.get() - << " Data endpoint setup done: shutdown=" - << (self->connection_->listener_->shutdown_ ? "true" : "false"); - if (self->connection_->listener_->shutdown_) { - return absl::UnavailableError("Server shutdown"); - } - return self->connection_->listener_->server_->SetupTransport( - new ChaoticGoodServerTransport( - self->connection_->args(), - std::move(self->connection_->endpoint_), std::move(ret), - self->connection_->listener_->event_engine_, - self->connection_->config_), - nullptr, self->connection_->args(), nullptr); - }), - // Set timeout for waiting data endpoint connect. - TrySeq( - // []() { - Sleep(Timestamp::Now() + kConnectionDeadline), - [self]() mutable -> absl::Status { - MutexLock lock(&self->connection_->listener_->mu_); - // Delete connection ids from map when timeout; - for (const std::string& connection_id : - self->connection_->connection_ids_) { - self->connection_->listener_->connectivity_map_.erase( - connection_id); - } - return absl::DeadlineExceededError("Deadline exceeded."); - })); -} - auto ChaoticGoodServerListener::ActiveConnection::HandshakingState:: ControlEndpointWriteSettingsFrame(RefCountedPtr self) { - self->connection_->NewConnectionIDs( - self->connection_->listener_->args() - .GetInt(GRPC_ARG_CHAOTIC_GOOD_DATA_CONNECTIONS) - .value_or(1)); SettingsFrame frame; frame.body.set_data_channel(false); - for (const auto& connection_id : self->connection_->connection_ids_) { - frame.body.add_connection_id(connection_id); - } - self->connection_->config_.PrepareOutgoingSettings(frame.body); + absl::get(self->data_) + .config.PrepareServerOutgoingSettings(frame.body); SliceBuffer write_buffer; frame.MakeHeader().Serialize( write_buffer.AddTiny(FrameHeader::kFrameHeaderSize)); frame.SerializePayload(write_buffer); - // ignore encoding errors: they will be logged separately already - return TrySeq(self->connection_->endpoint_.Write(std::move(write_buffer)), - WaitForDataEndpointSetup(self)); + return TrySeq( + self->connection_->endpoint_.Write(std::move(write_buffer)), [self]() { + return self->connection_->listener_->server_->SetupTransport( + new ChaoticGoodServerTransport( + self->connection_->args(), + std::move(self->connection_->endpoint_), + std::move(absl::get(self->data_).config), + self->connection_->listener_->data_connection_listener_), + nullptr, self->connection_->args(), nullptr); + }); } auto ChaoticGoodServerListener::ActiveConnection::HandshakingState:: @@ -365,28 +380,19 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState:: // Send data endpoint setting frame SettingsFrame frame; frame.body.set_data_channel(true); - frame.body.set_alignment(self->connection_->data_alignment_); SliceBuffer write_buffer; frame.MakeHeader().Serialize( write_buffer.AddTiny(FrameHeader::kFrameHeaderSize)); frame.SerializePayload(write_buffer); // ignore encoding errors: they will be logged separately already - return TrySeq( - self->connection_->endpoint_.Write(std::move(write_buffer)), - [self]() mutable { - MutexLock lock(&self->connection_->listener_->mu_); - // Set endpoint to latch - CHECK_EQ(self->connection_->connection_ids_.size(), 1ull); - auto it = self->connection_->listener_->connectivity_map_.find( - self->connection_->connection_ids_[0]); - if (it == self->connection_->listener_->connectivity_map_.end()) { - return absl::InternalError(absl::StrCat( - "Connection not in map: ", - absl::CEscape(self->connection_->connection_ids_[0]))); - } - it->second->Set(std::move(self->connection_->endpoint_)); - return absl::OkStatus(); - }); + return TrySeq(self->connection_->endpoint_.Write(std::move(write_buffer)), + [self]() mutable { + self->connection_->listener_->data_connection_listener_ + ->FinishDataConnection( + absl::get(self->data_).connection_id, + std::move(self->connection_->endpoint_)); + return absl::OkStatus(); + }); } auto ChaoticGoodServerListener::ActiveConnection::HandshakingState:: @@ -456,14 +462,6 @@ void ChaoticGoodServerListener::ActiveConnection::HandshakingState:: connection_->receive_settings_activity_ = std::move(activity); } -Timestamp ChaoticGoodServerListener::ActiveConnection::HandshakingState:: - GetConnectionDeadline() { - return Timestamp::Now() + - connection_->args() - .GetDurationFromIntMillis(GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS) - .value_or(kConnectionDeadline); -} - void ChaoticGoodServerListener::Orphan() { GRPC_TRACE_LOG(chaotic_good, INFO) << "ChaoticGoodServerListener::Orphan()"; { @@ -527,7 +525,7 @@ int grpc_server_add_chaotic_good_port(grpc_server* server, const char* addr) { for (const auto& ee_addr : results.value()) { auto listener = grpc_core::MakeOrphanable< grpc_core::chaotic_good::ChaoticGoodServerListener>( - core_server, core_server->channel_args()); + grpc_core::Server::FromC(server), core_server->channel_args()); std::string addr_str = *grpc_event_engine::experimental::ResolvedAddressToString(ee_addr); GRPC_TRACE_LOG(chaotic_good, INFO) << "BIND: " << addr_str; diff --git a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.h b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.h index b81571126365b..d7862afb3ae6c 100644 --- a/src/core/ext/transport/chaotic_good/server/chaotic_good_server.h +++ b/src/core/ext/transport/chaotic_good/server/chaotic_good_server.h @@ -30,6 +30,7 @@ #include "absl/status/statusor.h" #include "src/core/channelz/channelz.h" #include "src/core/ext/transport/chaotic_good/config.h" +#include "src/core/ext/transport/chaotic_good/pending_connection.h" #include "src/core/handshaker/handshaker.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/iomgr/closure.h" @@ -60,7 +61,7 @@ class ChaoticGoodServerListener final : public Server::ListenerInterface { }; } - ChaoticGoodServerListener( + explicit ChaoticGoodServerListener( Server* server, const ChannelArgs& args, absl::AnyInvocable connection_id_generator = DefaultConnectionIDGenerator()); @@ -96,26 +97,33 @@ class ChaoticGoodServerListener final : public Server::ListenerInterface { } private: + struct DataConnection { + explicit DataConnection(std::string connection_id) + : connection_id(std::move(connection_id)) {} + std::string connection_id; + }; + struct ControlConnection { + explicit ControlConnection(Config config) : config(std::move(config)) {} + Config config; + }; + static auto EndpointReadSettingsFrame( RefCountedPtr self); static auto EndpointWriteSettingsFrame( RefCountedPtr self, bool is_control_endpoint); - static auto WaitForDataEndpointSetup( - RefCountedPtr self); static auto ControlEndpointWriteSettingsFrame( RefCountedPtr self); static auto DataEndpointWriteSettingsFrame( RefCountedPtr self); void OnHandshakeDone(absl::StatusOr result); - Timestamp GetConnectionDeadline(); const RefCountedPtr connection_; const RefCountedPtr handshake_mgr_; + absl::variant data_; }; private: void Done(); - void NewConnectionIDs(size_t count); RefCountedPtr arena_ = SimpleArenaAllocator()->MakeArena(); const RefCountedPtr listener_; RefCountedPtr handshaking_state_; @@ -123,12 +131,47 @@ class ChaoticGoodServerListener final : public Server::ListenerInterface { ActivityPtr receive_settings_activity_ ABSL_GUARDED_BY(mu_); bool orphaned_ ABSL_GUARDED_BY(mu_) = false; PromiseEndpoint endpoint_; - std::vector connection_ids_; - Config config_; - int32_t data_alignment_; absl::BitGen bitgen_; }; + class DataConnectionListener final : public ServerConnectionFactory { + public: + DataConnectionListener( + absl::AnyInvocable connection_id_generator, + Duration connect_timeout, + std::shared_ptr + event_engine); + ~DataConnectionListener() override { CHECK(shutdown_); } + + void Orphaned() override; + + PendingConnection RequestDataConnection() override; + void FinishDataConnection(absl::string_view id, PromiseEndpoint endpoint); + Duration connection_timeout() const { return connect_timeout_; } + + private: + using PromiseEndpointLatch = + InterActivityLatch>; + using PromiseEndpointLatchPtr = std::shared_ptr; + struct PendingConnectionInfo { + PromiseEndpointLatchPtr latch; + grpc_event_engine::experimental::EventEngine::TaskHandle timeout; + }; + + void ConnectionTimeout(absl::string_view id); + PromiseEndpointLatchPtr Extract(absl::string_view id); + + Mutex mu_; + absl::flat_hash_map pending_connections_ + ABSL_GUARDED_BY(mu_); + absl::AnyInvocable connection_id_generator_ + ABSL_GUARDED_BY(mu_); + const std::shared_ptr + event_engine_; + const Duration connect_timeout_; + bool shutdown_ ABSL_GUARDED_BY(mu_) = false; + }; + void Start(Server*, const std::vector*) override { StartListening().IgnoreError(); }; @@ -150,15 +193,10 @@ class ChaoticGoodServerListener final : public Server::ListenerInterface { ee_listener_; Mutex mu_; bool shutdown_ ABSL_GUARDED_BY(mu_) = false; - // Map of connection id to endpoints connectivity. - absl::flat_hash_map>> - connectivity_map_ ABSL_GUARDED_BY(mu_); absl::flat_hash_set> connection_list_ ABSL_GUARDED_BY(mu_); - absl::AnyInvocable connection_id_generator_ - ABSL_GUARDED_BY(mu_); grpc_closure* on_destroy_done_ ABSL_GUARDED_BY(mu_) = nullptr; + const RefCountedPtr data_connection_listener_; }; } // namespace chaotic_good diff --git a/src/core/ext/transport/chaotic_good/server_transport.cc b/src/core/ext/transport/chaotic_good/server_transport.cc index 848c99f90d786..af6b8a001df98 100644 --- a/src/core/ext/transport/chaotic_good/server_transport.cc +++ b/src/core/ext/transport/chaotic_good/server_transport.cc @@ -304,7 +304,7 @@ auto ChaoticGoodServerTransport::ReadOneFrame( LOG_EVERY_N_SEC(INFO, 10) << "Bad frame type: " << incoming_frame.header().ToString(); - return absl::OkStatus(); + return ImmediateOkStatus(); })); }, []() -> LoopCtl { return Continue{}; })); @@ -330,24 +330,23 @@ auto ChaoticGoodServerTransport::OnTransportActivityDone( } ChaoticGoodServerTransport::ChaoticGoodServerTransport( - const ChannelArgs& args, PromiseEndpoint control_endpoint, - std::vector data_endpoints, - std::shared_ptr event_engine, - Config config) + const ChannelArgs& args, PromiseEndpoint control_endpoint, Config config, + RefCountedPtr) : call_arena_allocator_(MakeRefCounted( args.GetObject() ->memory_quota() ->CreateMemoryAllocator("chaotic-good"), 1024)), - event_engine_(event_engine), + event_engine_( + args.GetObjectRef()), outgoing_frames_(4), message_chunker_(config.MakeMessageChunker()) { auto transport = MakeRefCounted( - std::move(control_endpoint), std::move(data_endpoints), event_engine, - config.MakeTransportOptions()); + std::move(control_endpoint), config.TakePendingDataEndpoints(), + event_engine_, config.MakeTransportOptions(), false); auto party_arena = SimpleArenaAllocator(0)->MakeArena(); party_arena->SetContext( - event_engine.get()); + event_engine_.get()); party_ = Party::Make(std::move(party_arena)); party_->Spawn( "server-chaotic-writer", diff --git a/src/core/ext/transport/chaotic_good/server_transport.h b/src/core/ext/transport/chaotic_good/server_transport.h index 0d6da8785710a..5d696349d9494 100644 --- a/src/core/ext/transport/chaotic_good/server_transport.h +++ b/src/core/ext/transport/chaotic_good/server_transport.h @@ -47,6 +47,7 @@ #include "src/core/ext/transport/chaotic_good/frame.h" #include "src/core/ext/transport/chaotic_good/frame_header.h" #include "src/core/ext/transport/chaotic_good/message_reassembly.h" +#include "src/core/ext/transport/chaotic_good/pending_connection.h" #include "src/core/lib/event_engine/default_event_engine.h" // IWYU pragma: keep #include "src/core/lib/promise/activity.h" #include "src/core/lib/promise/context.h" @@ -77,12 +78,9 @@ namespace chaotic_good { class ChaoticGoodServerTransport final : public ServerTransport { public: - ChaoticGoodServerTransport( - const ChannelArgs& args, PromiseEndpoint control_endpoint, - std::vector data_endpoints, - std::shared_ptr - event_engine, - Config config); + ChaoticGoodServerTransport(const ChannelArgs& args, + PromiseEndpoint control_endpoint, Config config, + RefCountedPtr); FilterStackTransport* filter_stack_transport() override { return nullptr; } ClientTransport* client_transport() override { return nullptr; } diff --git a/src/core/lib/promise/map.h b/src/core/lib/promise/map.h index 7c49dfbdf6ac7..28b14feed07c4 100644 --- a/src/core/lib/promise/map.h +++ b/src/core/lib/promise/map.h @@ -21,6 +21,9 @@ #include #include +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/str_cat.h" #include "src/core/lib/promise/detail/promise_like.h" #include "src/core/lib/promise/poll.h" @@ -155,6 +158,45 @@ struct JustElem { } }; +namespace promise_detail { +template +class MapError { + public: + explicit MapError(Fn fn) : fn_(std::move(fn)) {} + absl::Status operator()(absl::Status status) { + if (status.ok()) return status; + return fn_(std::move(status)); + } + template + absl::StatusOr operator()(absl::StatusOr status) { + if (status.ok()) return status; + return fn_(std::move(status.status())); + } + + private: + Fn fn_; +}; +} // namespace promise_detail + +// Map status->better status in the case of errors +template +auto MapErrors(Promise promise, Fn fn) { + return Map(std::move(promise), promise_detail::MapError(std::move(fn))); +} + +// Simple mapper to add a prefix to the message of an error +template +auto AddErrorPrefix(absl::string_view prefix, Promise promise) { + return MapErrors(std::move(promise), [prefix](absl::Status status) { + absl::Status out(status.code(), absl::StrCat(prefix, status.message())); + status.ForEachPayload( + [&out](absl::string_view name, const absl::Cord& value) { + out.SetPayload(name, value); + }); + return out; + }); +} + } // namespace grpc_core #endif // GRPC_SRC_CORE_LIB_PROMISE_MAP_H diff --git a/src/core/lib/promise/party.h b/src/core/lib/promise/party.h index 94e42fe6c286a..5a566d1e39ce6 100644 --- a/src/core/lib/promise/party.h +++ b/src/core/lib/promise/party.h @@ -25,11 +25,10 @@ #include #include "absl/base/attributes.h" -#include "absl/base/thread_annotations.h" #include "absl/log/check.h" -#include "absl/log/log.h" #include "absl/strings/string_view.h" #include "src/core/lib/debug/trace.h" +#include "src/core/lib/event_engine/event_engine_context.h" #include "src/core/lib/promise/activity.h" #include "src/core/lib/promise/context.h" #include "src/core/lib/promise/detail/promise_factory.h" @@ -39,8 +38,6 @@ #include "src/core/util/crash.h" #include "src/core/util/ref_counted.h" #include "src/core/util/ref_counted_ptr.h" -#include "src/core/util/sync.h" -#include "src/core/util/useful.h" namespace grpc_core { @@ -191,7 +188,10 @@ class Party : public Activity, private Wakeable { friend class Arena; // Derived types should be constructed upon `arena`. - explicit Party(RefCountedPtr arena) : arena_(std::move(arena)) {} + explicit Party(RefCountedPtr arena) : arena_(std::move(arena)) { + CHECK(arena_->GetContext() != + nullptr); + } ~Party() override; // Main run loop. Must be locked. diff --git a/test/core/call/yodel/yodel_test.h b/test/core/call/yodel/yodel_test.h index 42cea861830b9..339583d7080a3 100644 --- a/test/core/call/yodel/yodel_test.h +++ b/test/core/call/yodel/yodel_test.h @@ -364,6 +364,12 @@ class YodelTest : public ::testing::Test { class NoContext { public: + explicit NoContext(grpc_event_engine::experimental::EventEngine* ee) { + auto arena = SimpleArenaAllocator()->MakeArena(); + arena->SetContext(ee); + party_ = Party::Make(std::move(arena)); + } + template void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) { @@ -381,14 +387,14 @@ class YodelTest : public ::testing::Test { } private: - RefCountedPtr party_ = - Party::Make(SimpleArenaAllocator()->MakeArena()); + RefCountedPtr party_; }; template void SpawnTestSeqWithoutContext( yodel_detail::NameAndLocation name_and_location, Actions... actions) { - SpawnTestSeq(NoContext{}, name_and_location, std::move(actions)...); + SpawnTestSeq(NoContext{event_engine().get()}, name_and_location, + std::move(actions)...); } auto MakeCall(ClientMetadataHandle client_initial_metadata) { diff --git a/test/core/promise/bm_party.cc b/test/core/promise/bm_party.cc index c6976e62a1920..df6c75e66f36d 100644 --- a/test/core/promise/bm_party.cc +++ b/test/core/promise/bm_party.cc @@ -24,6 +24,8 @@ namespace { void BM_PartyCreate(benchmark::State& state) { auto arena = SimpleArenaAllocator()->MakeArena(); + arena->SetContext( + grpc_event_engine::experimental::GetDefaultEventEngine().get()); for (auto _ : state) { Party::Make(arena); } @@ -31,7 +33,10 @@ void BM_PartyCreate(benchmark::State& state) { BENCHMARK(BM_PartyCreate); void BM_AddParticipant(benchmark::State& state) { - auto party = Party::Make(SimpleArenaAllocator()->MakeArena()); + auto arena = SimpleArenaAllocator()->MakeArena(); + arena->SetContext( + grpc_event_engine::experimental::GetDefaultEventEngine().get()); + auto party = Party::Make(arena); for (auto _ : state) { party->Spawn("participant", []() { return Success{}; }, [](StatusFlag) {}); } @@ -39,7 +44,10 @@ void BM_AddParticipant(benchmark::State& state) { BENCHMARK(BM_AddParticipant); void BM_WakeupParticipant(benchmark::State& state) { - auto party = Party::Make(SimpleArenaAllocator()->MakeArena()); + auto arena = SimpleArenaAllocator()->MakeArena(); + arena->SetContext( + grpc_event_engine::experimental::GetDefaultEventEngine().get()); + auto party = Party::Make(arena); party->Spawn( "driver", [&state, w = IntraActivityWaiter()]() mutable -> Poll { diff --git a/test/core/promise/map_test.cc b/test/core/promise/map_test.cc index cd6f373f3fedf..02cddd8e6fa57 100644 --- a/test/core/promise/map_test.cc +++ b/test/core/promise/map_test.cc @@ -49,6 +49,29 @@ TEST(CheckDelayedTest, SeesDelayed) { EXPECT_THAT(x(), IsReady(std::make_tuple(42, true))); } +TEST(MapError, DoesntMapOk) { + auto fail_on_call = [](const absl::Status&) { + LOG(FATAL) << "should never be called"; + return absl::InternalError("unreachable"); + }; + promise_detail::MapError map_on_error( + std::move(fail_on_call)); + EXPECT_EQ(absl::OkStatus(), map_on_error(absl::OkStatus())); +} + +TEST(MapError, CanMapError) { + auto map_call = [](const absl::Status& status) { + EXPECT_EQ(status.code(), absl::StatusCode::kInternal); + EXPECT_EQ(status.message(), "hello"); + return absl::UnavailableError("world"); + }; + promise_detail::MapError map_on_error( + std::move(map_call)); + auto mapped = map_on_error(absl::InternalError("hello")); + EXPECT_EQ(mapped.code(), absl::StatusCode::kUnavailable); + EXPECT_EQ(mapped.message(), "world"); +} + } // namespace grpc_core int main(int argc, char** argv) { diff --git a/test/core/transport/benchmarks/bm_chaotic_good.cc b/test/core/transport/benchmarks/bm_chaotic_good.cc index 1b5e258b65cf6..60f07a3486297 100644 --- a/test/core/transport/benchmarks/bm_chaotic_good.cc +++ b/test/core/transport/benchmarks/bm_chaotic_good.cc @@ -34,22 +34,26 @@ class ChaoticGoodTraits { auto channel_args = CoreConfiguration::Get() .channel_args_preconditioning() .PreconditionChannelArgs(nullptr); - chaotic_good::Config config(channel_args); + chaotic_good::Config client_config(channel_args); + chaotic_good::Config server_config(channel_args); auto control = grpc_event_engine::experimental::PassthroughEndpoint:: MakePassthroughEndpoint(1, 2, true); auto data = grpc_event_engine::experimental::PassthroughEndpoint:: MakePassthroughEndpoint(3, 4, true); + client_config.ServerAddPendingDataEndpoint( + chaotic_good::ImmediateConnection( + "foo", PromiseEndpoint(std::move(data.client), SliceBuffer()))); + server_config.ServerAddPendingDataEndpoint( + chaotic_good::ImmediateConnection( + "foo", PromiseEndpoint(std::move(data.server), SliceBuffer()))); auto client = MakeOrphanable( - PromiseEndpoint(std::move(control.client), SliceBuffer()), - chaotic_good::OneDataEndpoint( - PromiseEndpoint(std::move(data.client), SliceBuffer())), - channel_args, grpc_event_engine::experimental::GetDefaultEventEngine(), - config); + channel_args, PromiseEndpoint(std::move(control.client), SliceBuffer()), + std::move(client_config), + MakeRefCounted()); auto server = MakeOrphanable( channel_args, PromiseEndpoint(std::move(control.server), SliceBuffer()), - chaotic_good::OneDataEndpoint( - PromiseEndpoint(std::move(data.server), SliceBuffer())), - grpc_event_engine::experimental::GetDefaultEventEngine(), config); + std::move(server_config), + MakeRefCounted()); return {std::move(client), std::move(server)}; } @@ -69,6 +73,25 @@ class ChaoticGoodTraits { auto md = Arena::MakePooledForOverwrite(); return md; } + + private: + class FakeClientConnectionFactory + : public chaotic_good::ClientConnectionFactory { + public: + chaotic_good::PendingConnection Connect(absl::string_view id) override { + Crash("Connect not implemented"); + } + void Orphaned() override {} + }; + + class FakeServerConnectionFactory + : public chaotic_good::ServerConnectionFactory { + public: + chaotic_good::PendingConnection RequestDataConnection() override { + Crash("RequestDataConnection not implemented"); + } + void Orphaned() override {} + }; }; GRPC_CALL_SPINE_BENCHMARK(TransportFixture); diff --git a/test/core/transport/chaotic_good/chaotic_good_server_test.cc b/test/core/transport/chaotic_good/chaotic_good_server_test.cc index b76b97b4bfc0a..07a0be856ddb1 100644 --- a/test/core/transport/chaotic_good/chaotic_good_server_test.cc +++ b/test/core/transport/chaotic_good/chaotic_good_server_test.cc @@ -92,8 +92,7 @@ class ChaoticGoodServerTest : public ::testing::Test { args_.address = &resolved_addr_; args_.deadline = Timestamp::Now() + Duration::Seconds(5); args_.channel_args = channel_args(); - connector_ = MakeRefCounted( - grpc_event_engine::experimental::GetDefaultEventEngine()); + connector_ = MakeRefCounted(); } protected: diff --git a/test/core/transport/chaotic_good/client_transport_error_test.cc b/test/core/transport/chaotic_good/client_transport_error_test.cc index 43d716788944e..0199aa0179113 100644 --- a/test/core/transport/chaotic_good/client_transport_error_test.cc +++ b/test/core/transport/chaotic_good/client_transport_error_test.cc @@ -94,6 +94,12 @@ class MockEndpoint GetLocalAddress, (), (const, override)); }; +class MockClientConnectionFactory : public ClientConnectionFactory { + public: + MOCK_METHOD(PendingConnection, Connect, (absl::string_view), (override)); + void Orphaned() final {} +}; + struct MockPromiseEndpoint { StrictMock* endpoint = new StrictMock(); PromiseEndpoint promise_endpoint{ @@ -139,7 +145,16 @@ class ClientTransportTest : public ::testing::Test { .PreconditionChannelArgs(nullptr); } - Config MakeConfig() { return Config(MakeChannelArgs()); } + template + Config MakeConfig(PromiseEndpoints... promise_endpoints) { + Config config(MakeChannelArgs()); + auto name_endpoint = [i = 0]() mutable { return absl::StrCat(++i); }; + std::vector this_is_only_here_to_unpack_the_following_statement{ + (config.ServerAddPendingDataEndpoint(ImmediateConnection( + name_endpoint(), std::move(promise_endpoints))), + 0)...}; + return config; + } auto MakeCall(ClientMetadataHandle client_initial_metadata) { auto arena = call_arena_allocator_->MakeArena(); @@ -170,6 +185,8 @@ class ClientTransportTest : public ::testing::Test { TEST_F(ClientTransportTest, AddOneStreamWithWriteFailed) { MockPromiseEndpoint control_endpoint; MockPromiseEndpoint data_endpoint; + auto client_connection_factory = + MakeRefCounted>(); // Mock write failed and read is pending. EXPECT_CALL(*control_endpoint.endpoint, Write) .Times(AtMost(1)) @@ -187,9 +204,9 @@ TEST_F(ClientTransportTest, AddOneStreamWithWriteFailed) { })); EXPECT_CALL(*control_endpoint.endpoint, Read).WillOnce(Return(false)); auto transport = MakeOrphanable( - std::move(control_endpoint.promise_endpoint), - OneDataEndpoint(std::move(data_endpoint.promise_endpoint)), - MakeChannelArgs(), event_engine(), MakeConfig()); + MakeChannelArgs(), std::move(control_endpoint.promise_endpoint), + MakeConfig(std::move(data_endpoint.promise_endpoint)), + client_connection_factory); auto call = MakeCall(TestInitialMetadata()); transport->StartCall(call.handler.StartCall()); call.initiator.SpawnGuarded("test-send", @@ -222,6 +239,8 @@ TEST_F(ClientTransportTest, AddOneStreamWithWriteFailed) { TEST_F(ClientTransportTest, AddOneStreamWithReadFailed) { MockPromiseEndpoint control_endpoint; MockPromiseEndpoint data_endpoint; + auto client_connection_factory = + MakeRefCounted>(); // Mock read failed. EXPECT_CALL(*control_endpoint.endpoint, Read) .WillOnce(WithArgs<0>( @@ -231,9 +250,9 @@ TEST_F(ClientTransportTest, AddOneStreamWithReadFailed) { return false; })); auto transport = MakeOrphanable( - std::move(control_endpoint.promise_endpoint), - OneDataEndpoint(std::move(data_endpoint.promise_endpoint)), - MakeChannelArgs(), event_engine(), MakeConfig()); + MakeChannelArgs(), std::move(control_endpoint.promise_endpoint), + MakeConfig(std::move(data_endpoint.promise_endpoint)), + client_connection_factory); auto call = MakeCall(TestInitialMetadata()); transport->StartCall(call.handler.StartCall()); call.initiator.SpawnGuarded("test-send", @@ -267,6 +286,8 @@ TEST_F(ClientTransportTest, AddMultipleStreamWithWriteFailed) { // Mock write failed at first stream and second stream's write will fail too. MockPromiseEndpoint control_endpoint; MockPromiseEndpoint data_endpoint; + auto client_connection_factory = + MakeRefCounted>(); EXPECT_CALL(*control_endpoint.endpoint, Write) .Times(AtMost(1)) .WillRepeatedly( @@ -283,9 +304,9 @@ TEST_F(ClientTransportTest, AddMultipleStreamWithWriteFailed) { })); EXPECT_CALL(*control_endpoint.endpoint, Read).WillOnce(Return(false)); auto transport = MakeOrphanable( - std::move(control_endpoint.promise_endpoint), - OneDataEndpoint(std::move(data_endpoint.promise_endpoint)), - MakeChannelArgs(), event_engine(), MakeConfig()); + MakeChannelArgs(), std::move(control_endpoint.promise_endpoint), + MakeConfig(std::move(data_endpoint.promise_endpoint)), + client_connection_factory); auto call1 = MakeCall(TestInitialMetadata()); transport->StartCall(call1.handler.StartCall()); auto call2 = MakeCall(TestInitialMetadata()); @@ -340,6 +361,8 @@ TEST_F(ClientTransportTest, AddMultipleStreamWithWriteFailed) { TEST_F(ClientTransportTest, AddMultipleStreamWithReadFailed) { MockPromiseEndpoint control_endpoint; MockPromiseEndpoint data_endpoint; + auto client_connection_factory = + MakeRefCounted>(); // Mock read failed at first stream, and second stream's write will fail too. EXPECT_CALL(*control_endpoint.endpoint, Read) .WillOnce(WithArgs<0>( @@ -349,9 +372,9 @@ TEST_F(ClientTransportTest, AddMultipleStreamWithReadFailed) { return false; })); auto transport = MakeOrphanable( - std::move(control_endpoint.promise_endpoint), - OneDataEndpoint(std::move(data_endpoint.promise_endpoint)), - MakeChannelArgs(), event_engine(), MakeConfig()); + MakeChannelArgs(), std::move(control_endpoint.promise_endpoint), + MakeConfig(std::move(data_endpoint.promise_endpoint)), + client_connection_factory); auto call1 = MakeCall(TestInitialMetadata()); transport->StartCall(call1.handler.StartCall()); auto call2 = MakeCall(TestInitialMetadata()); diff --git a/test/core/transport/chaotic_good/client_transport_test.cc b/test/core/transport/chaotic_good/client_transport_test.cc index 3307d5b9e1e3b..4137137180f89 100644 --- a/test/core/transport/chaotic_good/client_transport_test.cc +++ b/test/core/transport/chaotic_good/client_transport_test.cc @@ -57,6 +57,12 @@ namespace grpc_core { namespace chaotic_good { namespace testing { +class MockClientConnectionFactory : public ClientConnectionFactory { + public: + MOCK_METHOD(PendingConnection, Connect, (absl::string_view), (override)); + void Orphaned() final {} +}; + ClientMetadataHandle TestInitialMetadata() { auto md = Arena::MakePooledForOverwrite(); md->Set(HttpPathMetadata(), Slice::FromStaticString("/demo.Service/Step")); @@ -85,17 +91,33 @@ auto SendClientToServerMessages(CallInitiator initiator, int num_messages) { }); } -ChannelArgs MakeChannelArgs() { +ChannelArgs MakeChannelArgs( + std::shared_ptr + event_engine) { return CoreConfiguration::Get() .channel_args_preconditioning() - .PreconditionChannelArgs(nullptr); + .PreconditionChannelArgs(nullptr) + .SetObject( + std::move(event_engine)); } -Config MakeConfig() { return Config(MakeChannelArgs()); } +template +Config MakeConfig(const ChannelArgs& channel_args, + PromiseEndpoints... promise_endpoints) { + Config config(channel_args); + auto name_endpoint = [i = 0]() mutable { return absl::StrCat(++i); }; + std::vector this_is_only_here_to_unpack_the_following_statement{ + (config.ServerAddPendingDataEndpoint( + ImmediateConnection(name_endpoint(), std::move(promise_endpoints))), + 0)...}; + return config; +} TEST_F(TransportTest, AddOneStream) { MockPromiseEndpoint control_endpoint(1000); MockPromiseEndpoint data_endpoint(1001); + auto client_connection_factory = + MakeRefCounted>(); static const std::string many_as(1024 * 1024, 'a'); const auto server_initial_metadata = EncodeProto("message: 'hello'"); @@ -118,10 +140,11 @@ TEST_F(TransportTest, AddOneStream) { EXPECT_CALL(*control_endpoint.endpoint, Read) .InSequence(control_endpoint.read_sequence) .WillOnce(Return(false)); + auto channel_args = MakeChannelArgs(event_engine()); auto transport = MakeOrphanable( - std::move(control_endpoint.promise_endpoint), - OneDataEndpoint(std::move(data_endpoint.promise_endpoint)), - MakeChannelArgs(), event_engine(), MakeConfig()); + channel_args, std::move(control_endpoint.promise_endpoint), + MakeConfig(channel_args, std::move(data_endpoint.promise_endpoint)), + client_connection_factory); auto call = MakeCall(TestInitialMetadata()); StrictMock> on_done; EXPECT_CALL(on_done, Call()); @@ -180,6 +203,8 @@ TEST_F(TransportTest, AddOneStream) { TEST_F(TransportTest, AddOneStreamMultipleMessages) { MockPromiseEndpoint control_endpoint(1000); MockPromiseEndpoint data_endpoint(1001); + auto client_connection_factory = + MakeRefCounted>(); const auto server_initial_metadata = EncodeProto(""); const auto server_trailing_metadata = @@ -202,10 +227,11 @@ TEST_F(TransportTest, AddOneStreamMultipleMessages) { EXPECT_CALL(*control_endpoint.endpoint, Read) .InSequence(control_endpoint.read_sequence) .WillOnce(Return(false)); + auto channel_args = MakeChannelArgs(event_engine()); auto transport = MakeOrphanable( - std::move(control_endpoint.promise_endpoint), - OneDataEndpoint(std::move(data_endpoint.promise_endpoint)), - MakeChannelArgs(), event_engine(), MakeConfig()); + channel_args, std::move(control_endpoint.promise_endpoint), + MakeConfig(channel_args, std::move(data_endpoint.promise_endpoint)), + client_connection_factory); auto call = MakeCall(TestInitialMetadata()); StrictMock> on_done; EXPECT_CALL(on_done, Call()); diff --git a/test/core/transport/chaotic_good/data_endpoints_test.cc b/test/core/transport/chaotic_good/data_endpoints_test.cc index 49c3b6df72c3c..ff8c4bfdad90a 100644 --- a/test/core/transport/chaotic_good/data_endpoints_test.cc +++ b/test/core/transport/chaotic_good/data_endpoints_test.cc @@ -43,12 +43,20 @@ class DataEndpointsTest : public YodelTest { #define DATA_ENDPOINTS_TEST(name) YODEL_TEST(DataEndpointsTest, name) +template +std::vector Endpoints(Args... args) { + std::vector connections; + std::vector this_is_just_here_to_get_the_statements_to_unpack = { + (connections.emplace_back( + chaotic_good::ImmediateConnection("foo", std::move(args))), + 0)...}; + return connections; +} + DATA_ENDPOINTS_TEST(CanWrite) { chaotic_good::testing::MockPromiseEndpoint ep(1234); - std::vector endpoints; - endpoints.push_back(std::move(ep.promise_endpoint)); - chaotic_good::DataEndpoints data_endpoints(std::move(endpoints), - event_engine().get()); + chaotic_good::DataEndpoints data_endpoints( + Endpoints(std::move(ep.promise_endpoint)), event_engine().get(), false); ep.ExpectWrite( {grpc_event_engine::experimental::Slice::FromCopiedString("hello")}, event_engine().get()); @@ -62,11 +70,10 @@ DATA_ENDPOINTS_TEST(CanWrite) { DATA_ENDPOINTS_TEST(CanMultiWrite) { chaotic_good::testing::MockPromiseEndpoint ep1(1234); chaotic_good::testing::MockPromiseEndpoint ep2(1235); - std::vector endpoints; - endpoints.push_back(std::move(ep1.promise_endpoint)); - endpoints.push_back(std::move(ep2.promise_endpoint)); - chaotic_good::DataEndpoints data_endpoints(std::move(endpoints), - event_engine().get()); + chaotic_good::DataEndpoints data_endpoints( + Endpoints(std::move(ep1.promise_endpoint), + std::move(ep2.promise_endpoint)), + event_engine().get(), false); SliceBuffer writes1; SliceBuffer writes2; ep1.CaptureWrites(writes1, event_engine().get()); @@ -91,10 +98,8 @@ DATA_ENDPOINTS_TEST(CanMultiWrite) { DATA_ENDPOINTS_TEST(CanRead) { chaotic_good::testing::MockPromiseEndpoint ep(1234); - std::vector endpoints; - endpoints.push_back(std::move(ep.promise_endpoint)); - chaotic_good::DataEndpoints data_endpoints(std::move(endpoints), - event_engine().get()); + chaotic_good::DataEndpoints data_endpoints( + Endpoints(std::move(ep.promise_endpoint)), event_engine().get(), false); ep.ExpectRead( {grpc_event_engine::experimental::Slice::FromCopiedString("hello")}, event_engine().get()); diff --git a/test/core/transport/chaotic_good/server_transport_test.cc b/test/core/transport/chaotic_good/server_transport_test.cc index 598027bdfa422..77c1cff09e8d2 100644 --- a/test/core/transport/chaotic_good/server_transport_test.cc +++ b/test/core/transport/chaotic_good/server_transport_test.cc @@ -72,13 +72,27 @@ ServerMetadataHandle TestTrailingMetadata() { return md; } -ChannelArgs MakeChannelArgs() { +ChannelArgs MakeChannelArgs( + std::shared_ptr + event_engine) { return CoreConfiguration::Get() .channel_args_preconditioning() - .PreconditionChannelArgs(nullptr); + .PreconditionChannelArgs(nullptr) + .SetObject( + std::move(event_engine)); } -Config MakeConfig() { return Config(MakeChannelArgs()); } +template +Config MakeConfig(const ChannelArgs& channel_args, + PromiseEndpoints... promise_endpoints) { + Config config(channel_args); + auto name_endpoint = [i = 0]() mutable { return absl::StrCat(++i); }; + std::vector this_is_only_here_to_unpack_the_following_statement{ + (config.ServerAddPendingDataEndpoint( + ImmediateConnection(name_endpoint(), std::move(promise_endpoints))), + 0)...}; + return config; +} class MockCallDestination : public UnstartedCallDestination { public: @@ -88,15 +102,24 @@ class MockCallDestination : public UnstartedCallDestination { (override)); }; +class MockServerConnectionFactory : public ServerConnectionFactory { + public: + MOCK_METHOD(PendingConnection, RequestDataConnection, (), (override)); + void Orphaned() final {} +}; + TEST_F(TransportTest, ReadAndWriteOneMessage) { MockPromiseEndpoint control_endpoint(1); MockPromiseEndpoint data_endpoint(2); + auto server_connection_factory = + MakeRefCounted>(); auto call_destination = MakeRefCounted>(); EXPECT_CALL(*call_destination, Orphaned()).Times(1); + auto channel_args = MakeChannelArgs(event_engine()); auto transport = MakeOrphanable( - MakeChannelArgs(), std::move(control_endpoint.promise_endpoint), - OneDataEndpoint(std::move(data_endpoint.promise_endpoint)), - event_engine(), MakeConfig()); + channel_args, std::move(control_endpoint.promise_endpoint), + MakeConfig(channel_args, std::move(data_endpoint.promise_endpoint)), + server_connection_factory); const auto server_initial_metadata = EncodeProto("message: 'hello'"); const auto server_trailing_metadata = @@ -184,6 +207,8 @@ TEST_F(TransportTest, ReadAndWriteOneMessage) { nullptr); // Wait until ClientTransport's internal activities to finish. event_engine()->TickUntilIdle(); + ::testing::Mock::VerifyAndClearExpectations(control_endpoint.endpoint); + ::testing::Mock::VerifyAndClearExpectations(data_endpoint.endpoint); event_engine()->UnsetGlobalHooks(); } diff --git a/test/core/transport/test_suite/BUILD b/test/core/transport/test_suite/BUILD index 018b5c438cd9b..319a4381964cd 100644 --- a/test/core/transport/test_suite/BUILD +++ b/test/core/transport/test_suite/BUILD @@ -106,6 +106,7 @@ grpc_cc_library( "gtest", ], deps = [ + "//src/core:chaotic_good_config", "//test/core/call/yodel:yodel_test", ], ) diff --git a/test/core/transport/test_suite/chaotic_good_fixture.cc b/test/core/transport/test_suite/chaotic_good_fixture.cc index 400a80fd63e32..b42cf24eb1300 100644 --- a/test/core/transport/test_suite/chaotic_good_fixture.cc +++ b/test/core/transport/test_suite/chaotic_good_fixture.cc @@ -30,17 +30,22 @@ TRANSPORT_FIXTURE(ChaoticGood) { .SetObject( std::static_pointer_cast< grpc_event_engine::experimental::EventEngine>(event_engine)); + chaotic_good::Config client_config(channel_args); + chaotic_good::Config server_config(channel_args); + client_config.ServerAddPendingDataEndpoint(chaotic_good::ImmediateConnection( + "foo", std::move(data_endpoints.client))); + server_config.ServerAddPendingDataEndpoint(chaotic_good::ImmediateConnection( + "foo", std::move(data_endpoints.server))); auto client_transport = MakeOrphanable( - std::move(control_endpoints.client), - chaotic_good::OneDataEndpoint(std::move(data_endpoints.client)), - ChannelArgs().SetObject(resource_quota), event_engine, - chaotic_good::Config(channel_args)); + channel_args, std::move(control_endpoints.client), + std::move(client_config), + MakeRefCounted()); auto server_transport = MakeOrphanable( channel_args, std::move(control_endpoints.server), - chaotic_good::OneDataEndpoint(std::move(data_endpoints.server)), - event_engine, chaotic_good::Config(channel_args)); + std::move(server_config), + MakeRefCounted()); return ClientAndServerTransportPair{std::move(client_transport), std::move(server_transport)}; } diff --git a/test/core/transport/test_suite/chaotic_good_fixture_helpers.h b/test/core/transport/test_suite/chaotic_good_fixture_helpers.h index 3e1403d5a536b..e819e6509aaf0 100644 --- a/test/core/transport/test_suite/chaotic_good_fixture_helpers.h +++ b/test/core/transport/test_suite/chaotic_good_fixture_helpers.h @@ -49,6 +49,24 @@ EndpointPair CreateEndpointPair( grpc_event_engine::experimental::FuzzingEventEngine* event_engine, ResourceQuota* resource_quota, int port); +class FakeClientConnectionFactory final + : public chaotic_good::ClientConnectionFactory { + public: + chaotic_good::PendingConnection Connect(absl::string_view) override { + Crash("Connect not implemented"); + } + void Orphaned() override {} +}; + +class FakeServerConnectionFactory final + : public chaotic_good::ServerConnectionFactory { + public: + chaotic_good::PendingConnection RequestDataConnection() override { + Crash("RequestDataConnection not implemented"); + } + void Orphaned() override {} +}; + } // namespace grpc_core #endif // GRPC_TEST_CORE_TRANSPORT_TEST_SUITE_CHAOTIC_GOOD_FIXTURE_HELPERS_H diff --git a/test/core/transport/test_suite/chaotic_good_one_byte_chunk_fixture.cc b/test/core/transport/test_suite/chaotic_good_one_byte_chunk_fixture.cc index 5c3689476cf8e..fefef35a09ac8 100644 --- a/test/core/transport/test_suite/chaotic_good_one_byte_chunk_fixture.cc +++ b/test/core/transport/test_suite/chaotic_good_one_byte_chunk_fixture.cc @@ -20,24 +20,26 @@ TRANSPORT_FIXTURE(ChaoticGoodOneByteChunks) { auto resource_quota = MakeResourceQuota("test"); EndpointPair control_endpoints = CreateEndpointPair(event_engine.get(), resource_quota.get(), 1234); - EndpointPair data_endpoints = - CreateEndpointPair(event_engine.get(), resource_quota.get(), 4321); auto channel_args = ChannelArgs() .SetObject(resource_quota) .SetObject( std::static_pointer_cast< grpc_event_engine::experimental::EventEngine>(event_engine)); - chaotic_good::Config config(channel_args); - config.TestOnlySetChunkSizes(1); + chaotic_good::Config client_config(channel_args); + chaotic_good::Config server_config(channel_args); + client_config.TestOnlySetChunkSizes(1); + server_config.TestOnlySetChunkSizes(1); auto client_transport = MakeOrphanable( - std::move(control_endpoints.client), std::vector{}, - ChannelArgs().SetObject(resource_quota), event_engine, config); + channel_args, std::move(control_endpoints.client), + std::move(client_config), + MakeRefCounted()); auto server_transport = MakeOrphanable( channel_args, std::move(control_endpoints.server), - std::vector{}, event_engine, config); + std::move(server_config), + MakeRefCounted()); return ClientAndServerTransportPair{std::move(client_transport), std::move(server_transport), true}; } diff --git a/test/core/transport/test_suite/chaotic_good_single_connection_fixture.cc b/test/core/transport/test_suite/chaotic_good_single_connection_fixture.cc index 9de2ea8d8930c..10d39439488a7 100644 --- a/test/core/transport/test_suite/chaotic_good_single_connection_fixture.cc +++ b/test/core/transport/test_suite/chaotic_good_single_connection_fixture.cc @@ -28,16 +28,18 @@ TRANSPORT_FIXTURE(ChaoticGoodSingleConnection) { .SetObject( std::static_pointer_cast< grpc_event_engine::experimental::EventEngine>(event_engine)); + chaotic_good::Config client_config(channel_args); + chaotic_good::Config server_config(channel_args); auto client_transport = MakeOrphanable( - std::move(control_endpoints.client), std::vector{}, - ChannelArgs().SetObject(resource_quota), event_engine, - chaotic_good::Config(channel_args)); + channel_args, std::move(control_endpoints.client), + std::move(client_config), + MakeRefCounted()); auto server_transport = MakeOrphanable( channel_args, std::move(control_endpoints.server), - std::vector{}, event_engine, - chaotic_good::Config(channel_args)); + std::move(server_config), + MakeRefCounted()); return ClientAndServerTransportPair{std::move(client_transport), std::move(server_transport)}; } diff --git a/test/core/transport/test_suite/transport_test.h b/test/core/transport/test_suite/transport_test.h index 50478f93e59b4..7edb7ca573980 100644 --- a/test/core/transport/test_suite/transport_test.h +++ b/test/core/transport/test_suite/transport_test.h @@ -21,6 +21,8 @@ #include "absl/random/bit_gen_ref.h" #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "src/core/config/core_configuration.h" +#include "src/core/ext/transport/chaotic_good/config.h" #include "src/core/lib/transport/transport.h" #include "test/core/call/yodel/yodel_test.h" #include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h" @@ -49,6 +51,25 @@ class TransportTest : public YodelTest { CallHandler TickUntilServerCall(); + ChannelArgs MakeChannelArgs() { + return CoreConfiguration::Get() + .channel_args_preconditioning() + .PreconditionChannelArgs(nullptr) + .SetObject( + event_engine()); + } + + template + chaotic_good::Config MakeConfig(PromiseEndpoints... promise_endpoints) { + chaotic_good::Config config(MakeChannelArgs()); + auto name_endpoint = [i = 0]() mutable { return absl::StrCat(++i); }; + std::vector this_is_only_here_to_unpack_the_following_statement{ + (config.ServerAddPendingDataEndpoint(ImmediateConnection( + name_endpoint(), std::move(promise_endpoints))), + 0)...}; + return config; + } + private: class ServerCallDestination final : public UnstartedCallDestination { public: From eef07f8d9e7fce494a05973d371478871587d644 Mon Sep 17 00:00:00 2001 From: alto-ruby Date: Tue, 10 Dec 2024 18:38:47 -0800 Subject: [PATCH 07/17] [Ruby] increase ruby test timeout (#38258) Increase ruby timeout to 2 hours. It timeout quite often, e.g.: https://btx.cloud.google.com/invocations/e0b8b0a1-dc56-4af1-b149-968c6108711d/targets/grpc%2Fcore%2Fpull_request%2Fmacos%2Fgrpc_basictests_ruby;config=default/log When it ran successful, it took close to 1h (current timeout): https://btx.cloud.google.com/invocations/39e1debb-09a3-462e-922d-6b2c00ee3779/log Closes #38258 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38258 from alto-ruby:increase-ruby-test-timeout c5f8a031ca4d12839bd2e2340dcced8c2d35adcc PiperOrigin-RevId: 704922783 --- tools/run_tests/run_tests_matrix.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/run_tests/run_tests_matrix.py b/tools/run_tests/run_tests_matrix.py index af7cf801e15a8..6a20ec0f103f4 100755 --- a/tools/run_tests/run_tests_matrix.py +++ b/tools/run_tests/run_tests_matrix.py @@ -36,6 +36,9 @@ # Set timeout high for ObjC for Cocoapods to install pods _OBJC_RUNTESTS_TIMEOUT = 4 * 60 * 60 +# Set timeout high for Ruby for MacOS for slow xcodebuild +_RUBY_RUNTESTS_TIMEOUT = 2 * 60 * 60 + # Number of jobs assigned to each run_tests.py instance _DEFAULT_INNER_JOBS = 2 @@ -308,6 +311,7 @@ def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS): labels=["basictests", "multilang"], extra_args=extra_args + ["--report_multi_target"], inner_jobs=inner_jobs, + timeout_seconds=_RUBY_RUNTESTS_TIMEOUT, ) # ARM64 Linux Ruby and PHP tests From 5b3709b3020dcb365c6bc1245dc143a7c2d9f10a Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Tue, 10 Dec 2024 22:27:11 -0800 Subject: [PATCH 08/17] [PH2] Add new debug only trace flag (#38250) [PH2] Add new debug only trace flag Closes #38250 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38250 from tanvi-jagtap:add_new_debug_trace_flag 8ee186b8ab637d7e9e77846baf1fb12e924f57bb PiperOrigin-RevId: 704972174 --- doc/trace_flags.md | 1 + src/core/lib/debug/trace_flags.cc | 2 ++ src/core/lib/debug/trace_flags.h | 1 + src/core/lib/debug/trace_flags.yaml | 4 ++++ 4 files changed, 8 insertions(+) diff --git a/doc/trace_flags.md b/doc/trace_flags.md index 4ea7129a28f48..d81086998a1cd 100644 --- a/doc/trace_flags.md +++ b/doc/trace_flags.md @@ -101,6 +101,7 @@ accomplished by invoking `bazel build --config=dbg ` - lb_policy_refcount - LB policy refcounting. - party_state - Coordination of activities related to a call. - pending_tags - Still-in-progress tags on completion queues. The `api` tracer must be enabled for this flag to have any effect. + - ph2 - Promise Based HTTP2 transport. - polling - The active polling engine. - polling_api - API calls to polling engine. - promise_primitives - Low-level primitives in the promise library. diff --git a/src/core/lib/debug/trace_flags.cc b/src/core/lib/debug/trace_flags.cc index 29963b4c1f649..addf4bd141167 100644 --- a/src/core/lib/debug/trace_flags.cc +++ b/src/core/lib/debug/trace_flags.cc @@ -35,6 +35,7 @@ DebugOnlyTraceFlag fd_trace_trace(false, "fd_trace"); DebugOnlyTraceFlag lb_policy_refcount_trace(false, "lb_policy_refcount"); DebugOnlyTraceFlag party_state_trace(false, "party_state"); DebugOnlyTraceFlag pending_tags_trace(false, "pending_tags"); +DebugOnlyTraceFlag ph2_trace(false, "ph2"); DebugOnlyTraceFlag polling_trace(false, "polling"); DebugOnlyTraceFlag polling_api_trace(false, "polling_api"); DebugOnlyTraceFlag promise_primitives_trace(false, "promise_primitives"); @@ -225,6 +226,7 @@ const absl::flat_hash_map& GetAllTraceFlags() { {"lb_policy_refcount", &lb_policy_refcount_trace}, {"party_state", &party_state_trace}, {"pending_tags", &pending_tags_trace}, + {"ph2", &ph2_trace}, {"polling", &polling_trace}, {"polling_api", &polling_api_trace}, {"promise_primitives", &promise_primitives_trace}, diff --git a/src/core/lib/debug/trace_flags.h b/src/core/lib/debug/trace_flags.h index f185adb65ecc6..c32d9c1768c8f 100644 --- a/src/core/lib/debug/trace_flags.h +++ b/src/core/lib/debug/trace_flags.h @@ -36,6 +36,7 @@ extern DebugOnlyTraceFlag fd_trace_trace; extern DebugOnlyTraceFlag lb_policy_refcount_trace; extern DebugOnlyTraceFlag party_state_trace; extern DebugOnlyTraceFlag pending_tags_trace; +extern DebugOnlyTraceFlag ph2_trace; extern DebugOnlyTraceFlag polling_trace; extern DebugOnlyTraceFlag polling_api_trace; extern DebugOnlyTraceFlag promise_primitives_trace; diff --git a/src/core/lib/debug/trace_flags.yaml b/src/core/lib/debug/trace_flags.yaml index 11889710dcbc3..1999ba7020e79 100644 --- a/src/core/lib/debug/trace_flags.yaml +++ b/src/core/lib/debug/trace_flags.yaml @@ -225,6 +225,10 @@ pending_tags: debug_only: true default: false description: Still-in-progress tags on completion queues. The `api` tracer must be enabled for this flag to have any effect. +ph2: + debug_only: true + default: false + description: Promise Based HTTP2 transport. pick_first: default: false description: Pick first load balancing policy. From 39a388954dd91a122547f3d8444e8e8cef8bf03c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 11 Dec 2024 12:18:28 -0800 Subject: [PATCH 09/17] [call-v3] Actually experimentalize retries (#38268) Closes #38268 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38268 from ctiller:ex2 fb0ad04654599fb18b7496f7720ff13b36e66583 PiperOrigin-RevId: 705195556 --- test/core/end2end/end2end_test_suites.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/end2end/end2end_test_suites.cc b/test/core/end2end/end2end_test_suites.cc index 2f592ea657704..4395f791abc3e 100644 --- a/test/core/end2end/end2end_test_suites.cc +++ b/test/core/end2end/end2end_test_suites.cc @@ -536,7 +536,6 @@ class ChaoticGoodFixture : public CoreTestFixture { args.Set(GRPC_ARG_CHAOTIC_GOOD_DATA_CONNECTIONS, data_connections_) .Set(GRPC_ARG_CHAOTIC_GOOD_MAX_RECV_CHUNK_SIZE, chunk_size_) .Set(GRPC_ARG_CHAOTIC_GOOD_MAX_SEND_CHUNK_SIZE, chunk_size_) - .Set(GRPC_ARG_ENABLE_RETRIES, IsRetryInCallv3Enabled()) .ToC() .get(), nullptr); @@ -553,6 +552,7 @@ class ChaoticGoodFixture : public CoreTestFixture { localaddr_.c_str(), args.Set(GRPC_ARG_CHAOTIC_GOOD_MAX_RECV_CHUNK_SIZE, chunk_size_) .Set(GRPC_ARG_CHAOTIC_GOOD_MAX_SEND_CHUNK_SIZE, chunk_size_) + .SetIfUnset(GRPC_ARG_ENABLE_RETRIES, IsRetryInCallv3Enabled()) .ToC() .get()); return client; From cf81cce9c75d55b0e45e9356aed19aaff6d191d7 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Wed, 11 Dec 2024 12:26:06 -0800 Subject: [PATCH 10/17] [Build] Prerequisites to Bazel 8 upgrade (#38261) - All rules* need to be upgraded to support Bazel 8. - Clean-up unnecessary Android-related rules. Closes #38261 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38261 from veblush:bazel8-pre d9d7f393ac64befb4b1a4c65f2d4dcb2b80328f2 PiperOrigin-RevId: 705198130 --- WORKSPACE | 24 ------------------------ bazel/grpc_deps.bzl | 28 ++++++++++++++-------------- bazel/grpc_python_deps.bzl | 6 +++--- 3 files changed, 17 insertions(+), 41 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 175de18acd0d3..0f6ccf50d53c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -32,30 +32,6 @@ http_archive( urls = ["https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz"], ) -RULES_ANDROID_NDK_COMMIT = "010f4f17dd13a8baaaacc28ba6c8c2c75f54c68b" - -RULES_ANDROID_NDK_SHA = "2ab6a97748772f289331d75caaaee0593825935d1d9d982231a437fb8ab5a14d" - -http_archive( - name = "rules_android_ndk", - sha256 = RULES_ANDROID_NDK_SHA, - strip_prefix = "rules_android_ndk-%s" % RULES_ANDROID_NDK_COMMIT, - url = "https://github.com/bazelbuild/rules_android_ndk/archive/%s.zip" % RULES_ANDROID_NDK_COMMIT, -) - -android_sdk_repository( - name = "androidsdk", - build_tools_version = "34.0.0", -) - -load("@rules_android_ndk//:rules.bzl", "android_ndk_repository") - -android_ndk_repository(name = "androidndk") - -# Note that we intentionally avoid calling `register_toolchains("@androidndk//:all")` -# here, because the toolchain rule fails when $ANDROID_NDK_HOME is not set. -# Use `--extra_toolchains=@androidndk//:all` to manually register it when building for Android. - # Prevents bazel's '...' expansion from including the following folder. # This is required to avoid triggering "Unable to find package for @rules_fuzzing//fuzzing:cc_defs.bzl" # error. diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index f90cce94a764e..014c8430dee84 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -98,11 +98,11 @@ def grpc_deps(): if "rules_cc" not in native.existing_rules(): http_archive( name = "rules_cc", - sha256 = "b26168b9a13f094794982b832975eaf53cefc5dced5b3be7df6b8b794dc2744b", - strip_prefix = "rules_cc-0.0.12", + sha256 = "abc605dd850f813bb37004b77db20106a19311a96b2da1c92b789da529d28fe1", + strip_prefix = "rules_cc-0.0.17", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_cc/releases/download/0.0.12/rules_cc-0.0.12.tar.gz", - "https://github.com/bazelbuild/rules_cc/releases/download/0.0.12/rules_cc-0.0.12.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_cc/releases/download/0.0.17/rules_cc-0.0.17.tar.gz", + "https://github.com/bazelbuild/rules_cc/releases/download/0.0.17/rules_cc-0.0.17.tar.gz", ], ) @@ -226,11 +226,11 @@ def grpc_deps(): if "rules_proto" not in native.existing_rules(): http_archive( name = "rules_proto", - sha256 = "6fb6767d1bef535310547e03247f7518b03487740c11b6c6adb7952033fe1295", - strip_prefix = "rules_proto-6.0.2", + sha256 = "0e5c64a2599a6e26c6a03d6162242d231ecc0de219534c38cb4402171def21e8", + strip_prefix = "rules_proto-7.0.2", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_proto/archive/refs/tags/6.0.2.tar.gz", - "https://github.com/bazelbuild/rules_proto/archive/refs/tags/6.0.2.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_proto/archive/refs/tags/7.0.2.tar.gz", + "https://github.com/bazelbuild/rules_proto/archive/refs/tags/7.0.2.tar.gz", ], ) @@ -251,20 +251,20 @@ def grpc_deps(): if "build_bazel_rules_apple" not in native.existing_rules(): http_archive( name = "build_bazel_rules_apple", - sha256 = "34c41bfb59cdaea29ac2df5a2fa79e5add609c71bb303b2ebb10985f93fa20e7", + sha256 = "86ff9c3a2c7bc308fef339bcd5b3819aa735215033886cc281eb63f10cd17976", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_apple/releases/download/3.1.1/rules_apple.3.1.1.tar.gz", - "https://github.com/bazelbuild/rules_apple/releases/download/3.1.1/rules_apple.3.1.1.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_apple/releases/download/3.16.0/rules_apple.3.16.0.tar.gz", + "https://github.com/bazelbuild/rules_apple/releases/download/3.16.0/rules_apple.3.16.0.tar.gz", ], ) if "build_bazel_apple_support" not in native.existing_rules(): http_archive( name = "build_bazel_apple_support", - sha256 = "cf4d63f39c7ba9059f70e995bf5fe1019267d3f77379c2028561a5d7645ef67c", + sha256 = "b53f6491e742549f13866628ddffcc75d1f3b2d6987dc4f14a16b242113c890b", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/apple_support/releases/download/1.11.1/apple_support.1.11.1.tar.gz", - "https://github.com/bazelbuild/apple_support/releases/download/1.11.1/apple_support.1.11.1.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/apple_support/releases/download/1.17.1/apple_support.1.17.1.tar.gz", + "https://github.com/bazelbuild/apple_support/releases/download/1.17.1/apple_support.1.17.1.tar.gz", ], ) diff --git a/bazel/grpc_python_deps.bzl b/bazel/grpc_python_deps.bzl index 7a7aa603275e9..fab875639012d 100644 --- a/bazel/grpc_python_deps.bzl +++ b/bazel/grpc_python_deps.bzl @@ -22,9 +22,9 @@ def grpc_python_deps(): if "rules_python" not in native.existing_rules(): http_archive( name = "rules_python", - sha256 = "be04b635c7be4604be1ef20542e9870af3c49778ce841ee2d92fcb42f9d9516a", - strip_prefix = "rules_python-0.35.0", - url = "https://github.com/bazelbuild/rules_python/releases/download/0.35.0/rules_python-0.35.0.tar.gz", + sha256 = "4f7e2aa1eb9aa722d96498f5ef514f426c1f55161c3c9ae628c857a7128ceb07", + strip_prefix = "rules_python-1.0.0", + url = "https://github.com/bazelbuild/rules_python/releases/download/1.0.0/rules_python-1.0.0.tar.gz", ) python_configure(name = "local_config_python") From 17715928ad96b0a99041ed7658599e36d4f98d30 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Wed, 11 Dec 2024 13:21:12 -0800 Subject: [PATCH 11/17] [Build] Upgraded Bazel to 7.4.1 (#38262) 7.4.1 is the latest one for Bazel 7.x as of today. Closes #38262 PiperOrigin-RevId: 705217168 --- .bazelversion | 2 +- bazel/supported_versions.txt | 2 +- bazel/update_mirror.sh | 6 +++--- doc/bazel_support.md | 2 +- tools/bazel.rc | 3 +++ tools/bazelify_tests/dockerimage_current_versions.bzl | 6 +++--- tools/bazelify_tests/test/supported_bazel_versions.bzl | 2 +- tools/dockerfile/test/bazel.current_version | 2 +- tools/dockerfile/test/bazel/Dockerfile | 2 +- tools/dockerfile/test/bazel_arm64.current_version | 2 +- tools/dockerfile/test/bazel_arm64/Dockerfile | 2 +- tools/dockerfile/test/sanity.current_version | 2 +- tools/dockerfile/test/sanity/Dockerfile | 2 +- 13 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.bazelversion b/.bazelversion index 643916c03f1f6..815da58b7a9ed 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.3.1 +7.4.1 diff --git a/bazel/supported_versions.txt b/bazel/supported_versions.txt index 643916c03f1f6..815da58b7a9ed 100644 --- a/bazel/supported_versions.txt +++ b/bazel/supported_versions.txt @@ -1 +1 @@ -7.3.1 +7.4.1 diff --git a/bazel/update_mirror.sh b/bazel/update_mirror.sh index d051edb11ab65..55938d3f5e080 100755 --- a/bazel/update_mirror.sh +++ b/bazel/update_mirror.sh @@ -57,9 +57,9 @@ function upload { # upload "github.com/google/boringssl/archive/1c2769383f027befac5b75b6cedd25daf3bf4dcf.tar.gz" # bazel binaries used by the tools/bazel wrapper script -upload github.com/bazelbuild/bazel/releases/download/7.3.1/bazel-7.3.1-linux-x86_64 -upload github.com/bazelbuild/bazel/releases/download/7.3.1/bazel-7.3.1-darwin-x86_64 -upload github.com/bazelbuild/bazel/releases/download/7.3.1/bazel-7.3.1-windows-x86_64.exe +upload github.com/bazelbuild/bazel/releases/download/7.4.1/bazel-7.4.1-linux-x86_64 +upload github.com/bazelbuild/bazel/releases/download/7.4.1/bazel-7.4.1-darwin-x86_64 +upload github.com/bazelbuild/bazel/releases/download/7.4.1/bazel-7.4.1-windows-x86_64.exe # Collect the github archives to mirror from grpc_deps.bzl grep -o '"https://github.com/[^"]*"' bazel/grpc_deps.bzl | sed 's/^"https:\/\///' | sed 's/"$//' | while read -r line ; do diff --git a/doc/bazel_support.md b/doc/bazel_support.md index 3753d7aa6b9b7..7ed2bc7d5c128 100644 --- a/doc/bazel_support.md +++ b/doc/bazel_support.md @@ -43,6 +43,6 @@ However individual releases may have a broader compatibility range. The currently supported versions are captured by the following list: -- [`7.3.1`](https://github.com/bazelbuild/bazel/releases/tag/7.3.1) +- [`7.4.1`](https://github.com/bazelbuild/bazel/releases/tag/7.4.1) NOTE: gRPC doesn't support bzlmod yet. \ No newline at end of file diff --git a/tools/bazel.rc b/tools/bazel.rc index 6c55a150d2f8c..8cd69bd9b7f8c 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -182,3 +182,6 @@ build:fuzztest_test --cxxopt=-std=c++17 # OpenTelemetry C++ needs this option to build with absl build --@io_opentelemetry_cpp//api:with_abseil + +# Bazel 7.4.1 needs this (https://github.com/bazelbuild/bazel/issues/24369) +test --nozip_undeclared_test_outputs diff --git a/tools/bazelify_tests/dockerimage_current_versions.bzl b/tools/bazelify_tests/dockerimage_current_versions.bzl index 328fa4a380711..ac211a67d3eb7 100644 --- a/tools/bazelify_tests/dockerimage_current_versions.bzl +++ b/tools/bazelify_tests/dockerimage_current_versions.bzl @@ -88,8 +88,8 @@ DOCKERIMAGE_CURRENT_VERSIONS = { "tools/dockerfile/interoptest/grpc_interop_ruby.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/grpc_interop_ruby@sha256:ce9539e9068b2597d5d43dc2bb7df17b84fd8192759cf7a02132b676ca6fa4ed", "tools/dockerfile/interoptest/lb_interop_fake_servers.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/lb_interop_fake_servers@sha256:b89a51dd9147e1293f50ee64dd719fce5929ca7894d3770a3d80dbdecb99fd52", "tools/dockerfile/test/android_ndk.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/android_ndk@sha256:e4fd2e0048c4ffd2a04e4a41154ee469ed61e058cb704ee95071f7a3bdad507a", - "tools/dockerfile/test/bazel.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/bazel@sha256:be25af8c0e5faf39a585e7ddd657c4fd66513e4eba0ee0c687109b19ed462518", - "tools/dockerfile/test/bazel_arm64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/bazel_arm64@sha256:ce026fedc059c74bade52f4b87c54907a3cf9abb22f6a584dba584e1925bbc42", + "tools/dockerfile/test/bazel.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/bazel@sha256:a0ca2c4f113c4d9e62e67b36d1734c0ffc3baff851cc48f23616df82484f905d", + "tools/dockerfile/test/bazel_arm64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/bazel_arm64@sha256:2728d010d87cb1845d002efbc3d08dadc283e8d0b7e0b582c2623960af61d2c5", "tools/dockerfile/test/csharp_debian11_arm64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/csharp_debian11_arm64@sha256:4d4bc5f15e03f3d3d8fd889670ecde2c66a2e4d2dd9db80733c05c1d90c8a248", "tools/dockerfile/test/csharp_debian11_x64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/csharp_debian11_x64@sha256:0763d919b17b4cfe5b65aff3bf911c04e9e4d46d11649858742033facd9f534f", "tools/dockerfile/test/cxx_alpine_x64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/cxx_alpine_x64@sha256:10587bea5d163bf5c34c6157ebd1863d22863d9d38bbaf5135ffc6fbf2b73004", @@ -112,5 +112,5 @@ DOCKERIMAGE_CURRENT_VERSIONS = { "tools/dockerfile/test/rbe_ubuntu2004.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/rbe_ubuntu2004@sha256:b3eb1a17b7b091e3c5648a803076b2c40601242ff91c04d55997af6641305f68", "tools/dockerfile/test/ruby_debian11_arm64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_debian11_arm64@sha256:d2e79919b2e2d4cc36a29682ecb5170641df4fb506cfb453978ffdeb8a841bd9", "tools/dockerfile/test/ruby_debian11_x64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_debian11_x64@sha256:6e8b4696ba0661f11a31ed0992a94d2efcd889a018f57160f0e2fb62963f3593", - "tools/dockerfile/test/sanity.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/sanity@sha256:7fd5e54075e74ff4aa5eceb6f00dd15fd5151b43c30a85fa4bd5d55f3dcf8287", + "tools/dockerfile/test/sanity.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/sanity@sha256:8b8e0b83725dfc5f81c901b3a737872410ee04fc1cb8b9ec5b2e4a5670fbf23c", } diff --git a/tools/bazelify_tests/test/supported_bazel_versions.bzl b/tools/bazelify_tests/test/supported_bazel_versions.bzl index 360a3459d7851..d1ce33c840d1d 100644 --- a/tools/bazelify_tests/test/supported_bazel_versions.bzl +++ b/tools/bazelify_tests/test/supported_bazel_versions.bzl @@ -17,5 +17,5 @@ This file is generated from the supported_bazel_versions.bzl.template """ SUPPORTED_BAZEL_VERSIONS = [ - "7.3.1", + "7.4.1", ] diff --git a/tools/dockerfile/test/bazel.current_version b/tools/dockerfile/test/bazel.current_version index a3d78435b01ef..d5a548337a79b 100644 --- a/tools/dockerfile/test/bazel.current_version +++ b/tools/dockerfile/test/bazel.current_version @@ -1 +1 @@ -us-docker.pkg.dev/grpc-testing/testing-images-public/bazel:de71ae928884a4697890b8ff8eda4f7fe59abec2@sha256:be25af8c0e5faf39a585e7ddd657c4fd66513e4eba0ee0c687109b19ed462518 \ No newline at end of file +us-docker.pkg.dev/grpc-testing/testing-images-public/bazel:f807574dd98dfb4a31da1104bfcb7de444b98797@sha256:a0ca2c4f113c4d9e62e67b36d1734c0ffc3baff851cc48f23616df82484f905d \ No newline at end of file diff --git a/tools/dockerfile/test/bazel/Dockerfile b/tools/dockerfile/test/bazel/Dockerfile index 7b3a688f9a53f..d526e5e717c00 100644 --- a/tools/dockerfile/test/bazel/Dockerfile +++ b/tools/dockerfile/test/bazel/Dockerfile @@ -38,7 +38,7 @@ RUN apt-get update && apt-get -y install \ # Bazel installation # Must be in sync with tools/bazel -ENV BAZEL_VERSION 7.3.1 +ENV BAZEL_VERSION 7.4.1 # The correct bazel version is already preinstalled, no need to use //tools/bazel wrapper. ENV DISABLE_BAZEL_WRAPPER 1 diff --git a/tools/dockerfile/test/bazel_arm64.current_version b/tools/dockerfile/test/bazel_arm64.current_version index 9d7f06c6674ce..ddf06c44543a3 100644 --- a/tools/dockerfile/test/bazel_arm64.current_version +++ b/tools/dockerfile/test/bazel_arm64.current_version @@ -1 +1 @@ -us-docker.pkg.dev/grpc-testing/testing-images-public/bazel_arm64:ae4306eccb3a8985d0a63fac0dc14019c58b1c79@sha256:ce026fedc059c74bade52f4b87c54907a3cf9abb22f6a584dba584e1925bbc42 \ No newline at end of file +us-docker.pkg.dev/grpc-testing/testing-images-public/bazel_arm64:6abcf8ebfbfdde00a629dcd6e0743ed0de578387@sha256:2728d010d87cb1845d002efbc3d08dadc283e8d0b7e0b582c2623960af61d2c5 \ No newline at end of file diff --git a/tools/dockerfile/test/bazel_arm64/Dockerfile b/tools/dockerfile/test/bazel_arm64/Dockerfile index 518888b84a5bd..dadcace9ff925 100644 --- a/tools/dockerfile/test/bazel_arm64/Dockerfile +++ b/tools/dockerfile/test/bazel_arm64/Dockerfile @@ -97,7 +97,7 @@ RUN apt-get update && apt-get -y install libc++-dev clang && apt-get clean # Bazel installation # Must be in sync with tools/bazel -ENV BAZEL_VERSION 7.3.1 +ENV BAZEL_VERSION 7.4.1 # The correct bazel version is already preinstalled, no need to use //tools/bazel wrapper. ENV DISABLE_BAZEL_WRAPPER 1 diff --git a/tools/dockerfile/test/sanity.current_version b/tools/dockerfile/test/sanity.current_version index 5da3c5baa21cd..24f27a1c283a4 100644 --- a/tools/dockerfile/test/sanity.current_version +++ b/tools/dockerfile/test/sanity.current_version @@ -1 +1 @@ -us-docker.pkg.dev/grpc-testing/testing-images-public/sanity:7b20e380c8ace88e99a1ec934eed62f706aa5bfa@sha256:7fd5e54075e74ff4aa5eceb6f00dd15fd5151b43c30a85fa4bd5d55f3dcf8287 \ No newline at end of file +us-docker.pkg.dev/grpc-testing/testing-images-public/sanity:031ef1568c1e7c3347429dbcb3ea5534812515c4@sha256:8b8e0b83725dfc5f81c901b3a737872410ee04fc1cb8b9ec5b2e4a5670fbf23c \ No newline at end of file diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile index ccdbe544cf060..042b737f05ff1 100644 --- a/tools/dockerfile/test/sanity/Dockerfile +++ b/tools/dockerfile/test/sanity/Dockerfile @@ -108,7 +108,7 @@ RUN apt-get update && apt-get install -y jq git && apt-get clean # Bazel installation # Must be in sync with tools/bazel -ENV BAZEL_VERSION 7.3.1 +ENV BAZEL_VERSION 7.4.1 # The correct bazel version is already preinstalled, no need to use //tools/bazel wrapper. ENV DISABLE_BAZEL_WRAPPER 1 From 6ca7889d4dcead990db45328277a6ae6abac9208 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 11 Dec 2024 14:58:37 -0800 Subject: [PATCH 12/17] [tdigest] Lessen stringency on a test in the middle of the range (#38267) We had this failure: https://btx.cloud.google.com/invocations/41c80cc6-7d25-454f-928e-129f5bab1e4e/targets/github%2Fgrpc%2Frun_tests%2Fcpp_linux_dbg_native;config=default/tests I think since 0 is around the median for this test, it's going to hit the t-digest worst case and it's ok to increase the max error slightly. Closes #38267 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38267 from ctiller:tdigest2 5c5865a7cd0c862f1051046763e3b75bdafd50fe PiperOrigin-RevId: 705252434 --- test/core/util/tdigest_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/util/tdigest_test.cc b/test/core/util/tdigest_test.cc index 68daa8a88dc17..39c4a322b6d42 100644 --- a/test/core/util/tdigest_test.cc +++ b/test/core/util/tdigest_test.cc @@ -462,7 +462,7 @@ INSTANTIATE_TEST_SUITE_P( []() { return UniformSamples(100000, -10000, 10000); }, {{-10001, 0}, {-9900, 0.005}, - {0, 0.005}, + {0, 0.008}, {9900, 0.005}, {10000, 0}}})); From bac8e34abb13f74fb36c4d4ca0288950aecc4380 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 11 Dec 2024 22:06:31 -0800 Subject: [PATCH 13/17] [chaotic-good] Cleanup (#38273) Instead of open coding the interface conversion from variant, use the absl function that does this automatically instead. Closes #38273 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38273 from ctiller:rubble 63258dc8fbd69b8ee43ce098c8c8802333658902 PiperOrigin-RevId: 705365106 --- .../chaotic_good/chaotic_good_transport.h | 3 ++- src/core/ext/transport/chaotic_good/frame.h | 27 ------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/src/core/ext/transport/chaotic_good/chaotic_good_transport.h b/src/core/ext/transport/chaotic_good/chaotic_good_transport.h index 4136d9752ae20..4c83a57bd1867 100644 --- a/src/core/ext/transport/chaotic_good/chaotic_good_transport.h +++ b/src/core/ext/transport/chaotic_good/chaotic_good_transport.h @@ -160,7 +160,8 @@ class ChaoticGoodTransport : public RefCounted { outgoing_frames.Next(), // Serialize and write it out. [self = self.get()](Frame client_frame) { - return self->WriteFrame(GetFrameInterface(client_frame)); + return self->WriteFrame( + absl::ConvertVariantTo(client_frame)); }, []() -> LoopCtl { // The write failures will be caught in TrySeq and exit loop. diff --git a/src/core/ext/transport/chaotic_good/frame.h b/src/core/ext/transport/chaotic_good/frame.h index 5cdc0961e2f6c..3e4eaed36ff03 100644 --- a/src/core/ext/transport/chaotic_good/frame.h +++ b/src/core/ext/transport/chaotic_good/frame.h @@ -186,33 +186,6 @@ using ServerFrame = absl::variant; -inline FrameInterface& GetFrameInterface(ClientFrame& frame) { - return MatchMutable( - &frame, - [](ClientInitialMetadataFrame* frame) -> FrameInterface& { - return *frame; - }, - [](MessageFrame* frame) -> FrameInterface& { return *frame; }, - [](BeginMessageFrame* frame) -> FrameInterface& { return *frame; }, - [](MessageChunkFrame* frame) -> FrameInterface& { return *frame; }, - [](ClientEndOfStream* frame) -> FrameInterface& { return *frame; }, - [](CancelFrame* frame) -> FrameInterface& { return *frame; }); -} - -inline FrameInterface& GetFrameInterface(ServerFrame& frame) { - return MatchMutable( - &frame, - [](ServerInitialMetadataFrame* frame) -> FrameInterface& { - return *frame; - }, - [](MessageFrame* frame) -> FrameInterface& { return *frame; }, - [](BeginMessageFrame* frame) -> FrameInterface& { return *frame; }, - [](MessageChunkFrame* frame) -> FrameInterface& { return *frame; }, - [](ServerTrailingMetadataFrame* frame) -> FrameInterface& { - return *frame; - }); -} - } // namespace chaotic_good } // namespace grpc_core From b4605e661dea70c1921fbf3433aff9f915742bdd Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Thu, 12 Dec 2024 09:01:38 -0800 Subject: [PATCH 14/17] [alts] Reduce logging frequency when the ALTS handshaker service returns an error. (#38257) [Gpr_To_Absl_Logging] Log noise reduction This is in response to a customer complaint. Closes #38257 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38257 from tanvi-jagtap:reduce_log_noise_spanner 0194508dc47877559585b0523d7f3fc31f1bbf50 PiperOrigin-RevId: 705523903 --- src/core/tsi/alts/handshaker/alts_handshaker_client.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc index 9004ad7a93518..e45e1dba55024 100644 --- a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +++ b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc @@ -298,7 +298,7 @@ void alts_handshaker_client_handle_response(alts_handshaker_client* c, if (details.size > 0) { error = absl::StrCat("Status ", code, " from handshaker service: ", absl::string_view(details.data, details.size)); - LOG(ERROR) << error; + LOG_EVERY_N_SEC(INFO, 1) << error; } } // TODO(apolcyn): consider short ciruiting handle_response_done and From 4b87a162bd2f5a811c258a14bcba4f08cabc3d05 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 12 Dec 2024 10:52:47 -0800 Subject: [PATCH 15/17] [dns] Small tweak to readability of dns resolver code (#38253) Closes #38253 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38253 from ctiller:readability 4aa7f5936fecde3039b4b197b553c26449fe1c21 PiperOrigin-RevId: 705559926 --- src/core/resolver/dns/c_ares/dns_resolver_ares.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/resolver/dns/c_ares/dns_resolver_ares.cc index 426ee4acd085b..ec88ce3d778d3 100644 --- a/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/resolver/dns/c_ares/dns_resolver_ares.cc @@ -198,12 +198,12 @@ AresClientChannelDNSResolver::AresClientChannelDNSResolver( ResolverArgs args, Duration min_time_between_resolutions) : PollingResolver(std::move(args), min_time_between_resolutions, BackOff::Options() - .set_initial_backoff(Duration::Milliseconds( - GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS * 1000)) + .set_initial_backoff(Duration::Seconds( + GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS)) .set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER) .set_jitter(GRPC_DNS_RECONNECT_JITTER) - .set_max_backoff(Duration::Milliseconds( - GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)), + .set_max_backoff(Duration::Seconds( + GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS)), &cares_resolver_trace), request_service_config_( !channel_args() From 11b971eea9639d1dd217a5d159f17793bfb74563 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 12 Dec 2024 14:14:10 -0800 Subject: [PATCH 16/17] [atm] Remove gpr_atm_no_barrier_clamped_add (#38263) `gpr_atm_no_barrier_clamped_add` had problems with overflow (adding INTPTR_MAX for instance would not work) Generalize `useful.h` variants, add a `DCHECK` for invalid `Clamp` arguments, remove the buggy `gpr_atm_no_barrier_clamped_add` and replace usages with `std::atomic` usage round the `useful.h` functions. Closes #38263 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38263 from ctiller:rtst ad10505a94d348eee81761a01621b110540b11f7 PiperOrigin-RevId: 705627429 --- CMakeLists.txt | 1 - Makefile | 1 - Package.swift | 1 - build_autogenerated.yaml | 1 - config.m4 | 1 - config.w32 | 1 - fuzztest/core/util/BUILD | 11 +++ fuzztest/core/util/useful_fuzztest.cc | 78 +++++++++++++++++++ gRPC-Core.podspec | 1 - grpc.gemspec | 1 - include/grpc/support/atm.h | 13 ---- package.xml | 1 - src/core/BUILD | 9 +-- src/core/client_channel/retry_throttle.cc | 51 +++++++----- src/core/client_channel/retry_throttle.h | 6 +- src/core/util/atm.cc | 34 -------- src/core/util/useful.h | 20 +++-- src/python/grpcio/grpc_core_dependencies.py | 1 - .../observability_lib_deps.py | 1 - test/core/util/useful_test.cc | 14 ---- tools/doxygen/Doxyfile.c++.internal | 1 - tools/doxygen/Doxyfile.core.internal | 1 - 22 files changed, 136 insertions(+), 113 deletions(-) create mode 100644 fuzztest/core/util/useful_fuzztest.cc delete mode 100644 src/core/util/atm.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f87003724006..5aa53b28b9257 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2056,7 +2056,6 @@ add_library(gpr src/core/config/load_config.cc src/core/lib/event_engine/thread_local.cc src/core/util/alloc.cc - src/core/util/atm.cc src/core/util/crash.cc src/core/util/examine_stack.cc src/core/util/fork.cc diff --git a/Makefile b/Makefile index ad4ef32069438..3d95beed8f506 100644 --- a/Makefile +++ b/Makefile @@ -1425,7 +1425,6 @@ LIBGRPC_SRC = \ src/core/tsi/transport_security.cc \ src/core/tsi/transport_security_grpc.cc \ src/core/util/alloc.cc \ - src/core/util/atm.cc \ src/core/util/backoff.cc \ src/core/util/crash.cc \ src/core/util/dump_args.cc \ diff --git a/Package.swift b/Package.swift index fd636552f411a..77e6bbb4b0202 100644 --- a/Package.swift +++ b/Package.swift @@ -1846,7 +1846,6 @@ let package = Package( "src/core/tsi/transport_security_interface.h", "src/core/util/alloc.cc", "src/core/util/alloc.h", - "src/core/util/atm.cc", "src/core/util/atomic_utils.h", "src/core/util/avl.h", "src/core/util/backoff.cc", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index f56edca2ca40d..45df9d5128eab 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -82,7 +82,6 @@ libs: - src/core/config/load_config.cc - src/core/lib/event_engine/thread_local.cc - src/core/util/alloc.cc - - src/core/util/atm.cc - src/core/util/crash.cc - src/core/util/examine_stack.cc - src/core/util/fork.cc diff --git a/config.m4 b/config.m4 index 50fcd862c8b0f..bbd39a43c0843 100644 --- a/config.m4 +++ b/config.m4 @@ -800,7 +800,6 @@ if test "$PHP_GRPC" != "no"; then src/core/tsi/transport_security.cc \ src/core/tsi/transport_security_grpc.cc \ src/core/util/alloc.cc \ - src/core/util/atm.cc \ src/core/util/backoff.cc \ src/core/util/crash.cc \ src/core/util/dump_args.cc \ diff --git a/config.w32 b/config.w32 index 802858a9f4fc0..7b024a45e6355 100644 --- a/config.w32 +++ b/config.w32 @@ -765,7 +765,6 @@ if (PHP_GRPC != "no") { "src\\core\\tsi\\transport_security.cc " + "src\\core\\tsi\\transport_security_grpc.cc " + "src\\core\\util\\alloc.cc " + - "src\\core\\util\\atm.cc " + "src\\core\\util\\backoff.cc " + "src\\core\\util\\crash.cc " + "src\\core\\util\\dump_args.cc " + diff --git a/fuzztest/core/util/BUILD b/fuzztest/core/util/BUILD index 66fd6f062dc90..1774c8837e56f 100644 --- a/fuzztest/core/util/BUILD +++ b/fuzztest/core/util/BUILD @@ -25,3 +25,14 @@ grpc_fuzz_test( ], deps = ["//src/core:tdigest"], ) + +grpc_fuzz_test( + name = "useful_fuzztest", + srcs = ["useful_fuzztest.cc"], + external_deps = [ + "fuzztest", + "fuzztest_main", + "gtest", + ], + deps = ["//src/core:useful"], +) diff --git a/fuzztest/core/util/useful_fuzztest.cc b/fuzztest/core/util/useful_fuzztest.cc new file mode 100644 index 0000000000000..66a4cb88417fc --- /dev/null +++ b/fuzztest/core/util/useful_fuzztest.cc @@ -0,0 +1,78 @@ +// 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. + +#include +#include +#include +#include + +#include "fuzztest/fuzztest.h" +#include "gtest/gtest.h" +#include "src/core/util/useful.h" + +using fuzztest::InRange; +using fuzztest::VectorOf; + +namespace grpc_core { + +template +void ClampWorks(T value, T min, T max) { + if (max < min) return; // invalid args + T result = Clamp(value, min, max); + EXPECT_LE(result, max); + EXPECT_GE(result, min); +} + +void ClampWorksInt(int value, int min, int max) { ClampWorks(value, min, max); } +FUZZ_TEST(MyTestSuite, ClampWorksInt); +void ClampWorksUint64(uint64_t value, uint64_t min, uint64_t max) { + ClampWorks(value, min, max); +} +FUZZ_TEST(MyTestSuite, ClampWorksUint64); +void ClampWorksUint8(uint8_t value, uint8_t min, uint8_t max) { + ClampWorks(value, min, max); +} +FUZZ_TEST(MyTestSuite, ClampWorksUint8); +void ClampWorksInt8(int8_t value, int8_t min, int8_t max) { + ClampWorks(value, min, max); +} +FUZZ_TEST(MyTestSuite, ClampWorksInt8); + +template +void SaturatingAddWorks(T a, T b) { + T result = SaturatingAdd(a, b); + Bigger expect = Clamp(static_cast(a) + static_cast(b), + std::numeric_limits::min(), + std::numeric_limits::max()); + EXPECT_EQ(result, expect); +} + +void SaturatingAddWorksInt32(int32_t a, int32_t b) { + SaturatingAddWorks(a, b); +} +FUZZ_TEST(MyTestSuite, SaturatingAddWorksInt32); +void SaturatingAddWorksUint32(uint32_t a, uint32_t b) { + SaturatingAddWorks(a, b); +} +FUZZ_TEST(MyTestSuite, SaturatingAddWorksUint32); +void SaturatingAddWorksInt8(int8_t a, int8_t b) { + SaturatingAddWorks(a, b); +} +FUZZ_TEST(MyTestSuite, SaturatingAddWorksInt8); +void SaturatingAddWorksUint8(uint8_t a, uint8_t b) { + SaturatingAddWorks(a, b); +} +FUZZ_TEST(MyTestSuite, SaturatingAddWorksUint8); + +} // namespace grpc_core diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index af626eb895f72..3a1bfd409e574 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1963,7 +1963,6 @@ Pod::Spec.new do |s| 'src/core/tsi/transport_security_interface.h', 'src/core/util/alloc.cc', 'src/core/util/alloc.h', - 'src/core/util/atm.cc', 'src/core/util/atomic_utils.h', 'src/core/util/avl.h', 'src/core/util/backoff.cc', diff --git a/grpc.gemspec b/grpc.gemspec index 248ab706c67ed..481d59c81cd72 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -1848,7 +1848,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/tsi/transport_security_interface.h ) s.files += %w( src/core/util/alloc.cc ) s.files += %w( src/core/util/alloc.h ) - s.files += %w( src/core/util/atm.cc ) s.files += %w( src/core/util/atomic_utils.h ) s.files += %w( src/core/util/avl.h ) s.files += %w( src/core/util/backoff.cc ) diff --git a/include/grpc/support/atm.h b/include/grpc/support/atm.h index 2e8031f2e287f..607046dfca2c5 100644 --- a/include/grpc/support/atm.h +++ b/include/grpc/support/atm.h @@ -79,17 +79,4 @@ #error could not determine platform for atm #endif -#ifdef __cplusplus -extern "C" { -#endif - -/** Adds \a delta to \a *value, clamping the result to the range specified - by \a min and \a max. Returns the new value. */ -gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta, - gpr_atm min, gpr_atm max); - -#ifdef __cplusplus -} -#endif - #endif /* GRPC_SUPPORT_ATM_H */ diff --git a/package.xml b/package.xml index cfaa59c7db852..ec23133e924a2 100644 --- a/package.xml +++ b/package.xml @@ -1830,7 +1830,6 @@ - diff --git a/src/core/BUILD b/src/core/BUILD index 2dd07ce65edaa..9335eb1f22889 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -341,9 +341,6 @@ grpc_cc_library( grpc_cc_library( name = "gpr_atm", - srcs = [ - "util/atm.cc", - ], language = "c++", public_hdrs = [ "//:include/grpc/support/atm.h", @@ -3594,13 +3591,11 @@ grpc_cc_library( hdrs = [ "client_channel/retry_throttle.h", ], - external_deps = [ - "absl/base:core_headers", - ], + external_deps = ["absl/base:core_headers"], language = "c++", deps = [ - "gpr_atm", "ref_counted", + "useful", "//:gpr", "//:ref_counted_ptr", ], diff --git a/src/core/client_channel/retry_throttle.cc b/src/core/client_channel/retry_throttle.cc index a631a8c47dd66..3b00af58f35f1 100644 --- a/src/core/client_channel/retry_throttle.cc +++ b/src/core/client_channel/retry_throttle.cc @@ -18,16 +18,33 @@ #include "src/core/client_channel/retry_throttle.h" -#include #include +#include +#include +#include #include #include #include +#include "src/core/util/useful.h" + namespace grpc_core { namespace internal { +namespace { +template +T ClampedAdd(std::atomic& value, T delta, T min, T max) { + T prev_value = value.load(std::memory_order_relaxed); + T new_value; + do { + new_value = Clamp(SaturatingAdd(prev_value, delta), min, max); + } while (!value.compare_exchange_weak(prev_value, new_value, + std::memory_order_relaxed)); + return new_value; +} +} // namespace + // // ServerRetryThrottleData // @@ -44,26 +61,24 @@ ServerRetryThrottleData::ServerRetryThrottleData( // we will start out doing the same thing on the new one. if (old_throttle_data != nullptr) { double token_fraction = - static_cast( - gpr_atm_acq_load(&old_throttle_data->milli_tokens_)) / + static_cast( + old_throttle_data->milli_tokens_.load(std::memory_order_relaxed)) / static_cast(old_throttle_data->max_milli_tokens_); initial_milli_tokens = static_cast(token_fraction * max_milli_tokens); } - gpr_atm_rel_store(&milli_tokens_, static_cast(initial_milli_tokens)); + milli_tokens_.store(initial_milli_tokens, std::memory_order_relaxed); // If there was a pre-existing entry, mark it as stale and give it a // pointer to the new entry, which is its replacement. if (old_throttle_data != nullptr) { Ref().release(); // Ref held by pre-existing entry. - gpr_atm_rel_store(&old_throttle_data->replacement_, - reinterpret_cast(this)); + old_throttle_data->replacement_.store(this, std::memory_order_release); } } ServerRetryThrottleData::~ServerRetryThrottleData() { ServerRetryThrottleData* replacement = - reinterpret_cast( - gpr_atm_acq_load(&replacement_)); + replacement_.load(std::memory_order_acquire); if (replacement != nullptr) { replacement->Unref(); } @@ -73,8 +88,7 @@ void ServerRetryThrottleData::GetReplacementThrottleDataIfNeeded( ServerRetryThrottleData** throttle_data) { while (true) { ServerRetryThrottleData* new_throttle_data = - reinterpret_cast( - gpr_atm_acq_load(&(*throttle_data)->replacement_)); + (*throttle_data)->replacement_.load(std::memory_order_acquire); if (new_throttle_data == nullptr) return; *throttle_data = new_throttle_data; } @@ -85,10 +99,10 @@ bool ServerRetryThrottleData::RecordFailure() { ServerRetryThrottleData* throttle_data = this; GetReplacementThrottleDataIfNeeded(&throttle_data); // We decrement milli_tokens by 1000 (1 token) for each failure. - const uintptr_t new_value = - static_cast(gpr_atm_no_barrier_clamped_add( - &throttle_data->milli_tokens_, gpr_atm{-1000}, gpr_atm{0}, - static_cast(throttle_data->max_milli_tokens_))); + const uintptr_t new_value = ClampedAdd( + throttle_data->milli_tokens_, -1000, 0, + std::min(throttle_data->max_milli_tokens_, + std::numeric_limits::max())); // Retries are allowed as long as the new value is above the threshold // (max_milli_tokens / 2). return new_value > throttle_data->max_milli_tokens_ / 2; @@ -99,10 +113,11 @@ void ServerRetryThrottleData::RecordSuccess() { ServerRetryThrottleData* throttle_data = this; GetReplacementThrottleDataIfNeeded(&throttle_data); // We increment milli_tokens by milli_token_ratio for each success. - gpr_atm_no_barrier_clamped_add( - &throttle_data->milli_tokens_, - static_cast(throttle_data->milli_token_ratio_), gpr_atm{0}, - static_cast(throttle_data->max_milli_tokens_)); + ClampedAdd( + throttle_data->milli_tokens_, throttle_data->milli_token_ratio_, 0, + std::max( + 0, std::min(throttle_data->max_milli_tokens_, + std::numeric_limits::max()))); } // diff --git a/src/core/client_channel/retry_throttle.h b/src/core/client_channel/retry_throttle.h index fd01471d673eb..4fc6fca24edb1 100644 --- a/src/core/client_channel/retry_throttle.h +++ b/src/core/client_channel/retry_throttle.h @@ -19,10 +19,10 @@ #ifndef GRPC_SRC_CORE_CLIENT_CHANNEL_RETRY_THROTTLE_H #define GRPC_SRC_CORE_CLIENT_CHANNEL_RETRY_THROTTLE_H -#include #include #include +#include #include #include @@ -58,11 +58,11 @@ class ServerRetryThrottleData final const uintptr_t max_milli_tokens_; const uintptr_t milli_token_ratio_; - gpr_atm milli_tokens_; + std::atomic milli_tokens_; // A pointer to the replacement for this ServerRetryThrottleData entry. // If non-nullptr, then this entry is stale and must not be used. // We hold a reference to the replacement. - gpr_atm replacement_ = 0; + std::atomic replacement_{nullptr}; }; /// Global map of server name to retry throttle data. diff --git a/src/core/util/atm.cc b/src/core/util/atm.cc deleted file mode 100644 index 536163c110d08..0000000000000 --- a/src/core/util/atm.cc +++ /dev/null @@ -1,34 +0,0 @@ -// -// -// 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. -// -// - -#include -#include - -#include "src/core/util/useful.h" - -gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta, - gpr_atm min, gpr_atm max) { - gpr_atm current_value; - gpr_atm new_value; - do { - current_value = gpr_atm_no_barrier_load(value); - new_value = grpc_core::Clamp(current_value + delta, min, max); - if (new_value == current_value) break; - } while (!gpr_atm_no_barrier_cas(value, current_value, new_value)); - return new_value; -} diff --git a/src/core/util/useful.h b/src/core/util/useful.h index 8007c4ca334b0..11412b6f3aaae 100644 --- a/src/core/util/useful.h +++ b/src/core/util/useful.h @@ -1,5 +1,3 @@ -// -// // Copyright 2015 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,8 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// -// #ifndef GRPC_SRC_CORE_UTIL_USEFUL_H #define GRPC_SRC_CORE_UTIL_USEFUL_H @@ -22,6 +18,7 @@ #include #include +#include #include "absl/log/check.h" #include "absl/numeric/bits.h" @@ -103,15 +100,16 @@ constexpr size_t HashPointer(T* p, size_t range) { } // Compute a+b. -// If the result is greater than INT64_MAX, return INT64_MAX. -// If the result is less than INT64_MIN, return INT64_MIN. -inline int64_t SaturatingAdd(int64_t a, int64_t b) { +// If the result is greater than MAX, return MAX. +// If the result is less than MIN, return MIN. +template +inline T SaturatingAdd(T a, T b) { if (a > 0) { - if (b > INT64_MAX - a) { - return INT64_MAX; + if (b > std::numeric_limits::max() - a) { + return std::numeric_limits::max(); } - } else if (b < INT64_MIN - a) { - return INT64_MIN; + } else if (b < std::numeric_limits::min() - a) { + return std::numeric_limits::min(); } return a + b; } diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 3f255bbe8f86d..bd812614e13ef 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -774,7 +774,6 @@ 'src/core/tsi/transport_security.cc', 'src/core/tsi/transport_security_grpc.cc', 'src/core/util/alloc.cc', - 'src/core/util/atm.cc', 'src/core/util/backoff.cc', 'src/core/util/crash.cc', 'src/core/util/dump_args.cc', diff --git a/src/python/grpcio_observability/observability_lib_deps.py b/src/python/grpcio_observability/observability_lib_deps.py index dc1cdba7c8f64..675f6496d45ca 100644 --- a/src/python/grpcio_observability/observability_lib_deps.py +++ b/src/python/grpcio_observability/observability_lib_deps.py @@ -26,7 +26,6 @@ 'grpc_root/src/core/lib/slice/slice.cc', 'grpc_root/src/core/lib/slice/slice_string_helpers.cc', 'grpc_root/src/core/util/alloc.cc', - 'grpc_root/src/core/util/atm.cc', 'grpc_root/src/core/util/crash.cc', 'grpc_root/src/core/util/examine_stack.cc', 'grpc_root/src/core/util/fork.cc', diff --git a/test/core/util/useful_test.cc b/test/core/util/useful_test.cc index 8efecba0adbdd..235d87c0954c3 100644 --- a/test/core/util/useful_test.cc +++ b/test/core/util/useful_test.cc @@ -54,20 +54,6 @@ TEST(UsefulTest, BitOps) { EXPECT_EQ(GetBit(bitset, 3), 0); } -TEST(UsefulTest, SaturatingAdd) { - EXPECT_EQ(SaturatingAdd(0, 0), 0); - EXPECT_EQ(SaturatingAdd(0, 1), 1); - EXPECT_EQ(SaturatingAdd(1, 0), 1); - EXPECT_EQ(SaturatingAdd(1, 1), 2); - EXPECT_EQ(SaturatingAdd(std::numeric_limits::max(), 1), - std::numeric_limits::max()); - EXPECT_EQ(SaturatingAdd(std::numeric_limits::max(), - std::numeric_limits::max()), - std::numeric_limits::max()); - EXPECT_EQ(SaturatingAdd(std::numeric_limits::min(), -1), - std::numeric_limits::min()); -} - TEST(UsefulTest, RoundUpToPowerOf2) { EXPECT_EQ(RoundUpToPowerOf2(0), 0); EXPECT_EQ(RoundUpToPowerOf2(1), 1); diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 839b734d205a3..aed4754839d9f 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -2813,7 +2813,6 @@ src/core/tsi/transport_security_grpc.h \ src/core/tsi/transport_security_interface.h \ src/core/util/alloc.cc \ src/core/util/alloc.h \ -src/core/util/atm.cc \ src/core/util/atomic_utils.h \ src/core/util/avl.h \ src/core/util/backoff.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 167c45a874cf5..32fe7beb2ed91 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -2629,7 +2629,6 @@ src/core/tsi/transport_security_interface.h \ src/core/util/README.md \ src/core/util/alloc.cc \ src/core/util/alloc.h \ -src/core/util/atm.cc \ src/core/util/atomic_utils.h \ src/core/util/avl.h \ src/core/util/backoff.cc \ From 4e0c1d45f7a3d48fdfef3326ee6bd9882d050473 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 12 Dec 2024 16:17:14 -0800 Subject: [PATCH 17/17] [xDS-enabled server] fix status code when RDS resource doesn't exist (#38277) When the RDS resource is not found, the xDS-enabled gRPC server was returning status NOT_FOUND for data plane RPCs. That code should never be generated by gRPC itself, as per https://github.com/grpc/grpc/blob/master/doc/statuscodes.md. This PR changes it to return UNAVAILABLE in this case instead. Closes #38277 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38277 from markdroth:xds_server_rds_does_not_exist_status_code_fix d852c283b41ac7ef58cacee7bdab2a357535330d PiperOrigin-RevId: 705664077 --- src/core/server/xds_server_config_fetcher.cc | 4 ++-- test/cpp/end2end/xds/xds_end2end_test.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/server/xds_server_config_fetcher.cc b/src/core/server/xds_server_config_fetcher.cc index b7644d1148800..d3f0ef4525e5b 100644 --- a/src/core/server/xds_server_config_fetcher.cc +++ b/src/core/server/xds_server_config_fetcher.cc @@ -899,7 +899,7 @@ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager:: } } state.rds_update = - absl::NotFoundError("Requested route config does not exist"); + absl::UnavailableError("Requested route config does not exist"); } // Promote the filter chain match manager object if all the referenced // resources are fetched. @@ -1342,7 +1342,7 @@ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager:: void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager:: DynamicXdsServerConfigSelectorProvider::OnResourceDoesNotExist() { MutexLock lock(&mu_); - resource_ = absl::NotFoundError("Requested route config does not exist"); + resource_ = absl::UnavailableError("Requested route config does not exist"); if (watcher_ == nullptr) { return; } diff --git a/test/cpp/end2end/xds/xds_end2end_test.cc b/test/cpp/end2end/xds/xds_end2end_test.cc index a4d724e9fd592..577e6bfbb0e13 100644 --- a/test/cpp/end2end/xds/xds_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_end2end_test.cc @@ -2125,7 +2125,7 @@ TEST_P(XdsServerRdsTest, NonInlineRouteConfigurationNotAvailable) { ASSERT_TRUE(backends_[0]->notifier()->WaitOnServingStatusChange( grpc_core::LocalIpAndPort(backends_[0]->port()), grpc::StatusCode::OK)); SendRpc([this]() { return CreateInsecureChannel(); }, RpcOptions(), {}, {}, - true /* test_expects_failure */, grpc::StatusCode::NOT_FOUND, + true /* test_expects_failure */, grpc::StatusCode::UNAVAILABLE, "Requested route config does not exist"); }