From 9bed17b987bf72382a98c9f9bf13e33a8c37cbaf Mon Sep 17 00:00:00 2001 From: Takashi Matsuo Date: Wed, 27 Nov 2019 14:05:30 -0800 Subject: [PATCH 001/129] feat: add x-goog-user-project header from quota_project field --- .../lib/security/credentials/credentials.h | 1 + .../credentials/oauth2/oauth2_credentials.cc | 19 +++++++++ .../credentials/oauth2/oauth2_credentials.h | 10 ++++- .../security/transport/client_auth_filter.cc | 14 +++++-- src/core/lib/transport/metadata_batch.cc | 13 ++++++ src/core/lib/transport/metadata_batch.h | 11 +++++ test/core/security/credentials_test.cc | 40 ++++++++++++++++++- test/core/security/json_token_test.cc | 31 ++++++++++++++ 8 files changed, 133 insertions(+), 6 deletions(-) diff --git a/src/core/lib/security/credentials/credentials.h b/src/core/lib/security/credentials/credentials.h index 65996fd09e4..e68462d077f 100644 --- a/src/core/lib/security/credentials/credentials.h +++ b/src/core/lib/security/credentials/credentials.h @@ -56,6 +56,7 @@ typedef enum { #define GRPC_CALL_CREDENTIALS_TYPE_COMPOSITE "Composite" #define GRPC_AUTHORIZATION_METADATA_KEY "authorization" +#define GRPC_AUTH_QUOTA_PROJECT_METADATA_KEY "x-goog-user-project" #define GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY \ "x-goog-iam-authorization-token" #define GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY "x-goog-iam-authority-selector" diff --git a/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc b/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc index 1dadc01fb86..8654a561c15 100644 --- a/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +++ b/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc @@ -72,6 +72,9 @@ grpc_auth_refresh_token grpc_auth_refresh_token_create_from_json( } result.type = GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER; + // quota_project_id is optional, so we don't check the result of the copy. + grpc_copy_json_string_property(json, "quota_project_id", + &result.quota_project_id); if (!grpc_copy_json_string_property(json, "client_secret", &result.client_secret) || !grpc_copy_json_string_property(json, "client_id", &result.client_id) || @@ -112,6 +115,10 @@ void grpc_auth_refresh_token_destruct(grpc_auth_refresh_token* refresh_token) { gpr_free(refresh_token->refresh_token); refresh_token->refresh_token = nullptr; } + if (refresh_token->quota_project_id != nullptr) { + gpr_free(refresh_token->quota_project_id); + refresh_token->quota_project_id = nullptr; + } } // @@ -273,6 +280,7 @@ bool grpc_oauth2_token_fetcher_credentials::get_request_metadata( grpc_polling_entity* pollent, grpc_auth_metadata_context /*context*/, grpc_credentials_mdelem_array* md_array, grpc_closure* on_request_metadata, grpc_error** /*error*/) { + maybe_add_additional_metadata(md_array); // Check if we can use the cached token. grpc_millis refresh_threshold = GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS * GPR_MS_PER_SEC; @@ -450,6 +458,17 @@ void grpc_google_refresh_token_credentials::fetch_oauth2( gpr_free(body); } +void grpc_google_refresh_token_credentials::maybe_add_additional_metadata( + grpc_credentials_mdelem_array* md_array) { + if (refresh_token_.quota_project_id != nullptr) { + grpc_mdelem quota_project_md = grpc_mdelem_from_slices( + grpc_core::ExternallyManagedSlice(GRPC_AUTH_QUOTA_PROJECT_METADATA_KEY), + grpc_core::ExternallyManagedSlice(refresh_token_.quota_project_id)); + grpc_credentials_mdelem_array_add(md_array, quota_project_md); + GRPC_MDELEM_UNREF(quota_project_md); + } +} + grpc_google_refresh_token_credentials::grpc_google_refresh_token_credentials( grpc_auth_refresh_token refresh_token) : refresh_token_(refresh_token) {} diff --git a/src/core/lib/security/credentials/oauth2/oauth2_credentials.h b/src/core/lib/security/credentials/oauth2/oauth2_credentials.h index ba07ee04ee7..1dfda318d47 100644 --- a/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +++ b/src/core/lib/security/credentials/oauth2/oauth2_credentials.h @@ -32,12 +32,13 @@ "s&subject_token_type=%s" // auth_refresh_token parsing. -typedef struct { +struct grpc_auth_refresh_token { const char* type; char* client_id; char* client_secret; char* refresh_token; -} grpc_auth_refresh_token; + char* quota_project_id = nullptr; +}; /// Returns 1 if the object is valid, 0 otherwise. int grpc_auth_refresh_token_is_valid( @@ -90,6 +91,9 @@ class grpc_oauth2_token_fetcher_credentials : public grpc_call_credentials { grpc_httpcli_context* httpcli_context, grpc_polling_entity* pollent, grpc_iomgr_cb_func cb, grpc_millis deadline) = 0; + // Sub class may override this for adding additional metadata other than + // credentials itself. + virtual void maybe_add_additional_metadata(grpc_credentials_mdelem_array*) {} private: gpr_mu mu_; @@ -117,6 +121,8 @@ class grpc_google_refresh_token_credentials final grpc_httpcli_context* httpcli_context, grpc_polling_entity* pollent, grpc_iomgr_cb_func cb, grpc_millis deadline) override; + void maybe_add_additional_metadata( + grpc_credentials_mdelem_array* md_array) override; private: grpc_auth_refresh_token refresh_token_; diff --git a/src/core/lib/security/transport/client_auth_filter.cc b/src/core/lib/security/transport/client_auth_filter.cc index c3658a99d2e..6ed363ba8fe 100644 --- a/src/core/lib/security/transport/client_auth_filter.cc +++ b/src/core/lib/security/transport/client_auth_filter.cc @@ -165,9 +165,17 @@ static void on_credentials_metadata(void* arg, grpc_error* input_error) { grpc_metadata_batch* mdb = batch->payload->send_initial_metadata.send_initial_metadata; for (size_t i = 0; i < calld->md_array.size; ++i) { - add_error(&error, grpc_metadata_batch_add_tail( - mdb, &calld->md_links[i], - GRPC_MDELEM_REF(calld->md_array.md[i]))); + // Only add x-goog-user-project header if not present. + if (grpc_slice_str_cmp(GRPC_MDKEY(calld->md_array.md[i]), + GRPC_AUTH_QUOTA_PROJECT_METADATA_KEY) == 0) { + add_error(&error, grpc_metadata_batch_add_tail_when_key_not_exist( + mdb, &calld->md_links[i], + GRPC_MDELEM_REF(calld->md_array.md[i]))); + } else { + add_error(&error, grpc_metadata_batch_add_tail( + mdb, &calld->md_links[i], + GRPC_MDELEM_REF(calld->md_array.md[i]))); + } } } if (error == GRPC_ERROR_NONE) { diff --git a/src/core/lib/transport/metadata_batch.cc b/src/core/lib/transport/metadata_batch.cc index 66749b671c7..fc7c382e916 100644 --- a/src/core/lib/transport/metadata_batch.cc +++ b/src/core/lib/transport/metadata_batch.cc @@ -205,6 +205,19 @@ grpc_error* grpc_metadata_batch_add_tail(grpc_metadata_batch* batch, return grpc_metadata_batch_link_tail(batch, storage); } +grpc_error* grpc_metadata_batch_add_tail_when_key_not_exist( + grpc_metadata_batch* batch, grpc_linked_mdelem* storage, + grpc_mdelem elem_to_add) { + auto cur = batch->list.head; + while (cur != nullptr) { + if (grpc_slice_cmp(GRPC_MDKEY(cur->md), GRPC_MDKEY(elem_to_add)) == 0) { + // We already have the same key, just returning. + return GRPC_ERROR_NONE; + } + } + return grpc_metadata_batch_add_tail(batch, storage, elem_to_add); +} + static void link_tail(grpc_mdelem_list* list, grpc_linked_mdelem* storage) { assert_valid_list(list); GPR_DEBUG_ASSERT(!GRPC_MDISNULL(storage->md)); diff --git a/src/core/lib/transport/metadata_batch.h b/src/core/lib/transport/metadata_batch.h index 46a437e4f1b..4ef4654d141 100644 --- a/src/core/lib/transport/metadata_batch.h +++ b/src/core/lib/transport/metadata_batch.h @@ -138,6 +138,17 @@ grpc_error* grpc_metadata_batch_add_tail( grpc_metadata_batch* batch, grpc_linked_mdelem* storage, grpc_mdelem elem_to_add) GRPC_MUST_USE_RESULT; +/** Add \a elem_to_add as the last element in \a batch, only + when the current batch doesn't have the same key in the + given element, using \a storage as backing storage for the + linked list element. \a storage is owned by the caller + and must survive for the lifetime of batch. This usually + means it should be around for the lifetime of the call. + Takes ownership of \a elem_to_add */ +grpc_error* grpc_metadata_batch_add_tail_when_key_not_exist( + grpc_metadata_batch* batch, grpc_linked_mdelem* storage, + grpc_mdelem elem_to_add) GRPC_MUST_USE_RESULT; + inline grpc_error* GRPC_MUST_USE_RESULT grpc_metadata_batch_add_tail( grpc_metadata_batch* batch, grpc_linked_mdelem* storage, grpc_metadata_batch_callouts_index idx) { diff --git a/test/core/security/credentials_test.cc b/test/core/security/credentials_test.cc index d86d3c950f6..a01eba17e86 100644 --- a/test/core/security/credentials_test.cc +++ b/test/core/security/credentials_test.cc @@ -97,6 +97,13 @@ static const char test_refresh_token_str[] = " \"refresh_token\": \"1/Blahblasj424jladJDSGNf-u4Sua3HDA2ngjd42\"," " \"type\": \"authorized_user\"}"; +static const char test_refresh_token_with_quota_project_id_str[] = + "{ \"client_id\": \"32555999999.apps.googleusercontent.com\"," + " \"client_secret\": \"EmssLNjJy1332hD4KFsecret\"," + " \"refresh_token\": \"1/Blahblasj424jladJDSGNf-u4Sua3HDA2ngjd42\"," + " \"quota_project_id\": \"my-quota-project-id\"," + " \"type\": \"authorized_user\"}"; + static const char valid_oauth2_json_response[] = "{\"access_token\":\"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_\"," " \"expires_in\":3599, " @@ -713,7 +720,37 @@ static void test_refresh_token_creds_success(void) { /* Check security level. */ GPR_ASSERT(creds->min_security_level() == GRPC_PRIVACY_AND_INTEGRITY); - /* First request: http put should be called. */ + /* First request: http post should be called. */ + request_metadata_state* state = + make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); + grpc_httpcli_set_override(httpcli_get_should_not_be_called, + refresh_token_httpcli_post_success); + run_request_metadata_test(creds, auth_md_ctx, state); + grpc_core::ExecCtx::Get()->Flush(); + + /* Second request: the cached token should be served directly. */ + state = + make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); + grpc_httpcli_set_override(httpcli_get_should_not_be_called, + httpcli_post_should_not_be_called); + run_request_metadata_test(creds, auth_md_ctx, state); + grpc_core::ExecCtx::Get()->Flush(); + + creds->Unref(); + grpc_httpcli_set_override(nullptr, nullptr); +} + +static void test_refresh_token_with_quota_project_id_creds_success(void) { + grpc_core::ExecCtx exec_ctx; + expected_md emd[] = { + {"authorization", "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_"}, + {"x-goog-user-project", "my-quota-project-id"}}; + grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, + nullptr, nullptr}; + grpc_call_credentials* creds = grpc_google_refresh_token_credentials_create( + test_refresh_token_with_quota_project_id_str, nullptr); + + /* First request: http post should be called. */ request_metadata_state* state = make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd)); grpc_httpcli_set_override(httpcli_get_should_not_be_called, @@ -1620,6 +1657,7 @@ int main(int argc, char** argv) { test_compute_engine_creds_success(); test_compute_engine_creds_failure(); test_refresh_token_creds_success(); + test_refresh_token_with_quota_project_id_creds_success(); test_refresh_token_creds_failure(); test_valid_sts_creds_options(); test_invalid_sts_creds_options(); diff --git a/test/core/security/json_token_test.cc b/test/core/security/json_token_test.cc index a3ae18e6abd..8d26d7e70e3 100644 --- a/test/core/security/json_token_test.cc +++ b/test/core/security/json_token_test.cc @@ -73,6 +73,13 @@ static const char test_refresh_token_str[] = " \"refresh_token\": \"1/Blahblasj424jladJDSGNf-u4Sua3HDA2ngjd42\"," " \"type\": \"authorized_user\"}"; +static const char test_refresh_token_with_quota_project_id_str[] = + "{ \"client_id\": \"32555999999.apps.googleusercontent.com\"," + " \"client_secret\": \"EmssLNjJy1332hD4KFsecret\"," + " \"refresh_token\": \"1/Blahblasj424jladJDSGNf-u4Sua3HDA2ngjd42\"," + " \"quota_project_id\": \"my-quota-project-id\"," + " \"type\": \"authorized_user\"}"; + static const char test_scope[] = "myperm1 myperm2"; static const char test_service_url[] = "https://foo.com/foo.v1"; @@ -438,6 +445,29 @@ static void test_parse_refresh_token_success(void) { GPR_ASSERT(refresh_token.refresh_token != nullptr && (strcmp(refresh_token.refresh_token, "1/Blahblasj424jladJDSGNf-u4Sua3HDA2ngjd42") == 0)); + GPR_ASSERT(refresh_token.quota_project_id == nullptr); + grpc_auth_refresh_token_destruct(&refresh_token); +} + +static void test_parse_refresh_token_with_quota_project_id_success(void) { + grpc_auth_refresh_token refresh_token = + grpc_auth_refresh_token_create_from_string( + test_refresh_token_with_quota_project_id_str); + GPR_ASSERT(grpc_auth_refresh_token_is_valid(&refresh_token)); + GPR_ASSERT(refresh_token.type != nullptr && + (strcmp(refresh_token.type, "authorized_user") == 0)); + GPR_ASSERT(refresh_token.client_id != nullptr && + (strcmp(refresh_token.client_id, + "32555999999.apps.googleusercontent.com") == 0)); + GPR_ASSERT( + refresh_token.client_secret != nullptr && + (strcmp(refresh_token.client_secret, "EmssLNjJy1332hD4KFsecret") == 0)); + GPR_ASSERT(refresh_token.refresh_token != nullptr && + (strcmp(refresh_token.refresh_token, + "1/Blahblasj424jladJDSGNf-u4Sua3HDA2ngjd42") == 0)); + GPR_ASSERT( + refresh_token.quota_project_id != nullptr && + (strcmp(refresh_token.quota_project_id, "my-quota-project-id") == 0)); grpc_auth_refresh_token_destruct(&refresh_token); } @@ -494,6 +524,7 @@ int main(int argc, char** argv) { test_service_account_creds_jwt_encode_and_sign(); test_jwt_creds_jwt_encode_and_sign(); test_parse_refresh_token_success(); + test_parse_refresh_token_with_quota_project_id_success(); test_parse_refresh_token_failure_no_type(); test_parse_refresh_token_failure_no_client_id(); test_parse_refresh_token_failure_no_client_secret(); From 0c4af58accb73b7913ed97a4cf7535d2ba266bfc Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 3 Feb 2020 18:30:00 -0800 Subject: [PATCH 002/129] Add test and fake LRU cache interface --- .gitignore | 6 +- src/python/grpcio/grpc/BUILD.bazel | 6 ++ src/python/grpcio/grpc/__init__.py | 6 ++ src/python/grpcio/grpc/_simple_stubs.py | 46 +++++++++++++ src/python/grpcio_tests/tests/tests.json | 1 + .../grpcio_tests/tests/unit/BUILD.bazel | 1 + .../tests/unit/_simple_stubs_test.py | 65 +++++++++++++++++++ 7 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 src/python/grpcio/grpc/_simple_stubs.py create mode 100644 src/python/grpcio_tests/tests/unit/_simple_stubs_test.py diff --git a/.gitignore b/.gitignore index 63aeb4b8f8e..bd9a5139fe2 100644 --- a/.gitignore +++ b/.gitignore @@ -115,11 +115,7 @@ Podfile.lock .idea/ # Bazel files -bazel-bin -bazel-genfiles -bazel-grpc -bazel-out -bazel-testlogs +bazel-* bazel_format_virtual_environment/ tools/bazel-* diff --git a/src/python/grpcio/grpc/BUILD.bazel b/src/python/grpcio/grpc/BUILD.bazel index dfcceb36571..26279d11661 100644 --- a/src/python/grpcio/grpc/BUILD.bazel +++ b/src/python/grpcio/grpc/BUILD.bazel @@ -15,6 +15,7 @@ py_library( ":interceptor", ":server", ":compression", + ":_simple_stubs", "//src/python/grpcio/grpc/_cython:cygrpc", "//src/python/grpcio/grpc/experimental", "//src/python/grpcio/grpc/framework", @@ -85,3 +86,8 @@ py_library( ":common", ], ) + +py_library( + name = "_simple_stubs", + srcs = ["_simple_stubs.py"], +) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 478c615418e..9d7b701a8d7 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1949,6 +1949,7 @@ def server(thread_pool, maximum_concurrent_rpcs, compression) + @contextlib.contextmanager def _create_servicer_context(rpc_event, state, request_deserializer): from grpc import _server # pylint: disable=cyclic-import @@ -2031,8 +2032,13 @@ __all__ = ( 'secure_channel', 'intercept_channel', 'server', + 'unary_unary', ) +if sys.version_info[0] > 2: + from grpc._simple_stubs import unary_unary + __all__ = __all__ + (unary_unary,) + ############################### Extension Shims ################################ # Here to maintain backwards compatibility; avoid using these in new code! diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py new file mode 100644 index 00000000000..4b8b928366f --- /dev/null +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -0,0 +1,46 @@ +# TODO: Flowerbox. + +import grpc +from typing import Any, Callable, Optional, Sequence, Text, Tuple, Union + + +def _get_cached_channel(target: Text, + options: Sequence[Tuple[Text, Text]], + channel_credentials: Optional[grpc.ChannelCredentials], + compression: Optional[grpc.Compression]) -> grpc.Channel: + # TODO: Actually cache. + if channel_credentials is None: + return grpc.insecure_channel(target, + options=options, + compression=compression) + else: + return grpc.secure_channel(target, + credentials=channel_credentials, + options=options, + compression=compression) + +def unary_unary(request: Any, + target: Text, + method: Text, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[Text, Text]] = (), + # TODO: Somehow make insecure_channel opt-in, not the default. + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + metadata: Optional[Sequence[Tuple[Text, Union[Text, bytes]]]] = None) -> Any: + """Invokes a unary RPC without an explicitly specified channel. + + This is backed by an LRU cache of channels evicted by a background thread + on a periodic basis. + + TODO: Document the parameters and return value. + """ + channel = _get_cached_channel(target, options, channel_credentials, compression) + multicallable = channel.unary_unary(method, request_serializer, request_deserializer) + return multicallable(request, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials) diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index eb702f6c8b0..94e5123e40c 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -70,6 +70,7 @@ "unit._server_test.ServerTest", "unit._server_wait_for_termination_test.ServerWaitForTerminationTest", "unit._session_cache_test.SSLSessionCacheTest", + "unit._simple_stubs_test.SimpleStubsTest", "unit._signal_handling_test.SignalHandlingTest", "unit._version_test.VersionTest", "unit.beta._beta_features_test.BetaFeaturesTest", diff --git a/src/python/grpcio_tests/tests/unit/BUILD.bazel b/src/python/grpcio_tests/tests/unit/BUILD.bazel index 42b99023463..a4ac8bb3ef0 100644 --- a/src/python/grpcio_tests/tests/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/BUILD.bazel @@ -32,6 +32,7 @@ GRPCIO_TESTS_UNIT = [ "_resource_exhausted_test.py", "_rpc_test.py", "_signal_handling_test.py", + "_simple_stubs_test.py", # TODO(ghostwriternr): To be added later. # "_server_ssl_cert_config_test.py", "_server_test.py", diff --git a/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py new file mode 100644 index 00000000000..26d0a0b9b7b --- /dev/null +++ b/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py @@ -0,0 +1,65 @@ +# Copyright 2020 The 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. +"""Tests for Simple Stubs.""" + +import unittest +import sys + +import logging + +import grpc +import test_common + + +_UNARY_UNARY = "/test/UnaryUnary" + + +def _unary_unary_handler(request, context): + return request + + +class _GenericHandler(grpc.GenericRpcHandler): + def service(self, handler_call_details): + if handler_call_details.method == _UNARY_UNARY: + return grpc.unary_unary_rpc_method_handler(_unary_unary_handler) + else: + raise NotImplementedError() + + +@unittest.skipIf(sys.version_info[0] < 3, "Unsupported on Python 2.") +class SimpleStubsTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + super(SimpleStubsTest, cls).setUpClass() + cls._server = test_common.test_server() + cls._port = cls._server.add_insecure_port('[::]:0') + cls._server.add_generic_rpc_handlers((_GenericHandler(),)) + cls._server.start() + + @classmethod + def tearDownClass(cls): + cls._server.stop(None) + super(SimpleStubsTest, cls).tearDownClass() + + def test_unary_unary(self): + target = f'localhost:{self._port}' + request = b'0000' + response = grpc.unary_unary(request, target, _UNARY_UNARY) + self.assertEqual(request, response) + +if __name__ == "__main__": + logging.basicConfig() + unittest.main(verbosity=2) + + From 5a8a6e3ad3216bcaecc2ece276879a5bdd733f94 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 4 Feb 2020 12:34:34 -0800 Subject: [PATCH 003/129] Add thread-safe channel cache. Test that it actually caches --- src/python/grpcio/grpc/_simple_stubs.py | 38 +++++- .../tests/unit/_simple_stubs_test.py | 113 +++++++++++++++--- 2 files changed, 128 insertions(+), 23 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 4b8b928366f..245bbf6596a 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -1,14 +1,22 @@ # TODO: Flowerbox. +import threading + import grpc from typing import Any, Callable, Optional, Sequence, Text, Tuple, Union +_CHANNEL_CACHE = None +_CHANNEL_CACHE_LOCK = threading.RLock() -def _get_cached_channel(target: Text, - options: Sequence[Tuple[Text, Text]], - channel_credentials: Optional[grpc.ChannelCredentials], - compression: Optional[grpc.Compression]) -> grpc.Channel: - # TODO: Actually cache. +# TODO: Evict channels. + +# Eviction policy based on both channel count and time since use. Perhaps +# OrderedDict instead? + +def _create_channel(target: Text, + options: Sequence[Tuple[Text, Text]], + channel_credentials: Optional[grpc.ChannelCredentials], + compression: Optional[grpc.Compression]) -> grpc.Channel: if channel_credentials is None: return grpc.insecure_channel(target, options=options, @@ -19,6 +27,26 @@ def _get_cached_channel(target: Text, options=options, compression=compression) + +def _get_cached_channel(target: Text, + options: Sequence[Tuple[Text, Text]], + channel_credentials: Optional[grpc.ChannelCredentials], + compression: Optional[grpc.Compression]) -> grpc.Channel: + global _CHANNEL_CACHE + global _CHANNEL_CACHE_LOCK + key = (target, options, channel_credentials, compression) + with _CHANNEL_CACHE_LOCK: + if _CHANNEL_CACHE is None: + _CHANNEL_CACHE = {} + channel = _CHANNEL_CACHE.get(key, None) + if channel is not None: + return channel + else: + channel = _create_channel(target, options, channel_credentials, compression) + _CHANNEL_CACHE[key] = channel + return channel + + def unary_unary(request: Any, target: Text, method: Text, diff --git a/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py index 26d0a0b9b7b..4a380afa054 100644 --- a/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py @@ -13,14 +13,24 @@ # limitations under the License. """Tests for Simple Stubs.""" +import contextlib +import datetime +import inspect import unittest import sys +import time import logging import grpc import test_common +# TODO: Figure out how to get this test to run only for Python 3. +from typing import Callable, Optional + +_CACHE_EPOCHS = 8 +_CACHE_TRIALS = 6 + _UNARY_UNARY = "/test/UnaryUnary" @@ -37,26 +47,93 @@ class _GenericHandler(grpc.GenericRpcHandler): raise NotImplementedError() +def _time_invocation(to_time: Callable[[], None]) -> datetime.timedelta: + start = datetime.datetime.now() + to_time() + return datetime.datetime.now() - start + + +@contextlib.contextmanager +def _server(credentials: Optional[grpc.ServerCredentials]): + try: + server = test_common.test_server() + target = '[::]:0' + if credentials is None: + port = server.add_insecure_port(target) + else: + port = server.add_secure_port(target, credentials) + server.add_generic_rpc_handlers((_GenericHandler(),)) + server.start() + yield server, port + finally: + server.stop(None) + + @unittest.skipIf(sys.version_info[0] < 3, "Unsupported on Python 2.") class SimpleStubsTest(unittest.TestCase): - @classmethod - def setUpClass(cls): - super(SimpleStubsTest, cls).setUpClass() - cls._server = test_common.test_server() - cls._port = cls._server.add_insecure_port('[::]:0') - cls._server.add_generic_rpc_handlers((_GenericHandler(),)) - cls._server.start() - - @classmethod - def tearDownClass(cls): - cls._server.stop(None) - super(SimpleStubsTest, cls).tearDownClass() - - def test_unary_unary(self): - target = f'localhost:{self._port}' - request = b'0000' - response = grpc.unary_unary(request, target, _UNARY_UNARY) - self.assertEqual(request, response) + + def assert_cached(self, to_check: Callable[[str], None]) -> None: + """Asserts that a function caches intermediate data/state. + + To be specific, given a function whose caching behavior is + deterministic in the value of a supplied string, this function asserts + that, on average, subsequent invocations of the function for a specific + string are faster than first invocations with that same string. + + Args: + to_check: A function returning nothing, that caches values based on + an arbitrary supplied Text object. + """ + initial_runs = [] + cached_runs = [] + for epoch in range(_CACHE_EPOCHS): + runs = [] + text = str(epoch) + for trial in range(_CACHE_TRIALS): + runs.append(_time_invocation(lambda: to_check(text))) + initial_runs.append(runs[0]) + cached_runs.extend(runs[1:]) + average_cold = sum((run for run in initial_runs), datetime.timedelta()) / len(initial_runs) + average_warm = sum((run for run in cached_runs), datetime.timedelta()) / len(cached_runs) + self.assertLess(average_warm, average_cold) + + def test_unary_unary_insecure(self): + with _server(None) as (_, port): + target = f'localhost:{port}' + request = b'0000' + response = grpc.unary_unary(request, target, _UNARY_UNARY) + self.assertEqual(request, response) + + def test_unary_unary_secure(self): + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + request = b'0000' + response = grpc.unary_unary(request, + target, + _UNARY_UNARY, + channel_credentials=grpc.local_channel_credentials()) + self.assertEqual(request, response) + + def test_channels_cached(self): + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + request = b'0000' + test_name = inspect.stack()[0][3] + args = (request, target, _UNARY_UNARY) + kwargs = {"channel_credentials": grpc.local_channel_credentials()} + def _invoke(seed: Text): + run_kwargs = dict(kwargs) + run_kwargs["options"] = ((test_name + seed, ""),) + grpc.unary_unary(*args, **run_kwargs) + self.assert_cached(_invoke) + + # TODO: Test request_serializer + # TODO: Test request_deserializer + # TODO: Test channel_credentials + # TODO: Test call_credentials + # TODO: Test compression + # TODO: Test wait_for_ready + # TODO: Test metadata if __name__ == "__main__": logging.basicConfig() From 741b407ac48d4e880c01d10c667087e1c90087ec Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 4 Feb 2020 18:34:55 -0800 Subject: [PATCH 004/129] Add simple eviction mechanism --- src/python/grpcio/grpc/_simple_stubs.py | 130 ++++++++++++++---- .../tests/unit/_simple_stubs_test.py | 27 +++- 2 files changed, 130 insertions(+), 27 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 245bbf6596a..255fd455cb7 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -1,50 +1,126 @@ # TODO: Flowerbox. +import collections +import datetime +import os +import logging import threading import grpc from typing import Any, Callable, Optional, Sequence, Text, Tuple, Union -_CHANNEL_CACHE = None -_CHANNEL_CACHE_LOCK = threading.RLock() -# TODO: Evict channels. +_LOGGER = logging.getLogger(__name__) + +_EVICTION_PERIOD_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" +if _EVICTION_PERIOD_KEY in os.environ: + _EVICTION_PERIOD = datetime.timedelta(seconds=float(os.environ[_EVICTION_PERIOD_KEY])) +else: + _EVICTION_PERIOD = datetime.timedelta(minutes=10) -# Eviction policy based on both channel count and time since use. Perhaps -# OrderedDict instead? def _create_channel(target: Text, options: Sequence[Tuple[Text, Text]], channel_credentials: Optional[grpc.ChannelCredentials], compression: Optional[grpc.Compression]) -> grpc.Channel: if channel_credentials is None: + _LOGGER.info(f"Creating insecure channel with options '{options}' " + + f"and compression '{compression}'") return grpc.insecure_channel(target, options=options, compression=compression) else: + _LOGGER.info(f"Creating secure channel with credentials '{channel_credentials}', " + + f"options '{options}' and compression '{compression}'") return grpc.secure_channel(target, credentials=channel_credentials, options=options, compression=compression) +class ChannelCache: + _singleton = None + _lock = threading.RLock() + _condition = threading.Condition(lock=_lock) + _eviction_ready = threading.Event() + + + def __init__(self): + self._mapping = collections.OrderedDict() + self._eviction_thread = threading.Thread(target=ChannelCache._perform_evictions, daemon=True) + self._eviction_thread.start() + + + @staticmethod + def get(): + with ChannelCache._lock: + if ChannelCache._singleton is None: + ChannelCache._singleton = ChannelCache() + ChannelCache._eviction_ready.wait() + return ChannelCache._singleton + + # TODO: Type annotate key. + def _evict_locked(self, key): + channel, _ = self._mapping.pop(key) + _LOGGER.info(f"Evicting channel {channel} with configuration {key}.") + channel.close() + del channel + + + # TODO: Refactor. Way too deeply nested. + @staticmethod + def _perform_evictions(): + while True: + with ChannelCache._lock: + ChannelCache._eviction_ready.set() + if not ChannelCache._singleton._mapping: + ChannelCache._condition.wait() + else: + key, (channel, eviction_time) = next(iter(ChannelCache._singleton._mapping.items())) + now = datetime.datetime.now() + if eviction_time <= now: + ChannelCache._singleton._evict_locked(key) + continue + else: + time_to_eviction = (eviction_time - now).total_seconds() + ChannelCache._condition.wait(timeout=time_to_eviction) -def _get_cached_channel(target: Text, - options: Sequence[Tuple[Text, Text]], - channel_credentials: Optional[grpc.ChannelCredentials], - compression: Optional[grpc.Compression]) -> grpc.Channel: - global _CHANNEL_CACHE - global _CHANNEL_CACHE_LOCK - key = (target, options, channel_credentials, compression) - with _CHANNEL_CACHE_LOCK: - if _CHANNEL_CACHE is None: - _CHANNEL_CACHE = {} - channel = _CHANNEL_CACHE.get(key, None) - if channel is not None: - return channel - else: - channel = _create_channel(target, options, channel_credentials, compression) - _CHANNEL_CACHE[key] = channel - return channel + + + def get_channel(self, + target: Text, + options: Sequence[Tuple[Text, Text]], + channel_credentials: Optional[grpc.ChannelCredentials], + compression: Optional[grpc.Compression]) -> grpc.Channel: + key = (target, options, channel_credentials, compression) + with self._lock: + # TODO: Can the get and the pop be turned into a single operation? + channel_data = self._mapping.get(key, None) + if channel_data is not None: + channel = channel_data[0] + # # NOTE: This isn't actually necessary. The eviction thread will + # # always wake up because the new head of the list will, by + # # definition, have a later eviction time than the old head of + # # the list. If however, we allow for channels with heterogeneous + # # eviction periods, this *will* become necessary. We can imagine + # # this would be the case for timeouts. That is, if a timeout + # # longer than the eviction period is specified, we do not want + # # to cancel the RPC prematurely. + # if channel is next(iter(self._mapping.values()))[0]: + # self._condition.notify() + # Move to the end of the map. + self._mapping.pop(key) + self._mapping[key] = (channel, datetime.datetime.now() + _EVICTION_PERIOD) + return channel + else: + channel = _create_channel(target, options, channel_credentials, compression) + self._mapping[key] = (channel, datetime.datetime.now() + _EVICTION_PERIOD) + if len(self._mapping) == 1: + self._condition.notify() + return channel + + def _test_only_channel_count(self) -> int: + with self._lock: + return len(self._mapping) def unary_unary(request: Any, @@ -58,17 +134,21 @@ def unary_unary(request: Any, call_credentials: Optional[grpc.CallCredentials] = None, compression: Optional[grpc.Compression] = None, wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, metadata: Optional[Sequence[Tuple[Text, Union[Text, bytes]]]] = None) -> Any: """Invokes a unary RPC without an explicitly specified channel. - This is backed by an LRU cache of channels evicted by a background thread + This is backed by a cache of channels evicted by a background thread on a periodic basis. TODO: Document the parameters and return value. """ - channel = _get_cached_channel(target, options, channel_credentials, compression) + + # TODO: Warn if the timeout is greater than the channel eviction time. + channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_unary(method, request_serializer, request_deserializer) return multicallable(request, metadata=metadata, wait_for_ready=wait_for_ready, - credentials=call_credentials) + credentials=call_credentials, + timeout=timeout) diff --git a/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py index 4a380afa054..68ee7ea0a06 100644 --- a/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py @@ -16,12 +16,15 @@ import contextlib import datetime import inspect +import os import unittest import sys import time import logging +os.environ["GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS"] = "1" + import grpc import test_common @@ -82,7 +85,7 @@ class SimpleStubsTest(unittest.TestCase): Args: to_check: A function returning nothing, that caches values based on - an arbitrary supplied Text object. + an arbitrary supplied string. """ initial_runs = [] cached_runs = [] @@ -121,12 +124,32 @@ class SimpleStubsTest(unittest.TestCase): test_name = inspect.stack()[0][3] args = (request, target, _UNARY_UNARY) kwargs = {"channel_credentials": grpc.local_channel_credentials()} - def _invoke(seed: Text): + def _invoke(seed: str): run_kwargs = dict(kwargs) run_kwargs["options"] = ((test_name + seed, ""),) grpc.unary_unary(*args, **run_kwargs) self.assert_cached(_invoke) + # TODO: Can this somehow be made more blackbox? + def test_channels_evicted(self): + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + request = b'0000' + response = grpc.unary_unary(request, + target, + _UNARY_UNARY, + channel_credentials=grpc.local_channel_credentials()) + channel_count = None + deadline = datetime.datetime.now() + datetime.timedelta(seconds=10) + while datetime.datetime.now() < deadline: + channel_count = grpc._simple_stubs.ChannelCache.get()._test_only_channel_count() + if channel_count == 0: + break + time.sleep(1) + else: + self.assertFalse("Not all channels were evicted. {channel_count} remain.") + + # TODO: Test request_serializer # TODO: Test request_deserializer # TODO: Test channel_credentials From d869bed623f9340d8be4e16d0a96a7fc871776d2 Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Wed, 5 Feb 2020 15:56:16 -0800 Subject: [PATCH 005/129] Added in server builder. --- test/cpp/client/credentials_test.cc | 7 +++++-- tools/internal_ci/macos/grpc_experiment.cfg | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 tools/internal_ci/macos/grpc_experiment.cfg diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index 002c5e87cc9..5a3e58b0b6c 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -690,6 +691,10 @@ TEST_F(CredentialsTest, LoadTlsServerCredentials) { TlsCredentialsOptions options = TlsCredentialsOptions( GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr); + // It is necessary to instantiate a |ServerBuilder| object so that the C-core + // is properly initialized. + ::grpc::ServerBuilder builder; + (void)builder; std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = grpc::experimental::TlsServerCredentials(options); GPR_ASSERT(server_credentials.get() != nullptr); @@ -762,8 +767,6 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) { int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); - grpc_init(); int ret = RUN_ALL_TESTS(); - grpc_shutdown(); return ret; } diff --git a/tools/internal_ci/macos/grpc_experiment.cfg b/tools/internal_ci/macos/grpc_experiment.cfg new file mode 100644 index 00000000000..3b15ca78b6a --- /dev/null +++ b/tools/internal_ci/macos/grpc_experiment.cfg @@ -0,0 +1,18 @@ +# Copyright 2019 The 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. + +# Config file for the internal CI (in protobuf text format) + +# Location of the continuous shell script in repository. +build_file: "grpc/tools/internal_ci/macos/grpc_run_bazel_cpp_ios_tests.sh" From 924aace7dc0492ae2752a830d5e6281edf718e09 Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Thu, 6 Feb 2020 08:51:41 -0800 Subject: [PATCH 006/129] Version 4. --- .../grpcpp/security/tls_credentials_options.h | 53 +++++++--------- src/cpp/common/tls_credentials_options.cc | 62 ++++++++++++++----- test/cpp/client/credentials_test.cc | 41 +++++++----- 3 files changed, 94 insertions(+), 62 deletions(-) diff --git a/include/grpcpp/security/tls_credentials_options.h b/include/grpcpp/security/tls_credentials_options.h index b5bb7c78b7f..d83226865d8 100644 --- a/include/grpcpp/security/tls_credentials_options.h +++ b/include/grpcpp/security/tls_credentials_options.h @@ -55,12 +55,13 @@ class TlsKeyMaterialsConfig { } int version() const { return version_; } - /** Setter for key materials that will be called by the user. The setter - * transfers ownership of the arguments to the config. **/ - void set_pem_root_certs(grpc::string pem_root_certs); + /** Setter for key materials that will be called by the user. Ownership of the + * arguments will not be transferred. **/ + void set_pem_root_certs(const grpc::string& pem_root_certs); void add_pem_key_cert_pair(const PemKeyCertPair& pem_key_cert_pair); - void set_key_materials(grpc::string pem_root_certs, - std::vector pem_key_cert_pair_list); + void set_key_materials( + const grpc::string& pem_root_certs, + const std::vector& pem_key_cert_pair_list); void set_version(int version) { version_ = version; }; private: @@ -70,40 +71,36 @@ class TlsKeyMaterialsConfig { }; /** TLS credential reload arguments, wraps grpc_tls_credential_reload_arg. It is - * used for experimental purposes for now and it is subject to change. + * used for experimental purposes for now and it is subject to change. * - * The credential reload arg contains all the info necessary to schedule/cancel - * a credential reload request. The callback function must be called after - * finishing the schedule operation. See the description of the - * grpc_tls_credential_reload_arg struct in grpc_security.h for more details. + * The credential reload arg contains all the info necessary to schedule/cancel + * a credential reload request. The callback function must be called after + * finishing the schedule operation. See the description of the + * grpc_tls_credential_reload_arg struct in grpc_security.h for more details. * **/ class TlsCredentialReloadArg { public: /** TlsCredentialReloadArg does not take ownership of the C arg that is passed - * to the constructor. One must remember to free any memory allocated to the C - * arg after using the setter functions below. **/ + * to the constructor. One must remember to free any memory allocated to the + * C arg after using the setter functions below. **/ TlsCredentialReloadArg(grpc_tls_credential_reload_arg* arg); ~TlsCredentialReloadArg(); - /** Getters for member fields. The callback function is not exposed. - * They return the corresponding fields of the underlying C arg. In the case - * of the key materials config, it creates a new instance of the C++ key - * materials config from the underlying C grpc_tls_key_materials_config. **/ + /** Getters for member fields. **/ void* cb_user_data() const; bool is_pem_key_cert_pair_list_empty() const; grpc_ssl_certificate_config_reload_status status() const; grpc::string error_details() const; - /** Setters for member fields. They modify the fields of the underlying C arg. - * The setters for the key_materials_config and the error_details allocate - * memory when modifying c_arg_, so one must remember to free c_arg_'s - * original key_materials_config or error_details after using the appropriate - * setter function. - * **/ + /** Setters for member fields. Ownership of the arguments will not be + * transferred. **/ void set_cb_user_data(void* cb_user_data); void set_pem_root_certs(const grpc::string& pem_root_certs); void add_pem_key_cert_pair( - TlsKeyMaterialsConfig::PemKeyCertPair pem_key_cert_pair); + const TlsKeyMaterialsConfig::PemKeyCertPair& pem_key_cert_pair); + void set_key_materials(const grpc::string& pem_root_certs, + std::vector + pem_key_cert_pair_list); void set_key_materials_config( const std::shared_ptr& key_materials_config); void set_status(grpc_ssl_certificate_config_reload_status status); @@ -187,8 +184,7 @@ class TlsServerAuthorizationCheckArg { TlsServerAuthorizationCheckArg(grpc_tls_server_authorization_check_arg* arg); ~TlsServerAuthorizationCheckArg(); - /** Getters for member fields. They return the corresponding fields of the - * underlying C arg.**/ + /** Getters for member fields. **/ void* cb_user_data() const; int success() const; grpc::string target_name() const; @@ -197,12 +193,7 @@ class TlsServerAuthorizationCheckArg { grpc_status_code status() const; grpc::string error_details() const; - /** Setters for member fields. They modify the fields of the underlying C arg. - * The setters for target_name, peer_cert, and error_details allocate memory - * when modifying c_arg_, so one must remember to free c_arg_'s original - * target_name, peer_cert, or error_details after using the appropriate setter - * function. - * **/ + /** Setters for member fields. **/ void set_cb_user_data(void* cb_user_data); void set_success(int success); void set_target_name(const grpc::string& target_name); diff --git a/src/cpp/common/tls_credentials_options.cc b/src/cpp/common/tls_credentials_options.cc index d5692c6effd..1c65ea66d89 100644 --- a/src/cpp/common/tls_credentials_options.cc +++ b/src/cpp/common/tls_credentials_options.cc @@ -16,19 +16,18 @@ * */ +#include #include #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" - -#include - #include "src/cpp/common/tls_credentials_options_util.h" namespace grpc_impl { namespace experimental { /** TLS key materials config API implementation **/ -void TlsKeyMaterialsConfig::set_pem_root_certs(grpc::string pem_root_certs) { - pem_root_certs_ = std::move(pem_root_certs); +void TlsKeyMaterialsConfig::set_pem_root_certs( + const grpc::string& pem_root_certs) { + pem_root_certs_ = pem_root_certs; } void TlsKeyMaterialsConfig::add_pem_key_cert_pair( @@ -37,10 +36,10 @@ void TlsKeyMaterialsConfig::add_pem_key_cert_pair( } void TlsKeyMaterialsConfig::set_key_materials( - grpc::string pem_root_certs, - std::vector pem_key_cert_pair_list) { - pem_key_cert_pair_list_ = std::move(pem_key_cert_pair_list); - pem_root_certs_ = std::move(pem_root_certs); + const grpc::string& pem_root_certs, + const std::vector& pem_key_cert_pair_list) { + pem_key_cert_pair_list_ = pem_key_cert_pair_list; + pem_root_certs_ = pem_root_certs; } /** TLS credential reload arg API implementation **/ @@ -59,7 +58,6 @@ TlsCredentialReloadArg::~TlsCredentialReloadArg() {} void* TlsCredentialReloadArg::cb_user_data() const { return c_arg_->cb_user_data; } - bool TlsCredentialReloadArg::is_pem_key_cert_pair_list_empty() const { return c_arg_->key_materials_config->pem_key_cert_pair_list().empty(); } @@ -85,17 +83,46 @@ void TlsCredentialReloadArg::set_pem_root_certs( c_arg_->key_materials_config->set_pem_root_certs(std::move(c_pem_root_certs)); } -void TlsCredentialReloadArg::add_pem_key_cert_pair( - TlsKeyMaterialsConfig::PemKeyCertPair pem_key_cert_pair) { +namespace { + +::grpc_core::PemKeyCertPair ConvertToCorePemKeyCertPair( + const TlsKeyMaterialsConfig::PemKeyCertPair& pem_key_cert_pair) { grpc_ssl_pem_key_cert_pair* ssl_pair = (grpc_ssl_pem_key_cert_pair*)gpr_malloc( sizeof(grpc_ssl_pem_key_cert_pair)); ssl_pair->private_key = gpr_strdup(pem_key_cert_pair.private_key.c_str()); ssl_pair->cert_chain = gpr_strdup(pem_key_cert_pair.cert_chain.c_str()); - ::grpc_core::PemKeyCertPair c_pem_key_cert_pair = - ::grpc_core::PemKeyCertPair(ssl_pair); + return ::grpc_core::PemKeyCertPair(ssl_pair); +} + +} // namespace + +void TlsCredentialReloadArg::add_pem_key_cert_pair( + const TlsKeyMaterialsConfig::PemKeyCertPair& pem_key_cert_pair) { c_arg_->key_materials_config->add_pem_key_cert_pair( - std::move(c_pem_key_cert_pair)); + ConvertToCorePemKeyCertPair(pem_key_cert_pair)); +} + +void TlsCredentialReloadArg::set_key_materials( + const grpc::string& pem_root_certs, + std::vector pem_key_cert_pair_list) { + /** Initialize the |key_materials_config| field of |c_arg_|, if it has not + * already been done. **/ + if (c_arg_->key_materials_config == nullptr) { + c_arg_->key_materials_config = grpc_tls_key_materials_config_create(); + } + /** Convert |pem_key_cert_pair_list| to an inlined vector of ssl pairs. **/ + ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> + c_pem_key_cert_pair_list; + for (const auto& key_cert_pair : pem_key_cert_pair_list) { + c_pem_key_cert_pair_list.emplace_back( + ConvertToCorePemKeyCertPair(key_cert_pair)); + } + /** Populate the key materials config field of |c_arg_|. **/ + ::grpc_core::UniquePtr c_pem_root_certs( + gpr_strdup(pem_root_certs.c_str())); + c_arg_->key_materials_config->set_key_materials(std::move(c_pem_root_certs), + c_pem_key_cert_pair_list); } void TlsCredentialReloadArg::set_key_materials_config( @@ -288,6 +315,11 @@ TlsCredentialsOptions::TlsCredentialsOptions( c_credentials_options_, server_verification_option); } +/** Whenever a TlsCredentialsOptions instance is created, the caller takes + * ownership of the c_credentials_options_ pointer (see e.g. the implementation + * of the TlsCredentials API in secure_credentials.cc). For this reason, the + * TlsCredentialsOptions destructor is not responsible for freeing + * c_credentials_options_. **/ TlsCredentialsOptions::~TlsCredentialsOptions() {} } // namespace experimental diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index c24c3a3bea9..4095707ff8c 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -17,9 +17,9 @@ */ #include +#include #include #include - #include #include @@ -54,10 +54,10 @@ static void tls_credential_reload_callback( class TestTlsCredentialReload : public TlsCredentialReloadInterface { int Schedule(TlsCredentialReloadArg* arg) override { GPR_ASSERT(arg != nullptr); - struct TlsKeyMaterialsConfig::PemKeyCertPair pair3 = {"private_key3", - "cert_chain3"}; + TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key3", + "cert_chain3"}; arg->set_pem_root_certs("new_pem_root_certs"); - arg->add_pem_key_cert_pair(pair3); + arg->add_pem_key_cert_pair(pair); arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW); return 0; } @@ -101,7 +101,6 @@ class TestTlsServerAuthorizationCheck arg->set_error_details("cancelled"); } }; - } // namespace namespace grpc { @@ -294,8 +293,7 @@ TEST_F(CredentialsTest, TlsKeyMaterialsConfigCppToC) { TEST_F(CredentialsTest, TlsKeyMaterialsModifiers) { std::shared_ptr config(new TlsKeyMaterialsConfig()); - struct TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key", - "cert_chain"}; + TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key", "cert_chain"}; config->add_pem_key_cert_pair(pair); config->set_pem_root_certs("pem_root_certs"); EXPECT_STREQ(config->pem_root_certs().c_str(), "pem_root_certs"); @@ -313,15 +311,28 @@ typedef class ::grpc_impl::experimental::TlsCredentialReloadConfig TEST_F(CredentialsTest, TlsCredentialReloadArgCallback) { grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg; + c_arg->key_materials_config = grpc_tls_key_materials_config_create(); c_arg->cb = tls_credential_reload_callback; c_arg->context = nullptr; TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg); + arg->set_pem_root_certs("pem_root_certs"); + TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key", "cert_chain"}; + arg->add_pem_key_cert_pair(pair); arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW); arg->OnCredentialReloadDoneCallback(); EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED); + EXPECT_STREQ(c_arg->key_materials_config->pem_root_certs(), "pem_root_certs"); + EXPECT_EQ(c_arg->key_materials_config->pem_key_cert_pair_list().size(), 1); + EXPECT_STREQ( + c_arg->key_materials_config->pem_key_cert_pair_list()[0].private_key(), + "private_key"); + EXPECT_STREQ( + c_arg->key_materials_config->pem_key_cert_pair_list()[0].cert_chain(), + "cert_chain"); // Cleanup. delete arg; + delete c_arg->key_materials_config; delete c_arg; } @@ -333,15 +344,12 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigSchedule) { grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg(); c_arg->context = nullptr; TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg); - std::shared_ptr key_materials_config( - new TlsKeyMaterialsConfig()); struct TlsKeyMaterialsConfig::PemKeyCertPair pair1 = {"private_key1", "cert_chain1"}; struct TlsKeyMaterialsConfig::PemKeyCertPair pair2 = {"private_key2", "cert_chain2"}; std::vector pair_list = {pair1, pair2}; - key_materials_config->set_key_materials("pem_root_certs", pair_list); - arg->set_key_materials_config(key_materials_config); + arg->set_key_materials("pem_root_certs", pair_list); arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW); arg->set_error_details("error_details"); const char* error_details_before_schedule = c_arg->error_details; @@ -649,7 +657,7 @@ TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) { delete c_options; } -// This test demonstrates how the SPIFFE credentials will be used. +// This test demonstrates how the TLS credentials will be used. TEST_F(CredentialsTest, LoadTlsChannelCredentials) { std::shared_ptr test_credential_reload( new TestTlsCredentialReload()); @@ -674,21 +682,22 @@ TEST_F(CredentialsTest, LoadTlsChannelCredentials) { // This test demonstrates how the TLS credentials will be used to create // server credentials. TEST_F(CredentialsTest, LoadTlsServerCredentials) { + grpc_init(); std::shared_ptr test_credential_reload( new TestTlsCredentialReload()); std::shared_ptr credential_reload_config( new TlsCredentialReloadConfig(test_credential_reload)); + // The server builder is needed in order to properly initialize the C-core. + ServerBuilder builder; + (void)builder; TlsCredentialsOptions options = TlsCredentialsOptions( GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr); - // It is necessary to instantiate a |ServerBuilder| object so that the C-core - // is properly initialized. - ::grpc::ServerBuilder builder; - (void)builder; std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = grpc::experimental::TlsServerCredentials(options); GPR_ASSERT(server_credentials.get() != nullptr); + grpc_shutdown(); } TEST_F(CredentialsTest, TlsCredentialReloadConfigErrorMessages) { From 20f85c1d6004cd5617fc9f8738abe2eb71af94bb Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 6 Feb 2020 14:12:38 -0800 Subject: [PATCH 007/129] Don't run test under Python 2 --- .../grpcio_tests/tests/unit/BUILD.bazel | 2 +- .../tests/unit/py3_only/BUILD.bazel | 28 +++++++++++++++++++ .../unit/{ => py3_only}/_simple_stubs_test.py | 1 - 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel rename src/python/grpcio_tests/tests/unit/{ => py3_only}/_simple_stubs_test.py (98%) diff --git a/src/python/grpcio_tests/tests/unit/BUILD.bazel b/src/python/grpcio_tests/tests/unit/BUILD.bazel index a4ac8bb3ef0..75085e9091b 100644 --- a/src/python/grpcio_tests/tests/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/BUILD.bazel @@ -32,7 +32,6 @@ GRPCIO_TESTS_UNIT = [ "_resource_exhausted_test.py", "_rpc_test.py", "_signal_handling_test.py", - "_simple_stubs_test.py", # TODO(ghostwriternr): To be added later. # "_server_ssl_cert_config_test.py", "_server_test.py", @@ -111,3 +110,4 @@ py_library( ) for test_file_name in GRPCIO_TESTS_UNIT ] + diff --git a/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel b/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel new file mode 100644 index 00000000000..5cdfed647e5 --- /dev/null +++ b/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel @@ -0,0 +1,28 @@ +package( + default_visibility = ["//visibility:public"], + default_testonly = True, +) + +GRPCIO_PY3_ONLY_UNIT_TESTS = [ + "_simple_stubs_test.py", +] + +[ + py_test( + name = test_file_name[:-len(".py")], + size = "small", + python_version = "PY3", + srcs_version = "PY3", + srcs = [test_file_name], + main = test_file_name, + deps = [ + "//src/python/grpcio_tests/tests/unit:resources", + "//src/python/grpcio_tests/tests/unit:test_common", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/testing", + "//src/python/grpcio_tests/tests/unit/framework/common", + "@six", + ], + imports = [".."], + ) for test_file_name in GRPCIO_PY3_ONLY_UNIT_TESTS +] diff --git a/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py similarity index 98% rename from src/python/grpcio_tests/tests/unit/_simple_stubs_test.py rename to src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 68ee7ea0a06..026a796198b 100644 --- a/src/python/grpcio_tests/tests/unit/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -28,7 +28,6 @@ os.environ["GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS"] = "1" import grpc import test_common -# TODO: Figure out how to get this test to run only for Python 3. from typing import Callable, Optional _CACHE_EPOCHS = 8 From 4ac50ceed62bfdcc2c34144ddcbbf2f8d360732b Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 6 Feb 2020 15:59:01 -0800 Subject: [PATCH 008/129] Add maximum-based channel eviction --- src/python/grpcio/grpc/_simple_stubs.py | 25 +++---- .../tests/unit/py3_only/_simple_stubs_test.py | 68 +++++++++++++------ 2 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 255fd455cb7..1ae06bd8d63 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -15,9 +15,16 @@ _LOGGER = logging.getLogger(__name__) _EVICTION_PERIOD_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" if _EVICTION_PERIOD_KEY in os.environ: _EVICTION_PERIOD = datetime.timedelta(seconds=float(os.environ[_EVICTION_PERIOD_KEY])) + _LOGGER.info(f"Setting managed channel eviction period to {_EVICTION_PERIOD}") else: _EVICTION_PERIOD = datetime.timedelta(minutes=10) +_MAXIMUM_CHANNELS_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" +if _MAXIMUM_CHANNELS_KEY in os.environ: + _MAXIMUM_CHANNELS = int(os.environ[_MAXIMUM_CHANNELS_KEY]) + _LOGGER.info(f"Setting maximum managed channels to {_MAXIMUM_CHANNELS}") +else: + _MAXIMUM_CHANNELS = 2 ** 8 def _create_channel(target: Text, options: Sequence[Tuple[Text, Text]], @@ -74,6 +81,10 @@ class ChannelCache: ChannelCache._eviction_ready.set() if not ChannelCache._singleton._mapping: ChannelCache._condition.wait() + elif len(ChannelCache._singleton._mapping) > _MAXIMUM_CHANNELS: + key = next(iter(ChannelCache._singleton._mapping.keys())) + ChannelCache._singleton._evict_locked(key) + # And immediately reevaluate. else: key, (channel, eviction_time) = next(iter(ChannelCache._singleton._mapping.items())) now = datetime.datetime.now() @@ -97,24 +108,13 @@ class ChannelCache: channel_data = self._mapping.get(key, None) if channel_data is not None: channel = channel_data[0] - # # NOTE: This isn't actually necessary. The eviction thread will - # # always wake up because the new head of the list will, by - # # definition, have a later eviction time than the old head of - # # the list. If however, we allow for channels with heterogeneous - # # eviction periods, this *will* become necessary. We can imagine - # # this would be the case for timeouts. That is, if a timeout - # # longer than the eviction period is specified, we do not want - # # to cancel the RPC prematurely. - # if channel is next(iter(self._mapping.values()))[0]: - # self._condition.notify() - # Move to the end of the map. self._mapping.pop(key) self._mapping[key] = (channel, datetime.datetime.now() + _EVICTION_PERIOD) return channel else: channel = _create_channel(target, options, channel_credentials, compression) self._mapping[key] = (channel, datetime.datetime.now() + _EVICTION_PERIOD) - if len(self._mapping) == 1: + if len(self._mapping) == 1 or len(self._mapping) >= _MAXIMUM_CHANNELS: self._condition.notify() return channel @@ -123,6 +123,7 @@ class ChannelCache: return len(self._mapping) +# TODO: s/Text/str/g def unary_unary(request: Any, target: Text, method: Text, diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 026a796198b..8a97a8f7d67 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -13,22 +13,25 @@ # limitations under the License. """Tests for Simple Stubs.""" +import os + +_MAXIMUM_CHANNELS = 10 + +os.environ["GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS"] = "1" +os.environ["GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM"] = str(_MAXIMUM_CHANNELS) + import contextlib import datetime import inspect -import os +import logging import unittest import sys import time +from typing import Callable, Optional -import logging - -os.environ["GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS"] = "1" - -import grpc import test_common +import grpc -from typing import Callable, Optional _CACHE_EPOCHS = 8 _CACHE_TRIALS = 6 @@ -71,7 +74,6 @@ def _server(credentials: Optional[grpc.ServerCredentials]): server.stop(None) -@unittest.skipIf(sys.version_info[0] < 3, "Unsupported on Python 2.") class SimpleStubsTest(unittest.TestCase): def assert_cached(self, to_check: Callable[[str], None]) -> None: @@ -99,6 +101,22 @@ class SimpleStubsTest(unittest.TestCase): average_warm = sum((run for run in cached_runs), datetime.timedelta()) / len(cached_runs) self.assertLess(average_warm, average_cold) + + def assert_eventually(self, + predicate: Callable[[], bool], + *, + timeout: Optional[datetime.timedelta] = None, + message: Optional[Callable[[], str]] = None) -> None: + message = message or (lambda: "Proposition did not evaluate to true") + timeout = timeout or datetime.timedelta(seconds=10) + end = datetime.datetime.now() + timeout + while datetime.datetime.now() < end: + if predicate(): + break + time.sleep(0.5) + else: + self.fail(message() + " after " + str(timeout)) + def test_unary_unary_insecure(self): with _server(None) as (_, port): target = f'localhost:{port}' @@ -129,7 +147,6 @@ class SimpleStubsTest(unittest.TestCase): grpc.unary_unary(*args, **run_kwargs) self.assert_cached(_invoke) - # TODO: Can this somehow be made more blackbox? def test_channels_evicted(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' @@ -138,15 +155,26 @@ class SimpleStubsTest(unittest.TestCase): target, _UNARY_UNARY, channel_credentials=grpc.local_channel_credentials()) - channel_count = None - deadline = datetime.datetime.now() + datetime.timedelta(seconds=10) - while datetime.datetime.now() < deadline: - channel_count = grpc._simple_stubs.ChannelCache.get()._test_only_channel_count() - if channel_count == 0: - break - time.sleep(1) - else: - self.assertFalse("Not all channels were evicted. {channel_count} remain.") + self.assert_eventually( + lambda: grpc._simple_stubs.ChannelCache.get()._test_only_channel_count() == 0, + message=lambda: f"{grpc._simple_stubs.ChannelCache.get()._test_only_channel_count()} remain") + + def test_total_channels_enforced(self): + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + request = b'0000' + for i in range(99): + # Ensure we get a new channel each time. + options = (("foo", str(i)),) + # Send messages at full blast. + grpc.unary_unary(request, + target, + _UNARY_UNARY, + options=options, + channel_credentials=grpc.local_channel_credentials()) + self.assert_eventually( + lambda: grpc._simple_stubs.ChannelCache.get()._test_only_channel_count() <= _MAXIMUM_CHANNELS + 1, + message=lambda: f"{grpc._simple_stubs.ChannelCache.get()._test_only_channel_count()} channels remain") # TODO: Test request_serializer @@ -158,7 +186,5 @@ class SimpleStubsTest(unittest.TestCase): # TODO: Test metadata if __name__ == "__main__": - logging.basicConfig() + logging.basicConfig(level=logging.INFO) unittest.main(verbosity=2) - - From b5f06c216ef7016572ebecc1a75e247bbde432e4 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 6 Feb 2020 16:10:25 -0800 Subject: [PATCH 009/129] Implement unary_stream --- src/python/grpcio/grpc/__init__.py | 4 +- src/python/grpcio/grpc/_simple_stubs.py | 50 ++++++++++++++----- .../tests/unit/py3_only/_simple_stubs_test.py | 19 +++++++ 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 9d7b701a8d7..d3e860b4690 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -2036,8 +2036,8 @@ __all__ = ( ) if sys.version_info[0] > 2: - from grpc._simple_stubs import unary_unary - __all__ = __all__ + (unary_unary,) + from grpc._simple_stubs import unary_unary, unary_stream + __all__ = __all__ + (unary_unary, unary_stream) ############################### Extension Shims ################################ diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 1ae06bd8d63..b9c6753fcd2 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -7,7 +7,7 @@ import logging import threading import grpc -from typing import Any, Callable, Optional, Sequence, Text, Tuple, Union +from typing import Any, AnyStr, Callable, Iterator, Optional, Sequence, Tuple, Union _LOGGER = logging.getLogger(__name__) @@ -26,8 +26,8 @@ if _MAXIMUM_CHANNELS_KEY in os.environ: else: _MAXIMUM_CHANNELS = 2 ** 8 -def _create_channel(target: Text, - options: Sequence[Tuple[Text, Text]], +def _create_channel(target: str, + options: Sequence[Tuple[str, str]], channel_credentials: Optional[grpc.ChannelCredentials], compression: Optional[grpc.Compression]) -> grpc.Channel: if channel_credentials is None: @@ -98,8 +98,8 @@ class ChannelCache: def get_channel(self, - target: Text, - options: Sequence[Tuple[Text, Text]], + target: str, + options: Sequence[Tuple[str, str]], channel_credentials: Optional[grpc.ChannelCredentials], compression: Optional[grpc.Compression]) -> grpc.Channel: key = (target, options, channel_credentials, compression) @@ -123,20 +123,19 @@ class ChannelCache: return len(self._mapping) -# TODO: s/Text/str/g def unary_unary(request: Any, - target: Text, - method: Text, + target: str, + method: str, request_serializer: Optional[Callable[[Any], bytes]] = None, request_deserializer: Optional[Callable[[bytes], Any]] = None, - options: Sequence[Tuple[Text, Text]] = (), + options: Sequence[Tuple[AnyStr, AnyStr]] = (), # TODO: Somehow make insecure_channel opt-in, not the default. channel_credentials: Optional[grpc.ChannelCredentials] = None, call_credentials: Optional[grpc.CallCredentials] = None, compression: Optional[grpc.Compression] = None, wait_for_ready: Optional[bool] = None, timeout: Optional[float] = None, - metadata: Optional[Sequence[Tuple[Text, Union[Text, bytes]]]] = None) -> Any: + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Any: """Invokes a unary RPC without an explicitly specified channel. This is backed by a cache of channels evicted by a background thread @@ -144,8 +143,6 @@ def unary_unary(request: Any, TODO: Document the parameters and return value. """ - - # TODO: Warn if the timeout is greater than the channel eviction time. channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_unary(method, request_serializer, request_deserializer) return multicallable(request, @@ -153,3 +150,32 @@ def unary_unary(request: Any, wait_for_ready=wait_for_ready, credentials=call_credentials, timeout=timeout) + + +def unary_stream(request: Any, + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + # TODO: Somehow make insecure_channel opt-in, not the default. + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[Any]: + """Invokes a unary-stream RPC without an explicitly specified channel. + + This is backed by a cache of channels evicted by a background thread + on a periodic basis. + + TODO: Document the parameters and return value. + """ + channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) + multicallable = channel.unary_stream(method, request_serializer, request_deserializer) + return multicallable(request, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials, + timeout=timeout) diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 8a97a8f7d67..67d1b6c48f1 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -36,18 +36,27 @@ import grpc _CACHE_EPOCHS = 8 _CACHE_TRIALS = 6 +_SERVER_RESPONSE_COUNT = 10 _UNARY_UNARY = "/test/UnaryUnary" +_UNARY_STREAM = "/test/UnaryStream" def _unary_unary_handler(request, context): return request +def _unary_stream_handler(request, context): + for _ in range(_SERVER_RESPONSE_COUNT): + yield request + + class _GenericHandler(grpc.GenericRpcHandler): def service(self, handler_call_details): if handler_call_details.method == _UNARY_UNARY: return grpc.unary_unary_rpc_method_handler(_unary_unary_handler) + elif handler_call_details.method == _UNARY_STREAM: + return grpc.unary_stream_rpc_method_handler(_unary_stream_handler) else: raise NotImplementedError() @@ -176,6 +185,16 @@ class SimpleStubsTest(unittest.TestCase): lambda: grpc._simple_stubs.ChannelCache.get()._test_only_channel_count() <= _MAXIMUM_CHANNELS + 1, message=lambda: f"{grpc._simple_stubs.ChannelCache.get()._test_only_channel_count()} channels remain") + def test_unary_stream(self): + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + request = b'0000' + for response in grpc.unary_stream(request, + target, + _UNARY_STREAM, + channel_credentials=grpc.local_channel_credentials()): + self.assertEqual(request, response) + # TODO: Test request_serializer # TODO: Test request_deserializer From 38bef984634f6db927ff3719816302a5b055e70f Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 6 Feb 2020 16:27:21 -0800 Subject: [PATCH 010/129] Add stream-unary --- src/python/grpcio/grpc/__init__.py | 6 +-- src/python/grpcio/grpc/_simple_stubs.py | 41 ++++++++++++++++--- .../tests/unit/py3_only/_simple_stubs_test.py | 24 +++++++++++ 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index d3e860b4690..fadabe93c19 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -2035,9 +2035,9 @@ __all__ = ( 'unary_unary', ) -if sys.version_info[0] > 2: - from grpc._simple_stubs import unary_unary, unary_stream - __all__ = __all__ + (unary_unary, unary_stream) +if sys.version_info[0] >= 3: + from grpc._simple_stubs import unary_unary, unary_stream, stream_unary + __all__ = __all__ + (unary_unary, unary_stream, stream_unary) ############################### Extension Shims ################################ diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index b9c6753fcd2..cd65d7f37da 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -7,7 +7,7 @@ import logging import threading import grpc -from typing import Any, AnyStr, Callable, Iterator, Optional, Sequence, Tuple, Union +from typing import Any, AnyStr, Callable, Iterator, Optional, Sequence, Tuple, TypeVar, Union _LOGGER = logging.getLogger(__name__) @@ -122,8 +122,10 @@ class ChannelCache: with self._lock: return len(self._mapping) +RequestType = TypeVar('RequestType') +ResponseType = TypeVar('ResponseType') -def unary_unary(request: Any, +def unary_unary(request: RequestType, target: str, method: str, request_serializer: Optional[Callable[[Any], bytes]] = None, @@ -135,7 +137,7 @@ def unary_unary(request: Any, compression: Optional[grpc.Compression] = None, wait_for_ready: Optional[bool] = None, timeout: Optional[float] = None, - metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Any: + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> ResponseType: """Invokes a unary RPC without an explicitly specified channel. This is backed by a cache of channels evicted by a background thread @@ -152,7 +154,7 @@ def unary_unary(request: Any, timeout=timeout) -def unary_stream(request: Any, +def unary_stream(request: RequestType, target: str, method: str, request_serializer: Optional[Callable[[Any], bytes]] = None, @@ -164,7 +166,7 @@ def unary_stream(request: Any, compression: Optional[grpc.Compression] = None, wait_for_ready: Optional[bool] = None, timeout: Optional[float] = None, - metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[Any]: + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[ResponseType]: """Invokes a unary-stream RPC without an explicitly specified channel. This is backed by a cache of channels evicted by a background thread @@ -179,3 +181,32 @@ def unary_stream(request: Any, wait_for_ready=wait_for_ready, credentials=call_credentials, timeout=timeout) + + +def stream_unary(request_iterator: Iterator[RequestType], + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + # TODO: Somehow make insecure_channel opt-in, not the default. + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> ResponseType: + """Invokes a stream-unary RPC without an explicitly specified channel. + + This is backed by a cache of channels evicted by a background thread + on a periodic basis. + + TODO: Document the parameters and return value. + """ + channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) + multicallable = channel.stream_unary(method, request_serializer, request_deserializer) + return multicallable(request_iterator, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials, + timeout=timeout) diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 67d1b6c48f1..ad34b46cc34 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -37,6 +37,7 @@ _CACHE_EPOCHS = 8 _CACHE_TRIALS = 6 _SERVER_RESPONSE_COUNT = 10 +_CLIENT_REQUEST_COUNT = _SERVER_RESPONSE_COUNT _UNARY_UNARY = "/test/UnaryUnary" _UNARY_STREAM = "/test/UnaryStream" @@ -51,12 +52,21 @@ def _unary_stream_handler(request, context): yield request +def _stream_unary_handler(request_iterator, context): + request = None + for single_request in request_iterator: + request = single_request + return request + + class _GenericHandler(grpc.GenericRpcHandler): def service(self, handler_call_details): if handler_call_details.method == _UNARY_UNARY: return grpc.unary_unary_rpc_method_handler(_unary_unary_handler) elif handler_call_details.method == _UNARY_STREAM: return grpc.unary_stream_rpc_method_handler(_unary_stream_handler) + elif handler_call_details.method == _STREAM_UNARY: + return grpc.stream_unary_rpc_method_handler(_stream_unary_handler) else: raise NotImplementedError() @@ -195,6 +205,20 @@ class SimpleStubsTest(unittest.TestCase): channel_credentials=grpc.local_channel_credentials()): self.assertEqual(request, response) + def test_stream_unary(self): + def request_iter(): + for _ in range(_CLIENT_REQUEST_COUNT): + yield request + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + request = b'0000' + response = grpc.stream_unary(request_iter(), + target, + _UNARY_STREAM, + channel_credentials=grpc.local_channel_credentials()) + self.assertEqual(request, response) + + # TODO: Test request_serializer # TODO: Test request_deserializer From 1abe2f0ac23694b512584159e3eb9fd619c762d0 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 6 Feb 2020 16:37:39 -0800 Subject: [PATCH 011/129] Add stream_stream --- src/python/grpcio/grpc/__init__.py | 4 +-- src/python/grpcio/grpc/_simple_stubs.py | 29 +++++++++++++++++++ .../tests/unit/py3_only/_simple_stubs_test.py | 23 ++++++++++++++- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index fadabe93c19..3417fb2caa5 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -2036,8 +2036,8 @@ __all__ = ( ) if sys.version_info[0] >= 3: - from grpc._simple_stubs import unary_unary, unary_stream, stream_unary - __all__ = __all__ + (unary_unary, unary_stream, stream_unary) + from grpc._simple_stubs import unary_unary, unary_stream, stream_unary, stream_stream + __all__ = __all__ + (unary_unary, unary_stream, stream_unary, stream_stream) ############################### Extension Shims ################################ diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index cd65d7f37da..a7585e6950c 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -210,3 +210,32 @@ def stream_unary(request_iterator: Iterator[RequestType], wait_for_ready=wait_for_ready, credentials=call_credentials, timeout=timeout) + + +def stream_stream(request_iterator: Iterator[RequestType], + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + # TODO: Somehow make insecure_channel opt-in, not the default. + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[ResponseType]: + """Invokes a stream-stream RPC without an explicitly specified channel. + + This is backed by a cache of channels evicted by a background thread + on a periodic basis. + + TODO: Document the parameters and return value. + """ + channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) + multicallable = channel.stream_stream(method, request_serializer, request_deserializer) + return multicallable(request_iterator, + metadata=metadata, + wait_for_ready=wait_for_ready, + credentials=call_credentials, + timeout=timeout) diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index ad34b46cc34..37019cb6c7e 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -41,6 +41,8 @@ _CLIENT_REQUEST_COUNT = _SERVER_RESPONSE_COUNT _UNARY_UNARY = "/test/UnaryUnary" _UNARY_STREAM = "/test/UnaryStream" +_STREAM_UNARY = "/test/StreamUnary" +_STREAM_STREAM = "/test/StreamStream" def _unary_unary_handler(request, context): @@ -59,6 +61,11 @@ def _stream_unary_handler(request_iterator, context): return request +def _stream_stream_handler(request_iterator, context): + for request in request_iterator: + yield request + + class _GenericHandler(grpc.GenericRpcHandler): def service(self, handler_call_details): if handler_call_details.method == _UNARY_UNARY: @@ -67,6 +74,8 @@ class _GenericHandler(grpc.GenericRpcHandler): return grpc.unary_stream_rpc_method_handler(_unary_stream_handler) elif handler_call_details.method == _STREAM_UNARY: return grpc.stream_unary_rpc_method_handler(_stream_unary_handler) + elif handler_call_details.method == _STREAM_STREAM: + return grpc.stream_stream_rpc_method_handler(_stream_stream_handler) else: raise NotImplementedError() @@ -214,10 +223,22 @@ class SimpleStubsTest(unittest.TestCase): request = b'0000' response = grpc.stream_unary(request_iter(), target, - _UNARY_STREAM, + _STREAM_UNARY, channel_credentials=grpc.local_channel_credentials()) self.assertEqual(request, response) + def test_stream_stream(self): + def request_iter(): + for _ in range(_CLIENT_REQUEST_COUNT): + yield request + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + request = b'0000' + for response in grpc.stream_stream(request_iter(), + target, + _STREAM_STREAM, + channel_credentials=grpc.local_channel_credentials()): + self.assertEqual(request, response) # TODO: Test request_serializer From aadcded305819f1451698659347b33a410825ccc Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 6 Feb 2020 16:56:01 -0800 Subject: [PATCH 012/129] Add docstrings --- src/python/grpcio/grpc/_simple_stubs.py | 179 +++++++++++++++++++++--- 1 file changed, 158 insertions(+), 21 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index a7585e6950c..17666dc9ba7 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -138,12 +138,47 @@ def unary_unary(request: RequestType, wait_for_ready: Optional[bool] = None, timeout: Optional[float] = None, metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> ResponseType: - """Invokes a unary RPC without an explicitly specified channel. - - This is backed by a cache of channels evicted by a background thread - on a periodic basis. - - TODO: Document the parameters and return value. + """Invokes a unary-unary RPC without an explicitly specified channel. + + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (channel args in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials(). + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to False. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. + metadata: Optional metadata to send to the server. + + Returns: + The response to the RPC. """ channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_unary(method, request_serializer, request_deserializer) @@ -160,7 +195,6 @@ def unary_stream(request: RequestType, request_serializer: Optional[Callable[[Any], bytes]] = None, request_deserializer: Optional[Callable[[bytes], Any]] = None, options: Sequence[Tuple[AnyStr, AnyStr]] = (), - # TODO: Somehow make insecure_channel opt-in, not the default. channel_credentials: Optional[grpc.ChannelCredentials] = None, call_credentials: Optional[grpc.CallCredentials] = None, compression: Optional[grpc.Compression] = None, @@ -169,10 +203,45 @@ def unary_stream(request: RequestType, metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[ResponseType]: """Invokes a unary-stream RPC without an explicitly specified channel. - This is backed by a cache of channels evicted by a background thread - on a periodic basis. - - TODO: Document the parameters and return value. + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (channel args in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials(). + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to False. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. + metadata: Optional metadata to send to the server. + + Returns: + An iterator of responses. """ channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_stream(method, request_serializer, request_deserializer) @@ -189,7 +258,6 @@ def stream_unary(request_iterator: Iterator[RequestType], request_serializer: Optional[Callable[[Any], bytes]] = None, request_deserializer: Optional[Callable[[bytes], Any]] = None, options: Sequence[Tuple[AnyStr, AnyStr]] = (), - # TODO: Somehow make insecure_channel opt-in, not the default. channel_credentials: Optional[grpc.ChannelCredentials] = None, call_credentials: Optional[grpc.CallCredentials] = None, compression: Optional[grpc.Compression] = None, @@ -198,10 +266,45 @@ def stream_unary(request_iterator: Iterator[RequestType], metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> ResponseType: """Invokes a stream-unary RPC without an explicitly specified channel. - This is backed by a cache of channels evicted by a background thread - on a periodic basis. - - TODO: Document the parameters and return value. + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request_iterator: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (channel args in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials(). + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to False. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. + metadata: Optional metadata to send to the server. + + Returns: + The response to the RPC. """ channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_unary(method, request_serializer, request_deserializer) @@ -218,7 +321,6 @@ def stream_stream(request_iterator: Iterator[RequestType], request_serializer: Optional[Callable[[Any], bytes]] = None, request_deserializer: Optional[Callable[[bytes], Any]] = None, options: Sequence[Tuple[AnyStr, AnyStr]] = (), - # TODO: Somehow make insecure_channel opt-in, not the default. channel_credentials: Optional[grpc.ChannelCredentials] = None, call_credentials: Optional[grpc.CallCredentials] = None, compression: Optional[grpc.Compression] = None, @@ -227,10 +329,45 @@ def stream_stream(request_iterator: Iterator[RequestType], metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[ResponseType]: """Invokes a stream-stream RPC without an explicitly specified channel. - This is backed by a cache of channels evicted by a background thread - on a periodic basis. - - TODO: Document the parameters and return value. + This is backed by a per-process cache of channels. Channels are evicted + from the cache after a fixed period by a background. Channels will also be + evicted if more than a configured maximum accumulate. + + The default eviction period is 10 minutes. One may set the environment + variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. + + The default maximum maximum number of channels is 256. One may set the + environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure + this. + + Args: + request_iterator: An iterator that yields request values for the RPC. + target: The server address. + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the response + message. Response goes undeserialized in case None is passed. + options: An optional list of key-value pairs (channel args in gRPC Core + runtime) to configure the channel. + channel_credentials: A credential applied to the whole channel, e.g. the + return value of grpc.ssl_channel_credentials(). + call_credentials: A call credential applied to each call individually, + e.g. the output of grpc.metadata_call_credentials() or + grpc.access_token_call_credentials(). + compression: An optional value indicating the compression method to be + used over the lifetime of the channel, e.g. grpc.Compression.Gzip. + wait_for_ready: An optional flag indicating whether the RPC should fail + immediately if the connection is not ready at the time the RPC is + invoked, or if it should wait until the connection to the server + becomes ready. When using this option, the user will likely also want + to set a timeout. Defaults to False. + timeout: An optional duration of time in seconds to allow for the RPC, + after which an exception will be raised. + metadata: Optional metadata to send to the server. + + Returns: + An iterator of responses. """ channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_stream(method, request_serializer, request_deserializer) From 84c8dc739e0a39c7acac0968b03eaa61589915fc Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 7 Feb 2020 15:58:51 -0800 Subject: [PATCH 013/129] Add insecure_channel_credentials function --- src/python/grpcio/grpc/__init__.py | 14 +- src/python/grpcio/grpc/_simple_stubs.py | 213 ++++++++++-------- .../tests/unit/py3_only/_simple_stubs_test.py | 134 ++++++----- 3 files changed, 213 insertions(+), 148 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 3417fb2caa5..369052671b1 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -569,7 +569,6 @@ class StreamStreamClientInterceptor(six.with_metaclass(abc.ABCMeta)): ############ Authentication & Authorization Interfaces & Classes ############# - class ChannelCredentials(object): """An encapsulation of the data required to create a secure Channel. @@ -600,6 +599,13 @@ class CallCredentials(object): self._credentials = credentials +_insecure_channel_credentials = object() + + +def insecure_channel_credentials(): + return ChannelCredentials(_insecure_channel_credentials) + + class AuthMetadataContext(six.with_metaclass(abc.ABCMeta)): """Provides information to call credentials metadata plugins. @@ -1879,6 +1885,10 @@ def secure_channel(target, credentials, options=None, compression=None): A Channel. """ from grpc import _channel # pylint: disable=cyclic-import + if credentials._credentials is _insecure_channel_credentials: + raise ValueError( + "secure_channel cannot be called with insecure credentials." + + " Call insecure_channel instead.") return _channel.Channel(target, () if options is None else options, credentials._credentials, compression) @@ -1949,7 +1959,6 @@ def server(thread_pool, maximum_concurrent_rpcs, compression) - @contextlib.contextmanager def _create_servicer_context(rpc_event, state, request_deserializer): from grpc import _server # pylint: disable=cyclic-import @@ -2022,6 +2031,7 @@ __all__ = ( 'access_token_call_credentials', 'composite_call_credentials', 'composite_channel_credentials', + 'insecure_channel_credentials', 'local_channel_credentials', 'local_server_credentials', 'ssl_server_credentials', diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 17666dc9ba7..5636e33e0c3 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -9,13 +9,14 @@ import threading import grpc from typing import Any, AnyStr, Callable, Iterator, Optional, Sequence, Tuple, TypeVar, Union - _LOGGER = logging.getLogger(__name__) _EVICTION_PERIOD_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" if _EVICTION_PERIOD_KEY in os.environ: - _EVICTION_PERIOD = datetime.timedelta(seconds=float(os.environ[_EVICTION_PERIOD_KEY])) - _LOGGER.info(f"Setting managed channel eviction period to {_EVICTION_PERIOD}") + _EVICTION_PERIOD = datetime.timedelta( + seconds=float(os.environ[_EVICTION_PERIOD_KEY])) + _LOGGER.info( + f"Setting managed channel eviction period to {_EVICTION_PERIOD}") else: _EVICTION_PERIOD = datetime.timedelta(minutes=10) @@ -24,39 +25,40 @@ if _MAXIMUM_CHANNELS_KEY in os.environ: _MAXIMUM_CHANNELS = int(os.environ[_MAXIMUM_CHANNELS_KEY]) _LOGGER.info(f"Setting maximum managed channels to {_MAXIMUM_CHANNELS}") else: - _MAXIMUM_CHANNELS = 2 ** 8 + _MAXIMUM_CHANNELS = 2**8 + -def _create_channel(target: str, - options: Sequence[Tuple[str, str]], - channel_credentials: Optional[grpc.ChannelCredentials], +def _create_channel(target: str, options: Sequence[Tuple[str, str]], + channel_credentials: grpc.ChannelCredentials, compression: Optional[grpc.Compression]) -> grpc.Channel: - if channel_credentials is None: + if channel_credentials._credentials is grpc._insecure_channel_credentials: _LOGGER.info(f"Creating insecure channel with options '{options}' " + - f"and compression '{compression}'") + f"and compression '{compression}'") return grpc.insecure_channel(target, options=options, compression=compression) else: - _LOGGER.info(f"Creating secure channel with credentials '{channel_credentials}', " + - f"options '{options}' and compression '{compression}'") + _LOGGER.info( + f"Creating secure channel with credentials '{channel_credentials}', " + + f"options '{options}' and compression '{compression}'") return grpc.secure_channel(target, credentials=channel_credentials, options=options, compression=compression) + class ChannelCache: _singleton = None _lock = threading.RLock() _condition = threading.Condition(lock=_lock) _eviction_ready = threading.Event() - def __init__(self): self._mapping = collections.OrderedDict() - self._eviction_thread = threading.Thread(target=ChannelCache._perform_evictions, daemon=True) + self._eviction_thread = threading.Thread( + target=ChannelCache._perform_evictions, daemon=True) self._eviction_thread.start() - @staticmethod def get(): with ChannelCache._lock: @@ -72,7 +74,6 @@ class ChannelCache: channel.close() del channel - # TODO: Refactor. Way too deeply nested. @staticmethod def _perform_evictions(): @@ -86,7 +87,8 @@ class ChannelCache: ChannelCache._singleton._evict_locked(key) # And immediately reevaluate. else: - key, (channel, eviction_time) = next(iter(ChannelCache._singleton._mapping.items())) + key, (channel, eviction_time) = next( + iter(ChannelCache._singleton._mapping.items())) now = datetime.datetime.now() if eviction_time <= now: ChannelCache._singleton._evict_locked(key) @@ -95,12 +97,8 @@ class ChannelCache: time_to_eviction = (eviction_time - now).total_seconds() ChannelCache._condition.wait(timeout=time_to_eviction) - - - def get_channel(self, - target: str, - options: Sequence[Tuple[str, str]], - channel_credentials: Optional[grpc.ChannelCredentials], + def get_channel(self, target: str, options: Sequence[Tuple[str, str]], + channel_credentials: grpc.ChannelCredentials, compression: Optional[grpc.Compression]) -> grpc.Channel: key = (target, options, channel_credentials, compression) with self._lock: @@ -109,12 +107,16 @@ class ChannelCache: if channel_data is not None: channel = channel_data[0] self._mapping.pop(key) - self._mapping[key] = (channel, datetime.datetime.now() + _EVICTION_PERIOD) + self._mapping[key] = (channel, datetime.datetime.now() + + _EVICTION_PERIOD) return channel else: - channel = _create_channel(target, options, channel_credentials, compression) - self._mapping[key] = (channel, datetime.datetime.now() + _EVICTION_PERIOD) - if len(self._mapping) == 1 or len(self._mapping) >= _MAXIMUM_CHANNELS: + channel = _create_channel(target, options, channel_credentials, + compression) + self._mapping[key] = (channel, datetime.datetime.now() + + _EVICTION_PERIOD) + if len(self._mapping) == 1 or len( + self._mapping) >= _MAXIMUM_CHANNELS: self._condition.notify() return channel @@ -122,22 +124,38 @@ class ChannelCache: with self._lock: return len(self._mapping) + RequestType = TypeVar('RequestType') ResponseType = TypeVar('ResponseType') -def unary_unary(request: RequestType, - target: str, - method: str, - request_serializer: Optional[Callable[[Any], bytes]] = None, - request_deserializer: Optional[Callable[[bytes], Any]] = None, - options: Sequence[Tuple[AnyStr, AnyStr]] = (), - # TODO: Somehow make insecure_channel opt-in, not the default. - channel_credentials: Optional[grpc.ChannelCredentials] = None, - call_credentials: Optional[grpc.CallCredentials] = None, - compression: Optional[grpc.Compression] = None, - wait_for_ready: Optional[bool] = None, - timeout: Optional[float] = None, - metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> ResponseType: + +# TODO(rbellevi): Consider a credential type that has the +# following functionality matrix: +# +# +----------+-------+--------+ +# | | local | remote | +# |----------+-------+--------+ +# | secure | o | o | +# | insecure | o | x | +# +----------+-------+--------+ +# +# Make this the default option. + +# TODO: Make LocalChannelCredentials the default. +def unary_unary( + request: RequestType, + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None +) -> ResponseType: """Invokes a unary-unary RPC without an explicitly specified channel. This is backed by a per-process cache of channels. Channels are evicted @@ -147,7 +165,7 @@ def unary_unary(request: RequestType, The default eviction period is 10 minutes. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. - The default maximum maximum number of channels is 256. One may set the + The default maximum number of channels is 256. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure this. @@ -162,7 +180,8 @@ def unary_unary(request: RequestType, options: An optional list of key-value pairs (channel args in gRPC Core runtime) to configure the channel. channel_credentials: A credential applied to the whole channel, e.g. the - return value of grpc.ssl_channel_credentials(). + return value of grpc.ssl_channel_credentials() or + grpc.insecure_channel_credentials(). call_credentials: A call credential applied to each call individually, e.g. the output of grpc.metadata_call_credentials() or grpc.access_token_call_credentials(). @@ -180,8 +199,11 @@ def unary_unary(request: RequestType, Returns: The response to the RPC. """ - channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) - multicallable = channel.unary_unary(method, request_serializer, request_deserializer) + channel_credentials = channel_credentials or grpc.local_channel_credentials() + channel = ChannelCache.get().get_channel(target, options, + channel_credentials, compression) + multicallable = channel.unary_unary(method, request_serializer, + request_deserializer) return multicallable(request, metadata=metadata, wait_for_ready=wait_for_ready, @@ -189,18 +211,20 @@ def unary_unary(request: RequestType, timeout=timeout) -def unary_stream(request: RequestType, - target: str, - method: str, - request_serializer: Optional[Callable[[Any], bytes]] = None, - request_deserializer: Optional[Callable[[bytes], Any]] = None, - options: Sequence[Tuple[AnyStr, AnyStr]] = (), - channel_credentials: Optional[grpc.ChannelCredentials] = None, - call_credentials: Optional[grpc.CallCredentials] = None, - compression: Optional[grpc.Compression] = None, - wait_for_ready: Optional[bool] = None, - timeout: Optional[float] = None, - metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[ResponseType]: +def unary_stream( + request: RequestType, + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None +) -> Iterator[ResponseType]: """Invokes a unary-stream RPC without an explicitly specified channel. This is backed by a per-process cache of channels. Channels are evicted @@ -210,7 +234,7 @@ def unary_stream(request: RequestType, The default eviction period is 10 minutes. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. - The default maximum maximum number of channels is 256. One may set the + The default maximum number of channels is 256. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure this. @@ -243,8 +267,11 @@ def unary_stream(request: RequestType, Returns: An iterator of responses. """ - channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) - multicallable = channel.unary_stream(method, request_serializer, request_deserializer) + channel_credentials = channel_credentials or grpc.local_channel_credentials() + channel = ChannelCache.get().get_channel(target, options, + channel_credentials, compression) + multicallable = channel.unary_stream(method, request_serializer, + request_deserializer) return multicallable(request, metadata=metadata, wait_for_ready=wait_for_ready, @@ -252,18 +279,20 @@ def unary_stream(request: RequestType, timeout=timeout) -def stream_unary(request_iterator: Iterator[RequestType], - target: str, - method: str, - request_serializer: Optional[Callable[[Any], bytes]] = None, - request_deserializer: Optional[Callable[[bytes], Any]] = None, - options: Sequence[Tuple[AnyStr, AnyStr]] = (), - channel_credentials: Optional[grpc.ChannelCredentials] = None, - call_credentials: Optional[grpc.CallCredentials] = None, - compression: Optional[grpc.Compression] = None, - wait_for_ready: Optional[bool] = None, - timeout: Optional[float] = None, - metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> ResponseType: +def stream_unary( + request_iterator: Iterator[RequestType], + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None +) -> ResponseType: """Invokes a stream-unary RPC without an explicitly specified channel. This is backed by a per-process cache of channels. Channels are evicted @@ -273,7 +302,7 @@ def stream_unary(request_iterator: Iterator[RequestType], The default eviction period is 10 minutes. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. - The default maximum maximum number of channels is 256. One may set the + The default maximum number of channels is 256. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure this. @@ -306,8 +335,11 @@ def stream_unary(request_iterator: Iterator[RequestType], Returns: The response to the RPC. """ - channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) - multicallable = channel.stream_unary(method, request_serializer, request_deserializer) + channel_credentials = channel_credentials or grpc.local_channel_credentials() + channel = ChannelCache.get().get_channel(target, options, + channel_credentials, compression) + multicallable = channel.stream_unary(method, request_serializer, + request_deserializer) return multicallable(request_iterator, metadata=metadata, wait_for_ready=wait_for_ready, @@ -315,18 +347,20 @@ def stream_unary(request_iterator: Iterator[RequestType], timeout=timeout) -def stream_stream(request_iterator: Iterator[RequestType], - target: str, - method: str, - request_serializer: Optional[Callable[[Any], bytes]] = None, - request_deserializer: Optional[Callable[[bytes], Any]] = None, - options: Sequence[Tuple[AnyStr, AnyStr]] = (), - channel_credentials: Optional[grpc.ChannelCredentials] = None, - call_credentials: Optional[grpc.CallCredentials] = None, - compression: Optional[grpc.Compression] = None, - wait_for_ready: Optional[bool] = None, - timeout: Optional[float] = None, - metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None) -> Iterator[ResponseType]: +def stream_stream( + request_iterator: Iterator[RequestType], + target: str, + method: str, + request_serializer: Optional[Callable[[Any], bytes]] = None, + request_deserializer: Optional[Callable[[bytes], Any]] = None, + options: Sequence[Tuple[AnyStr, AnyStr]] = (), + channel_credentials: Optional[grpc.ChannelCredentials] = None, + call_credentials: Optional[grpc.CallCredentials] = None, + compression: Optional[grpc.Compression] = None, + wait_for_ready: Optional[bool] = None, + timeout: Optional[float] = None, + metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None +) -> Iterator[ResponseType]: """Invokes a stream-stream RPC without an explicitly specified channel. This is backed by a per-process cache of channels. Channels are evicted @@ -336,7 +370,7 @@ def stream_stream(request_iterator: Iterator[RequestType], The default eviction period is 10 minutes. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" to configure this. - The default maximum maximum number of channels is 256. One may set the + The default maximum number of channels is 256. One may set the environment variable "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" to configure this. @@ -369,8 +403,11 @@ def stream_stream(request_iterator: Iterator[RequestType], Returns: An iterator of responses. """ - channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) - multicallable = channel.stream_stream(method, request_serializer, request_deserializer) + channel_credentials = channel_credentials or grpc.local_channel_credentials() + channel = ChannelCache.get().get_channel(target, options, + channel_credentials, compression) + multicallable = channel.stream_stream(method, request_serializer, + request_deserializer) return multicallable(request_iterator, metadata=metadata, wait_for_ready=wait_for_ready, diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 37019cb6c7e..1acc8728866 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -32,6 +32,7 @@ from typing import Callable, Optional import test_common import grpc +_REQUEST = b"0000" _CACHE_EPOCHS = 8 _CACHE_TRIALS = 6 @@ -67,6 +68,7 @@ def _stream_stream_handler(request_iterator, context): class _GenericHandler(grpc.GenericRpcHandler): + def service(self, handler_call_details): if handler_call_details.method == _UNARY_UNARY: return grpc.unary_unary_rpc_method_handler(_unary_unary_handler) @@ -125,11 +127,12 @@ class SimpleStubsTest(unittest.TestCase): runs.append(_time_invocation(lambda: to_check(text))) initial_runs.append(runs[0]) cached_runs.extend(runs[1:]) - average_cold = sum((run for run in initial_runs), datetime.timedelta()) / len(initial_runs) - average_warm = sum((run for run in cached_runs), datetime.timedelta()) / len(cached_runs) + average_cold = sum((run for run in initial_runs), + datetime.timedelta()) / len(initial_runs) + average_warm = sum((run for run in cached_runs), + datetime.timedelta()) / len(cached_runs) self.assertLess(average_warm, average_cold) - def assert_eventually(self, predicate: Callable[[], bool], *, @@ -148,106 +151,121 @@ class SimpleStubsTest(unittest.TestCase): def test_unary_unary_insecure(self): with _server(None) as (_, port): target = f'localhost:{port}' - request = b'0000' - response = grpc.unary_unary(request, target, _UNARY_UNARY) - self.assertEqual(request, response) + response = grpc.unary_unary( + _REQUEST, + target, + _UNARY_UNARY, + channel_credentials=grpc.insecure_channel_credentials()) + self.assertEqual(_REQUEST, response) def test_unary_unary_secure(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - request = b'0000' - response = grpc.unary_unary(request, - target, - _UNARY_UNARY, - channel_credentials=grpc.local_channel_credentials()) - self.assertEqual(request, response) + response = grpc.unary_unary( + _REQUEST, + target, + _UNARY_UNARY, + channel_credentials=grpc.local_channel_credentials()) + self.assertEqual(_REQUEST, response) + + def test_channel_credentials_default(self): + with _server(grpc.local_server_credentials()) as (_, port): + target = f'localhost:{port}' + response = grpc.unary_unary( + _REQUEST, + target, + _UNARY_UNARY) + self.assertEqual(_REQUEST, response) def test_channels_cached(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - request = b'0000' test_name = inspect.stack()[0][3] - args = (request, target, _UNARY_UNARY) + args = (_REQUEST, target, _UNARY_UNARY) kwargs = {"channel_credentials": grpc.local_channel_credentials()} + def _invoke(seed: str): run_kwargs = dict(kwargs) run_kwargs["options"] = ((test_name + seed, ""),) grpc.unary_unary(*args, **run_kwargs) + self.assert_cached(_invoke) def test_channels_evicted(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - request = b'0000' - response = grpc.unary_unary(request, - target, - _UNARY_UNARY, - channel_credentials=grpc.local_channel_credentials()) + response = grpc.unary_unary( + _REQUEST, + target, + _UNARY_UNARY, + channel_credentials=grpc.local_channel_credentials()) self.assert_eventually( - lambda: grpc._simple_stubs.ChannelCache.get()._test_only_channel_count() == 0, - message=lambda: f"{grpc._simple_stubs.ChannelCache.get()._test_only_channel_count()} remain") + lambda: grpc._simple_stubs.ChannelCache.get( + )._test_only_channel_count() == 0, + message=lambda: + f"{grpc._simple_stubs.ChannelCache.get()._test_only_channel_count()} remain" + ) def test_total_channels_enforced(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - request = b'0000' for i in range(99): # Ensure we get a new channel each time. options = (("foo", str(i)),) # Send messages at full blast. - grpc.unary_unary(request, - target, - _UNARY_UNARY, - options=options, - channel_credentials=grpc.local_channel_credentials()) + grpc.unary_unary( + _REQUEST, + target, + _UNARY_UNARY, + options=options, + channel_credentials=grpc.local_channel_credentials()) self.assert_eventually( - lambda: grpc._simple_stubs.ChannelCache.get()._test_only_channel_count() <= _MAXIMUM_CHANNELS + 1, - message=lambda: f"{grpc._simple_stubs.ChannelCache.get()._test_only_channel_count()} channels remain") + lambda: grpc._simple_stubs.ChannelCache.get( + )._test_only_channel_count() <= _MAXIMUM_CHANNELS + 1, + message=lambda: + f"{grpc._simple_stubs.ChannelCache.get()._test_only_channel_count()} channels remain" + ) def test_unary_stream(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - request = b'0000' - for response in grpc.unary_stream(request, - target, - _UNARY_STREAM, - channel_credentials=grpc.local_channel_credentials()): - self.assertEqual(request, response) + for response in grpc.unary_stream( + _REQUEST, + target, + _UNARY_STREAM, + channel_credentials=grpc.local_channel_credentials()): + self.assertEqual(_REQUEST, response) def test_stream_unary(self): + def request_iter(): for _ in range(_CLIENT_REQUEST_COUNT): - yield request + yield _REQUEST + with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - request = b'0000' - response = grpc.stream_unary(request_iter(), - target, - _STREAM_UNARY, - channel_credentials=grpc.local_channel_credentials()) - self.assertEqual(request, response) + response = grpc.stream_unary( + request_iter(), + target, + _STREAM_UNARY, + channel_credentials=grpc.local_channel_credentials()) + self.assertEqual(_REQUEST, response) def test_stream_stream(self): + def request_iter(): for _ in range(_CLIENT_REQUEST_COUNT): - yield request + yield _REQUEST + with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - request = b'0000' - for response in grpc.stream_stream(request_iter(), - target, - _STREAM_STREAM, - channel_credentials=grpc.local_channel_credentials()): - self.assertEqual(request, response) - - - # TODO: Test request_serializer - # TODO: Test request_deserializer - # TODO: Test channel_credentials - # TODO: Test call_credentials - # TODO: Test compression - # TODO: Test wait_for_ready - # TODO: Test metadata + for response in grpc.stream_stream( + request_iter(), + target, + _STREAM_STREAM, + channel_credentials=grpc.local_channel_credentials()): + self.assertEqual(_REQUEST, response) + if __name__ == "__main__": logging.basicConfig(level=logging.INFO) From ac864c75026d35d13bdac9dc6895ce497f409323 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 7 Feb 2020 16:42:38 -0800 Subject: [PATCH 014/129] Make APIs experimental --- src/python/grpcio/grpc/__init__.py | 15 +------ src/python/grpcio/grpc/_simple_stubs.py | 26 ++++++++---- .../grpcio/grpc/experimental/__init__.py | 42 +++++++++++++++++++ .../tests/unit/py3_only/_simple_stubs_test.py | 30 +++++++------ 4 files changed, 76 insertions(+), 37 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 369052671b1..1d140be95f0 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -569,6 +569,7 @@ class StreamStreamClientInterceptor(six.with_metaclass(abc.ABCMeta)): ############ Authentication & Authorization Interfaces & Classes ############# + class ChannelCredentials(object): """An encapsulation of the data required to create a secure Channel. @@ -599,13 +600,6 @@ class CallCredentials(object): self._credentials = credentials -_insecure_channel_credentials = object() - - -def insecure_channel_credentials(): - return ChannelCredentials(_insecure_channel_credentials) - - class AuthMetadataContext(six.with_metaclass(abc.ABCMeta)): """Provides information to call credentials metadata plugins. @@ -1885,6 +1879,7 @@ def secure_channel(target, credentials, options=None, compression=None): A Channel. """ from grpc import _channel # pylint: disable=cyclic-import + from grpc.experimental import _insecure_channel_credentials if credentials._credentials is _insecure_channel_credentials: raise ValueError( "secure_channel cannot be called with insecure credentials." + @@ -2031,7 +2026,6 @@ __all__ = ( 'access_token_call_credentials', 'composite_call_credentials', 'composite_channel_credentials', - 'insecure_channel_credentials', 'local_channel_credentials', 'local_server_credentials', 'ssl_server_credentials', @@ -2042,13 +2036,8 @@ __all__ = ( 'secure_channel', 'intercept_channel', 'server', - 'unary_unary', ) -if sys.version_info[0] >= 3: - from grpc._simple_stubs import unary_unary, unary_stream, stream_unary, stream_stream - __all__ = __all__ + (unary_unary, unary_stream, stream_unary, stream_stream) - ############################### Extension Shims ################################ # Here to maintain backwards compatibility; avoid using these in new code! diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 5636e33e0c3..fb5ba35cf0d 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -29,9 +29,11 @@ else: def _create_channel(target: str, options: Sequence[Tuple[str, str]], - channel_credentials: grpc.ChannelCredentials, + channel_credentials: Optional[grpc.ChannelCredentials], compression: Optional[grpc.Compression]) -> grpc.Channel: - if channel_credentials._credentials is grpc._insecure_channel_credentials: + channel_credentials = channel_credentials or grpc.local_channel_credentials( + ) + if channel_credentials._credentials is grpc.experimental._insecure_channel_credentials: _LOGGER.info(f"Creating insecure channel with options '{options}' " + f"and compression '{compression}'") return grpc.insecure_channel(target, @@ -98,7 +100,7 @@ class ChannelCache: ChannelCache._condition.wait(timeout=time_to_eviction) def get_channel(self, target: str, options: Sequence[Tuple[str, str]], - channel_credentials: grpc.ChannelCredentials, + channel_credentials: Optional[grpc.ChannelCredentials], compression: Optional[grpc.Compression]) -> grpc.Channel: key = (target, options, channel_credentials, compression) with self._lock: @@ -128,7 +130,6 @@ class ChannelCache: RequestType = TypeVar('RequestType') ResponseType = TypeVar('ResponseType') - # TODO(rbellevi): Consider a credential type that has the # following functionality matrix: # @@ -141,6 +142,7 @@ ResponseType = TypeVar('ResponseType') # # Make this the default option. + # TODO: Make LocalChannelCredentials the default. def unary_unary( request: RequestType, @@ -158,6 +160,8 @@ def unary_unary( ) -> ResponseType: """Invokes a unary-unary RPC without an explicitly specified channel. + THIS IS AN EXPERIMENTAL API. + This is backed by a per-process cache of channels. Channels are evicted from the cache after a fixed period by a background. Channels will also be evicted if more than a configured maximum accumulate. @@ -199,7 +203,7 @@ def unary_unary( Returns: The response to the RPC. """ - channel_credentials = channel_credentials or grpc.local_channel_credentials() + grpc.experimental.warn_experimental("unary_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_unary(method, request_serializer, @@ -227,6 +231,8 @@ def unary_stream( ) -> Iterator[ResponseType]: """Invokes a unary-stream RPC without an explicitly specified channel. + THIS IS AN EXPERIMENTAL API. + This is backed by a per-process cache of channels. Channels are evicted from the cache after a fixed period by a background. Channels will also be evicted if more than a configured maximum accumulate. @@ -267,7 +273,7 @@ def unary_stream( Returns: An iterator of responses. """ - channel_credentials = channel_credentials or grpc.local_channel_credentials() + grpc.experimental.warn_experimental("unary_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_stream(method, request_serializer, @@ -295,6 +301,8 @@ def stream_unary( ) -> ResponseType: """Invokes a stream-unary RPC without an explicitly specified channel. + THIS IS AN EXPERIMENTAL API. + This is backed by a per-process cache of channels. Channels are evicted from the cache after a fixed period by a background. Channels will also be evicted if more than a configured maximum accumulate. @@ -335,7 +343,7 @@ def stream_unary( Returns: The response to the RPC. """ - channel_credentials = channel_credentials or grpc.local_channel_credentials() + grpc.experimental.warn_experimental("stream_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_unary(method, request_serializer, @@ -363,6 +371,8 @@ def stream_stream( ) -> Iterator[ResponseType]: """Invokes a stream-stream RPC without an explicitly specified channel. + THIS IS AN EXPERIMENTAL API. + This is backed by a per-process cache of channels. Channels are evicted from the cache after a fixed period by a background. Channels will also be evicted if more than a configured maximum accumulate. @@ -403,7 +413,7 @@ def stream_stream( Returns: An iterator of responses. """ - channel_credentials = channel_credentials or grpc.local_channel_credentials() + grpc.experimental.warn_experimental("stream_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_stream(method, request_serializer, diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index a2c98c6f8be..277541ba97f 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -16,6 +16,12 @@ These APIs are subject to be removed during any minor version release. """ +import sys +import warnings + +import grpc +import grpc._simple_stubs + class ChannelOptions(object): """Indicates a channel option unique to gRPC Python. @@ -30,3 +36,39 @@ class ChannelOptions(object): class UsageError(Exception): """Raised by the gRPC library to indicate usage not allowed by the API.""" + + +_insecure_channel_credentials = object() + + +def insecure_channel_credentials(): + """Creates a ChannelCredentials for use with an insecure channel. + + THIS IS AN EXPERIMENTAL API. + + This is not for use with secure_channel function. Intead, this should be + used with grpc.unary_unary, grpc.unary_stream, grpc.stream_unary, or + grpc.stream_stream. + """ + return grpc.ChannelCredentials(_insecure_channel_credentials) + + +class ExperimentalApiWarning(Warning): + """A warning that an API is experimental.""" + +def warn_experimental(api_name): + msg = ("{} is an experimental API. It is subject to change or ".format(api_name) + + "removal between minor releases. Proceed with caution.") + warnings.warn(msg, ExperimentalApiWarning, stacklevel=2) + +__all__ = ( + 'ChannelOptions', + 'ExperimentalApiWarning', + 'UsageError', + 'insecure_channel_credentials', +) + +if sys.version_info[0] >= 3: + from grpc._simple_stubs import unary_unary, unary_stream, stream_unary, stream_stream + __all__ = __all__ + (unary_unary, unary_stream, stream_unary, stream_stream) + diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 1acc8728866..de81b7cfdff 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -31,6 +31,7 @@ from typing import Callable, Optional import test_common import grpc +import grpc.experimental _REQUEST = b"0000" @@ -151,17 +152,17 @@ class SimpleStubsTest(unittest.TestCase): def test_unary_unary_insecure(self): with _server(None) as (_, port): target = f'localhost:{port}' - response = grpc.unary_unary( - _REQUEST, - target, - _UNARY_UNARY, - channel_credentials=grpc.insecure_channel_credentials()) + response = grpc.experimental.unary_unary( + _REQUEST, + target, + _UNARY_UNARY, + channel_credentials=grpc.experimental.insecure_channel_credentials()) self.assertEqual(_REQUEST, response) def test_unary_unary_secure(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - response = grpc.unary_unary( + response = grpc.experimental.unary_unary( _REQUEST, target, _UNARY_UNARY, @@ -171,10 +172,7 @@ class SimpleStubsTest(unittest.TestCase): def test_channel_credentials_default(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - response = grpc.unary_unary( - _REQUEST, - target, - _UNARY_UNARY) + response = grpc.experimental.unary_unary(_REQUEST, target, _UNARY_UNARY) self.assertEqual(_REQUEST, response) def test_channels_cached(self): @@ -187,14 +185,14 @@ class SimpleStubsTest(unittest.TestCase): def _invoke(seed: str): run_kwargs = dict(kwargs) run_kwargs["options"] = ((test_name + seed, ""),) - grpc.unary_unary(*args, **run_kwargs) + grpc.experimental.unary_unary(*args, **run_kwargs) self.assert_cached(_invoke) def test_channels_evicted(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - response = grpc.unary_unary( + response = grpc.experimental.unary_unary( _REQUEST, target, _UNARY_UNARY, @@ -213,7 +211,7 @@ class SimpleStubsTest(unittest.TestCase): # Ensure we get a new channel each time. options = (("foo", str(i)),) # Send messages at full blast. - grpc.unary_unary( + grpc.experimental.unary_unary( _REQUEST, target, _UNARY_UNARY, @@ -229,7 +227,7 @@ class SimpleStubsTest(unittest.TestCase): def test_unary_stream(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - for response in grpc.unary_stream( + for response in grpc.experimental.unary_stream( _REQUEST, target, _UNARY_STREAM, @@ -244,7 +242,7 @@ class SimpleStubsTest(unittest.TestCase): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - response = grpc.stream_unary( + response = grpc.experimental.stream_unary( request_iter(), target, _STREAM_UNARY, @@ -259,7 +257,7 @@ class SimpleStubsTest(unittest.TestCase): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - for response in grpc.stream_stream( + for response in grpc.experimental.stream_stream( request_iter(), target, _STREAM_STREAM, From e5b287ead811469396b17551c632f83751e54750 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 7 Feb 2020 16:51:25 -0800 Subject: [PATCH 015/129] Yapf. Pylint --- .pylintrc | 2 +- src/python/grpcio/grpc/_simple_stubs.py | 31 ++++++++++++++----- .../grpcio/grpc/experimental/__init__.py | 7 +++-- .../tests/unit/py3_only/_simple_stubs_test.py | 6 ++-- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/.pylintrc b/.pylintrc index 4924d3651e4..97f9bc90c3d 100644 --- a/.pylintrc +++ b/.pylintrc @@ -12,7 +12,7 @@ extension-pkg-whitelist=grpc._cython.cygrpc # TODO(https://github.com/PyCQA/pylint/issues/1345): How does the inspection # not include "unused_" and "ignored_" by default? -dummy-variables-rgx=^ignored_|^unused_ +dummy-variables-rgx=^ignored_|^unused_|_ [DESIGN] diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index fb5ba35cf0d..a21d6eb1ca3 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -1,13 +1,26 @@ -# TODO: Flowerbox. +# Copyright 2020 The 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. +"""Functions that obviate explicit stubs and explicit channels.""" import collections import datetime import os import logging import threading +from typing import Any, AnyStr, Callable, Iterator, Optional, Sequence, Tuple, TypeVar, Union import grpc -from typing import Any, AnyStr, Callable, Iterator, Optional, Sequence, Tuple, TypeVar, Union _LOGGER = logging.getLogger(__name__) @@ -16,14 +29,14 @@ if _EVICTION_PERIOD_KEY in os.environ: _EVICTION_PERIOD = datetime.timedelta( seconds=float(os.environ[_EVICTION_PERIOD_KEY])) _LOGGER.info( - f"Setting managed channel eviction period to {_EVICTION_PERIOD}") + "Setting managed channel eviction period to %s", _EVICTION_PERIOD) else: _EVICTION_PERIOD = datetime.timedelta(minutes=10) _MAXIMUM_CHANNELS_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" if _MAXIMUM_CHANNELS_KEY in os.environ: _MAXIMUM_CHANNELS = int(os.environ[_MAXIMUM_CHANNELS_KEY]) - _LOGGER.info(f"Setting maximum managed channels to {_MAXIMUM_CHANNELS}") + _LOGGER.info("Setting maximum managed channels to %d", _MAXIMUM_CHANNELS) else: _MAXIMUM_CHANNELS = 2**8 @@ -72,7 +85,7 @@ class ChannelCache: # TODO: Type annotate key. def _evict_locked(self, key): channel, _ = self._mapping.pop(key) - _LOGGER.info(f"Evicting channel {channel} with configuration {key}.") + _LOGGER.info("Evicting channel %s with configuration %s.", channel, key) channel.close() del channel @@ -89,7 +102,7 @@ class ChannelCache: ChannelCache._singleton._evict_locked(key) # And immediately reevaluate. else: - key, (channel, eviction_time) = next( + key, (_, eviction_time) = next( iter(ChannelCache._singleton._mapping.items())) now = datetime.datetime.now() if eviction_time <= now: @@ -142,8 +155,7 @@ ResponseType = TypeVar('ResponseType') # # Make this the default option. - -# TODO: Make LocalChannelCredentials the default. +# pylint: disable=too-many-arguments def unary_unary( request: RequestType, target: str, @@ -215,6 +227,7 @@ def unary_unary( timeout=timeout) +# pylint: disable=too-many-arguments def unary_stream( request: RequestType, target: str, @@ -285,6 +298,7 @@ def unary_stream( timeout=timeout) +# pylint: disable=too-many-arguments def stream_unary( request_iterator: Iterator[RequestType], target: str, @@ -355,6 +369,7 @@ def stream_unary( timeout=timeout) +# pylint: disable=too-many-arguments def stream_stream( request_iterator: Iterator[RequestType], target: str, diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 277541ba97f..9e804aa7f96 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -56,11 +56,13 @@ def insecure_channel_credentials(): class ExperimentalApiWarning(Warning): """A warning that an API is experimental.""" + def warn_experimental(api_name): - msg = ("{} is an experimental API. It is subject to change or ".format(api_name) + - "removal between minor releases. Proceed with caution.") + msg = ("{} is an experimental API. It is subject to change or ".format( + api_name) + "removal between minor releases. Proceed with caution.") warnings.warn(msg, ExperimentalApiWarning, stacklevel=2) + __all__ = ( 'ChannelOptions', 'ExperimentalApiWarning', @@ -71,4 +73,3 @@ __all__ = ( if sys.version_info[0] >= 3: from grpc._simple_stubs import unary_unary, unary_stream, stream_unary, stream_stream __all__ = __all__ + (unary_unary, unary_stream, stream_unary, stream_stream) - diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index de81b7cfdff..abe48c92351 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -156,7 +156,8 @@ class SimpleStubsTest(unittest.TestCase): _REQUEST, target, _UNARY_UNARY, - channel_credentials=grpc.experimental.insecure_channel_credentials()) + channel_credentials=grpc.experimental. + insecure_channel_credentials()) self.assertEqual(_REQUEST, response) def test_unary_unary_secure(self): @@ -172,7 +173,8 @@ class SimpleStubsTest(unittest.TestCase): def test_channel_credentials_default(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - response = grpc.experimental.unary_unary(_REQUEST, target, _UNARY_UNARY) + response = grpc.experimental.unary_unary(_REQUEST, target, + _UNARY_UNARY) self.assertEqual(_REQUEST, response) def test_channels_cached(self): From 36aa768290f0928edadbf2e243dc965ecf564c66 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 7 Feb 2020 18:03:26 -0800 Subject: [PATCH 016/129] Correct tests.json --- src/python/grpcio_tests/tests/tests.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index 94e5123e40c..678ce03093e 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -70,7 +70,7 @@ "unit._server_test.ServerTest", "unit._server_wait_for_termination_test.ServerWaitForTerminationTest", "unit._session_cache_test.SSLSessionCacheTest", - "unit._simple_stubs_test.SimpleStubsTest", + "unit.py3_only._simple_stubs_test.SimpleStubsTest", "unit._signal_handling_test.SignalHandlingTest", "unit._version_test.VersionTest", "unit.beta._beta_features_test.BetaFeaturesTest", From 78c9ce56e51ae99bd4540087e9f6a072dfa723a7 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 11:36:33 -0800 Subject: [PATCH 017/129] Remove unguarded import of simple_stubs --- src/python/grpcio/grpc/experimental/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 9e804aa7f96..29f499f57c6 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -20,7 +20,6 @@ import sys import warnings import grpc -import grpc._simple_stubs class ChannelOptions(object): From 94efe57fb0bb7402e65535c4185ed8c4e9ac1c11 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 11:37:55 -0800 Subject: [PATCH 018/129] Buildifier --- .../grpcio_tests/tests/unit/BUILD.bazel | 1 - .../tests/unit/py3_only/BUILD.bazel | 39 ++++++++++--------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/python/grpcio_tests/tests/unit/BUILD.bazel b/src/python/grpcio_tests/tests/unit/BUILD.bazel index 75085e9091b..42b99023463 100644 --- a/src/python/grpcio_tests/tests/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/BUILD.bazel @@ -110,4 +110,3 @@ py_library( ) for test_file_name in GRPCIO_TESTS_UNIT ] - diff --git a/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel b/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel index 5cdfed647e5..7f1a013364a 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel @@ -1,6 +1,6 @@ package( - default_visibility = ["//visibility:public"], - default_testonly = True, + default_testonly = True, + default_visibility = ["//visibility:public"], ) GRPCIO_PY3_ONLY_UNIT_TESTS = [ @@ -8,21 +8,22 @@ GRPCIO_PY3_ONLY_UNIT_TESTS = [ ] [ - py_test( - name = test_file_name[:-len(".py")], - size = "small", - python_version = "PY3", - srcs_version = "PY3", - srcs = [test_file_name], - main = test_file_name, - deps = [ - "//src/python/grpcio_tests/tests/unit:resources", - "//src/python/grpcio_tests/tests/unit:test_common", - "//src/python/grpcio/grpc:grpcio", - "//src/python/grpcio_tests/tests/testing", - "//src/python/grpcio_tests/tests/unit/framework/common", - "@six", - ], - imports = [".."], - ) for test_file_name in GRPCIO_PY3_ONLY_UNIT_TESTS + py_test( + name = test_file_name[:-len(".py")], + size = "small", + srcs = [test_file_name], + imports = [".."], + main = test_file_name, + python_version = "PY3", + srcs_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/testing", + "//src/python/grpcio_tests/tests/unit:resources", + "//src/python/grpcio_tests/tests/unit:test_common", + "//src/python/grpcio_tests/tests/unit/framework/common", + "@six", + ], + ) + for test_file_name in GRPCIO_PY3_ONLY_UNIT_TESTS ] From 270880f440fc69a143d64280fc31c301b45e8de9 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 11:56:38 -0800 Subject: [PATCH 019/129] Yapf --- src/python/grpcio/grpc/_simple_stubs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index a21d6eb1ca3..a9e2d62f435 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -28,8 +28,8 @@ _EVICTION_PERIOD_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" if _EVICTION_PERIOD_KEY in os.environ: _EVICTION_PERIOD = datetime.timedelta( seconds=float(os.environ[_EVICTION_PERIOD_KEY])) - _LOGGER.info( - "Setting managed channel eviction period to %s", _EVICTION_PERIOD) + _LOGGER.info("Setting managed channel eviction period to %s", + _EVICTION_PERIOD) else: _EVICTION_PERIOD = datetime.timedelta(minutes=10) @@ -155,6 +155,7 @@ ResponseType = TypeVar('ResponseType') # # Make this the default option. + # pylint: disable=too-many-arguments def unary_unary( request: RequestType, From 70837b335117c56d6013224193cd3da2d651727b Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 12:44:08 -0800 Subject: [PATCH 020/129] Don't attempt to run under setuptools --- src/python/grpcio_tests/tests/tests.json | 1 - .../grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index 678ce03093e..eb702f6c8b0 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -70,7 +70,6 @@ "unit._server_test.ServerTest", "unit._server_wait_for_termination_test.ServerWaitForTerminationTest", "unit._session_cache_test.SSLSessionCacheTest", - "unit.py3_only._simple_stubs_test.SimpleStubsTest", "unit._signal_handling_test.SignalHandlingTest", "unit._version_test.VersionTest", "unit.beta._beta_features_test.BetaFeaturesTest", diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index abe48c92351..61a9117400c 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -13,6 +13,8 @@ # limitations under the License. """Tests for Simple Stubs.""" +# TODO(https://github.com/grpc/grpc/issues/21965): Run under setuptools. + import os _MAXIMUM_CHANNELS = 10 From 09774aebfb08f1ce0ad44a93bcca99b64a8da07f Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:18:18 -0800 Subject: [PATCH 021/129] Put libraries in order of reference --- src/python/grpcio/grpc/BUILD.bazel | 52 +++++++++++++++--------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/python/grpcio/grpc/BUILD.bazel b/src/python/grpcio/grpc/BUILD.bazel index 26279d11661..470b11e7fd7 100644 --- a/src/python/grpcio/grpc/BUILD.bazel +++ b/src/python/grpcio/grpc/BUILD.bazel @@ -1,31 +1,5 @@ package(default_visibility = ["//visibility:public"]) -py_library( - name = "grpcio", - srcs = ["__init__.py"], - data = [ - "//:grpc", - ], - imports = ["../"], - deps = [ - ":utilities", - ":auth", - ":plugin_wrapping", - ":channel", - ":interceptor", - ":server", - ":compression", - ":_simple_stubs", - "//src/python/grpcio/grpc/_cython:cygrpc", - "//src/python/grpcio/grpc/experimental", - "//src/python/grpcio/grpc/framework", - "@six//:six", - ] + select({ - "//conditions:default": ["@enum34//:enum34"], - "//:python3": [], - }), -) - py_library( name = "auth", srcs = ["_auth.py"], @@ -91,3 +65,29 @@ py_library( name = "_simple_stubs", srcs = ["_simple_stubs.py"], ) + +py_library( + name = "grpcio", + srcs = ["__init__.py"], + data = [ + "//:grpc", + ], + imports = ["../"], + deps = [ + ":utilities", + ":auth", + ":plugin_wrapping", + ":channel", + ":interceptor", + ":server", + ":compression", + ":_simple_stubs", + "//src/python/grpcio/grpc/_cython:cygrpc", + "//src/python/grpcio/grpc/experimental", + "//src/python/grpcio/grpc/framework", + "@six//:six", + ] + select({ + "//conditions:default": ["@enum34//:enum34"], + "//:python3": [], + }), +) From 70d3765712871830d2136a0a089ea3be777ad403 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:19:08 -0800 Subject: [PATCH 022/129] Use debug level logging --- src/python/grpcio/grpc/_simple_stubs.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index a9e2d62f435..ba8d57f2108 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -28,7 +28,7 @@ _EVICTION_PERIOD_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" if _EVICTION_PERIOD_KEY in os.environ: _EVICTION_PERIOD = datetime.timedelta( seconds=float(os.environ[_EVICTION_PERIOD_KEY])) - _LOGGER.info("Setting managed channel eviction period to %s", + _LOGGER.debug("Setting managed channel eviction period to %s", _EVICTION_PERIOD) else: _EVICTION_PERIOD = datetime.timedelta(minutes=10) @@ -36,7 +36,7 @@ else: _MAXIMUM_CHANNELS_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_MAXIMUM" if _MAXIMUM_CHANNELS_KEY in os.environ: _MAXIMUM_CHANNELS = int(os.environ[_MAXIMUM_CHANNELS_KEY]) - _LOGGER.info("Setting maximum managed channels to %d", _MAXIMUM_CHANNELS) + _LOGGER.debug("Setting maximum managed channels to %d", _MAXIMUM_CHANNELS) else: _MAXIMUM_CHANNELS = 2**8 @@ -47,13 +47,13 @@ def _create_channel(target: str, options: Sequence[Tuple[str, str]], channel_credentials = channel_credentials or grpc.local_channel_credentials( ) if channel_credentials._credentials is grpc.experimental._insecure_channel_credentials: - _LOGGER.info(f"Creating insecure channel with options '{options}' " + + _LOGGER.debug(f"Creating insecure channel with options '{options}' " + f"and compression '{compression}'") return grpc.insecure_channel(target, options=options, compression=compression) else: - _LOGGER.info( + _LOGGER.debug( f"Creating secure channel with credentials '{channel_credentials}', " + f"options '{options}' and compression '{compression}'") return grpc.secure_channel(target, @@ -85,7 +85,7 @@ class ChannelCache: # TODO: Type annotate key. def _evict_locked(self, key): channel, _ = self._mapping.pop(key) - _LOGGER.info("Evicting channel %s with configuration %s.", channel, key) + _LOGGER.debug("Evicting channel %s with configuration %s.", channel, key) channel.close() del channel From 6e7f9f2ebe2c2784df76be5cbc8ac1e0d79886d4 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:33:22 -0800 Subject: [PATCH 023/129] Add typing --- src/python/grpcio/grpc/_simple_stubs.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index ba8d57f2108..a5a7d830ba4 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -18,7 +18,7 @@ import datetime import os import logging import threading -from typing import Any, AnyStr, Callable, Iterator, Optional, Sequence, Tuple, TypeVar, Union +from typing import Any, AnyStr, Callable, Iterator, OrderedDict, Optional, Sequence, Tuple, TypeVar, Union import grpc @@ -61,12 +61,18 @@ def _create_channel(target: str, options: Sequence[Tuple[str, str]], options=options, compression=compression) +OptionsType = Sequence[Tuple[str, str]] +CacheKey = Tuple[str, OptionsType, Optional[grpc.ChannelCredentials], Optional[grpc.Compression]] class ChannelCache: + # NOTE(rbellevi): Untyped due to reference cycle. _singleton = None - _lock = threading.RLock() - _condition = threading.Condition(lock=_lock) - _eviction_ready = threading.Event() + _lock: threading.RLock = threading.RLock() + _condition: threading.Condition = threading.Condition(lock=_lock) + _eviction_ready: threading.Event = threading.Event() + + _mapping: OrderedDict[CacheKey, Tuple[grpc.Channel, datetime.datetime]] + _eviction_thread: threading.Thread def __init__(self): self._mapping = collections.OrderedDict() @@ -82,14 +88,12 @@ class ChannelCache: ChannelCache._eviction_ready.wait() return ChannelCache._singleton - # TODO: Type annotate key. - def _evict_locked(self, key): + def _evict_locked(self, key: CacheKey): channel, _ = self._mapping.pop(key) _LOGGER.debug("Evicting channel %s with configuration %s.", channel, key) channel.close() del channel - # TODO: Refactor. Way too deeply nested. @staticmethod def _perform_evictions(): while True: @@ -110,6 +114,11 @@ class ChannelCache: continue else: time_to_eviction = (eviction_time - now).total_seconds() + # NOTE: We aim to *eventually* coalesce to a state in + # which no overdue channels are in the cache and the + # length of the cache is longer than _MAXIMUM_CHANNELS. + # We tolerate momentary states in which these two + # criteria are not met. ChannelCache._condition.wait(timeout=time_to_eviction) def get_channel(self, target: str, options: Sequence[Tuple[str, str]], @@ -117,7 +126,6 @@ class ChannelCache: compression: Optional[grpc.Compression]) -> grpc.Channel: key = (target, options, channel_credentials, compression) with self._lock: - # TODO: Can the get and the pop be turned into a single operation? channel_data = self._mapping.get(key, None) if channel_data is not None: channel = channel_data[0] From e7e41e7610b0b770cad9694af465670837127af7 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:37:43 -0800 Subject: [PATCH 024/129] Change up ordering --- src/python/grpcio/grpc/_simple_stubs.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index a5a7d830ba4..65423d0f2af 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -22,6 +22,12 @@ from typing import Any, AnyStr, Callable, Iterator, OrderedDict, Optional, Seque import grpc +RequestType = TypeVar('RequestType') +ResponseType = TypeVar('ResponseType') + +OptionsType = Sequence[Tuple[str, str]] +CacheKey = Tuple[str, OptionsType, Optional[grpc.ChannelCredentials], Optional[grpc.Compression]] + _LOGGER = logging.getLogger(__name__) _EVICTION_PERIOD_KEY = "GRPC_PYTHON_MANAGED_CHANNEL_EVICTION_SECONDS" @@ -61,9 +67,6 @@ def _create_channel(target: str, options: Sequence[Tuple[str, str]], options=options, compression=compression) -OptionsType = Sequence[Tuple[str, str]] -CacheKey = Tuple[str, OptionsType, Optional[grpc.ChannelCredentials], Optional[grpc.Compression]] - class ChannelCache: # NOTE(rbellevi): Untyped due to reference cycle. _singleton = None @@ -148,9 +151,6 @@ class ChannelCache: return len(self._mapping) -RequestType = TypeVar('RequestType') -ResponseType = TypeVar('ResponseType') - # TODO(rbellevi): Consider a credential type that has the # following functionality matrix: # From 3daa32de4ee080bfcb34dc399c281d4dafda32ba Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:39:43 -0800 Subject: [PATCH 025/129] Stop emitting experimental warnings --- src/python/grpcio/grpc/_simple_stubs.py | 4 ---- src/python/grpcio/grpc/experimental/__init__.py | 12 ------------ 2 files changed, 16 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 65423d0f2af..1800f452daf 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -224,7 +224,6 @@ def unary_unary( Returns: The response to the RPC. """ - grpc.experimental.warn_experimental("unary_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_unary(method, request_serializer, @@ -295,7 +294,6 @@ def unary_stream( Returns: An iterator of responses. """ - grpc.experimental.warn_experimental("unary_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_stream(method, request_serializer, @@ -366,7 +364,6 @@ def stream_unary( Returns: The response to the RPC. """ - grpc.experimental.warn_experimental("stream_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_unary(method, request_serializer, @@ -437,7 +434,6 @@ def stream_stream( Returns: An iterator of responses. """ - grpc.experimental.warn_experimental("stream_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_stream(method, request_serializer, diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 29f499f57c6..9ab972daece 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -17,7 +17,6 @@ These APIs are subject to be removed during any minor version release. """ import sys -import warnings import grpc @@ -52,19 +51,8 @@ def insecure_channel_credentials(): return grpc.ChannelCredentials(_insecure_channel_credentials) -class ExperimentalApiWarning(Warning): - """A warning that an API is experimental.""" - - -def warn_experimental(api_name): - msg = ("{} is an experimental API. It is subject to change or ".format( - api_name) + "removal between minor releases. Proceed with caution.") - warnings.warn(msg, ExperimentalApiWarning, stacklevel=2) - - __all__ = ( 'ChannelOptions', - 'ExperimentalApiWarning', 'UsageError', 'insecure_channel_credentials', ) From 0668c73cd230664d4628d485843126b0bd973ef9 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:40:21 -0800 Subject: [PATCH 026/129] Add copyright header --- .../grpcio_tests/tests/unit/py3_only/BUILD.bazel | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel b/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel index 7f1a013364a..0735e447f84 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel @@ -1,3 +1,17 @@ +# Copyright 2020 The 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. + package( default_testonly = True, default_visibility = ["//visibility:public"], From 5474a76044ab2712d27f88c69b30f1402defffb4 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:41:22 -0800 Subject: [PATCH 027/129] Pull out constant --- .../grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 61a9117400c..3e60b38cbae 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -43,6 +43,8 @@ _CACHE_TRIALS = 6 _SERVER_RESPONSE_COUNT = 10 _CLIENT_REQUEST_COUNT = _SERVER_RESPONSE_COUNT +_STRESS_EPOCHS = _MAXIMUM_CHANNELS * 10 + _UNARY_UNARY = "/test/UnaryUnary" _UNARY_STREAM = "/test/UnaryStream" _STREAM_UNARY = "/test/StreamUnary" @@ -211,7 +213,7 @@ class SimpleStubsTest(unittest.TestCase): def test_total_channels_enforced(self): with _server(grpc.local_server_credentials()) as (_, port): target = f'localhost:{port}' - for i in range(99): + for i in range(_STRESS_EPOCHS): # Ensure we get a new channel each time. options = (("foo", str(i)),) # Send messages at full blast. From 753ab16ebbddfbdc76426702becd34f73daca1e2 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:43:22 -0800 Subject: [PATCH 028/129] Remove unused return value --- .../tests/unit/py3_only/_simple_stubs_test.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py index 3e60b38cbae..95a439f58a0 100644 --- a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py +++ b/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py @@ -104,7 +104,7 @@ def _server(credentials: Optional[grpc.ServerCredentials]): port = server.add_secure_port(target, credentials) server.add_generic_rpc_handlers((_GenericHandler(),)) server.start() - yield server, port + yield port finally: server.stop(None) @@ -154,7 +154,7 @@ class SimpleStubsTest(unittest.TestCase): self.fail(message() + " after " + str(timeout)) def test_unary_unary_insecure(self): - with _server(None) as (_, port): + with _server(None) as port: target = f'localhost:{port}' response = grpc.experimental.unary_unary( _REQUEST, @@ -165,7 +165,7 @@ class SimpleStubsTest(unittest.TestCase): self.assertEqual(_REQUEST, response) def test_unary_unary_secure(self): - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' response = grpc.experimental.unary_unary( _REQUEST, @@ -175,14 +175,14 @@ class SimpleStubsTest(unittest.TestCase): self.assertEqual(_REQUEST, response) def test_channel_credentials_default(self): - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' response = grpc.experimental.unary_unary(_REQUEST, target, _UNARY_UNARY) self.assertEqual(_REQUEST, response) def test_channels_cached(self): - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' test_name = inspect.stack()[0][3] args = (_REQUEST, target, _UNARY_UNARY) @@ -196,7 +196,7 @@ class SimpleStubsTest(unittest.TestCase): self.assert_cached(_invoke) def test_channels_evicted(self): - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' response = grpc.experimental.unary_unary( _REQUEST, @@ -211,7 +211,7 @@ class SimpleStubsTest(unittest.TestCase): ) def test_total_channels_enforced(self): - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' for i in range(_STRESS_EPOCHS): # Ensure we get a new channel each time. @@ -231,7 +231,7 @@ class SimpleStubsTest(unittest.TestCase): ) def test_unary_stream(self): - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' for response in grpc.experimental.unary_stream( _REQUEST, @@ -246,7 +246,7 @@ class SimpleStubsTest(unittest.TestCase): for _ in range(_CLIENT_REQUEST_COUNT): yield _REQUEST - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' response = grpc.experimental.stream_unary( request_iter(), @@ -261,7 +261,7 @@ class SimpleStubsTest(unittest.TestCase): for _ in range(_CLIENT_REQUEST_COUNT): yield _REQUEST - with _server(grpc.local_server_credentials()) as (_, port): + with _server(grpc.local_server_credentials()) as port: target = f'localhost:{port}' for response in grpc.experimental.stream_stream( request_iter(), From 67a492c9466c27070753964a4959c71c6489d5d4 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 13:47:25 -0800 Subject: [PATCH 029/129] Yapf --- src/python/grpcio/grpc/_simple_stubs.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 1800f452daf..9e198080b6a 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -18,7 +18,8 @@ import datetime import os import logging import threading -from typing import Any, AnyStr, Callable, Iterator, OrderedDict, Optional, Sequence, Tuple, TypeVar, Union +from typing import (Any, AnyStr, Callable, Iterator, OrderedDict, Optional, + Sequence, Tuple, TypeVar, Union) import grpc @@ -26,7 +27,8 @@ RequestType = TypeVar('RequestType') ResponseType = TypeVar('ResponseType') OptionsType = Sequence[Tuple[str, str]] -CacheKey = Tuple[str, OptionsType, Optional[grpc.ChannelCredentials], Optional[grpc.Compression]] +CacheKey = Tuple[str, OptionsType, Optional[grpc.ChannelCredentials], Optional[ + grpc.Compression]] _LOGGER = logging.getLogger(__name__) @@ -35,7 +37,7 @@ if _EVICTION_PERIOD_KEY in os.environ: _EVICTION_PERIOD = datetime.timedelta( seconds=float(os.environ[_EVICTION_PERIOD_KEY])) _LOGGER.debug("Setting managed channel eviction period to %s", - _EVICTION_PERIOD) + _EVICTION_PERIOD) else: _EVICTION_PERIOD = datetime.timedelta(minutes=10) @@ -54,7 +56,7 @@ def _create_channel(target: str, options: Sequence[Tuple[str, str]], ) if channel_credentials._credentials is grpc.experimental._insecure_channel_credentials: _LOGGER.debug(f"Creating insecure channel with options '{options}' " + - f"and compression '{compression}'") + f"and compression '{compression}'") return grpc.insecure_channel(target, options=options, compression=compression) @@ -67,6 +69,7 @@ def _create_channel(target: str, options: Sequence[Tuple[str, str]], options=options, compression=compression) + class ChannelCache: # NOTE(rbellevi): Untyped due to reference cycle. _singleton = None @@ -93,7 +96,8 @@ class ChannelCache: def _evict_locked(self, key: CacheKey): channel, _ = self._mapping.pop(key) - _LOGGER.debug("Evicting channel %s with configuration %s.", channel, key) + _LOGGER.debug("Evicting channel %s with configuration %s.", channel, + key) channel.close() del channel From ff3088979a32586224d5a273f7da43c82673fb57 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 14:53:33 -0800 Subject: [PATCH 030/129] Why you incomplete, Python 3.6? --- src/python/grpcio/grpc/_simple_stubs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 9e198080b6a..ae30be1bacb 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -18,8 +18,8 @@ import datetime import os import logging import threading -from typing import (Any, AnyStr, Callable, Iterator, OrderedDict, Optional, - Sequence, Tuple, TypeVar, Union) +from typing import (Any, AnyStr, Callable, Dict, Iterator, Optional, Sequence, + Tuple, TypeVar, Union) import grpc @@ -77,7 +77,7 @@ class ChannelCache: _condition: threading.Condition = threading.Condition(lock=_lock) _eviction_ready: threading.Event = threading.Event() - _mapping: OrderedDict[CacheKey, Tuple[grpc.Channel, datetime.datetime]] + _mapping: Dict[CacheKey, Tuple[grpc.Channel, datetime.datetime]] _eviction_thread: threading.Thread def __init__(self): From 7c581ab099d62fedf2d19a503c176b01be205928 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 14:57:30 -0800 Subject: [PATCH 031/129] Revert "Stop emitting experimental warnings" This reverts commit 3daa32de4ee080bfcb34dc399c281d4dafda32ba. --- src/python/grpcio/grpc/_simple_stubs.py | 4 ++++ src/python/grpcio/grpc/experimental/__init__.py | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index ae30be1bacb..3edf72c3422 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -228,6 +228,7 @@ def unary_unary( Returns: The response to the RPC. """ + grpc.experimental.warn_experimental("unary_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_unary(method, request_serializer, @@ -298,6 +299,7 @@ def unary_stream( Returns: An iterator of responses. """ + grpc.experimental.warn_experimental("unary_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_stream(method, request_serializer, @@ -368,6 +370,7 @@ def stream_unary( Returns: The response to the RPC. """ + grpc.experimental.warn_experimental("stream_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_unary(method, request_serializer, @@ -438,6 +441,7 @@ def stream_stream( Returns: An iterator of responses. """ + grpc.experimental.warn_experimental("stream_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_stream(method, request_serializer, diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 9ab972daece..29f499f57c6 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -17,6 +17,7 @@ These APIs are subject to be removed during any minor version release. """ import sys +import warnings import grpc @@ -51,8 +52,19 @@ def insecure_channel_credentials(): return grpc.ChannelCredentials(_insecure_channel_credentials) +class ExperimentalApiWarning(Warning): + """A warning that an API is experimental.""" + + +def warn_experimental(api_name): + msg = ("{} is an experimental API. It is subject to change or ".format( + api_name) + "removal between minor releases. Proceed with caution.") + warnings.warn(msg, ExperimentalApiWarning, stacklevel=2) + + __all__ = ( 'ChannelOptions', + 'ExperimentalApiWarning', 'UsageError', 'insecure_channel_credentials', ) From df247fb33a3a3f974664c0079663069c5dea2d20 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 10 Feb 2020 16:47:43 -0800 Subject: [PATCH 032/129] Experimental API decorator --- src/python/grpcio/grpc/_simple_stubs.py | 9 ++++--- .../grpcio/grpc/experimental/__init__.py | 25 ++++++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 3edf72c3422..378c234cd15 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -22,6 +22,7 @@ from typing import (Any, AnyStr, Callable, Dict, Iterator, Optional, Sequence, Tuple, TypeVar, Union) import grpc +from grpc.experimental import experimental_api RequestType = TypeVar('RequestType') ResponseType = TypeVar('ResponseType') @@ -169,6 +170,7 @@ class ChannelCache: # pylint: disable=too-many-arguments +@experimental_api def unary_unary( request: RequestType, target: str, @@ -228,7 +230,6 @@ def unary_unary( Returns: The response to the RPC. """ - grpc.experimental.warn_experimental("unary_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_unary(method, request_serializer, @@ -241,6 +242,7 @@ def unary_unary( # pylint: disable=too-many-arguments +@experimental_api def unary_stream( request: RequestType, target: str, @@ -299,7 +301,6 @@ def unary_stream( Returns: An iterator of responses. """ - grpc.experimental.warn_experimental("unary_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.unary_stream(method, request_serializer, @@ -312,6 +313,7 @@ def unary_stream( # pylint: disable=too-many-arguments +@experimental_api def stream_unary( request_iterator: Iterator[RequestType], target: str, @@ -370,7 +372,6 @@ def stream_unary( Returns: The response to the RPC. """ - grpc.experimental.warn_experimental("stream_unary") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_unary(method, request_serializer, @@ -383,6 +384,7 @@ def stream_unary( # pylint: disable=too-many-arguments +@experimental_api def stream_stream( request_iterator: Iterator[RequestType], target: str, @@ -441,7 +443,6 @@ def stream_stream( Returns: An iterator of responses. """ - grpc.experimental.warn_experimental("stream_stream") channel = ChannelCache.get().get_channel(target, options, channel_credentials, compression) multicallable = channel.stream_stream(method, request_serializer, diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 29f499f57c6..93ed0f64291 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -16,11 +16,14 @@ These APIs are subject to be removed during any minor version release. """ +import functools import sys import warnings import grpc +_EXPERIMENTAL_APIS_USED = set() + class ChannelOptions(object): """Indicates a channel option unique to gRPC Python. @@ -56,16 +59,30 @@ class ExperimentalApiWarning(Warning): """A warning that an API is experimental.""" -def warn_experimental(api_name): - msg = ("{} is an experimental API. It is subject to change or ".format( - api_name) + "removal between minor releases. Proceed with caution.") - warnings.warn(msg, ExperimentalApiWarning, stacklevel=2) +def _warn_experimental(api_name, stack_offset): + if api_name not in _EXPERIMENTAL_APIS_USED: + _EXPERIMENTAL_APIS_USED.add(api_name) + msg = ("'{}' is an experimental API. It is subject to change or ". + format(api_name) + + "removal between minor releases. Proceed with caution.") + warnings.warn(msg, ExperimentalApiWarning, stacklevel=2 + stack_offset) + + +def experimental_api(f): + + @functools.wraps(f) + def _wrapper(*args, **kwargs): + _warn_experimental(f.__name__, 1) + return f(*args, **kwargs) + + return _wrapper __all__ = ( 'ChannelOptions', 'ExperimentalApiWarning', 'UsageError', + 'experimental_api', 'insecure_channel_credentials', ) From bc3d8395e6e781153b25a509fa76343106b2303a Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Tue, 11 Feb 2020 16:23:22 -0800 Subject: [PATCH 033/129] Remove experiment config file. --- tools/internal_ci/macos/grpc_experiment.cfg | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 tools/internal_ci/macos/grpc_experiment.cfg diff --git a/tools/internal_ci/macos/grpc_experiment.cfg b/tools/internal_ci/macos/grpc_experiment.cfg deleted file mode 100644 index 3b15ca78b6a..00000000000 --- a/tools/internal_ci/macos/grpc_experiment.cfg +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2019 The 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. - -# Config file for the internal CI (in protobuf text format) - -# Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/macos/grpc_run_bazel_cpp_ios_tests.sh" From 485e87cadf7c4445bf03cd86d46331f16c13760c Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 11 Feb 2020 17:41:09 -0800 Subject: [PATCH 034/129] Move tests into single directory because Blaze is the worst --- .../grpcio_tests/tests/unit/BUILD.bazel | 24 +++++++++++ ...test.py => _simple_stubs_py3_only_test.py} | 0 .../tests/unit/py3_only/BUILD.bazel | 43 ------------------- 3 files changed, 24 insertions(+), 43 deletions(-) rename src/python/grpcio_tests/tests/unit/{py3_only/_simple_stubs_test.py => _simple_stubs_py3_only_test.py} (100%) delete mode 100644 src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel diff --git a/src/python/grpcio_tests/tests/unit/BUILD.bazel b/src/python/grpcio_tests/tests/unit/BUILD.bazel index 42b99023463..b2274227ced 100644 --- a/src/python/grpcio_tests/tests/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/BUILD.bazel @@ -40,6 +40,10 @@ GRPCIO_TESTS_UNIT = [ "_session_cache_test.py", ] +GRPCIO_PY3_ONLY_TESTS_UNIT = glob([ + "*_py3_only_test.py", +]) + py_library( name = "_tcp_proxy", srcs = ["_tcp_proxy.py"], @@ -110,3 +114,23 @@ py_library( ) for test_file_name in GRPCIO_TESTS_UNIT ] + +[ + py_test( + name = test_file_name[:-len(".py")], + size = "small", + srcs = [test_file_name], + main = test_file_name, + python_version = "PY3", + srcs_version = "PY3", + deps = [ + "resources", + "test_common", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/testing", + "//src/python/grpcio_tests/tests/unit/framework/common", + "@six", + ], + ) + for test_file_name in GRPCIO_PY3_ONLY_TESTS_UNIT +] diff --git a/src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py b/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py similarity index 100% rename from src/python/grpcio_tests/tests/unit/py3_only/_simple_stubs_test.py rename to src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py diff --git a/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel b/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel deleted file mode 100644 index 0735e447f84..00000000000 --- a/src/python/grpcio_tests/tests/unit/py3_only/BUILD.bazel +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2020 The 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. - -package( - default_testonly = True, - default_visibility = ["//visibility:public"], -) - -GRPCIO_PY3_ONLY_UNIT_TESTS = [ - "_simple_stubs_test.py", -] - -[ - py_test( - name = test_file_name[:-len(".py")], - size = "small", - srcs = [test_file_name], - imports = [".."], - main = test_file_name, - python_version = "PY3", - srcs_version = "PY3", - deps = [ - "//src/python/grpcio/grpc:grpcio", - "//src/python/grpcio_tests/tests/testing", - "//src/python/grpcio_tests/tests/unit:resources", - "//src/python/grpcio_tests/tests/unit:test_common", - "//src/python/grpcio_tests/tests/unit/framework/common", - "@six", - ], - ) - for test_file_name in GRPCIO_PY3_ONLY_UNIT_TESTS -] From 6eddf397e93717986d008c23aadf5a200f23a33f Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 11 Feb 2020 17:44:56 -0800 Subject: [PATCH 035/129] Reviewer advice --- .pylintrc | 2 +- src/python/grpcio/grpc/_simple_stubs.py | 4 ---- src/python/grpcio/grpc/experimental/__init__.py | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.pylintrc b/.pylintrc index 97f9bc90c3d..be8be6b6ef0 100644 --- a/.pylintrc +++ b/.pylintrc @@ -19,7 +19,7 @@ dummy-variables-rgx=^ignored_|^unused_|_ # NOTE(nathaniel): Not particularly attached to this value; it just seems to # be what works for us at the moment (excepting the dead-code-walking Beta # API). -max-args=7 +max-args=14 max-parents=8 [MISCELLANEOUS] diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 378c234cd15..72872e163c7 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -169,7 +169,6 @@ class ChannelCache: # Make this the default option. -# pylint: disable=too-many-arguments @experimental_api def unary_unary( request: RequestType, @@ -241,7 +240,6 @@ def unary_unary( timeout=timeout) -# pylint: disable=too-many-arguments @experimental_api def unary_stream( request: RequestType, @@ -312,7 +310,6 @@ def unary_stream( timeout=timeout) -# pylint: disable=too-many-arguments @experimental_api def stream_unary( request_iterator: Iterator[RequestType], @@ -383,7 +380,6 @@ def stream_unary( timeout=timeout) -# pylint: disable=too-many-arguments @experimental_api def stream_stream( request_iterator: Iterator[RequestType], diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 93ed0f64291..6364e36b631 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -82,7 +82,6 @@ __all__ = ( 'ChannelOptions', 'ExperimentalApiWarning', 'UsageError', - 'experimental_api', 'insecure_channel_credentials', ) From e99cdfa754e0438f32d0e389248da4c49009fa88 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 11 Feb 2020 18:13:13 -0800 Subject: [PATCH 036/129] Copybara makes me wish I were dead --- .../grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py b/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py index 95a439f58a0..360588e38ce 100644 --- a/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py +++ b/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py @@ -31,7 +31,7 @@ import sys import time from typing import Callable, Optional -import test_common +import tests.unit import test_common import grpc import grpc.experimental From a859b9a98ad608674d89fb81e411b2c7322705a6 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Wed, 12 Feb 2020 10:46:59 -0800 Subject: [PATCH 037/129] Whoops --- .../grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py b/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py index 360588e38ce..76de5232d35 100644 --- a/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py +++ b/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py @@ -31,7 +31,7 @@ import sys import time from typing import Callable, Optional -import tests.unit import test_common +from tests.unit import test_common import grpc import grpc.experimental From b07ea16e378e3caa5685d41c0d3240e25158fa57 Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Thu, 13 Feb 2020 15:35:35 -0800 Subject: [PATCH 038/129] Added back in experiment file and now using ssl credentials. --- tools/internal_ci/macos/grpc_experiment.cfg | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tools/internal_ci/macos/grpc_experiment.cfg diff --git a/tools/internal_ci/macos/grpc_experiment.cfg b/tools/internal_ci/macos/grpc_experiment.cfg new file mode 100644 index 00000000000..3b15ca78b6a --- /dev/null +++ b/tools/internal_ci/macos/grpc_experiment.cfg @@ -0,0 +1,18 @@ +# Copyright 2019 The 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. + +# Config file for the internal CI (in protobuf text format) + +# Location of the continuous shell script in repository. +build_file: "grpc/tools/internal_ci/macos/grpc_run_bazel_cpp_ios_tests.sh" From b344c90fe1efdafe5c4b8bd8c260d5af0d146b03 Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Thu, 13 Feb 2020 15:35:58 -0800 Subject: [PATCH 039/129] ssl creds --- test/cpp/client/credentials_test.cc | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index 4095707ff8c..8f824865b9c 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -683,19 +683,21 @@ TEST_F(CredentialsTest, LoadTlsChannelCredentials) { // server credentials. TEST_F(CredentialsTest, LoadTlsServerCredentials) { grpc_init(); - std::shared_ptr test_credential_reload( - new TestTlsCredentialReload()); - std::shared_ptr credential_reload_config( - new TlsCredentialReloadConfig(test_credential_reload)); + //std::shared_ptr test_credential_reload( + // new TestTlsCredentialReload()); + //std::shared_ptr credential_reload_config( + // new TlsCredentialReloadConfig(test_credential_reload)); // The server builder is needed in order to properly initialize the C-core. - ServerBuilder builder; - (void)builder; - TlsCredentialsOptions options = TlsCredentialsOptions( - GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, - GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr); - std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = - grpc::experimental::TlsServerCredentials(options); + //ServerBuilder builder; + //(void)builder; + //TlsCredentialsOptions options = TlsCredentialsOptions( + // GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, + // GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr); + //std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = + // grpc::experimental::TlsServerCredentials(options); + ::grpc::SslServerCredentialsOptions options; + std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = ::grpc::SslServerCredentials(options); GPR_ASSERT(server_credentials.get() != nullptr); grpc_shutdown(); } From c01b39e55bc0ec9015451355225ff18120851126 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 13 Feb 2020 16:06:32 -0800 Subject: [PATCH 040/129] Pull Python 3 only tests out to a separate repo --- src/python/grpcio_tests/commands.py | 31 ++++++++++++++ src/python/grpcio_tests/setup.py | 1 + .../grpcio_tests/tests/unit/BUILD.bazel | 24 ----------- .../grpcio_tests/tests_py3_only/__init__.py | 21 ++++++++++ .../tests_py3_only/unit/BUILD.bazel | 41 +++++++++++++++++++ .../tests_py3_only/unit/__init__.py | 13 ++++++ .../unit/_simple_stubs_test.py} | 0 7 files changed, 107 insertions(+), 24 deletions(-) create mode 100644 src/python/grpcio_tests/tests_py3_only/__init__.py create mode 100644 src/python/grpcio_tests/tests_py3_only/unit/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_py3_only/unit/__init__.py rename src/python/grpcio_tests/{tests/unit/_simple_stubs_py3_only_test.py => tests_py3_only/unit/_simple_stubs_test.py} (100%) diff --git a/src/python/grpcio_tests/commands.py b/src/python/grpcio_tests/commands.py index 9905aee86c5..a8f119fd46b 100644 --- a/src/python/grpcio_tests/commands.py +++ b/src/python/grpcio_tests/commands.py @@ -106,6 +106,37 @@ class TestLite(setuptools.Command): self.distribution.fetch_build_eggs(self.distribution.tests_require) +class TestPy3Only(setuptools.Command): + """Command to run tests for Python 3+ features. + + This does not include asyncio tests, which are housed in a separate + directory. + """ + + description = 'run tests for py3+ features' + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + self._add_eggs_to_path() + import tests + loader = tests.Loader() + loader.loadTestsFromNames(['tests_py3_only']) + runner = tests.Runner() + result = runner.run(loader.suite) + if not result.wasSuccessful(): + sys.exit('Test failure') + + def _add_eggs_to_path(self): + self.distribution.fetch_build_eggs(self.distribution.install_requires) + self.distribution.fetch_build_eggs(self.distribution.tests_require) + + class TestAio(setuptools.Command): """Command to run aio tests without fetching or building anything.""" diff --git a/src/python/grpcio_tests/setup.py b/src/python/grpcio_tests/setup.py index 36fbaf72e23..671f0653732 100644 --- a/src/python/grpcio_tests/setup.py +++ b/src/python/grpcio_tests/setup.py @@ -59,6 +59,7 @@ COMMAND_CLASS = { 'test_lite': commands.TestLite, 'test_gevent': commands.TestGevent, 'test_aio': commands.TestAio, + 'test_py3_only': commands.TestPy3Only, } PACKAGE_DATA = { diff --git a/src/python/grpcio_tests/tests/unit/BUILD.bazel b/src/python/grpcio_tests/tests/unit/BUILD.bazel index b2274227ced..42b99023463 100644 --- a/src/python/grpcio_tests/tests/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/BUILD.bazel @@ -40,10 +40,6 @@ GRPCIO_TESTS_UNIT = [ "_session_cache_test.py", ] -GRPCIO_PY3_ONLY_TESTS_UNIT = glob([ - "*_py3_only_test.py", -]) - py_library( name = "_tcp_proxy", srcs = ["_tcp_proxy.py"], @@ -114,23 +110,3 @@ py_library( ) for test_file_name in GRPCIO_TESTS_UNIT ] - -[ - py_test( - name = test_file_name[:-len(".py")], - size = "small", - srcs = [test_file_name], - main = test_file_name, - python_version = "PY3", - srcs_version = "PY3", - deps = [ - "resources", - "test_common", - "//src/python/grpcio/grpc:grpcio", - "//src/python/grpcio_tests/tests/testing", - "//src/python/grpcio_tests/tests/unit/framework/common", - "@six", - ], - ) - for test_file_name in GRPCIO_PY3_ONLY_TESTS_UNIT -] diff --git a/src/python/grpcio_tests/tests_py3_only/__init__.py b/src/python/grpcio_tests/tests_py3_only/__init__.py new file mode 100644 index 00000000000..6732ae8cbb5 --- /dev/null +++ b/src/python/grpcio_tests/tests_py3_only/__init__.py @@ -0,0 +1,21 @@ +# Copyright 2020 The 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. + +from __future__ import absolute_import + +from tests import _loader +from tests import _runner + +Loader = _loader.Loader +Runner = _runner.Runner diff --git a/src/python/grpcio_tests/tests_py3_only/unit/BUILD.bazel b/src/python/grpcio_tests/tests_py3_only/unit/BUILD.bazel new file mode 100644 index 00000000000..81b66ddc116 --- /dev/null +++ b/src/python/grpcio_tests/tests_py3_only/unit/BUILD.bazel @@ -0,0 +1,41 @@ +# Copyright 2020 The 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. + +package( + default_testonly = True, +) + +GRPCIO_PY3_ONLY_TESTS_UNIT = glob([ + "*_test.py", +]) + +[ + py_test( + name = test_file_name[:-len(".py")], + size = "small", + srcs = [test_file_name], + main = test_file_name, + python_version = "PY3", + srcs_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/testing", + "//src/python/grpcio_tests/tests/unit:resources", + "//src/python/grpcio_tests/tests/unit:test_common", + "//src/python/grpcio_tests/tests/unit/framework/common", + "@six", + ], + ) + for test_file_name in GRPCIO_PY3_ONLY_TESTS_UNIT +] diff --git a/src/python/grpcio_tests/tests_py3_only/unit/__init__.py b/src/python/grpcio_tests/tests_py3_only/unit/__init__.py new file mode 100644 index 00000000000..f4b321fc5b2 --- /dev/null +++ b/src/python/grpcio_tests/tests_py3_only/unit/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2019 The 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. diff --git a/src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py b/src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py similarity index 100% rename from src/python/grpcio_tests/tests/unit/_simple_stubs_py3_only_test.py rename to src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py From b66e7987390fa5b5ea351a3bdf53596423f671cd Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 14 Feb 2020 07:49:05 -0800 Subject: [PATCH 041/129] Pass C repo manager duty to Nico. --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/pull_request_template.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b9833672c72..8ad28709675 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 9cf36e6fa0b..d2144735943 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 0d9906a9eb0..8dd6384a5b7 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a85cfad9c7a..57af6c21597 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@markdroth +@nicolasnoble From 3cdd83bdaca12977b77f1fa57f40dfa1b985dbfc Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 10:56:40 -0800 Subject: [PATCH 042/129] Improve invocation_defects_tests with assertions and comments --- .../tests/unit/_invocation_defects_test.py | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py index 26a1a2d30d3..20d1124b901 100644 --- a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py +++ b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import itertools -import threading import unittest import logging @@ -35,26 +33,6 @@ _STREAM_STREAM = '/test/StreamStream' _DEFECTIVE_GENERIC_RPC_HANDLER = '/test/DefectiveGenericRpcHandler' -class _Callback(object): - - def __init__(self): - self._condition = threading.Condition() - self._value = None - self._called = False - - def __call__(self, value): - with self._condition: - self._value = value - self._called = True - self._condition.notify_all() - - def value(self): - with self._condition: - while not self._called: - self._condition.wait() - return self._value - - class _Handler(object): def __init__(self, control): @@ -199,6 +177,7 @@ def _defective_handler_multi_callable(channel): class InvocationDefectsTest(unittest.TestCase): + """Tests the handling of exception-raising user code.""" def setUp(self): self._control = test_control.PauseFailControl() @@ -219,12 +198,15 @@ class InvocationDefectsTest(unittest.TestCase): requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)] multi_callable = _stream_unary_multi_callable(self._channel) - with self.assertRaises(grpc.RpcError): + with self.assertRaises(grpc.RpcError) as exception_context: response = multi_callable( requests, metadata=(('test', 'IterableStreamRequestBlockingUnaryResponse'),)) + self.assertIs(grpc.StatusCode.UNKNOWN, + exception_context.exception.code()) + def testIterableStreamRequestFutureUnaryResponse(self): requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)] multi_callable = _stream_unary_multi_callable(self._channel) @@ -232,8 +214,11 @@ class InvocationDefectsTest(unittest.TestCase): requests, metadata=(('test', 'IterableStreamRequestFutureUnaryResponse'),)) - with self.assertRaises(grpc.RpcError): - response = response_future.result() + with self.assertRaises(grpc.RpcError) as exception_context: + response_future.result() + + self.assertIs(grpc.StatusCode.UNKNOWN, + exception_context.exception.code()) def testIterableStreamRequestStreamResponse(self): requests = [b'\x77\x58' for _ in range(test_constants.STREAM_LENGTH)] @@ -242,9 +227,12 @@ class InvocationDefectsTest(unittest.TestCase): requests, metadata=(('test', 'IterableStreamRequestStreamResponse'),)) - with self.assertRaises(grpc.RpcError): + with self.assertRaises(grpc.RpcError) as exception_context: next(response_iterator) + self.assertIs(grpc.StatusCode.UNKNOWN, + exception_context.exception.code()) + def testIteratorStreamRequestStreamResponse(self): requests_iterator = FailAfterFewIterationsCounter( test_constants.STREAM_LENGTH // 2, b'\x07\x08') @@ -253,18 +241,21 @@ class InvocationDefectsTest(unittest.TestCase): requests_iterator, metadata=(('test', 'IteratorStreamRequestStreamResponse'),)) - with self.assertRaises(grpc.RpcError): + with self.assertRaises(grpc.RpcError) as exception_context: for _ in range(test_constants.STREAM_LENGTH // 2 + 1): next(response_iterator) + self.assertIs(grpc.StatusCode.UNKNOWN, + exception_context.exception.code()) + def testDefectiveGenericRpcHandlerUnaryResponse(self): request = b'\x07\x08' multi_callable = _defective_handler_multi_callable(self._channel) with self.assertRaises(grpc.RpcError) as exception_context: - response = multi_callable( - request, - metadata=(('test', 'DefectiveGenericRpcHandlerUnary'),)) + multi_callable(request, + metadata=(('test', + 'DefectiveGenericRpcHandlerUnary'),)) self.assertIs(grpc.StatusCode.UNKNOWN, exception_context.exception.code()) From 4c59615f46ebcade24330d0bad906ed2832de857 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 18:06:14 -0800 Subject: [PATCH 043/129] Format __init__.py --- .../grpcio/grpc/experimental/aio/__init__.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/__init__.py b/src/python/grpcio/grpc/experimental/aio/__init__.py index d8d284780c1..45a5c973877 100644 --- a/src/python/grpcio/grpc/experimental/aio/__init__.py +++ b/src/python/grpcio/grpc/experimental/aio/__init__.py @@ -21,11 +21,11 @@ from typing import Any, Optional, Sequence, Tuple import grpc from grpc._cython.cygrpc import (EOF, AbortError, BaseError, UsageError, - init_grpc_aio) + InternalError, init_grpc_aio) -from ._base_call import Call, RpcContext, UnaryStreamCall, UnaryUnaryCall +from ._base_call import Call, RpcContext, UnaryStreamCall, UnaryUnaryCall, StreamUnaryCall, StreamStreamCall from ._call import AioRpcError -from ._channel import Channel, UnaryUnaryMultiCallable +from ._channel import Channel, UnaryUnaryMultiCallable, UnaryStreamMultiCallable, StreamUnaryMultiCallable, StreamStreamMultiCallable from ._interceptor import (ClientCallDetails, InterceptedUnaryUnaryCall, UnaryUnaryClientInterceptor) from ._server import Server, server @@ -83,8 +83,11 @@ def secure_channel( ################################### __all__ ################################# __all__ = ('AioRpcError', 'RpcContext', 'Call', 'UnaryUnaryCall', - 'UnaryStreamCall', 'init_grpc_aio', 'Channel', - 'UnaryUnaryMultiCallable', 'ClientCallDetails', + 'UnaryStreamCall', 'StreamUnaryCall', 'StreamStreamCall', + 'init_grpc_aio', 'Channel', 'UnaryUnaryMultiCallable', + 'UnaryStreamMultiCallable', 'StreamUnaryMultiCallable', + 'StreamStreamMultiCallable', 'ClientCallDetails', 'UnaryUnaryClientInterceptor', 'InterceptedUnaryUnaryCall', 'insecure_channel', 'server', 'Server', 'EOF', 'secure_channel', - 'AbortError', 'BaseError', 'UsageError') + 'AbortError', 'BaseError', 'UsageError' + 'InternalError') From 5326f8623d451b3c72311af7a5df2f2f6af1b1fe Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 18:06:57 -0800 Subject: [PATCH 044/129] Update sphinx configuration --- doc/python/sphinx/_static/custom.css | 3 + doc/python/sphinx/conf.py | 10 ++- doc/python/sphinx/grpc_asyncio.rst | 107 +++++++++++++++++++++++++++ doc/python/sphinx/index.rst | 1 + 4 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 doc/python/sphinx/_static/custom.css create mode 100644 doc/python/sphinx/grpc_asyncio.rst diff --git a/doc/python/sphinx/_static/custom.css b/doc/python/sphinx/_static/custom.css new file mode 100644 index 00000000000..d961c389b9e --- /dev/null +++ b/doc/python/sphinx/_static/custom.css @@ -0,0 +1,3 @@ +dl.field-list > dt { + word-break: keep-all !important; +} diff --git a/doc/python/sphinx/conf.py b/doc/python/sphinx/conf.py index 7cb5ee4d66e..0c209d58684 100644 --- a/doc/python/sphinx/conf.py +++ b/doc/python/sphinx/conf.py @@ -16,8 +16,8 @@ import os import sys -PYTHON_FOLDER = os.path.join(os.path.dirname(os.path.realpath(__file__)), - '..', '..', '..', 'src', 'python') +PYTHON_FOLDER = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', + '..', '..', 'src', 'python') sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio')) sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_channelz')) sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_health_checking')) @@ -53,6 +53,7 @@ extensions = [ 'sphinx.ext.todo', 'sphinx.ext.napoleon', 'sphinx.ext.coverage', + 'sphinx.ext.autodoc.typehints', ] napoleon_google_docstring = True @@ -64,7 +65,7 @@ autodoc_default_options = { } autodoc_mock_imports = [ - 'grpc._cython', + # 'grpc._cython.cygrpc', 'grpc_channelz.v1.channelz_pb2', 'grpc_channelz.v1.channelz_pb2_grpc', 'grpc_health.v1.health_pb2', @@ -73,6 +74,8 @@ autodoc_mock_imports = [ 'grpc_reflection.v1alpha.reflection_pb2_grpc', ] +autodoc_typehints = 'description' + # -- HTML Configuration ------------------------------------------------- html_theme = 'alabaster' @@ -84,6 +87,7 @@ html_theme_options = { 'description': grpc_version.VERSION, 'show_powered_by': False, } +html_static_path = ["_static"] # -- Options for manual page output ------------------------------------------ diff --git a/doc/python/sphinx/grpc_asyncio.rst b/doc/python/sphinx/grpc_asyncio.rst new file mode 100644 index 00000000000..89ada48dd93 --- /dev/null +++ b/doc/python/sphinx/grpc_asyncio.rst @@ -0,0 +1,107 @@ +gRPC AsyncIO API +================ + +.. module:: grpc.experimental.aio + +Overview +-------- + +gRPC AsyncIO API is a new version of gRPC Python whose architecture is +tailored to AsyncIO. Underlying, it is using C-Core's callback API, and +replaced all IO operations with methods provided by the AsyncIO library. + +This stack currently is under active development. Feel free to offer +suggestions by opening issues on `grpc/grpc `_. + +The design doc can be found here as `gRFC `_. + + +Module Contents +--------------- + + +Create Client +^^^^^^^^^^^^^ + +.. autofunction:: insecure_channel +.. autofunction:: secure_channel + + +Create Server +^^^^^^^^^^^^^ + +.. autofunction:: server + + +Channel Object +^^^^^^^^^^^^^^ + +.. autoclass:: Channel + + +Server Object +^^^^^^^^^^^^^ + +.. autoclass:: Server + + +gRPC Exceptions +^^^^^^^^^^^^^^^ + +.. autoexception:: BaseError +.. autoexception:: AioRpcError +.. autoexception:: UsageError +.. autoexception:: AbortError +.. autoexception:: InternalError + + +Client-Side Context +^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: Call +.. autoclass:: UnaryUnaryCall +.. autoclass:: UnaryStreamCall +.. autoclass:: StreamUnaryCall +.. autoclass:: StreamStreamCall + + +Client-Side Interceptor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ClientCallDetails +.. autoclass:: InterceptedUnaryUnaryCall +.. autoclass:: UnaryUnaryClientInterceptor + +.. Service-Side Context +.. ^^^^^^^^^^^^^^^^^^^^ + +.. .. autoclass:: ServicerContext + + +.. Service-Side Interceptor +.. ^^^^^^^^^^^^^^^^^^^^^^^^ + +.. .. autoclass:: ServerInterceptor + + +Multi-Callable Interfaces +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: UnaryUnaryMultiCallable() +.. autoclass:: UnaryStreamMultiCallable() +.. autoclass:: StreamUnaryMultiCallable() +.. autoclass:: StreamStreamMultiCallable() + + +.. Future Interfaces +.. ^^^^^^^^^^^^^^^^^ + +.. .. autoexception:: FutureTimeoutError +.. .. autoexception:: FutureCancelledError +.. .. autoclass:: Future + + +.. Compression +.. ^^^^^^^^^^^ + +.. .. autoclass:: Compression diff --git a/doc/python/sphinx/index.rst b/doc/python/sphinx/index.rst index bb671e75603..c033542cf27 100644 --- a/doc/python/sphinx/index.rst +++ b/doc/python/sphinx/index.rst @@ -10,6 +10,7 @@ API Reference :caption: Contents: grpc + grpc_asyncio grpc_channelz grpc_health_checking grpc_reflection From f17ec928dfcba7db6b69a66baae84e354b2a61ba Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 18:07:01 -0800 Subject: [PATCH 045/129] Fix lack of empty line in the docstring --- src/python/grpcio/grpc/experimental/aio/_interceptor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index aca93fd468c..9a394016be3 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -53,6 +53,7 @@ class UnaryUnaryClientInterceptor(metaclass=ABCMeta): client_call_details: ClientCallDetails, request: RequestType) -> Union[UnaryUnaryCall, ResponseType]: """Intercepts a unary-unary invocation asynchronously. + Args: continuation: A coroutine that proceeds with the invocation by executing the next interceptor in chain or invoking the @@ -65,8 +66,10 @@ class UnaryUnaryClientInterceptor(metaclass=ABCMeta): client_call_details: A ClientCallDetails object describing the outgoing RPC. request: The request value for the RPC. + Returns: - An object with the RPC response. + An object with the RPC response. + Raises: AioRpcError: Indicating that the RPC terminated with non-OK status. asyncio.CancelledError: Indicating that the RPC was canceled. From e62afd7ed28b594bdb79647ffa4679b237a44cc3 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 10:58:14 -0800 Subject: [PATCH 046/129] Polish the grpc_asyncio.rst --- doc/python/sphinx/conf.py | 10 +--------- doc/python/sphinx/grpc_asyncio.rst | 3 ++- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/doc/python/sphinx/conf.py b/doc/python/sphinx/conf.py index 0c209d58684..49e5ecb1dcd 100644 --- a/doc/python/sphinx/conf.py +++ b/doc/python/sphinx/conf.py @@ -64,15 +64,7 @@ autodoc_default_options = { 'members': None, } -autodoc_mock_imports = [ - # 'grpc._cython.cygrpc', - 'grpc_channelz.v1.channelz_pb2', - 'grpc_channelz.v1.channelz_pb2_grpc', - 'grpc_health.v1.health_pb2', - 'grpc_health.v1.health_pb2_grpc', - 'grpc_reflection.v1alpha.reflection_pb2', - 'grpc_reflection.v1alpha.reflection_pb2_grpc', -] +autodoc_mock_imports = [] autodoc_typehints = 'description' diff --git a/doc/python/sphinx/grpc_asyncio.rst b/doc/python/sphinx/grpc_asyncio.rst index 89ada48dd93..1935c231383 100644 --- a/doc/python/sphinx/grpc_asyncio.rst +++ b/doc/python/sphinx/grpc_asyncio.rst @@ -49,10 +49,10 @@ gRPC Exceptions ^^^^^^^^^^^^^^^ .. autoexception:: BaseError -.. autoexception:: AioRpcError .. autoexception:: UsageError .. autoexception:: AbortError .. autoexception:: InternalError +.. autoexception:: AioRpcError Client-Side Context @@ -88,6 +88,7 @@ Multi-Callable Interfaces ^^^^^^^^^^^^^^^^^^^^^^^^^ .. autoclass:: UnaryUnaryMultiCallable() + :undoc-members: __init__ .. autoclass:: UnaryStreamMultiCallable() .. autoclass:: StreamUnaryMultiCallable() .. autoclass:: StreamStreamMultiCallable() From d743e4390afad7a6d0e2bc392bee56b642138f67 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 14:44:52 -0800 Subject: [PATCH 047/129] Fill-in missing interfaces & improve rst template --- doc/python/sphinx/grpc_asyncio.rst | 56 ++- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 8 + .../grpcio/grpc/experimental/aio/__init__.py | 101 ++---- .../grpc/experimental/aio/_base_channel.py | 339 ++++++++++++++++++ .../grpc/experimental/aio/_base_server.py | 241 +++++++++++++ .../grpcio/grpc/experimental/aio/_channel.py | 227 +++--------- .../grpc/experimental/aio/_interceptor.py | 13 + .../grpcio/grpc/experimental/aio/_server.py | 3 +- 8 files changed, 725 insertions(+), 263 deletions(-) create mode 100644 src/python/grpcio/grpc/experimental/aio/_base_channel.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_base_server.py diff --git a/doc/python/sphinx/grpc_asyncio.rst b/doc/python/sphinx/grpc_asyncio.rst index 1935c231383..280004d3a49 100644 --- a/doc/python/sphinx/grpc_asyncio.rst +++ b/doc/python/sphinx/grpc_asyncio.rst @@ -6,12 +6,12 @@ gRPC AsyncIO API Overview -------- -gRPC AsyncIO API is a new version of gRPC Python whose architecture is +gRPC AsyncIO API is the **new version** of gRPC Python whose architecture is tailored to AsyncIO. Underlying, it is using C-Core's callback API, and replaced all IO operations with methods provided by the AsyncIO library. This stack currently is under active development. Feel free to offer -suggestions by opening issues on `grpc/grpc `_. +suggestions by opening issues on our GitHub repo `grpc/grpc `_. The design doc can be found here as `gRFC `_. @@ -19,6 +19,11 @@ The design doc can be found here as `gRFC _base_call.UnaryUnaryCall: + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: This is an EXPERIMENTAL argument. An optional + flag to enable wait for ready mechanism + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. This is an EXPERIMENTAL option. + + Returns: + A Call object instance which is an awaitable object. + + Raises: + RpcError: Indicating that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + + +class UnaryStreamMultiCallable(abc.ABC): + """Affords invoking a unary-stream RPC from client-side in an asynchronous way.""" + + @abc.abstractmethod + def __call__(self, + request: Any, + *, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = _IMMUTABLE_EMPTY_TUPLE, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None + ) -> _base_call.UnaryStreamCall: + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: This is an EXPERIMENTAL argument. An optional + flag to enable wait for ready mechanism + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. This is an EXPERIMENTAL option. + + Returns: + A Call object instance which is an awaitable object. + """ + + +class StreamUnaryMultiCallable(abc.ABC): + """Affords invoking a stream-unary RPC from client-side in an asynchronous way.""" + + @abc.abstractmethod + def __call__(self, + request_async_iterator: Optional[AsyncIterable[Any]] = None, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = _IMMUTABLE_EMPTY_TUPLE, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None + ) -> _base_call.StreamUnaryCall: + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: This is an EXPERIMENTAL argument. An optional + flag to enable wait for ready mechanism + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. This is an EXPERIMENTAL option. + + Returns: + A Call object instance which is an awaitable object. + + Raises: + RpcError: Indicating that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + + +class StreamStreamMultiCallable(abc.ABC): + """Affords invoking a stream-stream RPC from client-side in an asynchronous way.""" + + @abc.abstractmethod + def __call__(self, + request_async_iterator: Optional[AsyncIterable[Any]] = None, + timeout: Optional[float] = None, + metadata: Optional[MetadataType] = _IMMUTABLE_EMPTY_TUPLE, + credentials: Optional[grpc.CallCredentials] = None, + wait_for_ready: Optional[bool] = None, + compression: Optional[grpc.Compression] = None + ) -> _base_call.StreamStreamCall: + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: An optional duration of time in seconds to allow + for the RPC. + metadata: Optional :term:`metadata` to be transmitted to the + service-side of the RPC. + credentials: An optional CallCredentials for the RPC. Only valid for + secure Channel. + wait_for_ready: This is an EXPERIMENTAL argument. An optional + flag to enable wait for ready mechanism + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. This is an EXPERIMENTAL option. + + Returns: + A Call object instance which is an awaitable object. + + Raises: + RpcError: Indicating that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. + """ + + +class Channel(abc.ABC): + """Asynchronous Channel implementation. + + A cygrpc.AioChannel-backed implementation. + """ + + @abc.abstractmethod + async def __aenter__(self): + """Starts an asynchronous context manager. + + Returns: + Channel the channel that was instantiated. + """ + + @abc.abstractmethod + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Finishes the asynchronous context manager by closing the channel. + + Still active RPCs will be cancelled. + """ + + @abc.abstractmethod + async def close(self, grace: Optional[float] = None): + """Closes this Channel and releases all resources held by it. + + This method immediately stops the channel from executing new RPCs in + all cases. + + If a grace period is specified, this method wait until all active + RPCs are finshed, once the grace period is reached the ones that haven't + been terminated are cancelled. If a grace period is not specified + (by passing None for grace), all existing RPCs are cancelled immediately. + + This method is idempotent. + """ + + @abc.abstractmethod + def get_state(self, + try_to_connect: bool = False) -> grpc.ChannelConnectivity: + """Check the connectivity state of a channel. + + This is an EXPERIMENTAL API. + + If the channel reaches a stable connectivity state, it is guaranteed + that the return value of this function will eventually converge to that + state. + + Args: + try_to_connect: a bool indicate whether the Channel should try to + connect to peer or not. + + Returns: A ChannelConnectivity object. + """ + + @abc.abstractmethod + async def wait_for_state_change( + self, + last_observed_state: grpc.ChannelConnectivity, + ) -> None: + """Wait for a change in connectivity state. + + This is an EXPERIMENTAL API. + + The function blocks until there is a change in the channel connectivity + state from the "last_observed_state". If the state is already + different, this function will return immediately. + + There is an inherent race between the invocation of + "Channel.wait_for_state_change" and "Channel.get_state". The state can + change arbitrary times during the race, so there is no way to observe + every state transition. + + If there is a need to put a timeout for this function, please refer to + "asyncio.wait_for". + + Args: + last_observed_state: A grpc.ChannelConnectivity object representing + the last known state. + """ + + @abc.abstractmethod + async def channel_ready(self) -> None: + """Creates a coroutine that blocks until the Channel is READY.""" + + @abc.abstractmethod + def unary_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None + ) -> UnaryUnaryMultiCallable: + """Creates a UnaryUnaryMultiCallable for a unary-unary method. + + Args: + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the + response message. Response goes undeserialized in case None + is passed. + + Returns: + A UnaryUnaryMultiCallable value for the named unary-unary method. + """ + + @abc.abstractmethod + def unary_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None + ) -> UnaryStreamMultiCallable: + """Creates a UnaryStreamMultiCallable for a unary-stream method. + + Args: + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the + response message. Response goes undeserialized in case None + is passed. + + Returns: + A UnarySteramMultiCallable value for the named unary-stream method. + """ + + @abc.abstractmethod + def stream_unary( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None + ) -> StreamUnaryMultiCallable: + """Creates a StreamUnaryMultiCallable for a stream-unary method. + + Args: + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the + response message. Response goes undeserialized in case None + is passed. + + Returns: + A StreamUnaryMultiCallable value for the named stream-unary method. + """ + + @abc.abstractmethod + def stream_stream( + self, + method: str, + request_serializer: Optional[SerializingFunction] = None, + response_deserializer: Optional[DeserializingFunction] = None + ) -> StreamStreamMultiCallable: + """Creates a StreamStreamMultiCallable for a stream-stream method. + + Args: + method: The name of the RPC method. + request_serializer: Optional behaviour for serializing the request + message. Request goes unserialized in case None is passed. + response_deserializer: Optional behaviour for deserializing the + response message. Response goes undeserialized in case None + is passed. + + Returns: + A StreamStreamMultiCallable value for the named stream-stream method. + """ diff --git a/src/python/grpcio/grpc/experimental/aio/_base_server.py b/src/python/grpcio/grpc/experimental/aio/_base_server.py new file mode 100644 index 00000000000..ab62c172dc1 --- /dev/null +++ b/src/python/grpcio/grpc/experimental/aio/_base_server.py @@ -0,0 +1,241 @@ +# Copyright 2020 The 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. +"""Abstract base classes for server-side classes.""" + +import abc +from concurrent.futures import Executor +from typing import Any, Optional, Sequence, NoReturn + +import grpc + +from ._typing import ChannelArgumentType, MetadataType, RequestType, ResponseType + + +class Server(abc.ABC): + """Serves RPCs.""" + + @abc.abstractmethod + def add_generic_rpc_handlers( + self, + generic_rpc_handlers: Sequence[grpc.GenericRpcHandler]) -> None: + """Registers GenericRpcHandlers with this Server. + + This method is only safe to call before the server is started. + + Args: + generic_rpc_handlers: A sequence of GenericRpcHandlers that will be + used to service RPCs. + """ + + @abc.abstractmethod + def add_insecure_port(self, address: str) -> int: + """Opens an insecure port for accepting RPCs. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. If the port is 0, + or not specified in the address, then the gRPC runtime will choose a port. + + Returns: + An integer port on which the server will accept RPC requests. + """ + + @abc.abstractmethod + def add_secure_port(self, address: str, + server_credentials: grpc.ServerCredentials) -> int: + """Opens a secure port for accepting RPCs. + + This method may only be called before starting the server. + + Args: + address: The address for which to open a port. + if the port is 0, or not specified in the address, then the gRPC + runtime will choose a port. + server_credentials: A ServerCredentials object. + + Returns: + An integer port on which the server will accept RPC requests. + """ + + @abc.abstractmethod + async def start(self) -> None: + """Starts this Server. + + This method may only be called once. (i.e. it is not idempotent). + """ + + @abc.abstractmethod + async def stop(self, grace: Optional[float]) -> None: + """Stops this Server. + + This method immediately stops the server from servicing new RPCs in + all cases. + + If a grace period is specified, this method returns immediately and all + RPCs active at the end of the grace period are aborted. If a grace + period is not specified (by passing None for grace), all existing RPCs + are aborted immediately and this method blocks until the last RPC + handler terminates. + + This method is idempotent and may be called at any time. Passing a + smaller grace value in a subsequent call will have the effect of + stopping the Server sooner (passing None will have the effect of + stopping the server immediately). Passing a larger grace value in a + subsequent call will not have the effect of stopping the server later + (i.e. the most restrictive grace value is used). + + Args: + grace: A duration of time in seconds or None. + """ + + @abc.abstractmethod + async def wait_for_termination(self, + timeout: Optional[float] = None) -> bool: + """Block current coroutine until the server stops. + + This is an EXPERIMENTAL API. + + The wait will not consume computational resources during blocking, and + it will block until one of the two following conditions are met: + + 1) The server is stopped or terminated; + 2) A timeout occurs if timeout is not `None`. + + The timeout argument works in the same way as `threading.Event.wait()`. + https://docs.python.org/3/library/threading.html#threading.Event.wait + + Args: + timeout: A floating point number specifying a timeout for the + operation in seconds. + + Returns: + A bool indicates if the operation times out. + """ + + +class ServicerContext(abc.ABC): + """A context object passed to method implementations.""" + + async def read(self) -> RequestType: + """Reads one message from the RPC. + + Only one read operation is allowed simultaneously. Mixing new streaming API and old + streaming API will resulted in undefined behavior. + + Returns: + A response message of the RPC. + + Raises: + An RpcError exception if the read failed. + """ + + async def write(self, message: ResponseType) -> None: + """Writes one message to the RPC. + + Only one write operation is allowed simultaneously. Mixing new streaming API and old + streaming API will resulted in undefined behavior. + + Raises: + An RpcError exception if the write failed. + """ + + async def send_initial_metadata(self, + initial_metadata: MetadataType) -> None: + """Sends the initial metadata value to the client. + + This method need not be called by implementations if they have no + metadata to add to what the gRPC runtime will transmit. + + Args: + initial_metadata: The initial :term:`metadata`. + """ + + async def abort(self, code: grpc.StatusCode, details: str, + trailing_metadata: MetadataType) -> NoReturn: + """Raises an exception to terminate the RPC with a non-OK status. + + The code and details passed as arguments will supercede any existing + ones. + + Args: + code: A StatusCode object to be sent to the client. + It must not be StatusCode.OK. + details: A UTF-8-encodable string to be sent to the client upon + termination of the RPC. + trailing_metadata: A sequence of tuple represents the trailing + :term:`metadata`. + + Raises: + Exception: An exception is always raised to signal the abortion the + RPC to the gRPC runtime. + """ + + async def set_trailing_metadata(self, + trailing_metadata: MetadataType) -> None: + """Sends the trailing metadata for the RPC. + + This method need not be called by implementations if they have no + metadata to add to what the gRPC runtime will transmit. + + Args: + trailing_metadata: The trailing :term:`metadata`. + """ + + def invocation_metadata(self) -> Optional[MetadataType]: + """Accesses the metadata from the sent by the client. + + Returns: + The invocation :term:`metadata`. + """ + + def set_code(self, code: grpc.StatusCode) -> None: + """Sets the value to be used as status code upon RPC completion. + + This method need not be called by method implementations if they wish + the gRPC runtime to determine the status code of the RPC. + + Args: + code: A StatusCode object to be sent to the client. + """ + + def set_details(self, details: str) -> None: + """Sets the value to be used as detail string upon RPC completion. + + This method need not be called by method implementations if they have + no details to transmit. + + Args: + details: A UTF-8-encodable string to be sent to the client upon + termination of the RPC. + """ + + def set_compression(self, compression: grpc.Compression) -> None: + """Set the compression algorithm to be used for the entire call. + + This is an EXPERIMENTAL method. + + Args: + compression: An element of grpc.compression, e.g. + grpc.compression.Gzip. + """ + + def disable_next_message_compression(self) -> None: + """Disables compression for the next response message. + + This is an EXPERIMENTAL method. + + This method will override any compression configuration set during + server creation or set on the call. + """ diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index cb4ed80339c..fcc61338ca3 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -21,7 +21,7 @@ import grpc from grpc import _common, _compression, _grpcio_metadata from grpc._cython import cygrpc -from . import _base_call +from . import _base_call, _base_channel from ._call import (StreamStreamCall, StreamUnaryCall, UnaryStreamCall, UnaryUnaryCall) from ._interceptor import (InterceptedUnaryUnaryCall, @@ -86,8 +86,8 @@ class _BaseMultiCallable: self._interceptors = interceptors -class UnaryUnaryMultiCallable(_BaseMultiCallable): - """Factory an asynchronous unary-unary RPC stub call from client-side.""" +class UnaryUnaryMultiCallable(_BaseMultiCallable, + _base_channel.UnaryUnaryMultiCallable): def __call__(self, request: Any, @@ -98,29 +98,6 @@ class UnaryUnaryMultiCallable(_BaseMultiCallable): wait_for_ready: Optional[bool] = None, compression: Optional[grpc.Compression] = None ) -> _base_call.UnaryUnaryCall: - """Asynchronously invokes the underlying RPC. - - Args: - request: The request value for the RPC. - timeout: An optional duration of time in seconds to allow - for the RPC. - metadata: Optional :term:`metadata` to be transmitted to the - service-side of the RPC. - credentials: An optional CallCredentials for the RPC. Only valid for - secure Channel. - wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism - compression: An element of grpc.compression, e.g. - grpc.compression.Gzip. This is an EXPERIMENTAL option. - - Returns: - A Call object instance which is an awaitable object. - - Raises: - RpcError: Indicating that the RPC terminated with non-OK status. The - raised RpcError will also be a Call for the RPC affording the RPC's - metadata, status code, and details. - """ if compression: metadata = _compression.augment_metadata(metadata, compression) @@ -140,8 +117,8 @@ class UnaryUnaryMultiCallable(_BaseMultiCallable): return call -class UnaryStreamMultiCallable(_BaseMultiCallable): - """Affords invoking a unary-stream RPC from client-side in an asynchronous way.""" +class UnaryStreamMultiCallable(_BaseMultiCallable, + _base_channel.UnaryStreamMultiCallable): def __call__(self, request: Any, @@ -152,24 +129,6 @@ class UnaryStreamMultiCallable(_BaseMultiCallable): wait_for_ready: Optional[bool] = None, compression: Optional[grpc.Compression] = None ) -> _base_call.UnaryStreamCall: - """Asynchronously invokes the underlying RPC. - - Args: - request: The request value for the RPC. - timeout: An optional duration of time in seconds to allow - for the RPC. - metadata: Optional :term:`metadata` to be transmitted to the - service-side of the RPC. - credentials: An optional CallCredentials for the RPC. Only valid for - secure Channel. - wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism - compression: An element of grpc.compression, e.g. - grpc.compression.Gzip. This is an EXPERIMENTAL option. - - Returns: - A Call object instance which is an awaitable object. - """ if compression: metadata = _compression.augment_metadata(metadata, compression) @@ -183,8 +142,8 @@ class UnaryStreamMultiCallable(_BaseMultiCallable): return call -class StreamUnaryMultiCallable(_BaseMultiCallable): - """Affords invoking a stream-unary RPC from client-side in an asynchronous way.""" +class StreamUnaryMultiCallable(_BaseMultiCallable, + _base_channel.StreamUnaryMultiCallable): def __call__(self, request_async_iterator: Optional[AsyncIterable[Any]] = None, @@ -194,29 +153,6 @@ class StreamUnaryMultiCallable(_BaseMultiCallable): wait_for_ready: Optional[bool] = None, compression: Optional[grpc.Compression] = None ) -> _base_call.StreamUnaryCall: - """Asynchronously invokes the underlying RPC. - - Args: - request: The request value for the RPC. - timeout: An optional duration of time in seconds to allow - for the RPC. - metadata: Optional :term:`metadata` to be transmitted to the - service-side of the RPC. - credentials: An optional CallCredentials for the RPC. Only valid for - secure Channel. - wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism - compression: An element of grpc.compression, e.g. - grpc.compression.Gzip. This is an EXPERIMENTAL option. - - Returns: - A Call object instance which is an awaitable object. - - Raises: - RpcError: Indicating that the RPC terminated with non-OK status. The - raised RpcError will also be a Call for the RPC affording the RPC's - metadata, status code, and details. - """ if compression: metadata = _compression.augment_metadata(metadata, compression) @@ -230,8 +166,8 @@ class StreamUnaryMultiCallable(_BaseMultiCallable): return call -class StreamStreamMultiCallable(_BaseMultiCallable): - """Affords invoking a stream-stream RPC from client-side in an asynchronous way.""" +class StreamStreamMultiCallable(_BaseMultiCallable, + _base_channel.StreamStreamMultiCallable): def __call__(self, request_async_iterator: Optional[AsyncIterable[Any]] = None, @@ -241,29 +177,6 @@ class StreamStreamMultiCallable(_BaseMultiCallable): wait_for_ready: Optional[bool] = None, compression: Optional[grpc.Compression] = None ) -> _base_call.StreamStreamCall: - """Asynchronously invokes the underlying RPC. - - Args: - request: The request value for the RPC. - timeout: An optional duration of time in seconds to allow - for the RPC. - metadata: Optional :term:`metadata` to be transmitted to the - service-side of the RPC. - credentials: An optional CallCredentials for the RPC. Only valid for - secure Channel. - wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism - compression: An element of grpc.compression, e.g. - grpc.compression.Gzip. This is an EXPERIMENTAL option. - - Returns: - A Call object instance which is an awaitable object. - - Raises: - RpcError: Indicating that the RPC terminated with non-OK status. The - raised RpcError will also be a Call for the RPC affording the RPC's - metadata, status code, and details. - """ if compression: metadata = _compression.augment_metadata(metadata, compression) @@ -277,11 +190,7 @@ class StreamStreamMultiCallable(_BaseMultiCallable): return call -class Channel: - """Asynchronous Channel implementation. - - A cygrpc.AioChannel-backed implementation. - """ +class Channel(_base_channel.Channel): _loop: asyncio.AbstractEventLoop _channel: cygrpc.AioChannel _unary_unary_interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]] @@ -326,18 +235,9 @@ class Channel: self._loop) async def __aenter__(self): - """Starts an asynchronous context manager. - - Returns: - Channel the channel that was instantiated. - """ return self async def __aexit__(self, exc_type, exc_val, exc_tb): - """Finishes the asynchronous context manager by closing the channel. - - Still active RPCs will be cancelled. - """ await self._close(None) async def _close(self, grace): @@ -392,35 +292,10 @@ class Channel: self._channel.close() async def close(self, grace: Optional[float] = None): - """Closes this Channel and releases all resources held by it. - - This method immediately stops the channel from executing new RPCs in - all cases. - - If a grace period is specified, this method wait until all active - RPCs are finshed, once the grace period is reached the ones that haven't - been terminated are cancelled. If a grace period is not specified - (by passing None for grace), all existing RPCs are cancelled immediately. - - This method is idempotent. - """ await self._close(grace) def get_state(self, try_to_connect: bool = False) -> grpc.ChannelConnectivity: - """Check the connectivity state of a channel. - - This is an EXPERIMENTAL API. - - If the channel reaches a stable connectivity state, it is guaranteed - that the return value of this function will eventually converge to that - state. - - Args: try_to_connect: a bool indicate whether the Channel should try to - connect to peer or not. - - Returns: A ChannelConnectivity object. - """ result = self._channel.check_connectivity_state(try_to_connect) return _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[result] @@ -428,31 +303,10 @@ class Channel: self, last_observed_state: grpc.ChannelConnectivity, ) -> None: - """Wait for a change in connectivity state. - - This is an EXPERIMENTAL API. - - The function blocks until there is a change in the channel connectivity - state from the "last_observed_state". If the state is already - different, this function will return immediately. - - There is an inherent race between the invocation of - "Channel.wait_for_state_change" and "Channel.get_state". The state can - change arbitrary times during the race, so there is no way to observe - every state transition. - - If there is a need to put a timeout for this function, please refer to - "asyncio.wait_for". - - Args: - last_observed_state: A grpc.ChannelConnectivity object representing - the last known state. - """ assert await self._channel.watch_connectivity_state( last_observed_state.value[0], None) async def channel_ready(self) -> None: - """Creates a coroutine that ends when a Channel is ready.""" state = self.get_state(try_to_connect=True) while state != grpc.ChannelConnectivity.READY: await self.wait_for_state_change(state) @@ -464,19 +318,6 @@ class Channel: request_serializer: Optional[SerializingFunction] = None, response_deserializer: Optional[DeserializingFunction] = None ) -> UnaryUnaryMultiCallable: - """Creates a UnaryUnaryMultiCallable for a unary-unary method. - - Args: - method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request - message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the - response message. Response goes undeserialized in case None - is passed. - - Returns: - A UnaryUnaryMultiCallable value for the named unary-unary method. - """ return UnaryUnaryMultiCallable(self._channel, _common.encode(method), request_serializer, response_deserializer, @@ -513,3 +354,51 @@ class Channel: request_serializer, response_deserializer, None, self._loop) + + +def insecure_channel( + target: str, + options: Optional[ChannelArgumentType] = None, + compression: Optional[grpc.Compression] = None, + interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]] = None): + """Creates an insecure asynchronous Channel to a server. + + Args: + target: The server address + options: An optional list of key-value pairs (channel args + in gRPC Core runtime) to configure the channel. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. This is an EXPERIMENTAL option. + interceptors: An optional sequence of interceptors that will be executed for + any call executed with this channel. + + Returns: + A Channel. + """ + return Channel(target, () if options is None else options, None, + compression, interceptors) + + +def secure_channel( + target: str, + credentials: grpc.ChannelCredentials, + options: Optional[ChannelArgumentType] = None, + compression: Optional[grpc.Compression] = None, + interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]] = None): + """Creates a secure asynchronous Channel to a server. + + Args: + target: The server address. + credentials: A ChannelCredentials instance. + options: An optional list of key-value pairs (channel args + in gRPC Core runtime) to configure the channel. + compression: An optional value indicating the compression method to be + used over the lifetime of the channel. This is an EXPERIMENTAL option. + interceptors: An optional sequence of interceptors that will be executed for + any call executed with this channel. + + Returns: + An aio.Channel. + """ + return Channel(target, () if options is None else options, + credentials._credentials, compression, interceptors) diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index 9a394016be3..f67846dda11 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -35,6 +35,19 @@ class ClientCallDetails( 'ClientCallDetails', ('method', 'timeout', 'metadata', 'credentials', 'wait_for_ready')), grpc.ClientCallDetails): + """Describes an RPC to be invoked. + + This is an EXPERIMENTAL API. + + Args: + method: The method name of the RPC. + timeout: An optional duration of time in seconds to allow for the RPC. + metadata: Optional metadata to be transmitted to the service-side of + the RPC. + credentials: An optional CallCredentials for the RPC. + wait_for_ready: This is an EXPERIMENTAL argument. An optional flag to + enable wait for ready mechanism. + """ method: str timeout: Optional[float] diff --git a/src/python/grpcio/grpc/experimental/aio/_server.py b/src/python/grpcio/grpc/experimental/aio/_server.py index 13ff381af09..bdbbf30e2e2 100644 --- a/src/python/grpcio/grpc/experimental/aio/_server.py +++ b/src/python/grpcio/grpc/experimental/aio/_server.py @@ -21,6 +21,7 @@ import grpc from grpc import _common, _compression from grpc._cython import cygrpc +from . import _base_server from ._typing import ChannelArgumentType @@ -30,7 +31,7 @@ def _augment_channel_arguments(base_options: ChannelArgumentType, return tuple(base_options) + compression_option -class Server: +class Server(_base_server.Server): """Serves RPCs.""" def __init__(self, thread_pool: Optional[Executor], From 1945c1108fc90727908a7022a58d1dd47c57cfb8 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 15:03:22 -0800 Subject: [PATCH 048/129] Move the docstring from Cython to rst --- doc/python/sphinx/grpc_asyncio.rst | 18 +++++++++++++++++- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 8 -------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/doc/python/sphinx/grpc_asyncio.rst b/doc/python/sphinx/grpc_asyncio.rst index 280004d3a49..d70af2ef527 100644 --- a/doc/python/sphinx/grpc_asyncio.rst +++ b/doc/python/sphinx/grpc_asyncio.rst @@ -16,13 +16,29 @@ suggestions by opening issues on our GitHub repo `grpc/grpc `_. +Caveats +------- + +gRPC Async API objects may only be used on the thread on which they were +created. AsyncIO doesn't provide thread safety for most of its APIs. + + Module Contents --------------- Turn-On AsyncIO Mode ^^^^^^^^^^^^^^^^^^^^ -.. autofunction:: init_grpc_aio +.. function:: init_grpc_aio + + Turn-on AsyncIO mode for gRPC Python. + + This function is idempotent, and it should be invoked before creation of + AsyncIO stack objects. Otherwise, the application might deadlock. + + This function enables AsyncIO IO manager and disables threading for entire + process. After this point, there should not be blocking calls unless it is + taken cared by AsyncIO. Create Client diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index d21b8a6da00..4b38779ab63 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -17,14 +17,6 @@ cdef bint _grpc_aio_initialized = 0 def init_grpc_aio(): - """Turn-on AsyncIO mode for gRPC Python. - - This function enables AsyncIO IO manager and disables threading for entire - process. After this point, there should not be blocking calls unless it is - taken cared by AsyncIO. - - This function is idempotent. - """ global _grpc_aio_initialized if _grpc_aio_initialized: From 0c7bf6c434513b759e0e2a6ed2c7ed51ec59783e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 15:28:06 -0800 Subject: [PATCH 049/129] Make sanity tests happy --- src/python/grpcio/grpc/experimental/BUILD.bazel | 11 +---------- .../grpc/experimental/aio/_base_channel.py | 5 ++--- .../grpc/experimental/aio/_base_server.py | 17 +++++++++++++---- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/BUILD.bazel b/src/python/grpcio/grpc/experimental/BUILD.bazel index e436233210b..cdca2f40e5e 100644 --- a/src/python/grpcio/grpc/experimental/BUILD.bazel +++ b/src/python/grpcio/grpc/experimental/BUILD.bazel @@ -2,16 +2,7 @@ package(default_visibility = ["//visibility:public"]) py_library( name = "aio", - srcs = [ - "aio/__init__.py", - "aio/_base_call.py", - "aio/_call.py", - "aio/_channel.py", - "aio/_interceptor.py", - "aio/_server.py", - "aio/_typing.py", - "aio/_utils.py", - ], + srcs = glob(["aio/**/*.py"]), deps = [ "//src/python/grpcio/grpc/_cython:cygrpc", ], diff --git a/src/python/grpcio/grpc/experimental/aio/_base_channel.py b/src/python/grpcio/grpc/experimental/aio/_base_channel.py index a1f8121f5df..3b1b80fb5d3 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_channel.py @@ -14,13 +14,12 @@ """Abstract base classes for Channel objects and Multicallable objects.""" import abc -from typing import Any, AsyncIterable, Optional, Sequence +from typing import Any, AsyncIterable, Optional import grpc from . import _base_call -from ._typing import (ChannelArgumentType, DeserializingFunction, MetadataType, - SerializingFunction) +from ._typing import DeserializingFunction, MetadataType, SerializingFunction _IMMUTABLE_EMPTY_TUPLE = tuple() diff --git a/src/python/grpcio/grpc/experimental/aio/_base_server.py b/src/python/grpcio/grpc/experimental/aio/_base_server.py index ab62c172dc1..c0bf28a73ff 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_server.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_server.py @@ -14,12 +14,11 @@ """Abstract base classes for server-side classes.""" import abc -from concurrent.futures import Executor -from typing import Any, Optional, Sequence, NoReturn +from typing import Generic, NoReturn, Optional, Sequence import grpc -from ._typing import ChannelArgumentType, MetadataType, RequestType, ResponseType +from ._typing import MetadataType, RequestType, ResponseType class Server(abc.ABC): @@ -125,9 +124,10 @@ class Server(abc.ABC): """ -class ServicerContext(abc.ABC): +class ServicerContext(Generic[RequestType, ResponseType], abc.ABC): """A context object passed to method implementations.""" + @abc.abstractmethod async def read(self) -> RequestType: """Reads one message from the RPC. @@ -141,6 +141,7 @@ class ServicerContext(abc.ABC): An RpcError exception if the read failed. """ + @abc.abstractmethod async def write(self, message: ResponseType) -> None: """Writes one message to the RPC. @@ -151,6 +152,7 @@ class ServicerContext(abc.ABC): An RpcError exception if the write failed. """ + @abc.abstractmethod async def send_initial_metadata(self, initial_metadata: MetadataType) -> None: """Sends the initial metadata value to the client. @@ -162,6 +164,7 @@ class ServicerContext(abc.ABC): initial_metadata: The initial :term:`metadata`. """ + @abc.abstractmethod async def abort(self, code: grpc.StatusCode, details: str, trailing_metadata: MetadataType) -> NoReturn: """Raises an exception to terminate the RPC with a non-OK status. @@ -182,6 +185,7 @@ class ServicerContext(abc.ABC): RPC to the gRPC runtime. """ + @abc.abstractmethod async def set_trailing_metadata(self, trailing_metadata: MetadataType) -> None: """Sends the trailing metadata for the RPC. @@ -193,6 +197,7 @@ class ServicerContext(abc.ABC): trailing_metadata: The trailing :term:`metadata`. """ + @abc.abstractmethod def invocation_metadata(self) -> Optional[MetadataType]: """Accesses the metadata from the sent by the client. @@ -200,6 +205,7 @@ class ServicerContext(abc.ABC): The invocation :term:`metadata`. """ + @abc.abstractmethod def set_code(self, code: grpc.StatusCode) -> None: """Sets the value to be used as status code upon RPC completion. @@ -210,6 +216,7 @@ class ServicerContext(abc.ABC): code: A StatusCode object to be sent to the client. """ + @abc.abstractmethod def set_details(self, details: str) -> None: """Sets the value to be used as detail string upon RPC completion. @@ -221,6 +228,7 @@ class ServicerContext(abc.ABC): termination of the RPC. """ + @abc.abstractmethod def set_compression(self, compression: grpc.Compression) -> None: """Set the compression algorithm to be used for the entire call. @@ -231,6 +239,7 @@ class ServicerContext(abc.ABC): grpc.compression.Gzip. """ + @abc.abstractmethod def disable_next_message_compression(self) -> None: """Disables compression for the next response message. From 479651e4cf84eaa789d4a771bd4b227d5b862577 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 12 Feb 2020 11:17:47 -0800 Subject: [PATCH 050/129] Remove NoReturn to support <3.6.2 --- src/python/grpcio/grpc/experimental/aio/_base_server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_base_server.py b/src/python/grpcio/grpc/experimental/aio/_base_server.py index c0bf28a73ff..7123f13635d 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_server.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_server.py @@ -14,7 +14,7 @@ """Abstract base classes for server-side classes.""" import abc -from typing import Generic, NoReturn, Optional, Sequence +from typing import Generic, Optional, Sequence import grpc @@ -166,7 +166,7 @@ class ServicerContext(Generic[RequestType, ResponseType], abc.ABC): @abc.abstractmethod async def abort(self, code: grpc.StatusCode, details: str, - trailing_metadata: MetadataType) -> NoReturn: + trailing_metadata: MetadataType) -> None: """Raises an exception to terminate the RPC with a non-OK status. The code and details passed as arguments will supercede any existing From 12b0ddbc2b5a3efd1e93b83f7f4d4ccaed66cda1 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 12 Feb 2020 15:47:21 -0800 Subject: [PATCH 051/129] Improve the documentation based on suggestions --- doc/python/sphinx/grpc_asyncio.rst | 34 ++++++++++----- .../grpc/experimental/aio/_base_channel.py | 41 +++++++++++-------- .../grpc/experimental/aio/_base_server.py | 16 +++++--- 3 files changed, 57 insertions(+), 34 deletions(-) diff --git a/doc/python/sphinx/grpc_asyncio.rst b/doc/python/sphinx/grpc_asyncio.rst index d70af2ef527..16267d94433 100644 --- a/doc/python/sphinx/grpc_asyncio.rst +++ b/doc/python/sphinx/grpc_asyncio.rst @@ -7,8 +7,9 @@ Overview -------- gRPC AsyncIO API is the **new version** of gRPC Python whose architecture is -tailored to AsyncIO. Underlying, it is using C-Core's callback API, and -replaced all IO operations with methods provided by the AsyncIO library. +tailored to AsyncIO. Underlying, it utilizes the same C-extension, gRPC C-Core, +as existing stack, and it replaces all gRPC IO operations with methods provided +by the AsyncIO library. This stack currently is under active development. Feel free to offer suggestions by opening issues on our GitHub repo `grpc/grpc `_. @@ -26,23 +27,34 @@ created. AsyncIO doesn't provide thread safety for most of its APIs. Module Contents --------------- -Turn-On AsyncIO Mode -^^^^^^^^^^^^^^^^^^^^ +Enable AsyncIO in gRPC +^^^^^^^^^^^^^^^^^^^^^^ .. function:: init_grpc_aio - Turn-on AsyncIO mode for gRPC Python. + Enable AsyncIO for gRPC Python. - This function is idempotent, and it should be invoked before creation of + This function is idempotent and it should be invoked before creation of AsyncIO stack objects. Otherwise, the application might deadlock. - This function enables AsyncIO IO manager and disables threading for entire - process. After this point, there should not be blocking calls unless it is - taken cared by AsyncIO. + This function configurates the gRPC C-Core to invoke AsyncIO methods for IO + operations (e.g., socket read, write). The configuration applies to the + entire process. + After invoking this function, making blocking function calls in coroutines + or in the thread running event loop will block the event loop, potentially + starving all RPCs in the process. Refer to the Python language + documentation on AsyncIO for more details (`running-blocking-code `_). -Create Client -^^^^^^^^^^^^^ + +Create Channel +^^^^^^^^^^^^^^ + +Channels are the abstraction of clients, where most of networking logic +happens, for example, managing one or more underlying connections, name +resolution, load balancing, flow control, etc.. If you are using ProtoBuf, +Channel objects works best when further encapsulate into stub objects, then the +application can invoke remote functions as if they are local functions. .. autofunction:: insecure_channel .. autofunction:: secure_channel diff --git a/src/python/grpcio/grpc/experimental/aio/_base_channel.py b/src/python/grpcio/grpc/experimental/aio/_base_channel.py index 3b1b80fb5d3..1168c260e97 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_channel.py @@ -25,7 +25,7 @@ _IMMUTABLE_EMPTY_TUPLE = tuple() class UnaryUnaryMultiCallable(abc.ABC): - """Factory an asynchronous unary-unary RPC stub call from client-side.""" + """Enables asynchronous invocation of a unary-call RPC.""" @abc.abstractmethod def __call__(self, @@ -53,17 +53,17 @@ class UnaryUnaryMultiCallable(abc.ABC): grpc.compression.Gzip. This is an EXPERIMENTAL option. Returns: - A Call object instance which is an awaitable object. + A UnaryUnaryCall object. Raises: - RpcError: Indicating that the RPC terminated with non-OK status. The + RpcError: Indicates that the RPC terminated with non-OK status. The raised RpcError will also be a Call for the RPC affording the RPC's metadata, status code, and details. """ class UnaryStreamMultiCallable(abc.ABC): - """Affords invoking a unary-stream RPC from client-side in an asynchronous way.""" + """Enables asynchronous invocation of a server-streaming RPC.""" @abc.abstractmethod def __call__(self, @@ -91,12 +91,17 @@ class UnaryStreamMultiCallable(abc.ABC): grpc.compression.Gzip. This is an EXPERIMENTAL option. Returns: - A Call object instance which is an awaitable object. + A UnaryStreamCall object. + + Raises: + RpcError: Indicates that the RPC terminated with non-OK status. The + raised RpcError will also be a Call for the RPC affording the RPC's + metadata, status code, and details. """ class StreamUnaryMultiCallable(abc.ABC): - """Affords invoking a stream-unary RPC from client-side in an asynchronous way.""" + """Enables asynchronous invocation of a client-streaming RPC.""" @abc.abstractmethod def __call__(self, @@ -123,17 +128,17 @@ class StreamUnaryMultiCallable(abc.ABC): grpc.compression.Gzip. This is an EXPERIMENTAL option. Returns: - A Call object instance which is an awaitable object. + A StreamUnaryCall object. Raises: - RpcError: Indicating that the RPC terminated with non-OK status. The + RpcError: Indicates that the RPC terminated with non-OK status. The raised RpcError will also be a Call for the RPC affording the RPC's metadata, status code, and details. """ class StreamStreamMultiCallable(abc.ABC): - """Affords invoking a stream-stream RPC from client-side in an asynchronous way.""" + """Enables asynchronous invocation of a bidirectional-streaming RPC.""" @abc.abstractmethod def __call__(self, @@ -160,19 +165,21 @@ class StreamStreamMultiCallable(abc.ABC): grpc.compression.Gzip. This is an EXPERIMENTAL option. Returns: - A Call object instance which is an awaitable object. + A StreamStreamCall object. Raises: - RpcError: Indicating that the RPC terminated with non-OK status. The + RpcError: Indicates that the RPC terminated with non-OK status. The raised RpcError will also be a Call for the RPC affording the RPC's metadata, status code, and details. """ class Channel(abc.ABC): - """Asynchronous Channel implementation. + """Enables asynchronous RPC invocation as a client. - A cygrpc.AioChannel-backed implementation. + Channel objects implement the Asynchronous Context Manager (aka. async + with) type, although they are not supportted to be entered and exited + multiple times. """ @abc.abstractmethod @@ -208,7 +215,7 @@ class Channel(abc.ABC): @abc.abstractmethod def get_state(self, try_to_connect: bool = False) -> grpc.ChannelConnectivity: - """Check the connectivity state of a channel. + """Checks the connectivity state of a channel. This is an EXPERIMENTAL API. @@ -228,7 +235,7 @@ class Channel(abc.ABC): self, last_observed_state: grpc.ChannelConnectivity, ) -> None: - """Wait for a change in connectivity state. + """Waits for a change in connectivity state. This is an EXPERIMENTAL API. @@ -238,8 +245,8 @@ class Channel(abc.ABC): There is an inherent race between the invocation of "Channel.wait_for_state_change" and "Channel.get_state". The state can - change arbitrary times during the race, so there is no way to observe - every state transition. + change arbitrary many times during the race, so there is no way to + observe every state transition. If there is a need to put a timeout for this function, please refer to "asyncio.wait_for". diff --git a/src/python/grpcio/grpc/experimental/aio/_base_server.py b/src/python/grpcio/grpc/experimental/aio/_base_server.py index 7123f13635d..72e4288c94f 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_server.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_server.py @@ -41,6 +41,9 @@ class Server(abc.ABC): def add_insecure_port(self, address: str) -> int: """Opens an insecure port for accepting RPCs. + A port is a communication endpoint that used by networking protocols, + like TCP and UDP. To date, we only support TCP. + This method may only be called before starting the server. Args: @@ -56,6 +59,9 @@ class Server(abc.ABC): server_credentials: grpc.ServerCredentials) -> int: """Opens a secure port for accepting RPCs. + A port is a communication endpoint that used by networking protocols, + like TCP and UDP. To date, we only support TCP. + This method may only be called before starting the server. Args: @@ -102,7 +108,7 @@ class Server(abc.ABC): @abc.abstractmethod async def wait_for_termination(self, timeout: Optional[float] = None) -> bool: - """Block current coroutine until the server stops. + """Continues current coroutine once the server stops. This is an EXPERIMENTAL API. @@ -131,8 +137,7 @@ class ServicerContext(Generic[RequestType, ResponseType], abc.ABC): async def read(self) -> RequestType: """Reads one message from the RPC. - Only one read operation is allowed simultaneously. Mixing new streaming API and old - streaming API will resulted in undefined behavior. + Only one read operation is allowed simultaneously. Returns: A response message of the RPC. @@ -145,8 +150,7 @@ class ServicerContext(Generic[RequestType, ResponseType], abc.ABC): async def write(self, message: ResponseType) -> None: """Writes one message to the RPC. - Only one write operation is allowed simultaneously. Mixing new streaming API and old - streaming API will resulted in undefined behavior. + Only one write operation is allowed simultaneously. Raises: An RpcError exception if the write failed. @@ -218,7 +222,7 @@ class ServicerContext(Generic[RequestType, ResponseType], abc.ABC): @abc.abstractmethod def set_details(self, details: str) -> None: - """Sets the value to be used as detail string upon RPC completion. + """Sets the value to be used the as detail string upon RPC completion. This method need not be called by method implementations if they have no details to transmit. From 909ce6fee2bd5feb96efb348f27ef7c0b6511bf7 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 11:19:35 -0800 Subject: [PATCH 052/129] Point out it is testing client-side behavior --- src/python/grpcio_tests/tests/unit/_invocation_defects_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py index 20d1124b901..7dd43f7a4aa 100644 --- a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py +++ b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py @@ -177,7 +177,7 @@ def _defective_handler_multi_callable(channel): class InvocationDefectsTest(unittest.TestCase): - """Tests the handling of exception-raising user code.""" + """Tests the handling of exception-raising user code on the client-side.""" def setUp(self): self._control = test_control.PauseFailControl() From e6278b533372ba2cf8869a8563bd96208211e956 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 12:08:53 -0800 Subject: [PATCH 053/129] Make the test intent more obvious --- .../grpcio_tests/tests/unit/_invocation_defects_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py index 7dd43f7a4aa..a0208b51df4 100644 --- a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py +++ b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py @@ -195,11 +195,11 @@ class InvocationDefectsTest(unittest.TestCase): self._channel.close() def testIterableStreamRequestBlockingUnaryResponse(self): - requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)] + requests = object() multi_callable = _stream_unary_multi_callable(self._channel) with self.assertRaises(grpc.RpcError) as exception_context: - response = multi_callable( + multi_callable( requests, metadata=(('test', 'IterableStreamRequestBlockingUnaryResponse'),)) @@ -208,7 +208,7 @@ class InvocationDefectsTest(unittest.TestCase): exception_context.exception.code()) def testIterableStreamRequestFutureUnaryResponse(self): - requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)] + requests = object() multi_callable = _stream_unary_multi_callable(self._channel) response_future = multi_callable.future( requests, @@ -221,7 +221,7 @@ class InvocationDefectsTest(unittest.TestCase): exception_context.exception.code()) def testIterableStreamRequestStreamResponse(self): - requests = [b'\x77\x58' for _ in range(test_constants.STREAM_LENGTH)] + requests = object() multi_callable = _stream_stream_multi_callable(self._channel) response_iterator = multi_callable( requests, From 7b4d0b28c68617751a40112ca2f7ad518e3ecd7c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 12:24:35 -0800 Subject: [PATCH 054/129] Implement health checking servicer in AsyncIO --- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 2 + .../grpc_health/v1/BUILD.bazel | 5 +- .../grpc_health/v1/_async.py | 107 ++++++++ .../grpc_health/v1/health.py | 5 +- .../tests_aio/health_check/BUILD.bazel | 29 +++ .../tests_aio/health_check/__init__.py | 13 + .../health_check/health_servicer_test.py | 242 ++++++++++++++++++ 7 files changed, 401 insertions(+), 2 deletions(-) create mode 100644 src/python/grpcio_health_checking/grpc_health/v1/_async.py create mode 100644 src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/health_check/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 903c20796f7..74b249bdf8f 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -466,6 +466,8 @@ async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop): ) except (KeyboardInterrupt, SystemExit): raise + except asyncio.CancelledError: + _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method())) except _ServerStoppedError: _LOGGER.info('Aborting RPC due to server stop.') except Exception as e: diff --git a/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel b/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel index 78a55a7f2db..ff7be4347ed 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel +++ b/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel @@ -16,7 +16,10 @@ py_grpc_library( py_library( name = "grpc_health", - srcs = ["health.py"], + srcs = [ + "health.py", + "_async.py", + ], imports = ["../../"], deps = [ ":health_py_pb2", diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py new file mode 100644 index 00000000000..fd2e7be3d9d --- /dev/null +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -0,0 +1,107 @@ +# Copyright 2020 The 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. +"""Reference implementation for health checking in gRPC Python.""" + +import logging +import asyncio +import collections + +import grpc +from grpc.experimental import aio + +from grpc_health.v1 import health_pb2 as _health_pb2 +from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc + + +class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): + """An AsyncIO implementation of health checking servicer.""" + + def __init__(self): + self._lock = asyncio.Lock() + self._server_status = dict() + self._server_watchers = collections.defaultdict(asyncio.Condition) + self._gracefully_shutting_down = False + + async def Check(self, request: _health_pb2.HealthCheckRequest, context): + status = self._server_status.get(request.service) + logging.debug('Status %s, %s', request.service, status) + + if status is None: + await context.abort(grpc.StatusCode.NOT_FOUND) + else: + return _health_pb2.HealthCheckResponse(status=status) + + async def Watch(self, request: _health_pb2.HealthCheckRequest, context): + status = self._server_status.get(request.service) + + if status is None: + status = _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN + + try: + condition = self._server_watchers[request.service] + async with condition: + # Responds with current health state + await context.write( + _health_pb2.HealthCheckResponse(status=status)) + + # Polling on health state changes + while True: + await condition.wait() + + status = self._server_status.get(request.service) + await context.write( + _health_pb2.HealthCheckResponse(status=status)) + finally: + del self._server_watchers[request.service] + + async def _set(self, service: str, + status: _health_pb2.HealthCheckResponse.ServingStatus): + if service in self._server_watchers: + condition = self._server_watchers.get(service) + async with condition: + self._server_status[service] = status + condition.notify_all() + else: + self._server_status[service] = status + + async def set(self, service: str, + status: _health_pb2.HealthCheckResponse.ServingStatus): + """Sets the status of a service. + + Args: + service: string, the name of the service. NOTE, '' must be set. + status: HealthCheckResponse.status enum value indicating the status of + the service + """ + if self._gracefully_shutting_down: + return + else: + await self._set(service, status) + + async def enter_graceful_shutdown(self): + """Permanently sets the status of all services to NOT_SERVING. + + This should be invoked when the server is entering a graceful shutdown + period. After this method is invoked, future attempts to set the status + of a service will be ignored. + + This is an EXPERIMENTAL API. + """ + if self._gracefully_shutting_down: + return + else: + self._gracefully_shutting_down = True + for service in self._server_status: + await self._set(service, + _health_pb2.HealthCheckResponse.NOT_SERVING) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py index 15494fafdbc..acbcd441580 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/health.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py @@ -15,12 +15,15 @@ import collections import threading - +import sys import grpc from grpc_health.v1 import health_pb2 as _health_pb2 from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc +if sys.version_info[0] > 2: + from ._async import AsyncHealthServicer + SERVICE_NAME = _health_pb2.DESCRIPTOR.services_by_name['Health'].full_name diff --git a/src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel b/src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel new file mode 100644 index 00000000000..fde3f69991f --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel @@ -0,0 +1,29 @@ +# Copyright 2020 The 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. + +package(default_visibility = ["//visibility:public"]) + +py_test( + name = "health_servicer_test", + size = "small", + srcs = ["health_servicer_test.py"], + imports = ["../../"], + python_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_health_checking/grpc_health/v1:grpc_health", + "//src/python/grpcio_tests/tests/unit/framework/common", + "//src/python/grpcio_tests/tests_aio/unit:_test_base", + ], +) diff --git a/src/python/grpcio_tests/tests_aio/health_check/__init__.py b/src/python/grpcio_tests/tests_aio/health_check/__init__.py new file mode 100644 index 00000000000..1517f71d093 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/health_check/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020 The 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. diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py new file mode 100644 index 00000000000..0f686bb8e9c --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -0,0 +1,242 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests AsyncIO version of grpcio-health-checking.""" + +import asyncio +import logging +import time +import unittest + +import grpc + +from grpc_health.v1 import health +from grpc_health.v1 import health_pb2 +from grpc_health.v1 import health_pb2_grpc +from grpc.experimental import aio + +from tests.unit.framework.common import test_constants + +from tests_aio.unit._test_base import AioTestBase + +_SERVING_SERVICE = 'grpc.test.TestServiceServing' +_UNKNOWN_SERVICE = 'grpc.test.TestServiceUnknown' +_NOT_SERVING_SERVICE = 'grpc.test.TestServiceNotServing' +_WATCH_SERVICE = 'grpc.test.WatchService' + + +async def _pipe_to_queue(call, queue): + async for response in call: + await queue.put(response) + + +class HealthServicerTest(AioTestBase): + + async def setUp(self): + self._servicer = health.AsyncHealthServicer() + await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(_SERVING_SERVICE, + health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(_UNKNOWN_SERVICE, + health_pb2.HealthCheckResponse.UNKNOWN) + await self._servicer.set(_NOT_SERVING_SERVICE, + health_pb2.HealthCheckResponse.NOT_SERVING) + self._server = aio.server() + port = self._server.add_insecure_port('[::]:0') + health_pb2_grpc.add_HealthServicer_to_server(self._servicer, + self._server) + await self._server.start() + + self._channel = aio.insecure_channel('localhost:%d' % port) + self._stub = health_pb2_grpc.HealthStub(self._channel) + + async def tearDown(self): + await self._channel.close() + await self._server.stop(None) + + async def test_check_empty_service(self): + request = health_pb2.HealthCheckRequest() + resp = await self._stub.Check(request) + self.assertEqual(health_pb2.HealthCheckResponse.SERVING, resp.status) + + async def test_check_serving_service(self): + request = health_pb2.HealthCheckRequest(service=_SERVING_SERVICE) + resp = await self._stub.Check(request) + self.assertEqual(health_pb2.HealthCheckResponse.SERVING, resp.status) + + async def test_check_unknown_service(self): + request = health_pb2.HealthCheckRequest(service=_UNKNOWN_SERVICE) + resp = await self._stub.Check(request) + self.assertEqual(health_pb2.HealthCheckResponse.UNKNOWN, resp.status) + + async def test_check_not_serving_service(self): + request = health_pb2.HealthCheckRequest(service=_NOT_SERVING_SERVICE) + resp = await self._stub.Check(request) + self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, + resp.status) + + async def test_check_not_found_service(self): + request = health_pb2.HealthCheckRequest(service='not-found') + with self.assertRaises(grpc.RpcError) as context: + await self._stub.Check(request) + + self.assertEqual(grpc.StatusCode.NOT_FOUND, context.exception.code()) + + async def test_health_service_name(self): + self.assertEqual(health.SERVICE_NAME, 'grpc.health.v1.Health') + + async def test_watch_empty_service(self): + request = health_pb2.HealthCheckRequest(service='') + + call = self._stub.Watch(request) + queue = asyncio.Queue() + task = self.loop.create_task(_pipe_to_queue(call, queue)) + + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVING, + response.status) + + call.cancel() + await task + self.assertTrue(queue.empty()) + + async def test_watch_new_service(self): + request = health_pb2.HealthCheckRequest(service=_WATCH_SERVICE) + call = self._stub.Watch(request) + queue = asyncio.Queue() + task = self.loop.create_task(_pipe_to_queue(call, queue)) + + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, + response.status) + + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVING, + response.status) + + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.NOT_SERVING) + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, + response.status) + + call.cancel() + await task + self.assertTrue(queue.empty()) + + async def test_watch_service_isolation(self): + request = health_pb2.HealthCheckRequest(service=_WATCH_SERVICE) + call = self._stub.Watch(request) + queue = asyncio.Queue() + task = self.loop.create_task(_pipe_to_queue(call, queue)) + + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, + response.status) + + await self._servicer.set('some-other-service', + health_pb2.HealthCheckResponse.SERVING) + with self.assertRaises(asyncio.TimeoutError): + await asyncio.wait_for(queue.get(), test_constants.SHORT_TIMEOUT) + + call.cancel() + await task + self.assertTrue(queue.empty()) + + async def test_two_watchers(self): + request = health_pb2.HealthCheckRequest(service=_WATCH_SERVICE) + queue1 = asyncio.Queue() + queue2 = asyncio.Queue() + call1 = self._stub.Watch(request) + call2 = self._stub.Watch(request) + task1 = self.loop.create_task(_pipe_to_queue(call1, queue1)) + task2 = self.loop.create_task(_pipe_to_queue(call2, queue2)) + + response1 = await queue1.get() + response2 = await queue2.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, + response1.status) + self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, + response2.status) + + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) + response1 = await queue1.get() + response2 = await queue2.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVING, + response1.status) + self.assertEqual(health_pb2.HealthCheckResponse.SERVING, + response2.status) + + call1.cancel() + call2.cancel() + await task1 + await task2 + self.assertTrue(queue1.empty()) + self.assertTrue(queue2.empty()) + + async def test_cancelled_watch_removed_from_watch_list(self): + request = health_pb2.HealthCheckRequest(service=_WATCH_SERVICE) + call = self._stub.Watch(request) + queue = asyncio.Queue() + task = self.loop.create_task(_pipe_to_queue(call, queue)) + + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, + response.status) + + call.cancel() + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) + await task + + # Wait for the serving coroutine to process client cancellation. + timeout = time.time() + test_constants.TIME_ALLOWANCE + while (time.time() < timeout and self._servicer._server_watchers): + await asyncio.sleep(1) + self.assertFalse(self._servicer._server_watchers, + 'There should not be any watcher left') + self.assertTrue(queue.empty()) + + async def test_graceful_shutdown(self): + request = health_pb2.HealthCheckRequest(service='') + call = self._stub.Watch(request) + queue = asyncio.Queue() + task = self.loop.create_task(_pipe_to_queue(call, queue)) + + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.SERVING, + response.status) + + await self._servicer.enter_graceful_shutdown() + response = await queue.get() + self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, + response.status) + + # This should be a no-op. + await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + + resp = await self._stub.Check(request) + self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, + resp.status) + + call.cancel() + await task + self.assertTrue(queue.empty()) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) From 43788ac44e2ef7959a50885e5010024bf92e2943 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 12:29:26 -0800 Subject: [PATCH 055/129] Update the copyright --- .../grpcio_tests/tests_aio/health_check/health_servicer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 0f686bb8e9c..9c337095542 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -1,4 +1,4 @@ -# Copyright 2016 gRPC authors. +# Copyright 2020 The gRPC Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 908a8489f084d056a295a905221ee7222e1ccec6 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 12:30:24 -0800 Subject: [PATCH 056/129] Make the version check more strict --- src/python/grpcio_health_checking/grpc_health/v1/health.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py index acbcd441580..bc97368acf5 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/health.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py @@ -21,7 +21,7 @@ import grpc from grpc_health.v1 import health_pb2 as _health_pb2 from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc -if sys.version_info[0] > 2: +if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: from ._async import AsyncHealthServicer SERVICE_NAME = _health_pb2.DESCRIPTOR.services_by_name['Health'].full_name From 37055f923fb1b0027d33a5c0a1aebaadb1250bf4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 12:44:19 -0800 Subject: [PATCH 057/129] Make pylint happy --- src/python/grpcio_health_checking/grpc_health/v1/_async.py | 4 ---- src/python/grpcio_health_checking/grpc_health/v1/health.py | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index fd2e7be3d9d..acf8d5700cb 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -13,12 +13,10 @@ # limitations under the License. """Reference implementation for health checking in gRPC Python.""" -import logging import asyncio import collections import grpc -from grpc.experimental import aio from grpc_health.v1 import health_pb2 as _health_pb2 from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc @@ -28,14 +26,12 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): """An AsyncIO implementation of health checking servicer.""" def __init__(self): - self._lock = asyncio.Lock() self._server_status = dict() self._server_watchers = collections.defaultdict(asyncio.Condition) self._gracefully_shutting_down = False async def Check(self, request: _health_pb2.HealthCheckRequest, context): status = self._server_status.get(request.service) - logging.debug('Status %s, %s', request.service, status) if status is None: await context.abort(grpc.StatusCode.NOT_FOUND) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py index bc97368acf5..99d9c0406bf 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/health.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py @@ -22,7 +22,8 @@ from grpc_health.v1 import health_pb2 as _health_pb2 from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: - from ._async import AsyncHealthServicer + # Exposes AsyncHealthServicer as public API. + from ._async import AsyncHealthServicer # pylint: disable=unused-import SERVICE_NAME = _health_pb2.DESCRIPTOR.services_by_name['Health'].full_name From 5622e9e78c7f3776e260c538927d401a52abdecb Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 12:56:14 -0800 Subject: [PATCH 058/129] Make sanity tests happy --- .../grpc_health/v1/BUILD.bazel | 2 +- .../health_check/health_servicer_test.py | 38 +++++++------------ src/python/grpcio_tests/tests_aio/tests.json | 1 + 3 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel b/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel index ff7be4347ed..fe4aaed7aa8 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel +++ b/src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel @@ -17,8 +17,8 @@ py_grpc_library( py_library( name = "grpc_health", srcs = [ - "health.py", "_async.py", + "health.py", ], imports = ["../../"], deps = [ diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 9c337095542..78527057903 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -87,7 +87,7 @@ class HealthServicerTest(AioTestBase): async def test_check_not_found_service(self): request = health_pb2.HealthCheckRequest(service='not-found') - with self.assertRaises(grpc.RpcError) as context: + with self.assertRaises(aio.AioRpcError) as context: await self._stub.Check(request) self.assertEqual(grpc.StatusCode.NOT_FOUND, context.exception.code()) @@ -102,9 +102,8 @@ class HealthServicerTest(AioTestBase): queue = asyncio.Queue() task = self.loop.create_task(_pipe_to_queue(call, queue)) - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVING, - response.status) + (await queue.get()).status) call.cancel() await task @@ -116,21 +115,18 @@ class HealthServicerTest(AioTestBase): queue = asyncio.Queue() task = self.loop.create_task(_pipe_to_queue(call, queue)) - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, - response.status) + (await queue.get()).status) await self._servicer.set(_WATCH_SERVICE, health_pb2.HealthCheckResponse.SERVING) - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVING, - response.status) + (await queue.get()).status) await self._servicer.set(_WATCH_SERVICE, health_pb2.HealthCheckResponse.NOT_SERVING) - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, - response.status) + (await queue.get()).status) call.cancel() await task @@ -142,9 +138,8 @@ class HealthServicerTest(AioTestBase): queue = asyncio.Queue() task = self.loop.create_task(_pipe_to_queue(call, queue)) - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, - response.status) + (await queue.get()).status) await self._servicer.set('some-other-service', health_pb2.HealthCheckResponse.SERVING) @@ -164,21 +159,17 @@ class HealthServicerTest(AioTestBase): task1 = self.loop.create_task(_pipe_to_queue(call1, queue1)) task2 = self.loop.create_task(_pipe_to_queue(call2, queue2)) - response1 = await queue1.get() - response2 = await queue2.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, - response1.status) + (await queue1.get()).status) self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, - response2.status) + (await queue2.get()).status) await self._servicer.set(_WATCH_SERVICE, health_pb2.HealthCheckResponse.SERVING) - response1 = await queue1.get() - response2 = await queue2.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVING, - response1.status) + (await queue1.get()).status) self.assertEqual(health_pb2.HealthCheckResponse.SERVING, - response2.status) + (await queue2.get()).status) call1.cancel() call2.cancel() @@ -193,9 +184,8 @@ class HealthServicerTest(AioTestBase): queue = asyncio.Queue() task = self.loop.create_task(_pipe_to_queue(call, queue)) - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, - response.status) + (await queue.get()).status) call.cancel() await self._servicer.set(_WATCH_SERVICE, @@ -216,14 +206,12 @@ class HealthServicerTest(AioTestBase): queue = asyncio.Queue() task = self.loop.create_task(_pipe_to_queue(call, queue)) - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.SERVING, - response.status) + (await queue.get()).status) await self._servicer.enter_graceful_shutdown() - response = await queue.get() self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, - response.status) + (await queue.get()).status) # This should be a no-op. await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index e05d64ac474..ec21a93476e 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -1,5 +1,6 @@ [ "_sanity._sanity_test.AioSanityTest", + "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", "unit.abort_test.TestAbort", From de9feb69ab957a2d28bb04777ecafcc3e486ba2b Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Sun, 16 Feb 2020 18:27:22 -0800 Subject: [PATCH 059/129] Add dbghelp.lib to windows artifacts --- Makefile | 2 +- setup.py | 2 +- templates/Makefile.template | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 3750bdf78e7..a11f9dba1e2 100644 --- a/Makefile +++ b/Makefile @@ -410,7 +410,7 @@ LDFLAGS += -pthread endif ifeq ($(SYSTEM),MINGW32) -LIBS = m pthread ws2_32 +LIBS = m pthread ws2_32 dbghelp LDFLAGS += -pthread endif diff --git a/setup.py b/setup.py index c0ca62637c3..a1562c76a87 100644 --- a/setup.py +++ b/setup.py @@ -241,7 +241,7 @@ if "linux" in sys.platform: if not "win32" in sys.platform: EXTENSION_LIBRARIES += ('m',) if "win32" in sys.platform: - EXTENSION_LIBRARIES += ('advapi32', 'ws2_32',) + EXTENSION_LIBRARIES += ('advapi32', 'ws2_32', 'dbghelp',) if BUILD_WITH_SYSTEM_OPENSSL: EXTENSION_LIBRARIES += ('ssl', 'crypto',) if BUILD_WITH_SYSTEM_ZLIB: diff --git a/templates/Makefile.template b/templates/Makefile.template index 7fae035c1e4..815fac1ac5c 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -274,7 +274,7 @@ endif ifeq ($(SYSTEM),MINGW32) - LIBS = m pthread ws2_32 + LIBS = m pthread ws2_32 dbghelp LDFLAGS += -pthread endif From cb6d09ac212722d8385687a4ccf5f313074fad89 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 14 Feb 2020 11:14:10 -0500 Subject: [PATCH 060/129] add missing bm_pollset and bm_chttp2_transport targets to bazel build --- test/cpp/microbenchmarks/BUILD | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/cpp/microbenchmarks/BUILD b/test/cpp/microbenchmarks/BUILD index df2cedfeed3..298f93c05ee 100644 --- a/test/cpp/microbenchmarks/BUILD +++ b/test/cpp/microbenchmarks/BUILD @@ -263,6 +263,16 @@ grpc_cc_test( deps = [":helpers"], ) +grpc_cc_test( + name = "bm_chttp2_transport", + srcs = ["bm_chttp2_transport.cc"], + tags = [ + "no_mac", + "no_windows", + ], + deps = [":helpers"], +) + grpc_cc_test( name = "bm_opencensus_plugin", srcs = ["bm_opencensus_plugin.cc"], @@ -285,6 +295,16 @@ grpc_cc_test( deps = [":helpers"], ) +grpc_cc_test( + name = "bm_pollset", + srcs = ["bm_pollset.cc"], + tags = [ + "no_mac", + "no_windows", + ], + deps = [":helpers"], +) + grpc_cc_test( name = "bm_threadpool", size = "large", From 5e19408ef5635409d1da215814078601c45a8f9c Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 18 Feb 2020 03:20:18 -0800 Subject: [PATCH 061/129] disable bm_chttp2_transport on msan --- test/cpp/microbenchmarks/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cpp/microbenchmarks/BUILD b/test/cpp/microbenchmarks/BUILD index 298f93c05ee..7c6705e281e 100644 --- a/test/cpp/microbenchmarks/BUILD +++ b/test/cpp/microbenchmarks/BUILD @@ -269,6 +269,7 @@ grpc_cc_test( tags = [ "no_mac", "no_windows", + "nomsan", ], deps = [":helpers"], ) From 545f3120503f305e3f29c5e00f13f1186f4bcc90 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 10:36:56 -0800 Subject: [PATCH 062/129] Simplify the logic and improve readability --- .../grpc_health/v1/_async.py | 30 +++++++++---------- .../health_check/health_servicer_test.py | 6 ++-- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index acf8d5700cb..6bbb8697d94 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -39,25 +39,25 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): return _health_pb2.HealthCheckResponse(status=status) async def Watch(self, request: _health_pb2.HealthCheckRequest, context): - status = self._server_status.get(request.service) - - if status is None: - status = _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN - + condition = self._server_watchers[request.service] try: - condition = self._server_watchers[request.service] async with condition: - # Responds with current health state - await context.write( - _health_pb2.HealthCheckResponse(status=status)) - - # Polling on health state changes while True: - await condition.wait() - status = self._server_status.get(request.service) - await context.write( - _health_pb2.HealthCheckResponse(status=status)) + + if status: + # Responds with current health state + await context.write( + _health_pb2.HealthCheckResponse(status=status)) + else: + # Responds with default value + await context.write( + _health_pb2.HealthCheckResponse( + status=_health_pb2.HealthCheckResponse. + SERVICE_UNKNOWN)) + + # Polling on health state changes + await condition.wait() finally: del self._server_watchers[request.service] diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 78527057903..38ee6bb175f 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -143,6 +143,8 @@ class HealthServicerTest(AioTestBase): await self._servicer.set('some-other-service', health_pb2.HealthCheckResponse.SERVING) + # The change of health status in other service should be isolated. + # Hence, no additional notification should be observed. with self.assertRaises(asyncio.TimeoutError): await asyncio.wait_for(queue.get(), test_constants.SHORT_TIMEOUT) @@ -193,8 +195,8 @@ class HealthServicerTest(AioTestBase): await task # Wait for the serving coroutine to process client cancellation. - timeout = time.time() + test_constants.TIME_ALLOWANCE - while (time.time() < timeout and self._servicer._server_watchers): + timeout = time.monotonic() + test_constants.TIME_ALLOWANCE + while (time.monotonic() < timeout and self._servicer._server_watchers): await asyncio.sleep(1) self.assertFalse(self._servicer._server_watchers, 'There should not be any watcher left') From fe4eba490ccc50a6a6d4b06854fd9682a8c7788c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 10:39:06 -0800 Subject: [PATCH 063/129] Further simplify the loop --- .../grpc_health/v1/_async.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index 6bbb8697d94..65128d0b0e0 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -43,18 +43,13 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): try: async with condition: while True: - status = self._server_status.get(request.service) - - if status: - # Responds with current health state - await context.write( - _health_pb2.HealthCheckResponse(status=status)) - else: - # Responds with default value - await context.write( - _health_pb2.HealthCheckResponse( - status=_health_pb2.HealthCheckResponse. - SERVICE_UNKNOWN)) + status = self._server_status.get( + request.service, + _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN) + + # Responds with current health state + await context.write( + _health_pb2.HealthCheckResponse(status=status)) # Polling on health state changes await condition.wait() From b2d8509f78c9113980380205cb6c62553ab4875f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 11:23:23 -0800 Subject: [PATCH 064/129] Report every health state change --- .../grpc_health/v1/_async.py | 62 ++++++++++--------- .../health_check/health_servicer_test.py | 36 +++++------ 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index 65128d0b0e0..fb93d5b74e0 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -15,6 +15,7 @@ import asyncio import collections +from typing import Mapping, AbstractSet import grpc @@ -24,10 +25,14 @@ from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): """An AsyncIO implementation of health checking servicer.""" + _server_status: Mapping[str, + '_health_pb2.HealthCheckResponse.ServingStatus'] + _server_watchers: Mapping[str, AbstractSet[asyncio.Queue]] + _gracefully_shutting_down: bool def __init__(self): self._server_status = dict() - self._server_watchers = collections.defaultdict(asyncio.Condition) + self._server_watchers = collections.defaultdict(set) self._gracefully_shutting_down = False async def Check(self, request: _health_pb2.HealthCheckRequest, context): @@ -39,35 +44,37 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): return _health_pb2.HealthCheckResponse(status=status) async def Watch(self, request: _health_pb2.HealthCheckRequest, context): - condition = self._server_watchers[request.service] + queue = asyncio.Queue() + self._server_watchers[request.service].add(queue) + try: - async with condition: - while True: - status = self._server_status.get( - request.service, - _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN) - - # Responds with current health state - await context.write( - _health_pb2.HealthCheckResponse(status=status)) - - # Polling on health state changes - await condition.wait() + status = self._server_status.get( + request.service, + _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN) + while True: + # Responds with current health state + await context.write( + _health_pb2.HealthCheckResponse(status=status)) + + # Polling on health state changes + status = await queue.get() finally: - del self._server_watchers[request.service] + self._server_watchers[request.service].remove(queue) + if not self._server_watchers[request.service]: + del self._server_watchers[request.service] + + def _set(self, service: str, + status: _health_pb2.HealthCheckResponse.ServingStatus): + self._server_status[service] = status - async def _set(self, service: str, - status: _health_pb2.HealthCheckResponse.ServingStatus): if service in self._server_watchers: - condition = self._server_watchers.get(service) - async with condition: - self._server_status[service] = status - condition.notify_all() - else: - self._server_status[service] = status + # Only iterate through the watchers if there is at least one. + # Otherwise, it creates empty sets. + for watcher in self._server_watchers[service]: + watcher.put_nowait(status) - async def set(self, service: str, - status: _health_pb2.HealthCheckResponse.ServingStatus): + def set(self, service: str, + status: _health_pb2.HealthCheckResponse.ServingStatus): """Sets the status of a service. Args: @@ -78,7 +85,7 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): if self._gracefully_shutting_down: return else: - await self._set(service, status) + self._set(service, status) async def enter_graceful_shutdown(self): """Permanently sets the status of all services to NOT_SERVING. @@ -94,5 +101,4 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): else: self._gracefully_shutting_down = True for service in self._server_status: - await self._set(service, - _health_pb2.HealthCheckResponse.NOT_SERVING) + self._set(service, _health_pb2.HealthCheckResponse.NOT_SERVING) diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 38ee6bb175f..48c42376b97 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -44,13 +44,13 @@ class HealthServicerTest(AioTestBase): async def setUp(self): self._servicer = health.AsyncHealthServicer() - await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) - await self._servicer.set(_SERVING_SERVICE, - health_pb2.HealthCheckResponse.SERVING) - await self._servicer.set(_UNKNOWN_SERVICE, - health_pb2.HealthCheckResponse.UNKNOWN) - await self._servicer.set(_NOT_SERVING_SERVICE, - health_pb2.HealthCheckResponse.NOT_SERVING) + self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + self._servicer.set(_SERVING_SERVICE, + health_pb2.HealthCheckResponse.SERVING) + self._servicer.set(_UNKNOWN_SERVICE, + health_pb2.HealthCheckResponse.UNKNOWN) + self._servicer.set(_NOT_SERVING_SERVICE, + health_pb2.HealthCheckResponse.NOT_SERVING) self._server = aio.server() port = self._server.add_insecure_port('[::]:0') health_pb2_grpc.add_HealthServicer_to_server(self._servicer, @@ -118,13 +118,13 @@ class HealthServicerTest(AioTestBase): self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, (await queue.get()).status) - await self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.SERVING) + self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) self.assertEqual(health_pb2.HealthCheckResponse.SERVING, (await queue.get()).status) - await self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.NOT_SERVING) + self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.NOT_SERVING) self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, (await queue.get()).status) @@ -141,8 +141,8 @@ class HealthServicerTest(AioTestBase): self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, (await queue.get()).status) - await self._servicer.set('some-other-service', - health_pb2.HealthCheckResponse.SERVING) + self._servicer.set('some-other-service', + health_pb2.HealthCheckResponse.SERVING) # The change of health status in other service should be isolated. # Hence, no additional notification should be observed. with self.assertRaises(asyncio.TimeoutError): @@ -166,8 +166,8 @@ class HealthServicerTest(AioTestBase): self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, (await queue2.get()).status) - await self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.SERVING) + self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) self.assertEqual(health_pb2.HealthCheckResponse.SERVING, (await queue1.get()).status) self.assertEqual(health_pb2.HealthCheckResponse.SERVING, @@ -190,8 +190,8 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) call.cancel() - await self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.SERVING) + self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) await task # Wait for the serving coroutine to process client cancellation. @@ -216,7 +216,7 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) # This should be a no-op. - await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) resp = await self._stub.Check(request) self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, From a729bd1828ab70da7eb2de36ba8c53a88a258238 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 11:42:59 -0800 Subject: [PATCH 065/129] Revert "Report every health state change" This reverts commit b2d8509f78c9113980380205cb6c62553ab4875f. --- .../grpc_health/v1/_async.py | 62 +++++++++---------- .../health_check/health_servicer_test.py | 36 +++++------ 2 files changed, 46 insertions(+), 52 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index fb93d5b74e0..65128d0b0e0 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -15,7 +15,6 @@ import asyncio import collections -from typing import Mapping, AbstractSet import grpc @@ -25,14 +24,10 @@ from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): """An AsyncIO implementation of health checking servicer.""" - _server_status: Mapping[str, - '_health_pb2.HealthCheckResponse.ServingStatus'] - _server_watchers: Mapping[str, AbstractSet[asyncio.Queue]] - _gracefully_shutting_down: bool def __init__(self): self._server_status = dict() - self._server_watchers = collections.defaultdict(set) + self._server_watchers = collections.defaultdict(asyncio.Condition) self._gracefully_shutting_down = False async def Check(self, request: _health_pb2.HealthCheckRequest, context): @@ -44,37 +39,35 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): return _health_pb2.HealthCheckResponse(status=status) async def Watch(self, request: _health_pb2.HealthCheckRequest, context): - queue = asyncio.Queue() - self._server_watchers[request.service].add(queue) - + condition = self._server_watchers[request.service] try: - status = self._server_status.get( - request.service, - _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN) - while True: - # Responds with current health state - await context.write( - _health_pb2.HealthCheckResponse(status=status)) - - # Polling on health state changes - status = await queue.get() + async with condition: + while True: + status = self._server_status.get( + request.service, + _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN) + + # Responds with current health state + await context.write( + _health_pb2.HealthCheckResponse(status=status)) + + # Polling on health state changes + await condition.wait() finally: - self._server_watchers[request.service].remove(queue) - if not self._server_watchers[request.service]: - del self._server_watchers[request.service] - - def _set(self, service: str, - status: _health_pb2.HealthCheckResponse.ServingStatus): - self._server_status[service] = status + del self._server_watchers[request.service] + async def _set(self, service: str, + status: _health_pb2.HealthCheckResponse.ServingStatus): if service in self._server_watchers: - # Only iterate through the watchers if there is at least one. - # Otherwise, it creates empty sets. - for watcher in self._server_watchers[service]: - watcher.put_nowait(status) + condition = self._server_watchers.get(service) + async with condition: + self._server_status[service] = status + condition.notify_all() + else: + self._server_status[service] = status - def set(self, service: str, - status: _health_pb2.HealthCheckResponse.ServingStatus): + async def set(self, service: str, + status: _health_pb2.HealthCheckResponse.ServingStatus): """Sets the status of a service. Args: @@ -85,7 +78,7 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): if self._gracefully_shutting_down: return else: - self._set(service, status) + await self._set(service, status) async def enter_graceful_shutdown(self): """Permanently sets the status of all services to NOT_SERVING. @@ -101,4 +94,5 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): else: self._gracefully_shutting_down = True for service in self._server_status: - self._set(service, _health_pb2.HealthCheckResponse.NOT_SERVING) + await self._set(service, + _health_pb2.HealthCheckResponse.NOT_SERVING) diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 48c42376b97..38ee6bb175f 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -44,13 +44,13 @@ class HealthServicerTest(AioTestBase): async def setUp(self): self._servicer = health.AsyncHealthServicer() - self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) - self._servicer.set(_SERVING_SERVICE, - health_pb2.HealthCheckResponse.SERVING) - self._servicer.set(_UNKNOWN_SERVICE, - health_pb2.HealthCheckResponse.UNKNOWN) - self._servicer.set(_NOT_SERVING_SERVICE, - health_pb2.HealthCheckResponse.NOT_SERVING) + await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(_SERVING_SERVICE, + health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(_UNKNOWN_SERVICE, + health_pb2.HealthCheckResponse.UNKNOWN) + await self._servicer.set(_NOT_SERVING_SERVICE, + health_pb2.HealthCheckResponse.NOT_SERVING) self._server = aio.server() port = self._server.add_insecure_port('[::]:0') health_pb2_grpc.add_HealthServicer_to_server(self._servicer, @@ -118,13 +118,13 @@ class HealthServicerTest(AioTestBase): self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, (await queue.get()).status) - self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) self.assertEqual(health_pb2.HealthCheckResponse.SERVING, (await queue.get()).status) - self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.NOT_SERVING) + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.NOT_SERVING) self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, (await queue.get()).status) @@ -141,8 +141,8 @@ class HealthServicerTest(AioTestBase): self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, (await queue.get()).status) - self._servicer.set('some-other-service', - health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set('some-other-service', + health_pb2.HealthCheckResponse.SERVING) # The change of health status in other service should be isolated. # Hence, no additional notification should be observed. with self.assertRaises(asyncio.TimeoutError): @@ -166,8 +166,8 @@ class HealthServicerTest(AioTestBase): self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, (await queue2.get()).status) - self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) self.assertEqual(health_pb2.HealthCheckResponse.SERVING, (await queue1.get()).status) self.assertEqual(health_pb2.HealthCheckResponse.SERVING, @@ -190,8 +190,8 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) call.cancel() - self._servicer.set(_WATCH_SERVICE, - health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(_WATCH_SERVICE, + health_pb2.HealthCheckResponse.SERVING) await task # Wait for the serving coroutine to process client cancellation. @@ -216,7 +216,7 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) # This should be a no-op. - self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) resp = await self._stub.Check(request) self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, From 750b602118cf04b6431669567590c3a1470db236 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 12:25:11 -0800 Subject: [PATCH 066/129] Filter out duplicated status --- .../grpc_health/v1/_async.py | 17 ++++++++--- .../tests_aio/health_check/BUILD.bazel | 2 +- .../health_check/health_servicer_test.py | 28 +++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index 65128d0b0e0..b3f6a30c414 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -40,6 +40,7 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): async def Watch(self, request: _health_pb2.HealthCheckRequest, context): condition = self._server_watchers[request.service] + last_status = None try: async with condition: while True: @@ -47,14 +48,22 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): request.service, _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN) - # Responds with current health state - await context.write( - _health_pb2.HealthCheckResponse(status=status)) + # NOTE(lidiz) If the observed status is the same, it means + # intermediate statuses has been discarded. It's consider + # acceptable since peer only interested in eventual status. + if status != last_status: + # Responds with current health state + await context.write( + _health_pb2.HealthCheckResponse(status=status)) + + # Records the last sent status + last_status = status # Polling on health state changes await condition.wait() finally: - del self._server_watchers[request.service] + if request.service in self._server_watchers: + del self._server_watchers[request.service] async def _set(self, service: str, status: _health_pb2.HealthCheckResponse.ServingStatus): diff --git a/src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel b/src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel index fde3f69991f..4e1b088d0b8 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel +++ b/src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -package(default_visibility = ["//visibility:public"]) +package(default_testonly = 1) py_test( name = "health_servicer_test", diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 38ee6bb175f..2d5f4e3f531 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -16,6 +16,7 @@ import asyncio import logging import time +import random import unittest import grpc @@ -34,6 +35,8 @@ _UNKNOWN_SERVICE = 'grpc.test.TestServiceUnknown' _NOT_SERVING_SERVICE = 'grpc.test.TestServiceNotServing' _WATCH_SERVICE = 'grpc.test.WatchService' +_LARGE_NUMBER_OF_STATUS_CHANGE = 1000 + async def _pipe_to_queue(call, queue): async for response in call: @@ -226,6 +229,31 @@ class HealthServicerTest(AioTestBase): await task self.assertTrue(queue.empty()) + async def test_no_duplicate_status(self): + request = health_pb2.HealthCheckRequest(service=_WATCH_SERVICE) + call = self._stub.Watch(request) + queue = asyncio.Queue() + task = self.loop.create_task(_pipe_to_queue(call, queue)) + + self.assertEqual(health_pb2.HealthCheckResponse.SERVICE_UNKNOWN, + (await queue.get()).status) + last_status = health_pb2.HealthCheckResponse.SERVICE_UNKNOWN + + for _ in range(_LARGE_NUMBER_OF_STATUS_CHANGE): + if random.randint(0, 1) == 0: + status = health_pb2.HealthCheckResponse.SERVING + else: + status = health_pb2.HealthCheckResponse.NOT_SERVING + + await self._servicer.set(_WATCH_SERVICE, status) + if status != last_status: + self.assertEqual(status, (await queue.get()).status) + last_status = status + + call.cancel() + await task + self.assertTrue(queue.empty()) + if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) From 7917bd3074ab0fae3adcfc35e24f272fbd832dc4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 12:26:39 -0800 Subject: [PATCH 067/129] Fix a typo --- .../tests_aio/health_check/health_servicer_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 2d5f4e3f531..689686fbb4d 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -35,7 +35,7 @@ _UNKNOWN_SERVICE = 'grpc.test.TestServiceUnknown' _NOT_SERVING_SERVICE = 'grpc.test.TestServiceNotServing' _WATCH_SERVICE = 'grpc.test.WatchService' -_LARGE_NUMBER_OF_STATUS_CHANGE = 1000 +_LARGE_NUMBER_OF_STATUS_CHANGES = 1000 async def _pipe_to_queue(call, queue): @@ -239,7 +239,7 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) last_status = health_pb2.HealthCheckResponse.SERVICE_UNKNOWN - for _ in range(_LARGE_NUMBER_OF_STATUS_CHANGE): + for _ in range(_LARGE_NUMBER_OF_STATUS_CHANGES): if random.randint(0, 1) == 0: status = health_pb2.HealthCheckResponse.SERVING else: From b18ae4b78489779d54b5f1961f0b5c133dda4a28 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 18 Feb 2020 12:31:46 -0800 Subject: [PATCH 068/129] Add notap tag to tests that cause issues timeout issues internally --- test/cpp/microbenchmarks/BUILD | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/cpp/microbenchmarks/BUILD b/test/cpp/microbenchmarks/BUILD index 7c6705e281e..7122768da82 100644 --- a/test/cpp/microbenchmarks/BUILD +++ b/test/cpp/microbenchmarks/BUILD @@ -216,7 +216,10 @@ grpc_cc_test( name = "bm_fullstack_trickle", size = "large", srcs = ["bm_fullstack_trickle.cc"], - tags = ["manual"], + tags = [ + "manual", + "notap", + ], deps = [":helpers"], ) @@ -310,7 +313,10 @@ grpc_cc_test( name = "bm_threadpool", size = "large", srcs = ["bm_threadpool.cc"], - tags = ["manual"], + tags = [ + "manual", + "notap", + ], uses_polling = False, deps = [":helpers"], ) From 4c602d4ad66c22cc8fd3ef26ded2a2906c7cd7f1 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 12:45:00 -0800 Subject: [PATCH 069/129] Add type annotations --- .../grpc_health/v1/_async.py | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index b3f6a30c414..8f7865a6b08 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -15,7 +15,7 @@ import asyncio import collections - +from typing import MutableMapping import grpc from grpc_health.v1 import health_pb2 as _health_pb2 @@ -24,13 +24,18 @@ from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): """An AsyncIO implementation of health checking servicer.""" + _server_status: MutableMapping[ + str, '_health_pb2.HealthCheckResponse.ServingStatus'] + _server_watchers: MutableMapping[str, asyncio.Condition] + _gracefully_shutting_down: bool - def __init__(self): + def __init__(self) -> None: self._server_status = dict() self._server_watchers = collections.defaultdict(asyncio.Condition) self._gracefully_shutting_down = False - async def Check(self, request: _health_pb2.HealthCheckRequest, context): + async def Check(self, request: _health_pb2.HealthCheckRequest, + context) -> None: status = self._server_status.get(request.service) if status is None: @@ -38,7 +43,8 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): else: return _health_pb2.HealthCheckResponse(status=status) - async def Watch(self, request: _health_pb2.HealthCheckRequest, context): + async def Watch(self, request: _health_pb2.HealthCheckRequest, + context) -> None: condition = self._server_watchers[request.service] last_status = None try: @@ -66,7 +72,8 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): del self._server_watchers[request.service] async def _set(self, service: str, - status: _health_pb2.HealthCheckResponse.ServingStatus): + status: _health_pb2.HealthCheckResponse.ServingStatus + ) -> None: if service in self._server_watchers: condition = self._server_watchers.get(service) async with condition: @@ -76,7 +83,8 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): self._server_status[service] = status async def set(self, service: str, - status: _health_pb2.HealthCheckResponse.ServingStatus): + status: _health_pb2.HealthCheckResponse.ServingStatus + ) -> None: """Sets the status of a service. Args: @@ -89,7 +97,7 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): else: await self._set(service, status) - async def enter_graceful_shutdown(self): + async def enter_graceful_shutdown(self) -> None: """Permanently sets the status of all services to NOT_SERVING. This should be invoked when the server is entering a graceful shutdown From b62eca8558377bda0d591cf39cff9fceba52de1f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 13:58:29 -0800 Subject: [PATCH 070/129] Update the wording in comments --- src/python/grpcio_health_checking/grpc_health/v1/_async.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index 8f7865a6b08..4259d4d4760 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -55,7 +55,7 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN) # NOTE(lidiz) If the observed status is the same, it means - # intermediate statuses has been discarded. It's consider + # there are missing intermediate statuses. It's considered # acceptable since peer only interested in eventual status. if status != last_status: # Responds with current health state From 06e34a1d4f48a71a515cfd9ebb111db3aac6a1d7 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 18 Feb 2020 10:49:05 -0800 Subject: [PATCH 071/129] Update LRS to use "PROXYLESS_CLIENT_HOSTNAME" metadata instead of cluster field. --- .../ext/filters/client_channel/xds/xds_api.cc | 27 +++++++++++-------- test/cpp/end2end/xds_end2end_test.cc | 7 ++++- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index d41c25e2d26..076160c76d9 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -185,7 +185,8 @@ void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb, } void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, - const char* build_version, envoy_api_v2_core_Node* node_msg) { + const char* build_version, const std::string& server_name, + envoy_api_v2_core_Node* node_msg) { if (node != nullptr) { if (!node->id.empty()) { envoy_api_v2_core_Node_set_id(node_msg, @@ -200,6 +201,18 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, envoy_api_v2_core_Node_mutable_metadata(node_msg, arena); PopulateMetadata(arena, metadata, node->metadata.object_value()); } + if (!server_name.empty()) { + google_protobuf_Struct* metadata = + envoy_api_v2_core_Node_mutable_metadata(node_msg, arena); + google_protobuf_Struct_FieldsEntry* field = + google_protobuf_Struct_add_fields(metadata, arena); + google_protobuf_Struct_FieldsEntry_set_key( + field, upb_strview_makez("PROXYLESS_CLIENT_HOSTNAME")); + google_protobuf_Value* value = + google_protobuf_Struct_FieldsEntry_mutable_value(field, arena); + google_protobuf_Value_set_string_value( + value, upb_strview_make(server_name.data(), server_name.size())); + } if (!node->locality_region.empty() || !node->locality_zone.empty() || !node->locality_subzone.empty()) { envoy_api_v2_core_Locality* locality = @@ -260,7 +273,7 @@ envoy_api_v2_DiscoveryRequest* CreateDiscoveryRequest( if (build_version != nullptr) { envoy_api_v2_core_Node* node_msg = envoy_api_v2_DiscoveryRequest_mutable_node(request, arena); - PopulateNode(arena, node, build_version, node_msg); + PopulateNode(arena, node, build_version, "", node_msg); } return request; } @@ -960,15 +973,7 @@ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) { envoy_api_v2_core_Node* node_msg = envoy_service_load_stats_v2_LoadStatsRequest_mutable_node(request, arena.ptr()); - PopulateNode(arena.ptr(), node_, build_version_, node_msg); - // Add cluster stats. There is only one because we only use one server name in - // one channel. - envoy_api_v2_endpoint_ClusterStats* cluster_stats = - envoy_service_load_stats_v2_LoadStatsRequest_add_cluster_stats( - request, arena.ptr()); - // Set the cluster name. - envoy_api_v2_endpoint_ClusterStats_set_cluster_name( - cluster_stats, upb_strview_makez(server_name.c_str())); + PopulateNode(arena.ptr(), node_, build_version_, server_name, node_msg); return SerializeLrsRequest(request, arena.ptr()); } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index b3b0867fc1b..76a59661334 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -751,7 +751,12 @@ class LrsServiceImpl : public LrsService { IncreaseRequestCount(); // Send response. LoadStatsResponse response; - auto server_name = request.cluster_stats()[0].cluster_name(); + std::string server_name; + auto it = request.node().metadata().fields().find( + "PROXYLESS_CLIENT_HOSTNAME"); + if (it != request.node().metadata().fields().end()) { + server_name = it->second.string_value(); + } GPR_ASSERT(server_name != ""); response.add_clusters(server_name); response.mutable_load_reporting_interval()->set_seconds( From 2294b847a2ab359efe421d39476575e7fad151ec Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 14:30:10 -0800 Subject: [PATCH 072/129] Add OVERALL_HEALTH --- .../grpcio_health_checking/grpc_health/v1/_async.py | 6 ++---- .../grpcio_health_checking/grpc_health/v1/health.py | 7 +++++-- .../tests_aio/health_check/health_servicer_test.py | 12 +++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index 4259d4d4760..859cadbd642 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -22,7 +22,7 @@ from grpc_health.v1 import health_pb2 as _health_pb2 from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc -class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): +class HealthServicer(_health_pb2_grpc.HealthServicer): """An AsyncIO implementation of health checking servicer.""" _server_status: MutableMapping[ str, '_health_pb2.HealthCheckResponse.ServingStatus'] @@ -88,7 +88,7 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): """Sets the status of a service. Args: - service: string, the name of the service. NOTE, '' must be set. + service: string, the name of the service. status: HealthCheckResponse.status enum value indicating the status of the service """ @@ -103,8 +103,6 @@ class AsyncHealthServicer(_health_pb2_grpc.HealthServicer): This should be invoked when the server is entering a graceful shutdown period. After this method is invoked, future attempts to set the status of a service will be ignored. - - This is an EXPERIMENTAL API. """ if self._gracefully_shutting_down: return diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py index 99d9c0406bf..05a16c73380 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/health.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py @@ -23,9 +23,12 @@ from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: # Exposes AsyncHealthServicer as public API. - from ._async import AsyncHealthServicer # pylint: disable=unused-import + from . import _async as aio # pylint: disable=unused-import +# The service name of the health checking servicer. SERVICE_NAME = _health_pb2.DESCRIPTOR.services_by_name['Health'].full_name +# The entry of overall health for the entire server. +OVERALL_HEALTH = '' class _Watcher(): @@ -135,7 +138,7 @@ class HealthServicer(_health_pb2_grpc.HealthServicer): """Sets the status of a service. Args: - service: string, the name of the service. NOTE, '' must be set. + service: string, the name of the service. status: HealthCheckResponse.status enum value indicating the status of the service """ diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 689686fbb4d..71166a2beff 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -46,8 +46,9 @@ async def _pipe_to_queue(call, queue): class HealthServicerTest(AioTestBase): async def setUp(self): - self._servicer = health.AsyncHealthServicer() - await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + self._servicer = health.aio.HealthServicer() + await self._servicer.set(health.OVERALL_HEALTH, + health_pb2.HealthCheckResponse.SERVING) await self._servicer.set(_SERVING_SERVICE, health_pb2.HealthCheckResponse.SERVING) await self._servicer.set(_UNKNOWN_SERVICE, @@ -99,7 +100,7 @@ class HealthServicerTest(AioTestBase): self.assertEqual(health.SERVICE_NAME, 'grpc.health.v1.Health') async def test_watch_empty_service(self): - request = health_pb2.HealthCheckRequest(service='') + request = health_pb2.HealthCheckRequest(service=health.OVERALL_HEALTH) call = self._stub.Watch(request) queue = asyncio.Queue() @@ -206,7 +207,7 @@ class HealthServicerTest(AioTestBase): self.assertTrue(queue.empty()) async def test_graceful_shutdown(self): - request = health_pb2.HealthCheckRequest(service='') + request = health_pb2.HealthCheckRequest(service=health.OVERALL_HEALTH) call = self._stub.Watch(request) queue = asyncio.Queue() task = self.loop.create_task(_pipe_to_queue(call, queue)) @@ -219,7 +220,8 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) # This should be a no-op. - await self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) + await self._servicer.set(health.OVERALL_HEALTH, + health_pb2.HealthCheckResponse.SERVING) resp = await self._stub.Check(request) self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, From 1ee45615e231057c93c3732b5bedc249bf877226 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 09:55:46 -0800 Subject: [PATCH 073/129] Add benchmark client, server, and worker --- src/proto/grpc/core/BUILD | 11 ++ src/proto/grpc/testing/BUILD | 49 +++++ src/python/grpcio_tests/tests/qps/BUILD.bazel | 27 +++ .../tests_aio/benchmark/BUILD.bazel | 62 ++++++- .../tests_aio/benchmark/benchmark_client.py | 136 ++++++++++++++ .../tests_aio/benchmark/benchmark_servicer.py | 55 ++++++ .../tests_aio/benchmark/server.py | 18 +- .../tests_aio/benchmark/worker.py | 53 ++++++ .../tests_aio/benchmark/worker_servicer.py | 168 ++++++++++++++++++ 9 files changed, 558 insertions(+), 21 deletions(-) create mode 100644 src/python/grpcio_tests/tests/qps/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/worker.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py diff --git a/src/proto/grpc/core/BUILD b/src/proto/grpc/core/BUILD index 051ff2fb073..c79e15d639b 100644 --- a/src/proto/grpc/core/BUILD +++ b/src/proto/grpc/core/BUILD @@ -15,6 +15,7 @@ licenses(["notice"]) # Apache v2 load("//bazel:grpc_build_system.bzl", "grpc_package", "grpc_proto_library") +load("//bazel:python_rules.bzl", "py_proto_library") grpc_package( name = "core", @@ -25,3 +26,13 @@ grpc_proto_library( name = "stats_proto", srcs = ["stats.proto"], ) + +proto_library( + name = "stats_descriptor", + srcs = ["stats.proto"], +) + +py_proto_library( + name = "stats_py_pb2", + deps = [":stats_descriptor"], +) diff --git a/src/proto/grpc/testing/BUILD b/src/proto/grpc/testing/BUILD index db187e2356a..e18661df162 100644 --- a/src/proto/grpc/testing/BUILD +++ b/src/proto/grpc/testing/BUILD @@ -233,3 +233,52 @@ py_grpc_library( srcs = [":test_proto_descriptor"], deps = [":py_test_proto"], ) + +proto_library( + name = "worker_service_descriptor", + srcs = ["worker_service.proto"], + deps = [":control_descriptor"], +) + +py_proto_library( + name = "worker_service_py_pb2", + deps = [":worker_service_descriptor"], +) + +py_grpc_library( + name = "worker_service_py_pb2_grpc", + srcs = [":worker_service_descriptor"], + deps = [":worker_service_py_pb2"], +) + +proto_library( + name = "stats_descriptor", + srcs = ["stats.proto"], + deps = ["//src/proto/grpc/core:stats_descriptor"], +) + +py_proto_library( + name = "stats_py_pb2", + deps = [":stats_descriptor"], +) + +proto_library( + name = "payloads_descriptor", + srcs = ["payloads.proto"], +) + +py_proto_library( + name = "payloads_py_pb2", + deps = [":payloads_descriptor"], +) + +proto_library( + name = "control_descriptor", + srcs = ["control.proto"], + deps = [":payloads_descriptor", ":stats_descriptor"] +) + +py_proto_library( + name = "control_py_pb2", + deps = [":control_descriptor"], +) diff --git a/src/python/grpcio_tests/tests/qps/BUILD.bazel b/src/python/grpcio_tests/tests/qps/BUILD.bazel new file mode 100644 index 00000000000..c4f5d4dbd1a --- /dev/null +++ b/src/python/grpcio_tests/tests/qps/BUILD.bazel @@ -0,0 +1,27 @@ +# Copyright 2020 The 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. + +package( + default_testonly = 1, + default_visibility = ["//visibility:public"], +) + +py_library( + name = "histogram", + srcs = ["histogram.py"], + srcs_version = "PY2AND3", + deps = [ + "//src/proto/grpc/testing:stats_py_pb2", + ], +) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel b/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel index 992b850c353..579d3b0bf1f 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel +++ b/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel @@ -17,16 +17,66 @@ package( default_visibility = ["//visibility:public"], ) +py_library( + name = "benchmark_client", + srcs = ["benchmark_client.py"], + srcs_version = "PY3", + deps = [ + "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", + "//src/proto/grpc/testing:py_messages_proto", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/qps:histogram", + "//src/python/grpcio_tests/tests/unit:resources", + ], +) + +py_library( + name = "benchmark_servicer", + srcs = ["benchmark_servicer.py"], + srcs_version = "PY3", + deps = [ + "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", + "//src/proto/grpc/testing:py_messages_proto", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_library( + name = "worker_servicer", + srcs = ["worker_servicer.py"], + srcs_version = "PY3", + data = [ + "//src/python/grpcio_tests/tests/unit/credentials", + ], + deps = [ + ":benchmark_client", + ":benchmark_servicer", + "//src/python/grpcio_tests/tests/qps:histogram", + "//src/python/grpcio_tests/tests/unit:resources", + "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", + "//src/proto/grpc/testing:worker_service_py_pb2_grpc", + "//src/proto/grpc/testing:control_py_pb2", + "//src/proto/grpc/testing:payloads_py_pb2", + "//src/proto/grpc/core:stats_py_pb2", + "//src/proto/grpc/testing:stats_py_pb2", + "//src/python/grpcio/grpc:grpcio", + ], +) + py_binary( name = "server", srcs = ["server.py"], python_version = "PY3", + deps = [":benchmark_servicer"], +) + +py_binary( + name = "worker", + srcs = ["worker.py"], + imports = ["../../"], + python_version = "PY3", deps = [ - "//src/proto/grpc/testing:benchmark_service_py_pb2", - "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", - "//src/proto/grpc/testing:py_messages_proto", - "//src/python/grpcio/grpc:grpcio", - "//src/python/grpcio_tests/tests/unit/framework/common", - "@six", + ":worker_servicer", + "//src/proto/grpc/testing:worker_service_py_pb2_grpc", ], ) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py new file mode 100644 index 00000000000..2cbe3da29a7 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -0,0 +1,136 @@ +# Copyright 2020 The 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. +"""The Python AsyncIO Benchmark Clients.""" + +import abc +import asyncio +import time + +import grpc +from grpc.experimental import aio + +from src.proto.grpc.testing import (benchmark_service_pb2_grpc, control_pb2, + messages_pb2) +from tests.qps import histogram +from tests.unit import resources + + +class GenericStub(object): + + def __init__(self, channel: aio.Channel): + self.UnaryCall = channel.unary_unary( + '/grpc.testing.BenchmarkService/UnaryCall') + self.StreamingCall = channel.stream_stream( + '/grpc.testing.BenchmarkService/StreamingCall') + + +class BenchmarkClient(abc.ABC): + """Benchmark client interface that exposes a non-blocking send_request().""" + + def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + # Creates the channel + if config.HasField('security_params'): + channel_credentials = grpc.ssl_channel_credentials( + resources.test_root_certificates()) + self._channel = aio.secure_channel(address, channel_credentials, (( + 'grpc.ssl_target_name_override', + config.security_params.server_host_override, + ),)) + else: + self._channel = aio.insecure_channel(address) + + # Creates the stub + if config.payload_config.WhichOneof('payload') == 'simple_params': + self._generic = False + self._stub = benchmark_service_pb2_grpc.BenchmarkServiceStub( + channel) + payload = messages_pb2.Payload( + body='\0' * config.payload_config.simple_params.req_size) + self._request = messages_pb2.SimpleRequest( + payload=payload, + response_size=config.payload_config.simple_params.resp_size) + else: + self._generic = True + self._stub = GenericStub(channel) + self._request = '\0' * config.payload_config.bytebuf_params.req_size + + self._hist = hist + self._response_callbacks = [] + self._concurrency = config.outstanding_rpcs_per_channel + + async def run(self) -> None: + await aio.channel_ready(self._channel) + + async def stop(self) -> None: + await self._channel.close() + + def _record_query_time(self, query_time: float) -> None: + self._hist.add(query_time * 1e9) + + +class UnaryAsyncBenchmarkClient(BenchmarkClient): + + def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + super().__init__(address, config, hist) + self._running = None + self._stopped = asyncio.Event() + + async def _send_request(self): + start_time = time.time() + await self._stub.UnaryCall(self._request) + self._record_query_time(self, time.time() - start_time) + + async def _infinite_sender(self) -> None: + while self._running: + await self._send_request() + + async def run(self) -> None: + await super().run() + self._running = True + senders = (self._infinite_sender() for _ in range(self._concurrency)) + await asyncio.wait(senders) + self._stopped.set() + + async def stop(self) -> None: + self._running = False + await self._stopped.wait() + await super().stop() + + +class StreamingAsyncBenchmarkClient(BenchmarkClient): + + def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + super().__init__(address, config, hist) + self._running = None + self._stopped = asyncio.Event() + + async def _one_streamming_call(self): + call = self._stub.StreamingCall() + while self._running: + start_time = time.time() + await call.write(self._request) + await call.read() + self._record_query_time(self, time.time() - start_time) + + async def run(self): + await super().run() + self._running = True + senders = (self._one_streamming_call() for _ in range(self._concurrency)) + await asyncio.wait(senders) + self._stopped.set() + + async def stop(self): + self._running = False + await self._stopped.wait() + await super().stop() diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py new file mode 100644 index 00000000000..6aff17f7cac --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py @@ -0,0 +1,55 @@ +# Copyright 2020 The 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. +"""The Python AsyncIO Benchmark Servicers.""" + +import asyncio +import logging +import unittest + +from grpc.experimental import aio + +from src.proto.grpc.testing import benchmark_service_pb2_grpc, messages_pb2 + + +class BenchmarkServicer(benchmark_service_pb2_grpc.BenchmarkServiceServicer): + + async def UnaryCall(self, request, unused_context): + payload = messages_pb2.Payload(body=b'\0' * request.response_size) + return messages_pb2.SimpleResponse(payload=payload) + + async def StreamingFromServer(self, request, unused_context): + payload = messages_pb2.Payload(body=b'\0' * request.response_size) + # Sends response at full capacity! + while True: + yield messages_pb2.SimpleResponse(payload=payload) + + async def StreamingCall(self, request_iterator, unused_context): + payload = messages_pb2.Payload(body='\0' * request.response_size) + async for request in request_iterator: + yield messages_pb2.SimpleResponse(payload=payload) + + +class GenericBenchmarkServicer(benchmark_service_pb2_grpc.BenchmarkServiceServicer + ): + """Generic (no-codec) Server implementation for the Benchmark service.""" + + def __init__(self, resp_size): + self._response = '\0' * resp_size + + async def UnaryCall(self, unused_request, unused_context): + return self._response + + async def StreamingCall(self, request_iterator, unused_context): + async for request in request_iterator: + yield self._response diff --git a/src/python/grpcio_tests/tests_aio/benchmark/server.py b/src/python/grpcio_tests/tests_aio/benchmark/server.py index 1489bebcefa..05479a2997d 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/server.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/server.py @@ -17,28 +17,16 @@ import logging import unittest from grpc.experimental import aio -from src.proto.grpc.testing import messages_pb2 -from src.proto.grpc.testing import benchmark_service_pb2_grpc - - -class BenchmarkServer(benchmark_service_pb2_grpc.BenchmarkServiceServicer): - async def UnaryCall(self, request, context): - payload = messages_pb2.Payload(body=b'\0' * request.response_size) - return messages_pb2.SimpleResponse(payload=payload) - - async def StreamingFromServer(self, request, context): - payload = messages_pb2.Payload(body=b'\0' * request.response_size) - # Sends response at full capacity! - while True: - yield messages_pb2.SimpleResponse(payload=payload) +from src.proto.grpc.testing import benchmark_service_pb2_grpc +from tests_aio.benchmark import benchmark_servicer async def _start_async_server(): server = aio.server() port = server.add_insecure_port('localhost:%s' % 50051) - servicer = BenchmarkServer() + servicer = benchmark_servicer.BenchmarkServicer() benchmark_service_pb2_grpc.add_BenchmarkServiceServicer_to_server( servicer, server) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker.py b/src/python/grpcio_tests/tests_aio/benchmark/worker.py new file mode 100644 index 00000000000..628a8885d15 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker.py @@ -0,0 +1,53 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +import logging + +from grpc.experimental import aio + +from src.proto.grpc.testing import worker_service_pb2_grpc +from tests_aio.benchmark import worker_servicer + + +async def run_worker_server(port: int) -> None: + aio.init_grpc_aio() + server = aio.server() + + servicer = worker_servicer.WorkerServicer() + worker_service_pb2_grpc.add_WorkerServiceServicer_to_server( + servicer, server) + + server.add_insecure_port('[::]:{}'.format(port)) + + await server.start() + + await servicer.wait_for_quit() + await server.stop(None) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + parser = argparse.ArgumentParser( + description='gRPC Python performance testing worker') + parser.add_argument('--driver_port', + type=int, + dest='port', + help='The port the worker should listen on') + args = parser.parse_args() + + asyncio.get_event_loop().run_until_complete( + run_worker_server(args.port) + ) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py new file mode 100644 index 00000000000..79dc014c1a1 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -0,0 +1,168 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import multiprocessing +import time +from typing import Tuple + +import grpc +from grpc.experimental import aio + +from src.proto.grpc.testing import (benchmark_service_pb2_grpc, control_pb2, + stats_pb2, worker_service_pb2_grpc) +from tests.qps import histogram +from tests.unit import resources +from tests_aio.benchmark import benchmark_client, benchmark_servicer + +_NUM_CORES = multiprocessing.cpu_count() +_NUM_CORE_PYTHON_CAN_USE = 1 + + +def _get_server_status(start_time: float, end_time: float, port: int) -> control_pb2.ServerStatus: + end_time = time.time() + elapsed_time = end_time - start_time + stats = stats_pb2.ServerStats(time_elapsed=elapsed_time, + time_user=elapsed_time, + time_system=elapsed_time) + return control_pb2.ServerStatus(stats=stats, port=port, cores=_NUM_CORE_PYTHON_CAN_USE) + + +def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: + if config.async_server_threads != 1: + logging.warning('config.async_server_threads [%d] != 1', config.async_server_threads) + + server = aio.server() + if config.server_type == control_pb2.ASYNC_SERVER: + servicer = benchmark_servicer.BenchmarkServicer() + benchmark_service_pb2_grpc.add_BenchmarkServiceServicer_to_server( + servicer, server) + elif config.server_type == control_pb2.ASYNC_GENERIC_SERVER: + resp_size = config.payload_config.bytebuf_params.resp_size + servicer = benchmark_servicer.GenericBenchmarkServicer(resp_size) + method_implementations = { + 'StreamingCall': + grpc.stream_stream_rpc_method_handler(servicer.StreamingCall + ), + 'UnaryCall': + grpc.unary_unary_rpc_method_handler(servicer.UnaryCall), + } + handler = grpc.method_handlers_generic_handler( + 'grpc.testing.BenchmarkService', method_implementations) + server.add_generic_rpc_handlers((handler,)) + else: + raise NotImplementedError('Unsupported server type {}'.format( + config.server_type)) + + if config.HasField('security_params'): # Use SSL + server_creds = grpc.ssl_server_credentials( + ((resources.private_key(), resources.certificate_chain()),)) + port = server.add_secure_port('[::]:{}'.format(config.port), + server_creds) + else: + port = server.add_insecure_port('[::]:{}'.format(config.port)) + + return server, port + + +def _get_client_status(start_time: float, end_time: float, qps_data: histogram.Histogram) -> control_pb2.ClientStatus: + latencies = qps_data.get_data() + end_time = time.time() + elapsed_time = end_time - start_time + stats = stats_pb2.ClientStats(latencies=latencies, + time_elapsed=elapsed_time, + time_user=elapsed_time, + time_system=elapsed_time) + return control_pb2.ClientStatus(stats=stats) + + +def _create_client(server: str, config: control_pb2.ClientConfig, qps_data: histogram.Histogram) -> benchmark_client.BenchmarkClient: + if config.load_params.WhichOneof('load') != 'closed_loop': + raise NotImplementedError(f'Unsupported load parameter {config.load_params}') + + if config.client_type == control_pb2.ASYNC_CLIENT: + if config.rpc_type == control_pb2.UNARY: + client_type = benchmark_client.UnaryAsyncBenchmarkClient + if config.rpc_type == control_pb2.STREAMING: + client_type = benchmark_client.StreamingAsyncBenchmarkClient + else: + raise NotImplementedError(f'Unsupported rpc_type [{config.rpc_type}]') + else: + raise NotImplementedError(f'Unsupported client type {config.client_type}') + + return client_type(server, config, qps_data) + + +class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): + """Python Worker Server implementation.""" + + def __init__(self): + self._loop = asyncio.get_event_loop() + self._quit_event = asyncio.Event() + + async def RunServer(self, request_iterator, context): + config = (await context.read()).setup + + server, port = _create_server(config) + await server.start() + start_time = time.time() + yield self._get_server_status(start_time, start_time, port) + + async for request in request_iterator: + end_time = time.time() + status = self._get_server_status(start_time, end_time, port) + if request.mark.reset: + start_time = end_time + yield status + server.stop(None) + + async def RunClient(self, request_iterator, context): + config = (await context.read()).setup + + running_tasks = [] + qps_data = histogram.Histogram(config.histogram_params.resolution, + config.histogram_params.max_possible) + start_time = time.time() + + # Create a client for each channel as asyncio.Task + for i in range(config.client_channels): + server = config.server_targets[i % len(config.server_targets)] + client = self._create_client(server, config, qps_data) + running_tasks.append(self._loop.create_task(client.run())) + + end_time = time.time() + yield self._get_client_status(start_time, end_time, qps_data) + + # Respond to stat requests + async for request in request_iterator: + end_time = time.time() + status = self._get_client_status(start_time, end_time, qps_data) + if request.mark.reset: + qps_data.reset() + start_time = time.time() + yield status + + # Cleanup the clients + for task in running_tasks: + task.cancel() + + async def CoreCount(self, request, context): + return control_pb2.CoreResponse(cores=_NUM_CORES) + + async def QuitWorker(self, request, context): + self._quit_event.set() + return control_pb2.Void() + + async def wait_for_quit(self): + await self._quit_event.wait() From afb080787e37f3f9d9fd41de227334f2f4166e51 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 11:32:53 -0800 Subject: [PATCH 074/129] Clean up self references --- .../tests_aio/benchmark/worker_servicer.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 79dc014c1a1..d69f21d3301 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -13,6 +13,7 @@ # limitations under the License. import asyncio +import logging import multiprocessing import time from typing import Tuple @@ -117,11 +118,11 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): server, port = _create_server(config) await server.start() start_time = time.time() - yield self._get_server_status(start_time, start_time, port) + yield _get_server_status(start_time, start_time, port) async for request in request_iterator: end_time = time.time() - status = self._get_server_status(start_time, end_time, port) + status = _get_server_status(start_time, end_time, port) if request.mark.reset: start_time = end_time yield status @@ -138,16 +139,16 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): # Create a client for each channel as asyncio.Task for i in range(config.client_channels): server = config.server_targets[i % len(config.server_targets)] - client = self._create_client(server, config, qps_data) + client = _create_client(server, config, qps_data) running_tasks.append(self._loop.create_task(client.run())) end_time = time.time() - yield self._get_client_status(start_time, end_time, qps_data) + yield _get_client_status(start_time, end_time, qps_data) # Respond to stat requests async for request in request_iterator: end_time = time.time() - status = self._get_client_status(start_time, end_time, qps_data) + status = _get_client_status(start_time, end_time, qps_data) if request.mark.reset: qps_data.reset() start_time = time.time() From ae44213482b7513aa1516ecf1d3fb59395ff7942 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 11:35:04 -0800 Subject: [PATCH 075/129] Fix typos in worker_servicer.py --- .../grpcio_tests/tests_aio/benchmark/worker_servicer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index d69f21d3301..34609539952 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -95,7 +95,7 @@ def _create_client(server: str, config: control_pb2.ClientConfig, qps_data: hist if config.client_type == control_pb2.ASYNC_CLIENT: if config.rpc_type == control_pb2.UNARY: client_type = benchmark_client.UnaryAsyncBenchmarkClient - if config.rpc_type == control_pb2.STREAMING: + elif config.rpc_type == control_pb2.STREAMING: client_type = benchmark_client.StreamingAsyncBenchmarkClient else: raise NotImplementedError(f'Unsupported rpc_type [{config.rpc_type}]') @@ -126,7 +126,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): if request.mark.reset: start_time = end_time yield status - server.stop(None) + await server.stop(None) async def RunClient(self, request_iterator, context): config = (await context.read()).setup From c2a9f150790a7120f3af6b9ae91b2cd050382652 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 11:36:41 -0800 Subject: [PATCH 076/129] One more fix for the benchmark_client.py --- .../grpcio_tests/tests_aio/benchmark/benchmark_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index 2cbe3da29a7..d73b3c499c3 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -54,7 +54,7 @@ class BenchmarkClient(abc.ABC): if config.payload_config.WhichOneof('payload') == 'simple_params': self._generic = False self._stub = benchmark_service_pb2_grpc.BenchmarkServiceStub( - channel) + self._channel) payload = messages_pb2.Payload( body='\0' * config.payload_config.simple_params.req_size) self._request = messages_pb2.SimpleRequest( @@ -62,7 +62,7 @@ class BenchmarkClient(abc.ABC): response_size=config.payload_config.simple_params.resp_size) else: self._generic = True - self._stub = GenericStub(channel) + self._stub = GenericStub(self._channel) self._request = '\0' * config.payload_config.bytebuf_params.req_size self._hist = hist From 2916c351d58638bb13e6ed74a6f0b3afaad5c955 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 11:38:26 -0800 Subject: [PATCH 077/129] Use bytes instead of str --- .../grpcio_tests/tests_aio/benchmark/benchmark_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index d73b3c499c3..fbaacb64fbd 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -56,14 +56,14 @@ class BenchmarkClient(abc.ABC): self._stub = benchmark_service_pb2_grpc.BenchmarkServiceStub( self._channel) payload = messages_pb2.Payload( - body='\0' * config.payload_config.simple_params.req_size) + body=b'\0' * config.payload_config.simple_params.req_size) self._request = messages_pb2.SimpleRequest( payload=payload, response_size=config.payload_config.simple_params.resp_size) else: self._generic = True self._stub = GenericStub(self._channel) - self._request = '\0' * config.payload_config.bytebuf_params.req_size + self._request = b'\0' * config.payload_config.bytebuf_params.req_size self._hist = hist self._response_callbacks = [] From 49980a6db145a468a93ceb63af43a00b2b62ca84 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 11:55:42 -0800 Subject: [PATCH 078/129] Make benchmark worker work --- .../tests_aio/benchmark/benchmark_client.py | 6 +++--- src/python/grpcio_tests/tests_aio/benchmark/worker.py | 2 +- .../tests_aio/benchmark/worker_servicer.py | 10 +++++++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index fbaacb64fbd..da38d395296 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -89,7 +89,7 @@ class UnaryAsyncBenchmarkClient(BenchmarkClient): async def _send_request(self): start_time = time.time() await self._stub.UnaryCall(self._request) - self._record_query_time(self, time.time() - start_time) + self._record_query_time(time.time() - start_time) async def _infinite_sender(self) -> None: while self._running: @@ -99,7 +99,7 @@ class UnaryAsyncBenchmarkClient(BenchmarkClient): await super().run() self._running = True senders = (self._infinite_sender() for _ in range(self._concurrency)) - await asyncio.wait(senders) + await asyncio.gather(*senders) self._stopped.set() async def stop(self) -> None: @@ -121,7 +121,7 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient): start_time = time.time() await call.write(self._request) await call.read() - self._record_query_time(self, time.time() - start_time) + self._record_query_time(time.time() - start_time) async def run(self): await super().run() diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker.py b/src/python/grpcio_tests/tests_aio/benchmark/worker.py index 628a8885d15..bab450c97b7 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker.py @@ -39,7 +39,7 @@ async def run_worker_server(port: int) -> None: if __name__ == '__main__': - logging.basicConfig(level=logging.INFO) + logging.basicConfig(level=logging.DEBUG) parser = argparse.ArgumentParser( description='gRPC Python performance testing worker') parser.add_argument('--driver_port', diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 34609539952..6304ee566ec 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -30,6 +30,8 @@ from tests_aio.benchmark import benchmark_client, benchmark_servicer _NUM_CORES = multiprocessing.cpu_count() _NUM_CORE_PYTHON_CAN_USE = 1 +_LOGGER = logging.getLogger(__name__) + def _get_server_status(start_time: float, end_time: float, port: int) -> control_pb2.ServerStatus: end_time = time.time() @@ -42,7 +44,7 @@ def _get_server_status(start_time: float, end_time: float, port: int) -> control def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: if config.async_server_threads != 1: - logging.warning('config.async_server_threads [%d] != 1', config.async_server_threads) + _LOGGER.warning('config.async_server_threads [%d] != 1', config.async_server_threads) server = aio.server() if config.server_type == control_pb2.ASYNC_SERVER: @@ -114,9 +116,12 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): async def RunServer(self, request_iterator, context): config = (await context.read()).setup + _LOGGER.info('Received ServerConfig: %s', config) server, port = _create_server(config) await server.start() + _LOGGER.info('Server started at port [%d]', port) + start_time = time.time() yield _get_server_status(start_time, start_time, port) @@ -130,6 +135,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): async def RunClient(self, request_iterator, context): config = (await context.read()).setup + _LOGGER.info('Received ClientConfig: %s', config) running_tasks = [] qps_data = histogram.Histogram(config.histogram_params.resolution, @@ -140,6 +146,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): for i in range(config.client_channels): server = config.server_targets[i % len(config.server_targets)] client = _create_client(server, config, qps_data) + _LOGGER.info('Client created against server [%s]', server) running_tasks.append(self._loop.create_task(client.run())) end_time = time.time() @@ -162,6 +169,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): return control_pb2.CoreResponse(cores=_NUM_CORES) async def QuitWorker(self, request, context): + _LOGGER.info('QuitWorker command received.') self._quit_event.set() return control_pb2.Void() From 1ba37eebd28db21485781f6c7299acedbca27563 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 12:15:24 -0800 Subject: [PATCH 079/129] Add Python AsyncIO to the party --- .../performance/build_performance.sh | 2 + .../performance/run_worker_python_asyncio.sh | 20 +++++ .../run_tests/performance/scenario_config.py | 78 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 tools/run_tests/performance/run_worker_python_asyncio.sh diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 4662a28fe72..856cafa3b74 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -72,6 +72,8 @@ do # python workers are only run with python2.7 and building with multiple python versions is costly python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python2.7 --build_only -j 8 ;; + "python_asyncio") + python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python3.7 --build_only -j 8 *) python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --build_only -j 8 ;; diff --git a/tools/run_tests/performance/run_worker_python_asyncio.sh b/tools/run_tests/performance/run_worker_python_asyncio.sh new file mode 100644 index 00000000000..7d7517d6121 --- /dev/null +++ b/tools/run_tests/performance/run_worker_python_asyncio.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Copyright 2020 The 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. + +set -ex + +cd "$(dirname "$0")/../../.." + +PYTHONPATH=src/python/grpcio_tests:src/python/gens py37_native/bin/python src/python/grpcio_tests/tests_aio/benchmark/worker.py "$@" diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index 1d30a79dee0..be647e5e15c 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -816,6 +816,83 @@ class PythonLanguage: return 'python' +class PythonAsyncIOLanguage: + + def __init__(self): + self.safename = 'python_asyncio' + + def worker_cmdline(self): + return ['tools/run_tests/performance/run_worker_python_asyncio.sh'] + + def worker_port_offset(self): + return 1200 + + def scenarios(self): + yield _ping_pong_scenario('python_asyncio_generic_async_streaming_ping_pong', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_GENERIC_SERVER', + use_generic_payload=True, + categories=[SMOKETEST, SCALABLE]) + + yield _ping_pong_scenario('python_asyncio_protobuf_async_streaming_ping_pong', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER') + + yield _ping_pong_scenario('python_asyncio_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER') + + yield _ping_pong_scenario('python_asyncio_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + categories=[SMOKETEST, SCALABLE]) + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_qps_unconstrained', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + unconstrained_client='async') + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_streaming_qps_unconstrained', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + unconstrained_client='async') + + yield _ping_pong_scenario('python_asyncio_to_cpp_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + server_language='python_asyncio', + async_server_threads=1, + categories=[SMOKETEST, SCALABLE]) + + yield _ping_pong_scenario( + 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', + rpc_type='STREAMING', + client_type='SYNC_CLIENT', + server_type='ASYNC_SERVER', + server_language='python_asyncio', + async_server_threads=1) + + yield _ping_pong_scenario('python_asyncio_protobuf_async_unary_ping_pong_1MB', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + req_size=1024 * 1024, + resp_size=1024 * 1024, + categories=[SMOKETEST, SCALABLE]) + + def __str__(self): + return 'python_asyncio' + + class RubyLanguage: def __init__(self): @@ -1249,6 +1326,7 @@ LANGUAGES = { 'php7_protobuf_c': Php7Language(php7_protobuf_c=True), 'java': JavaLanguage(), 'python': PythonLanguage(), + 'python_asyncio': PythonAsyncIOLanguage(), 'go': GoLanguage(), 'node': NodeLanguage(), 'node_purejs': NodeLanguage(node_purejs=True) From 5d46af6c19bba9df2dd974883286e9413d3b61cf Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 14:15:16 -0800 Subject: [PATCH 080/129] Fix typo in build_performance.sh --- tools/run_tests/performance/build_performance.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 856cafa3b74..030f9da8aa8 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -74,6 +74,7 @@ do ;; "python_asyncio") python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python3.7 --build_only -j 8 + ;; *) python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --build_only -j 8 ;; From 6f343fc758d4b13291a5bc50fe61f5471852f857 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 14:55:50 -0800 Subject: [PATCH 081/129] Make sanity tests happy --- .../tests_aio/benchmark/benchmark_client.py | 14 ++-- .../tests_aio/benchmark/benchmark_servicer.py | 6 +- .../tests_aio/benchmark/worker.py | 4 +- .../tests_aio/benchmark/worker_servicer.py | 42 ++++++----- .../run_tests/performance/scenario_config.py | 72 ++++++++++--------- 5 files changed, 78 insertions(+), 60 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index da38d395296..9cdab36d158 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -38,7 +38,8 @@ class GenericStub(object): class BenchmarkClient(abc.ABC): """Benchmark client interface that exposes a non-blocking send_request().""" - def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + def __init__(self, address: str, config: control_pb2.ClientConfig, + hist: histogram.Histogram): # Creates the channel if config.HasField('security_params'): channel_credentials = grpc.ssl_channel_credentials( @@ -81,7 +82,8 @@ class BenchmarkClient(abc.ABC): class UnaryAsyncBenchmarkClient(BenchmarkClient): - def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + def __init__(self, address: str, config: control_pb2.ClientConfig, + hist: histogram.Histogram): super().__init__(address, config, hist) self._running = None self._stopped = asyncio.Event() @@ -101,7 +103,7 @@ class UnaryAsyncBenchmarkClient(BenchmarkClient): senders = (self._infinite_sender() for _ in range(self._concurrency)) await asyncio.gather(*senders) self._stopped.set() - + async def stop(self) -> None: self._running = False await self._stopped.wait() @@ -110,7 +112,8 @@ class UnaryAsyncBenchmarkClient(BenchmarkClient): class StreamingAsyncBenchmarkClient(BenchmarkClient): - def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + def __init__(self, address: str, config: control_pb2.ClientConfig, + hist: histogram.Histogram): super().__init__(address, config, hist) self._running = None self._stopped = asyncio.Event() @@ -126,7 +129,8 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient): async def run(self): await super().run() self._running = True - senders = (self._one_streamming_call() for _ in range(self._concurrency)) + senders = ( + self._one_streamming_call() for _ in range(self._concurrency)) await asyncio.wait(senders) self._stopped.set() diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py index 6aff17f7cac..6276a539320 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py @@ -35,13 +35,13 @@ class BenchmarkServicer(benchmark_service_pb2_grpc.BenchmarkServiceServicer): yield messages_pb2.SimpleResponse(payload=payload) async def StreamingCall(self, request_iterator, unused_context): - payload = messages_pb2.Payload(body='\0' * request.response_size) async for request in request_iterator: + payload = messages_pb2.Payload(body=b'\0' * request.response_size) yield messages_pb2.SimpleResponse(payload=payload) -class GenericBenchmarkServicer(benchmark_service_pb2_grpc.BenchmarkServiceServicer - ): +class GenericBenchmarkServicer( + benchmark_service_pb2_grpc.BenchmarkServiceServicer): """Generic (no-codec) Server implementation for the Benchmark service.""" def __init__(self, resp_size): diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker.py b/src/python/grpcio_tests/tests_aio/benchmark/worker.py index bab450c97b7..ad6d3e7b1c2 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker.py @@ -48,6 +48,4 @@ if __name__ == '__main__': help='The port the worker should listen on') args = parser.parse_args() - asyncio.get_event_loop().run_until_complete( - run_worker_server(args.port) - ) + asyncio.get_event_loop().run_until_complete(run_worker_server(args.port)) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 6304ee566ec..cefe7c1834e 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -33,18 +33,22 @@ _NUM_CORE_PYTHON_CAN_USE = 1 _LOGGER = logging.getLogger(__name__) -def _get_server_status(start_time: float, end_time: float, port: int) -> control_pb2.ServerStatus: +def _get_server_status(start_time: float, end_time: float, + port: int) -> control_pb2.ServerStatus: end_time = time.time() elapsed_time = end_time - start_time stats = stats_pb2.ServerStats(time_elapsed=elapsed_time, - time_user=elapsed_time, - time_system=elapsed_time) - return control_pb2.ServerStatus(stats=stats, port=port, cores=_NUM_CORE_PYTHON_CAN_USE) + time_user=elapsed_time, + time_system=elapsed_time) + return control_pb2.ServerStatus(stats=stats, + port=port, + cores=_NUM_CORE_PYTHON_CAN_USE) def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: if config.async_server_threads != 1: - _LOGGER.warning('config.async_server_threads [%d] != 1', config.async_server_threads) + _LOGGER.warning('config.async_server_threads [%d] != 1', + config.async_server_threads) server = aio.server() if config.server_type == control_pb2.ASYNC_SERVER: @@ -56,8 +60,7 @@ def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: servicer = benchmark_servicer.GenericBenchmarkServicer(resp_size) method_implementations = { 'StreamingCall': - grpc.stream_stream_rpc_method_handler(servicer.StreamingCall - ), + grpc.stream_stream_rpc_method_handler(servicer.StreamingCall), 'UnaryCall': grpc.unary_unary_rpc_method_handler(servicer.UnaryCall), } @@ -72,27 +75,32 @@ def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: server_creds = grpc.ssl_server_credentials( ((resources.private_key(), resources.certificate_chain()),)) port = server.add_secure_port('[::]:{}'.format(config.port), - server_creds) + server_creds) else: port = server.add_insecure_port('[::]:{}'.format(config.port)) return server, port -def _get_client_status(start_time: float, end_time: float, qps_data: histogram.Histogram) -> control_pb2.ClientStatus: +def _get_client_status(start_time: float, end_time: float, + qps_data: histogram.Histogram + ) -> control_pb2.ClientStatus: latencies = qps_data.get_data() end_time = time.time() elapsed_time = end_time - start_time stats = stats_pb2.ClientStats(latencies=latencies, - time_elapsed=elapsed_time, - time_user=elapsed_time, - time_system=elapsed_time) + time_elapsed=elapsed_time, + time_user=elapsed_time, + time_system=elapsed_time) return control_pb2.ClientStatus(stats=stats) -def _create_client(server: str, config: control_pb2.ClientConfig, qps_data: histogram.Histogram) -> benchmark_client.BenchmarkClient: +def _create_client(server: str, config: control_pb2.ClientConfig, + qps_data: histogram.Histogram + ) -> benchmark_client.BenchmarkClient: if config.load_params.WhichOneof('load') != 'closed_loop': - raise NotImplementedError(f'Unsupported load parameter {config.load_params}') + raise NotImplementedError( + f'Unsupported load parameter {config.load_params}') if config.client_type == control_pb2.ASYNC_CLIENT: if config.rpc_type == control_pb2.UNARY: @@ -100,9 +108,11 @@ def _create_client(server: str, config: control_pb2.ClientConfig, qps_data: hist elif config.rpc_type == control_pb2.STREAMING: client_type = benchmark_client.StreamingAsyncBenchmarkClient else: - raise NotImplementedError(f'Unsupported rpc_type [{config.rpc_type}]') + raise NotImplementedError( + f'Unsupported rpc_type [{config.rpc_type}]') else: - raise NotImplementedError(f'Unsupported client type {config.client_type}') + raise NotImplementedError( + f'Unsupported client type {config.client_type}') return client_type(server, config, qps_data) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index be647e5e15c..f6472876f2d 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -828,28 +828,32 @@ class PythonAsyncIOLanguage: return 1200 def scenarios(self): - yield _ping_pong_scenario('python_asyncio_generic_async_streaming_ping_pong', - rpc_type='STREAMING', - client_type='ASYNC_CLIENT', - server_type='ASYNC_GENERIC_SERVER', - use_generic_payload=True, - categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( + 'python_asyncio_generic_async_streaming_ping_pong', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_GENERIC_SERVER', + use_generic_payload=True, + categories=[SMOKETEST, SCALABLE]) - yield _ping_pong_scenario('python_asyncio_protobuf_async_streaming_ping_pong', - rpc_type='STREAMING', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER') + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_streaming_ping_pong', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER') - yield _ping_pong_scenario('python_asyncio_protobuf_async_unary_ping_pong', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER') + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER') - yield _ping_pong_scenario('python_asyncio_protobuf_async_unary_ping_pong', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_qps_unconstrained', @@ -865,13 +869,14 @@ class PythonAsyncIOLanguage: server_type='ASYNC_SERVER', unconstrained_client='async') - yield _ping_pong_scenario('python_asyncio_to_cpp_protobuf_async_unary_ping_pong', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - server_language='python_asyncio', - async_server_threads=1, - categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( + 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + server_language='python_asyncio', + async_server_threads=1, + categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', @@ -881,13 +886,14 @@ class PythonAsyncIOLanguage: server_language='python_asyncio', async_server_threads=1) - yield _ping_pong_scenario('python_asyncio_protobuf_async_unary_ping_pong_1MB', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - req_size=1024 * 1024, - resp_size=1024 * 1024, - categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong_1MB', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + req_size=1024 * 1024, + resp_size=1024 * 1024, + categories=[SMOKETEST, SCALABLE]) def __str__(self): return 'python_asyncio' From 4f1043ebd9837c632b9367929ccfd4bd1ee93eb0 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 17:07:08 -0800 Subject: [PATCH 082/129] Make Kokoro jobs aware the presence of python_asyncio --- tools/internal_ci/linux/grpc_e2e_performance_singlevm.sh | 2 +- tools/internal_ci/linux/grpc_full_performance_master.sh | 2 +- tools/internal_ci/linux/grpc_full_performance_release.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/internal_ci/linux/grpc_e2e_performance_singlevm.sh b/tools/internal_ci/linux/grpc_e2e_performance_singlevm.sh index fe985f6cd3a..d0ba3ac9bec 100755 --- a/tools/internal_ci/linux/grpc_e2e_performance_singlevm.sh +++ b/tools/internal_ci/linux/grpc_e2e_performance_singlevm.sh @@ -23,7 +23,7 @@ source tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc # TODO(jtattermusch): add back "node" language once the scenarios are passing again # See https://github.com/grpc/grpc/issues/20234 tools/run_tests/run_performance_tests.py \ - -l c++ csharp ruby java python go php7 php7_protobuf_c \ + -l c++ csharp ruby java python python_asyncio go php7 php7_protobuf_c \ --netperf \ --category smoketest \ -u kbuilder \ diff --git a/tools/internal_ci/linux/grpc_full_performance_master.sh b/tools/internal_ci/linux/grpc_full_performance_master.sh index 1ab657a1c32..019707fcf07 100755 --- a/tools/internal_ci/linux/grpc_full_performance_master.sh +++ b/tools/internal_ci/linux/grpc_full_performance_master.sh @@ -21,7 +21,7 @@ source tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc # run 8core client vs 8core server tools/run_tests/run_performance_tests.py \ - -l c++ csharp ruby java python go php7 php7_protobuf_c node \ + -l c++ csharp ruby java python python_asyncio go php7 php7_protobuf_c node \ --netperf \ --category scalable \ --remote_worker_host grpc-kokoro-performance-server-8core grpc-kokoro-performance-client-8core grpc-kokoro-performance-client2-8core \ diff --git a/tools/internal_ci/linux/grpc_full_performance_release.sh b/tools/internal_ci/linux/grpc_full_performance_release.sh index 5b1b2657a25..7da5a74ce34 100755 --- a/tools/internal_ci/linux/grpc_full_performance_release.sh +++ b/tools/internal_ci/linux/grpc_full_performance_release.sh @@ -21,7 +21,7 @@ source tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc # run 8core client vs 8core server tools/run_tests/run_performance_tests.py \ - -l c++ csharp ruby java python go php7 php7_protobuf_c \ + -l c++ csharp ruby java python python_asyncio go php7 php7_protobuf_c \ --netperf \ --category scalable \ --remote_worker_host grpc-kokoro-performance-server-8core grpc-kokoro-performance-client-8core grpc-kokoro-performance-client2-8core \ From d309d359346758f924dbc0231113dbe3b8cbf281 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 17:46:00 -0800 Subject: [PATCH 083/129] Fix the build performance for python_asyncio --- tools/run_tests/performance/build_performance.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 030f9da8aa8..e9b1121477e 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -73,7 +73,7 @@ do python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python2.7 --build_only -j 8 ;; "python_asyncio") - python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python3.7 --build_only -j 8 + python tools/run_tests/run_tests.py -l python -c "$CONFIG" --compiler python3.7 --build_only -j 8 ;; *) python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --build_only -j 8 From 7cdef95c4f3184805be5ef7c8f2711811c3c9e73 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 4 Feb 2020 17:48:25 -0800 Subject: [PATCH 084/129] Make buildifier happy --- src/proto/grpc/testing/BUILD | 5 ++++- .../grpcio_tests/tests_aio/benchmark/BUILD.bazel | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/proto/grpc/testing/BUILD b/src/proto/grpc/testing/BUILD index e18661df162..c67a7f81abc 100644 --- a/src/proto/grpc/testing/BUILD +++ b/src/proto/grpc/testing/BUILD @@ -275,7 +275,10 @@ py_proto_library( proto_library( name = "control_descriptor", srcs = ["control.proto"], - deps = [":payloads_descriptor", ":stats_descriptor"] + deps = [ + ":payloads_descriptor", + ":stats_descriptor", + ], ) py_proto_library( diff --git a/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel b/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel index 579d3b0bf1f..a4151697f30 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel +++ b/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel @@ -44,22 +44,22 @@ py_library( py_library( name = "worker_servicer", srcs = ["worker_servicer.py"], - srcs_version = "PY3", data = [ "//src/python/grpcio_tests/tests/unit/credentials", ], + srcs_version = "PY3", deps = [ ":benchmark_client", ":benchmark_servicer", - "//src/python/grpcio_tests/tests/qps:histogram", - "//src/python/grpcio_tests/tests/unit:resources", + "//src/proto/grpc/core:stats_py_pb2", "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", - "//src/proto/grpc/testing:worker_service_py_pb2_grpc", "//src/proto/grpc/testing:control_py_pb2", "//src/proto/grpc/testing:payloads_py_pb2", - "//src/proto/grpc/core:stats_py_pb2", "//src/proto/grpc/testing:stats_py_pb2", + "//src/proto/grpc/testing:worker_service_py_pb2_grpc", "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/qps:histogram", + "//src/python/grpcio_tests/tests/unit:resources", ], ) From 2e4e4f72c1f5f7949a26dbda7c07e945e91714e4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 10:53:34 -0800 Subject: [PATCH 085/129] Use Python3.6 instead of Python3.7 --- tools/run_tests/performance/build_performance.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index e9b1121477e..8a15d3da999 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -73,7 +73,7 @@ do python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python2.7 --build_only -j 8 ;; "python_asyncio") - python tools/run_tests/run_tests.py -l python -c "$CONFIG" --compiler python3.7 --build_only -j 8 + python tools/run_tests/run_tests.py -l python -c "$CONFIG" --compiler python3.6 --build_only -j 8 ;; *) python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --build_only -j 8 From 85eb4c17fb9ef8f2af739d9a009c7420561b7716 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 13:15:32 -0800 Subject: [PATCH 086/129] Use Python3.6 v2 --- tools/run_tests/performance/run_worker_python_asyncio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/performance/run_worker_python_asyncio.sh b/tools/run_tests/performance/run_worker_python_asyncio.sh index 7d7517d6121..4b5f018f181 100644 --- a/tools/run_tests/performance/run_worker_python_asyncio.sh +++ b/tools/run_tests/performance/run_worker_python_asyncio.sh @@ -17,4 +17,4 @@ set -ex cd "$(dirname "$0")/../../.." -PYTHONPATH=src/python/grpcio_tests:src/python/gens py37_native/bin/python src/python/grpcio_tests/tests_aio/benchmark/worker.py "$@" +PYTHONPATH=src/python/grpcio_tests:src/python/gens py36_native/bin/python src/python/grpcio_tests/tests_aio/benchmark/worker.py "$@" From 37bb427c0314007e4544ca6187138243cf79c3ec Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 15:05:23 -0800 Subject: [PATCH 087/129] Make run_worker_python.sh an executable --- .../performance/run_worker_python_asyncio.sh | 0 .../run_tests/performance/scenario_config.py | 129 ++++++++++-------- 2 files changed, 70 insertions(+), 59 deletions(-) mode change 100644 => 100755 tools/run_tests/performance/run_worker_python_asyncio.sh diff --git a/tools/run_tests/performance/run_worker_python_asyncio.sh b/tools/run_tests/performance/run_worker_python_asyncio.sh old mode 100644 new mode 100755 diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index f6472876f2d..8ca82aae010 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -828,72 +828,83 @@ class PythonAsyncIOLanguage: return 1200 def scenarios(self): - yield _ping_pong_scenario( - 'python_asyncio_generic_async_streaming_ping_pong', - rpc_type='STREAMING', - client_type='ASYNC_CLIENT', - server_type='ASYNC_GENERIC_SERVER', - use_generic_payload=True, - categories=[SMOKETEST, SCALABLE]) - - yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_streaming_ping_pong', - rpc_type='STREAMING', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER') - yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong', rpc_type='UNARY', client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER') - - yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_unary_ping_pong', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - categories=[SMOKETEST, SCALABLE]) - - yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_unary_qps_unconstrained', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - unconstrained_client='async') - - yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_streaming_qps_unconstrained', - rpc_type='STREAMING', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - unconstrained_client='async') - - yield _ping_pong_scenario( - 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - server_language='python_asyncio', - async_server_threads=1, + outstanding=64, + channels=1, + client_threads_per_cq=1, + server_threads_per_cq=1, categories=[SMOKETEST, SCALABLE]) - yield _ping_pong_scenario( - 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', - rpc_type='STREAMING', - client_type='SYNC_CLIENT', - server_type='ASYNC_SERVER', - server_language='python_asyncio', - async_server_threads=1) - - yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_unary_ping_pong_1MB', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - req_size=1024 * 1024, - resp_size=1024 * 1024, - categories=[SMOKETEST, SCALABLE]) + # yield _ping_pong_scenario( + # 'python_asyncio_generic_async_streaming_ping_pong', + # rpc_type='STREAMING', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_GENERIC_SERVER', + # use_generic_payload=True, + # categories=[SMOKETEST, SCALABLE]) + + # yield _ping_pong_scenario( + # 'python_asyncio_protobuf_async_streaming_ping_pong', + # rpc_type='STREAMING', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_SERVER') + + # yield _ping_pong_scenario( + # 'python_asyncio_protobuf_async_unary_ping_pong', + # rpc_type='UNARY', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_SERVER') + + # yield _ping_pong_scenario( + # 'python_asyncio_protobuf_async_unary_ping_pong', + # rpc_type='UNARY', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_SERVER', + # categories=[SMOKETEST, SCALABLE]) + + # yield _ping_pong_scenario( + # 'python_asyncio_protobuf_async_unary_qps_unconstrained', + # rpc_type='UNARY', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_SERVER', + # unconstrained_client='async') + + # yield _ping_pong_scenario( + # 'python_asyncio_protobuf_async_streaming_qps_unconstrained', + # rpc_type='STREAMING', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_SERVER', + # unconstrained_client='async') + + # yield _ping_pong_scenario( + # 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong', + # rpc_type='UNARY', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_SERVER', + # server_language='python_asyncio', + # async_server_threads=1, + # categories=[SMOKETEST, SCALABLE]) + + # yield _ping_pong_scenario( + # 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', + # rpc_type='STREAMING', + # client_type='SYNC_CLIENT', + # server_type='ASYNC_SERVER', + # server_language='python_asyncio', + # async_server_threads=1) + + # yield _ping_pong_scenario( + # 'python_asyncio_protobuf_async_unary_ping_pong_1MB', + # rpc_type='UNARY', + # client_type='ASYNC_CLIENT', + # server_type='ASYNC_SERVER', + # req_size=1024 * 1024, + # resp_size=1024 * 1024, + # categories=[SMOKETEST, SCALABLE]) def __str__(self): return 'python_asyncio' From e0f235ed9964dfdad2f6f4f976aaee44c9dcd952 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 15:40:31 -0800 Subject: [PATCH 088/129] Unconstrained? --- tools/run_tests/performance/scenario_config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index 8ca82aae010..d1e8ebbd148 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -837,6 +837,7 @@ class PythonAsyncIOLanguage: channels=1, client_threads_per_cq=1, server_threads_per_cq=1, + unconstrained_client=True, categories=[SMOKETEST, SCALABLE]) # yield _ping_pong_scenario( From 2d81bd203f0fd19b8d676942a7e8460b659769ce Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 17:42:55 -0800 Subject: [PATCH 089/129] Introduce sub workers --- .../grpcio_tests/tests/qps/histogram.py | 10 +++ .../tests_aio/benchmark/worker_servicer.py | 86 +++++++++++++++++-- .../run_tests/performance/scenario_config.py | 4 +- 3 files changed, 91 insertions(+), 9 deletions(-) diff --git a/src/python/grpcio_tests/tests/qps/histogram.py b/src/python/grpcio_tests/tests/qps/histogram.py index f198630b7d9..e0f06ffa9ec 100644 --- a/src/python/grpcio_tests/tests/qps/histogram.py +++ b/src/python/grpcio_tests/tests/qps/histogram.py @@ -65,6 +65,16 @@ class Histogram(object): data.count = self._count return data + def merge(self, another_data): + with self._lock: + for i in len(self._buckets): + self._buckets[i] += another_data.bucket[i] + self._min = min(self._min, another_data.min_seen) + self._max = max(self._max, another_data.max_seen) + self._sum += another_data.sum + self._sum_of_squares += another_data.sum_of_squares + self._count += another_data.count + def _bucket_for(self, val): val = min(val, self._max_possible) return int(math.log(val, self.multiplier)) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index cefe7c1834e..f6bafd35703 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -14,9 +14,12 @@ import asyncio import logging +import os import multiprocessing +import sys import time from typing import Tuple +import collections import grpc from grpc.experimental import aio @@ -117,6 +120,26 @@ def _create_client(server: str, config: control_pb2.ClientConfig, return client_type(server, config, qps_data) +WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + 'worker.py' +SubWorker = collections.namedtuple('SubWorker', ['process', 'port', 'channel', 'stub']) + + +async def _create_sub_worker(port: int) -> SubWorker: + process = asyncio.create_subprocess_exec( + sys.executable, + WORKER_ENTRY_FILE, + '--driver_port', port + ) + channel = aio.insecure_channel(f'localhost:{port}') + stub = worker_service_pb2_grpc.WorkerServiceStub(channel) + return SubWorker( + process=process, + port=port, + channel=channel, + stub=stub, + ) + + class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): """Python Worker Server implementation.""" @@ -143,10 +166,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): yield status await server.stop(None) - async def RunClient(self, request_iterator, context): - config = (await context.read()).setup - _LOGGER.info('Received ClientConfig: %s', config) - + async def _run_single_client(self, config, request_iterator, context): running_tasks = [] qps_data = histogram.Histogram(config.histogram_params.resolution, config.histogram_params.max_possible) @@ -160,7 +180,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): running_tasks.append(self._loop.create_task(client.run())) end_time = time.time() - yield _get_client_status(start_time, end_time, qps_data) + await context.write(_get_client_status(start_time, end_time, qps_data)) # Respond to stat requests async for request in request_iterator: @@ -169,16 +189,66 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): if request.mark.reset: qps_data.reset() start_time = time.time() - yield status + await context.write(status) # Cleanup the clients for task in running_tasks: task.cancel() - async def CoreCount(self, request, context): + async def RunClient(self, request_iterator, context): + config_request = await context.read() + config = config_request.setup + _LOGGER.info('Received ClientConfig: %s', config) + + if config.async_server_threads <= 0: + raise ValueError('async_server_threads can\'t be [%d]' % config.async_server_threads) + elif config.async_server_threads == 1: + await self._run_single_client(config, request_iterator, context) + else: + sub_workers = [] + for i in range(config.async_server_threads): + port = 40000+i + _LOGGER.info('Creating sub worker at port [%d]...', port) + sub_workers.append(await _create_sub_worker(port)) + + calls = [worker.stub.RunClient() for worker in sub_workers] + + for call in calls: + await call.write(config_request) + + start_time = time.time() + result = histogram.Histogram(config.histogram_params.resolution, + config.histogram_params.max_possible) + end_time = time.time() + yield _get_client_status(start_time, end_time, result) + + async for request in request_iterator: + end_time = time.time() + + for call in calls: + await call.write(request) + sub_status = await call.read() + result.merge(sub_status.latencies) + + status = _get_client_status(start_time, end_time, result) + if request.mark.reset: + result.reset() + start_time = time.time() + yield status + + for call in calls: + await call.QuitWorker() + + for worker in sub_workers: + await worker.channel.close() + _LOGGER.info('Waiting for sub worker [%s] to quit...', worker) + await worker.process.wait() + _LOGGER.info('Sub worker [%s] quit', worker) + + async def CoreCount(self, unused_request, unused_context): return control_pb2.CoreResponse(cores=_NUM_CORES) - async def QuitWorker(self, request, context): + async def QuitWorker(self, unused_request, unused_context): _LOGGER.info('QuitWorker command received.') self._quit_event.set() return control_pb2.Void() diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index d1e8ebbd148..5a4fddf16e6 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -118,6 +118,7 @@ def _ping_pong_scenario(name, unconstrained_client=None, client_language=None, server_language=None, + async_client_threads=0, async_server_threads=0, server_threads_per_cq=0, client_threads_per_cq=0, @@ -187,7 +188,7 @@ def _ping_pong_scenario(name, 'num_clients'] = num_clients if num_clients is not None else 0 # use as many clients as available. scenario['client_config']['outstanding_rpcs_per_channel'] = deep scenario['client_config']['client_channels'] = wide - scenario['client_config']['async_client_threads'] = 0 + scenario['client_config']['async_client_threads'] = async_client_threads if offered_load is not None: optimization_target = 'latency' else: @@ -837,6 +838,7 @@ class PythonAsyncIOLanguage: channels=1, client_threads_per_cq=1, server_threads_per_cq=1, + async_server_threads=6, unconstrained_client=True, categories=[SMOKETEST, SCALABLE]) From 5e2114d92f5a3c397304e7f74a1c8da80aac574e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 18:04:56 -0800 Subject: [PATCH 090/129] Fix the sub worker --- .../grpcio_tests/tests/qps/histogram.py | 2 +- .../tests_aio/benchmark/worker_servicer.py | 33 ++++++++++++------- .../run_tests/performance/scenario_config.py | 2 +- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/python/grpcio_tests/tests/qps/histogram.py b/src/python/grpcio_tests/tests/qps/histogram.py index e0f06ffa9ec..8139a6ee2fb 100644 --- a/src/python/grpcio_tests/tests/qps/histogram.py +++ b/src/python/grpcio_tests/tests/qps/histogram.py @@ -67,7 +67,7 @@ class Histogram(object): def merge(self, another_data): with self._lock: - for i in len(self._buckets): + for i in range(len(self._buckets)): self._buckets[i] += another_data.bucket[i] self._min = min(self._min, another_data.min_seen) self._max = max(self._max, another_data.max_seen) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index f6bafd35703..ee72165019c 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -120,17 +120,20 @@ def _create_client(server: str, config: control_pb2.ClientConfig, return client_type(server, config, qps_data) -WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + 'worker.py' +WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' SubWorker = collections.namedtuple('SubWorker', ['process', 'port', 'channel', 'stub']) async def _create_sub_worker(port: int) -> SubWorker: - process = asyncio.create_subprocess_exec( + process = await asyncio.create_subprocess_exec( sys.executable, WORKER_ENTRY_FILE, - '--driver_port', port + '--driver_port', str(port) ) + _LOGGER.info('Created sub worker process for port [%d] at pid [%d]', port, process.pid) channel = aio.insecure_channel(f'localhost:{port}') + _LOGGER.info('Waiting for sub worker at port [%d]', port) + await aio.channel_ready(channel) stub = worker_service_pb2_grpc.WorkerServiceStub(channel) return SubWorker( process=process, @@ -200,46 +203,54 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): config = config_request.setup _LOGGER.info('Received ClientConfig: %s', config) - if config.async_server_threads <= 0: - raise ValueError('async_server_threads can\'t be [%d]' % config.async_server_threads) - elif config.async_server_threads == 1: + if config.async_client_threads <= 0: + raise ValueError('async_client_threads can\'t be [%d]' % config.async_client_threads) + elif config.async_client_threads == 1: await self._run_single_client(config, request_iterator, context) else: sub_workers = [] - for i in range(config.async_server_threads): + for i in range(config.async_client_threads): port = 40000+i _LOGGER.info('Creating sub worker at port [%d]...', port) sub_workers.append(await _create_sub_worker(port)) calls = [worker.stub.RunClient() for worker in sub_workers] + config_request.setup.async_client_threads = 1 + for call in calls: await call.write(config_request) + # An empty status + await call.read() start_time = time.time() result = histogram.Histogram(config.histogram_params.resolution, config.histogram_params.max_possible) end_time = time.time() - yield _get_client_status(start_time, end_time, result) + await context.write(_get_client_status(start_time, end_time, result)) async for request in request_iterator: end_time = time.time() for call in calls: + _LOGGER.debug('Fetching status...') await call.write(request) sub_status = await call.read() - result.merge(sub_status.latencies) + result.merge(sub_status.stats.latencies) + _LOGGER.debug('Update from sub worker count=[%d]', sub_status.stats.latencies.count) status = _get_client_status(start_time, end_time, result) if request.mark.reset: result.reset() start_time = time.time() - yield status + _LOGGER.debug('Reporting count=[%d]', status.stats.latencies.count) + await context.write(status) for call in calls: - await call.QuitWorker() + await call.done_writing() for worker in sub_workers: + await worker.stub.QuitWorker(control_pb2.Void()) await worker.channel.close() _LOGGER.info('Waiting for sub worker [%s] to quit...', worker) await worker.process.wait() diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index 5a4fddf16e6..e935539605c 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -838,7 +838,7 @@ class PythonAsyncIOLanguage: channels=1, client_threads_per_cq=1, server_threads_per_cq=1, - async_server_threads=6, + async_client_threads=7, unconstrained_client=True, categories=[SMOKETEST, SCALABLE]) From ef853425cc42022dbce726e24cfc91395c7ff48d Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 18:20:32 -0800 Subject: [PATCH 091/129] Use picked port instead of assigned port --- .../grpcio_tests/tests_aio/benchmark/BUILD.bazel | 1 + .../tests_aio/benchmark/worker_servicer.py | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel b/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel index a4151697f30..651e3adc1e6 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel +++ b/src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel @@ -60,6 +60,7 @@ py_library( "//src/python/grpcio/grpc:grpcio", "//src/python/grpcio_tests/tests/qps:histogram", "//src/python/grpcio_tests/tests/unit:resources", + "//src/python/grpcio_tests/tests/unit/framework/common", ], ) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index ee72165019c..179d8f8d59d 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -29,6 +29,7 @@ from src.proto.grpc.testing import (benchmark_service_pb2_grpc, control_pb2, from tests.qps import histogram from tests.unit import resources from tests_aio.benchmark import benchmark_client, benchmark_servicer +from tests.unit.framework.common import get_socket _NUM_CORES = multiprocessing.cpu_count() _NUM_CORE_PYTHON_CAN_USE = 1 @@ -124,14 +125,17 @@ WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' SubWorker = collections.namedtuple('SubWorker', ['process', 'port', 'channel', 'stub']) -async def _create_sub_worker(port: int) -> SubWorker: +async def _create_sub_worker() -> SubWorker: + address, port, sock = get_socket() + sock.close() + _LOGGER.info('Creating sub worker at port [%d]...', port) process = await asyncio.create_subprocess_exec( sys.executable, WORKER_ENTRY_FILE, '--driver_port', str(port) ) _LOGGER.info('Created sub worker process for port [%d] at pid [%d]', port, process.pid) - channel = aio.insecure_channel(f'localhost:{port}') + channel = aio.insecure_channel(f'{address}:{port}') _LOGGER.info('Waiting for sub worker at port [%d]', port) await aio.channel_ready(channel) stub = worker_service_pb2_grpc.WorkerServiceStub(channel) @@ -210,9 +214,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): else: sub_workers = [] for i in range(config.async_client_threads): - port = 40000+i - _LOGGER.info('Creating sub worker at port [%d]...', port) - sub_workers.append(await _create_sub_worker(port)) + sub_workers.append(await _create_sub_worker()) calls = [worker.stub.RunClient() for worker in sub_workers] @@ -237,7 +239,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): await call.write(request) sub_status = await call.read() result.merge(sub_status.stats.latencies) - _LOGGER.debug('Update from sub worker count=[%d]', sub_status.stats.latencies.count) + _LOGGER.debug('Update from sub worker count=[%d]', + sub_status.stats.latencies.count) status = _get_client_status(start_time, end_time, result) if request.mark.reset: From 8a70e757fa56bfcc83e13d384f8c317484b6073d Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 5 Feb 2020 19:04:19 -0800 Subject: [PATCH 092/129] Re-enable all scenarios --- .../tests_aio/benchmark/worker_servicer.py | 2 +- .../run_tests/performance/scenario_config.py | 138 +++++++++--------- 2 files changed, 71 insertions(+), 69 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 179d8f8d59d..3513523ea78 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -213,7 +213,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): await self._run_single_client(config, request_iterator, context) else: sub_workers = [] - for i in range(config.async_client_threads): + for _ in range(config.async_client_threads): sub_workers.append(await _create_sub_worker()) calls = [worker.stub.RunClient() for worker in sub_workers] diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index e935539605c..271592ec432 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -838,76 +838,78 @@ class PythonAsyncIOLanguage: channels=1, client_threads_per_cq=1, server_threads_per_cq=1, - async_client_threads=7, - unconstrained_client=True, + async_client_threads=1, + unconstrained_client='async', + categories=[SMOKETEST, SCALABLE]) + + yield _ping_pong_scenario( + 'python_asyncio_generic_async_streaming_ping_pong', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_GENERIC_SERVER', + use_generic_payload=True, + categories=[SMOKETEST, SCALABLE]) + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_streaming_ping_pong', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER') + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER') + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + categories=[SMOKETEST, SCALABLE]) + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_qps_unconstrained', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + async_client_threads=1, + unconstrained_client='async') + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_streaming_qps_unconstrained', + rpc_type='STREAMING', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + async_client_threads=1, + unconstrained_client='async') + + yield _ping_pong_scenario( + 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + server_language='python_asyncio', + async_server_threads=1, categories=[SMOKETEST, SCALABLE]) - # yield _ping_pong_scenario( - # 'python_asyncio_generic_async_streaming_ping_pong', - # rpc_type='STREAMING', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_GENERIC_SERVER', - # use_generic_payload=True, - # categories=[SMOKETEST, SCALABLE]) - - # yield _ping_pong_scenario( - # 'python_asyncio_protobuf_async_streaming_ping_pong', - # rpc_type='STREAMING', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_SERVER') - - # yield _ping_pong_scenario( - # 'python_asyncio_protobuf_async_unary_ping_pong', - # rpc_type='UNARY', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_SERVER') - - # yield _ping_pong_scenario( - # 'python_asyncio_protobuf_async_unary_ping_pong', - # rpc_type='UNARY', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_SERVER', - # categories=[SMOKETEST, SCALABLE]) - - # yield _ping_pong_scenario( - # 'python_asyncio_protobuf_async_unary_qps_unconstrained', - # rpc_type='UNARY', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_SERVER', - # unconstrained_client='async') - - # yield _ping_pong_scenario( - # 'python_asyncio_protobuf_async_streaming_qps_unconstrained', - # rpc_type='STREAMING', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_SERVER', - # unconstrained_client='async') - - # yield _ping_pong_scenario( - # 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong', - # rpc_type='UNARY', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_SERVER', - # server_language='python_asyncio', - # async_server_threads=1, - # categories=[SMOKETEST, SCALABLE]) - - # yield _ping_pong_scenario( - # 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', - # rpc_type='STREAMING', - # client_type='SYNC_CLIENT', - # server_type='ASYNC_SERVER', - # server_language='python_asyncio', - # async_server_threads=1) - - # yield _ping_pong_scenario( - # 'python_asyncio_protobuf_async_unary_ping_pong_1MB', - # rpc_type='UNARY', - # client_type='ASYNC_CLIENT', - # server_type='ASYNC_SERVER', - # req_size=1024 * 1024, - # resp_size=1024 * 1024, - # categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( + 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', + rpc_type='STREAMING', + client_type='SYNC_CLIENT', + server_type='ASYNC_SERVER', + server_language='python_asyncio', + async_server_threads=1) + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong_1MB', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + req_size=1024 * 1024, + resp_size=1024 * 1024, + categories=[SMOKETEST, SCALABLE]) def __str__(self): return 'python_asyncio' From 8bede2fe91dbbee2d049433e0673e9fbf6d4ed69 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 09:58:44 -0800 Subject: [PATCH 093/129] Explicitly disable fork support --- tools/run_tests/performance/run_worker_python_asyncio.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/performance/run_worker_python_asyncio.sh b/tools/run_tests/performance/run_worker_python_asyncio.sh index 4b5f018f181..fda9457ca08 100755 --- a/tools/run_tests/performance/run_worker_python_asyncio.sh +++ b/tools/run_tests/performance/run_worker_python_asyncio.sh @@ -17,4 +17,6 @@ set -ex cd "$(dirname "$0")/../../.." -PYTHONPATH=src/python/grpcio_tests:src/python/gens py36_native/bin/python src/python/grpcio_tests/tests_aio/benchmark/worker.py "$@" +export GRPC_ENABLE_FORK_SUPPORT=0 +export PYTHONPATH=src/python/grpcio_tests:src/python/gens +py36_native/bin/python src/python/grpcio_tests/tests_aio/benchmark/worker.py "$@" From 94525e583181638ea39ff6e8dca13b156a8308b6 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 10:22:49 -0800 Subject: [PATCH 094/129] Parallelize sub worker creation --- .../tests_aio/benchmark/worker_servicer.py | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 3513523ea78..4e2ce6a6c0b 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -50,10 +50,6 @@ def _get_server_status(start_time: float, end_time: float, def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: - if config.async_server_threads != 1: - _LOGGER.warning('config.async_server_threads [%d] != 1', - config.async_server_threads) - server = aio.server() if config.server_type == control_pb2.ASYNC_SERVER: servicer = benchmark_servicer.BenchmarkServicer() @@ -154,10 +150,19 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): self._loop = asyncio.get_event_loop() self._quit_event = asyncio.Event() + # async def _run_single_server(self, config, request_iterator, context): + # server, port = _create_server(config) + # await server.start() + async def RunServer(self, request_iterator, context): config = (await context.read()).setup _LOGGER.info('Received ServerConfig: %s', config) + if config.async_server_threads <= 0: + _LOGGER.info('async_server_threads can\'t be [%d]', config.async_server_threads) + _LOGGER.info('Using async_server_threads == [%d]', _NUM_CORES) + config.async_server_threads = _NUM_CORES + server, port = _create_server(config) await server.start() _LOGGER.info('Server started at port [%d]', port) @@ -208,13 +213,17 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): _LOGGER.info('Received ClientConfig: %s', config) if config.async_client_threads <= 0: - raise ValueError('async_client_threads can\'t be [%d]' % config.async_client_threads) - elif config.async_client_threads == 1: + _LOGGER.info('async_client_threads can\'t be [%d]', config.async_client_threads) + _LOGGER.info('Using async_client_threads == [%d]', _NUM_CORES) + config.async_client_threads = _NUM_CORES + + if config.async_client_threads == 1: await self._run_single_client(config, request_iterator, context) else: - sub_workers = [] - for _ in range(config.async_client_threads): - sub_workers.append(await _create_sub_worker()) + sub_workers = await asyncio.gather(*( + _create_sub_worker() + for _ in range(config.async_client_threads) + )) calls = [worker.stub.RunClient() for worker in sub_workers] @@ -259,7 +268,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): await worker.process.wait() _LOGGER.info('Sub worker [%s] quit', worker) - async def CoreCount(self, unused_request, unused_context): + @staticmethod + async def CoreCount(unused_request, unused_context): return control_pb2.CoreResponse(cores=_NUM_CORES) async def QuitWorker(self, unused_request, unused_context): From 7cb055b035c7e33862fabe5d5b7266cc587b22fd Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 10:48:43 -0800 Subject: [PATCH 095/129] Make server parallel-able --- .../tests_aio/benchmark/worker_servicer.py | 131 +++++++++++++----- 1 file changed, 99 insertions(+), 32 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 4e2ce6a6c0b..8c438cc8d9b 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -33,11 +33,16 @@ from tests.unit.framework.common import get_socket _NUM_CORES = multiprocessing.cpu_count() _NUM_CORE_PYTHON_CAN_USE = 1 +_WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' +_SubWorker = collections.namedtuple( + '_SubWorker', ['process', 'port', 'channel', 'stub']) + _LOGGER = logging.getLogger(__name__) -def _get_server_status(start_time: float, end_time: float, +def _get_server_status(start_time: float, + end_time: float, port: int) -> control_pb2.ServerStatus: end_time = time.time() elapsed_time = end_time - start_time @@ -46,11 +51,13 @@ def _get_server_status(start_time: float, end_time: float, time_system=elapsed_time) return control_pb2.ServerStatus(stats=stats, port=port, - cores=_NUM_CORE_PYTHON_CAN_USE) + cores=_NUM_CORES) def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: - server = aio.server() + server = aio.server(options=( + ('grpc.so_reuseport', 1), + )) if config.server_type == control_pb2.ASYNC_SERVER: servicer = benchmark_servicer.BenchmarkServicer() benchmark_service_pb2_grpc.add_BenchmarkServiceServicer_to_server( @@ -84,7 +91,7 @@ def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: def _get_client_status(start_time: float, end_time: float, qps_data: histogram.Histogram - ) -> control_pb2.ClientStatus: + ) -> control_pb2.ClientStatus: latencies = qps_data.get_data() end_time = time.time() elapsed_time = end_time - start_time @@ -97,7 +104,7 @@ def _get_client_status(start_time: float, end_time: float, def _create_client(server: str, config: control_pb2.ClientConfig, qps_data: histogram.Histogram - ) -> benchmark_client.BenchmarkClient: + ) -> benchmark_client.BenchmarkClient: if config.load_params.WhichOneof('load') != 'closed_loop': raise NotImplementedError( f'Unsupported load parameter {config.load_params}') @@ -117,25 +124,28 @@ def _create_client(server: str, config: control_pb2.ClientConfig, return client_type(server, config, qps_data) -WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' -SubWorker = collections.namedtuple('SubWorker', ['process', 'port', 'channel', 'stub']) +def _pick_an_unused_port() -> int: + _, port, sock = get_socket() + sock.close() + return port + +async def _create_sub_worker() -> _SubWorker: + port = _pick_an_unused_port() -async def _create_sub_worker() -> SubWorker: - address, port, sock = get_socket() - sock.close() _LOGGER.info('Creating sub worker at port [%d]...', port) process = await asyncio.create_subprocess_exec( sys.executable, - WORKER_ENTRY_FILE, + _WORKER_ENTRY_FILE, '--driver_port', str(port) ) - _LOGGER.info('Created sub worker process for port [%d] at pid [%d]', port, process.pid) - channel = aio.insecure_channel(f'{address}:{port}') + _LOGGER.info( + 'Created sub worker process for port [%d] at pid [%d]', port, process.pid) + channel = aio.insecure_channel(f'localhost:{port}') _LOGGER.info('Waiting for sub worker at port [%d]', port) await aio.channel_ready(channel) stub = worker_service_pb2_grpc.WorkerServiceStub(channel) - return SubWorker( + return _SubWorker( process=process, port=port, channel=channel, @@ -150,34 +160,89 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): self._loop = asyncio.get_event_loop() self._quit_event = asyncio.Event() - # async def _run_single_server(self, config, request_iterator, context): - # server, port = _create_server(config) - # await server.start() - - async def RunServer(self, request_iterator, context): - config = (await context.read()).setup - _LOGGER.info('Received ServerConfig: %s', config) - - if config.async_server_threads <= 0: - _LOGGER.info('async_server_threads can\'t be [%d]', config.async_server_threads) - _LOGGER.info('Using async_server_threads == [%d]', _NUM_CORES) - config.async_server_threads = _NUM_CORES - + async def _run_single_server(self, config, request_iterator, context): server, port = _create_server(config) await server.start() _LOGGER.info('Server started at port [%d]', port) start_time = time.time() - yield _get_server_status(start_time, start_time, port) + await context.write(_get_server_status(start_time, start_time, port)) async for request in request_iterator: end_time = time.time() status = _get_server_status(start_time, end_time, port) if request.mark.reset: start_time = end_time - yield status + await context.write(status) await server.stop(None) + async def RunServer(self, request_iterator, context): + config_request = await context.read() + config = config_request.setup + _LOGGER.info('Received ServerConfig: %s', config) + + if config.async_server_threads <= 0: + _LOGGER.info( + 'async_server_threads can\'t be [%d]', config.async_server_threads) + _LOGGER.info('Using async_server_threads == [%d]', _NUM_CORES) + config.async_server_threads = _NUM_CORES + + if config.port == 0: + config.port = _pick_an_unused_port() + _LOGGER.info('Port picked [%d]', config.port) + + if config.async_server_threads == 1: + await self._run_single_server(config, request_iterator, context) + else: + sub_workers = await asyncio.gather(*( + _create_sub_worker() + for _ in range(config.async_server_threads) + )) + + calls = [worker.stub.RunServer() for worker in sub_workers] + + config_request.setup.async_server_threads = 1 + + for call in calls: + await call.write(config_request) + # An empty status indicates the peer is ready + await call.read() + + start_time = time.time() + await context.write(_get_server_status( + start_time, + start_time, + config.port, + )) + + async for request in request_iterator: + end_time = time.time() + + for call in calls: + _LOGGER.debug('Fetching status...') + await call.write(request) + # Reports from sub workers doesn't matter + await call.read() + + status = _get_server_status( + start_time, + end_time, + config.port, + ) + if request.mark.reset: + start_time = end_time + await context.write(status) + + for call in calls: + await call.done_writing() + + for worker in sub_workers: + await worker.stub.QuitWorker(control_pb2.Void()) + await worker.channel.close() + _LOGGER.info('Waiting for sub worker [%s] to quit...', worker) + await worker.process.wait() + _LOGGER.info('Sub worker [%s] quit', worker) + async def _run_single_client(self, config, request_iterator, context): running_tasks = [] qps_data = histogram.Histogram(config.histogram_params.resolution, @@ -213,7 +278,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): _LOGGER.info('Received ClientConfig: %s', config) if config.async_client_threads <= 0: - _LOGGER.info('async_client_threads can\'t be [%d]', config.async_client_threads) + _LOGGER.info( + 'async_client_threads can\'t be [%d]', config.async_client_threads) _LOGGER.info('Using async_client_threads == [%d]', _NUM_CORES) config.async_client_threads = _NUM_CORES @@ -231,7 +297,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): for call in calls: await call.write(config_request) - # An empty status + # An empty status indicates the peer is ready await call.read() start_time = time.time() @@ -255,7 +321,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): if request.mark.reset: result.reset() start_time = time.time() - _LOGGER.debug('Reporting count=[%d]', status.stats.latencies.count) + _LOGGER.debug( + 'Reporting count=[%d]', status.stats.latencies.count) await context.write(status) for call in calls: From 88077403cb18dfff66fb3e61e0e2402c73564328 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 10:56:12 -0800 Subject: [PATCH 096/129] Add full capacity benchmark scenario --- tools/run_tests/performance/scenario_config.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index 271592ec432..fd2761de50f 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -830,15 +830,28 @@ class PythonAsyncIOLanguage: def scenarios(self): yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_unary_ping_pong', + 'python_asyncio_protobuf_async_unary_ping_pong_64_max', rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', outstanding=64, channels=1, + async_client_threads=0, + async_server_threads=0, + unconstrained_client='async', + categories=[SMOKETEST, SCALABLE]) + + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong_128_1thread', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + outstanding=128, + channels=1, client_threads_per_cq=1, server_threads_per_cq=1, async_client_threads=1, + async_server_threads=1, unconstrained_client='async', categories=[SMOKETEST, SCALABLE]) From e9b1cddb973c05c2e8f284f593f4f18529556562 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 11:57:30 -0800 Subject: [PATCH 097/129] Fix the cpp server scenarios --- tools/run_tests/performance/scenario_config.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index fd2761de50f..d03fa7a49ee 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -903,17 +903,15 @@ class PythonAsyncIOLanguage: rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - server_language='python_asyncio', - async_server_threads=1, + server_language='c++', categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', rpc_type='STREAMING', - client_type='SYNC_CLIENT', + client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - server_language='python_asyncio', - async_server_threads=1) + server_language='c++') yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong_1MB', From 3a46fc73dd54224bfa5e43ee49af650a47c3aea5 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 14:29:07 -0800 Subject: [PATCH 098/129] Use Bazel to build and run aio qps worker --- .../helper_scripts/prepare_build_linux_perf_multilang_rc | 5 +++++ tools/run_tests/performance/build_performance.sh | 2 +- tools/run_tests/performance/run_worker_python_asyncio.sh | 4 +--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc b/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc index bb1287fee51..a3f27c90042 100644 --- a/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc +++ b/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc @@ -37,4 +37,9 @@ gsutil cp gs://grpc-testing-secrets/grpc_kokoro_performance_ssh_keys/id_rsa ~/.s echo -e 'Host grpc-kokoro-performance*\n\tStrictHostKeyChecking no' >> ~/.ssh/config chmod 600 ~/.ssh/id_rsa ~/.ssh/config +# Install Bazel through apt +curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - +echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list +sudo apt update && sudo apt install -y bazel + git submodule update --init diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 8a15d3da999..1494cbe572e 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -73,7 +73,7 @@ do python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python2.7 --build_only -j 8 ;; "python_asyncio") - python tools/run_tests/run_tests.py -l python -c "$CONFIG" --compiler python3.6 --build_only -j 8 + bazel build -c opt //src/python/grpcio_tests/tests_aio/benchmark:worker ;; *) python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --build_only -j 8 diff --git a/tools/run_tests/performance/run_worker_python_asyncio.sh b/tools/run_tests/performance/run_worker_python_asyncio.sh index fda9457ca08..2480d242274 100755 --- a/tools/run_tests/performance/run_worker_python_asyncio.sh +++ b/tools/run_tests/performance/run_worker_python_asyncio.sh @@ -17,6 +17,4 @@ set -ex cd "$(dirname "$0")/../../.." -export GRPC_ENABLE_FORK_SUPPORT=0 -export PYTHONPATH=src/python/grpcio_tests:src/python/gens -py36_native/bin/python src/python/grpcio_tests/tests_aio/benchmark/worker.py "$@" +blaze-bin/src/python/grpcio_tests/tests_aio/benchmark:worker "$@" From a345803331a93bc9d315b532c6a97dcbfedd8000 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 14:30:18 -0800 Subject: [PATCH 099/129] Fix the channel_ready usage --- src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 8c438cc8d9b..aea186c5393 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -143,7 +143,7 @@ async def _create_sub_worker() -> _SubWorker: 'Created sub worker process for port [%d] at pid [%d]', port, process.pid) channel = aio.insecure_channel(f'localhost:{port}') _LOGGER.info('Waiting for sub worker at port [%d]', port) - await aio.channel_ready(channel) + await channel.channel_ready() stub = worker_service_pb2_grpc.WorkerServiceStub(channel) return _SubWorker( process=process, From 50840080fba1ec952db7ea609d8db81c9b9d8213 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 14:34:10 -0800 Subject: [PATCH 100/129] Make YAPF happy --- .../tests_aio/benchmark/worker_servicer.py | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index aea186c5393..18a6e3f2207 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -34,30 +34,24 @@ from tests.unit.framework.common import get_socket _NUM_CORES = multiprocessing.cpu_count() _NUM_CORE_PYTHON_CAN_USE = 1 _WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' -_SubWorker = collections.namedtuple( - '_SubWorker', ['process', 'port', 'channel', 'stub']) - +_SubWorker = collections.namedtuple('_SubWorker', + ['process', 'port', 'channel', 'stub']) _LOGGER = logging.getLogger(__name__) -def _get_server_status(start_time: float, - end_time: float, +def _get_server_status(start_time: float, end_time: float, port: int) -> control_pb2.ServerStatus: end_time = time.time() elapsed_time = end_time - start_time stats = stats_pb2.ServerStats(time_elapsed=elapsed_time, time_user=elapsed_time, time_system=elapsed_time) - return control_pb2.ServerStatus(stats=stats, - port=port, - cores=_NUM_CORES) + return control_pb2.ServerStatus(stats=stats, port=port, cores=_NUM_CORES) def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: - server = aio.server(options=( - ('grpc.so_reuseport', 1), - )) + server = aio.server(options=(('grpc.so_reuseport', 1),)) if config.server_type == control_pb2.ASYNC_SERVER: servicer = benchmark_servicer.BenchmarkServicer() benchmark_service_pb2_grpc.add_BenchmarkServiceServicer_to_server( @@ -91,7 +85,7 @@ def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: def _get_client_status(start_time: float, end_time: float, qps_data: histogram.Histogram - ) -> control_pb2.ClientStatus: + ) -> control_pb2.ClientStatus: latencies = qps_data.get_data() end_time = time.time() elapsed_time = end_time - start_time @@ -104,7 +98,7 @@ def _get_client_status(start_time: float, end_time: float, def _create_client(server: str, config: control_pb2.ClientConfig, qps_data: histogram.Histogram - ) -> benchmark_client.BenchmarkClient: + ) -> benchmark_client.BenchmarkClient: if config.load_params.WhichOneof('load') != 'closed_loop': raise NotImplementedError( f'Unsupported load parameter {config.load_params}') @@ -134,13 +128,11 @@ async def _create_sub_worker() -> _SubWorker: port = _pick_an_unused_port() _LOGGER.info('Creating sub worker at port [%d]...', port) - process = await asyncio.create_subprocess_exec( - sys.executable, - _WORKER_ENTRY_FILE, - '--driver_port', str(port) - ) - _LOGGER.info( - 'Created sub worker process for port [%d] at pid [%d]', port, process.pid) + process = await asyncio.create_subprocess_exec(sys.executable, + _WORKER_ENTRY_FILE, + '--driver_port', str(port)) + _LOGGER.info('Created sub worker process for port [%d] at pid [%d]', port, + process.pid) channel = aio.insecure_channel(f'localhost:{port}') _LOGGER.info('Waiting for sub worker at port [%d]', port) await channel.channel_ready() @@ -182,8 +174,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): _LOGGER.info('Received ServerConfig: %s', config) if config.async_server_threads <= 0: - _LOGGER.info( - 'async_server_threads can\'t be [%d]', config.async_server_threads) + _LOGGER.info('async_server_threads can\'t be [%d]', + config.async_server_threads) _LOGGER.info('Using async_server_threads == [%d]', _NUM_CORES) config.async_server_threads = _NUM_CORES @@ -196,8 +188,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): else: sub_workers = await asyncio.gather(*( _create_sub_worker() - for _ in range(config.async_server_threads) - )) + for _ in range(config.async_server_threads))) calls = [worker.stub.RunServer() for worker in sub_workers] @@ -209,11 +200,12 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): await call.read() start_time = time.time() - await context.write(_get_server_status( - start_time, - start_time, - config.port, - )) + await context.write( + _get_server_status( + start_time, + start_time, + config.port, + )) async for request in request_iterator: end_time = time.time() @@ -278,8 +270,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): _LOGGER.info('Received ClientConfig: %s', config) if config.async_client_threads <= 0: - _LOGGER.info( - 'async_client_threads can\'t be [%d]', config.async_client_threads) + _LOGGER.info('async_client_threads can\'t be [%d]', + config.async_client_threads) _LOGGER.info('Using async_client_threads == [%d]', _NUM_CORES) config.async_client_threads = _NUM_CORES @@ -288,8 +280,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): else: sub_workers = await asyncio.gather(*( _create_sub_worker() - for _ in range(config.async_client_threads) - )) + for _ in range(config.async_client_threads))) calls = [worker.stub.RunClient() for worker in sub_workers] @@ -304,7 +295,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): result = histogram.Histogram(config.histogram_params.resolution, config.histogram_params.max_possible) end_time = time.time() - await context.write(_get_client_status(start_time, end_time, result)) + await context.write(_get_client_status(start_time, end_time, + result)) async for request in request_iterator: end_time = time.time() @@ -321,8 +313,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): if request.mark.reset: result.reset() start_time = time.time() - _LOGGER.debug( - 'Reporting count=[%d]', status.stats.latencies.count) + _LOGGER.debug('Reporting count=[%d]', + status.stats.latencies.count) await context.write(status) for call in calls: From f97ad240da87add49b31a3f063af289d5508bc59 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 15:10:10 -0800 Subject: [PATCH 101/129] Remove pdb trace point --- src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index 9cdab36d158..8e09c0b9a88 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -71,7 +71,7 @@ class BenchmarkClient(abc.ABC): self._concurrency = config.outstanding_rpcs_per_channel async def run(self) -> None: - await aio.channel_ready(self._channel) + await self._channel.channel_ready() async def stop(self) -> None: await self._channel.close() From c702f7238e98a7ea215e0acbdbf6416e4bbd3a42 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 6 Feb 2020 15:37:30 -0800 Subject: [PATCH 102/129] s/blaze/bazel/ --- tools/run_tests/performance/run_worker_python_asyncio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/performance/run_worker_python_asyncio.sh b/tools/run_tests/performance/run_worker_python_asyncio.sh index 2480d242274..7bf8d2f3bc0 100755 --- a/tools/run_tests/performance/run_worker_python_asyncio.sh +++ b/tools/run_tests/performance/run_worker_python_asyncio.sh @@ -17,4 +17,4 @@ set -ex cd "$(dirname "$0")/../../.." -blaze-bin/src/python/grpcio_tests/tests_aio/benchmark:worker "$@" +bazel-bin/src/python/grpcio_tests/tests_aio/benchmark/worker "$@" From 32d83a9c289dd998a19864d0e7ad2e523f1f78a6 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 7 Feb 2020 10:48:06 -0800 Subject: [PATCH 103/129] Use tools/bazel instead of installed bazel --- .../helper_scripts/prepare_build_linux_perf_multilang_rc | 5 ----- tools/run_tests/performance/build_performance.sh | 3 ++- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc b/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc index a3f27c90042..bb1287fee51 100644 --- a/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc +++ b/tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc @@ -37,9 +37,4 @@ gsutil cp gs://grpc-testing-secrets/grpc_kokoro_performance_ssh_keys/id_rsa ~/.s echo -e 'Host grpc-kokoro-performance*\n\tStrictHostKeyChecking no' >> ~/.ssh/config chmod 600 ~/.ssh/id_rsa ~/.ssh/config -# Install Bazel through apt -curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - -echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list -sudo apt update && sudo apt install -y bazel - git submodule update --init diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 1494cbe572e..92d2a7f17db 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -18,6 +18,7 @@ source ~/.rvm/scripts/rvm set -ex cd "$(dirname "$0")/../../.." +bazel=`pwd`/tools/bazel CONFIG=${CONFIG:-opt} @@ -73,7 +74,7 @@ do python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python2.7 --build_only -j 8 ;; "python_asyncio") - bazel build -c opt //src/python/grpcio_tests/tests_aio/benchmark:worker + $bazel build -c opt //src/python/grpcio_tests/tests_aio/benchmark:worker ;; *) python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --build_only -j 8 From df7d02c887e0a27ba8a48a24e7cf1470de205f98 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 7 Feb 2020 11:05:32 -0800 Subject: [PATCH 104/129] Make shellcheck happy --- tools/run_tests/performance/build_performance.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 92d2a7f17db..0923454f560 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -18,7 +18,7 @@ source ~/.rvm/scripts/rvm set -ex cd "$(dirname "$0")/../../.." -bazel=`pwd`/tools/bazel +bazel=$(pwd)/tools/bazel CONFIG=${CONFIG:-opt} From efe29d6945a803a3bafa98eef8850c693999573f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 10:25:10 -0800 Subject: [PATCH 105/129] Use the correct asyncio API --- .../grpcio_tests/tests_aio/benchmark/benchmark_client.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index 8e09c0b9a88..7e9a4b02958 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -16,6 +16,7 @@ import abc import asyncio import time +import logging import grpc from grpc.experimental import aio @@ -131,7 +132,7 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient): self._running = True senders = ( self._one_streamming_call() for _ in range(self._concurrency)) - await asyncio.wait(senders) + await asyncio.gather(*senders) self._stopped.set() async def stop(self): From 03e1bf107114861b7c8ad797ed69a08dd20e63a3 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 11:06:51 -0800 Subject: [PATCH 106/129] Fix already cancelled RPC --- .../grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 5 +++++ tools/run_tests/performance/scenario_config.py | 14 ++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 74b249bdf8f..c21b50425a6 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -333,6 +333,9 @@ async def _handle_unary_unary_rpc(object method_handler, object loop): # Receives request message cdef bytes request_raw = await _receive_message(rpc_state, loop) + if request_raw is None: + # The RPC was cancelled immediately after start on client side. + return # Deserializes the request message cdef object request_message = deserialize( @@ -364,6 +367,8 @@ async def _handle_unary_stream_rpc(object method_handler, object loop): # Receives request message cdef bytes request_raw = await _receive_message(rpc_state, loop) + if request_raw is None: + return # Deserializes the request message cdef object request_message = deserialize( diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index d03fa7a49ee..b7791afc4ce 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -836,8 +836,6 @@ class PythonAsyncIOLanguage: server_type='ASYNC_SERVER', outstanding=64, channels=1, - async_client_threads=0, - async_server_threads=0, unconstrained_client='async', categories=[SMOKETEST, SCALABLE]) @@ -848,8 +846,6 @@ class PythonAsyncIOLanguage: server_type='ASYNC_SERVER', outstanding=128, channels=1, - client_threads_per_cq=1, - server_threads_per_cq=1, async_client_threads=1, async_server_threads=1, unconstrained_client='async', @@ -860,6 +856,7 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER', + async_server_threads=1, use_generic_payload=True, categories=[SMOKETEST, SCALABLE]) @@ -867,19 +864,22 @@ class PythonAsyncIOLanguage: 'python_asyncio_protobuf_async_streaming_ping_pong', rpc_type='STREAMING', client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER') + server_type='ASYNC_SERVER', + async_server_threads=1) yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong', rpc_type='UNARY', client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER') + server_type='ASYNC_SERVER', + async_server_threads=1) yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong', rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', + async_server_threads=1, categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( @@ -887,7 +887,6 @@ class PythonAsyncIOLanguage: rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - async_client_threads=1, unconstrained_client='async') yield _ping_pong_scenario( @@ -895,7 +894,6 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - async_client_threads=1, unconstrained_client='async') yield _ping_pong_scenario( From 68be8a7742c889cdd0ba11654ee19a593a7e02e0 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 13:21:51 -0800 Subject: [PATCH 107/129] Improve log readability & polish scenario parameters --- .../tests_aio/benchmark/worker_servicer.py | 19 ++++++-- .../run_tests/performance/scenario_config.py | 47 +++++++++++-------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 18a6e3f2207..f23b07c9151 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -34,12 +34,24 @@ from tests.unit.framework.common import get_socket _NUM_CORES = multiprocessing.cpu_count() _NUM_CORE_PYTHON_CAN_USE = 1 _WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' -_SubWorker = collections.namedtuple('_SubWorker', - ['process', 'port', 'channel', 'stub']) _LOGGER = logging.getLogger(__name__) +class _SubWorker( + collections.namedtuple('_SubWorker', + ['process', 'port', 'channel', 'stub'])): + + def _repr(self): + return f'<_SubWorker pid={self.process.pid} port={self.port}>' + + def __repr__(self): + return self._repr() + + def __str__(self): + return self._repr() + + def _get_server_status(start_time: float, end_time: float, port: int) -> control_pb2.ServerStatus: end_time = time.time() @@ -231,9 +243,8 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): for worker in sub_workers: await worker.stub.QuitWorker(control_pb2.Void()) await worker.channel.close() - _LOGGER.info('Waiting for sub worker [%s] to quit...', worker) + _LOGGER.info('Waiting for [%s] to quit...', worker) await worker.process.wait() - _LOGGER.info('Sub worker [%s] quit', worker) async def _run_single_client(self, config, request_iterator, context): running_tasks = [] diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index b7791afc4ce..c8c7f8875ed 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -829,27 +829,34 @@ class PythonAsyncIOLanguage: return 1200 def scenarios(self): - yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_unary_ping_pong_64_max', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - outstanding=64, - channels=1, - unconstrained_client='async', - categories=[SMOKETEST, SCALABLE]) + for outstanding in [32, 64, 128, 256]: + for channels in [1, 5]: + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong_%dx%d_max' % + ( + outstanding, + channels, + ), + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + outstanding=outstanding, + channels=channels, + unconstrained_client='async', + categories=[SMOKETEST, SCALABLE]) - yield _ping_pong_scenario( - 'python_asyncio_protobuf_async_unary_ping_pong_128_1thread', - rpc_type='UNARY', - client_type='ASYNC_CLIENT', - server_type='ASYNC_SERVER', - outstanding=128, - channels=1, - async_client_threads=1, - async_server_threads=1, - unconstrained_client='async', - categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( + 'python_asyncio_protobuf_async_unary_ping_pong_%d_1thread' % + outstanding, + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + outstanding=outstanding, + channels=1, + async_client_threads=1, + async_server_threads=1, + unconstrained_client='async', + categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_generic_async_streaming_ping_pong', From 4819d8ba6e33fcb1b85e4d2a45976050cc0afc32 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 14:26:45 -0800 Subject: [PATCH 108/129] Improve scenario configs & plumb through channel arguments --- .../tests_aio/benchmark/benchmark_client.py | 19 +++++++++++++++---- .../tests_aio/benchmark/worker_servicer.py | 8 +++++++- .../run_tests/performance/scenario_config.py | 14 ++++++++------ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index 7e9a4b02958..1c0b2ea3d1e 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -17,6 +17,7 @@ import abc import asyncio import time import logging +import random import grpc from grpc.experimental import aio @@ -41,16 +42,26 @@ class BenchmarkClient(abc.ABC): def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + unique_option = (('iv', random.random()),) + channel_args = tuple( + (arg.name, arg.str_value) if arg.HasField('str_value') else ( + arg.name, int(arg.int_value)) for arg in config.channel_args) + # Creates the channel if config.HasField('security_params'): channel_credentials = grpc.ssl_channel_credentials( - resources.test_root_certificates()) - self._channel = aio.secure_channel(address, channel_credentials, (( + resources.test_root_certificates(),) + server_host_override_option = (( 'grpc.ssl_target_name_override', config.security_params.server_host_override, - ),)) + ),) + self._channel = aio.secure_channel( + address, channel_credentials, + unique_option + channel_args + server_host_override_option) else: - self._channel = aio.insecure_channel(address) + self._channel = aio.insecure_channel(address, + options=unique_option + + channel_args) # Creates the stub if config.payload_config.WhichOneof('payload') == 'simple_params': diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index f23b07c9151..aea8b88cc55 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -63,7 +63,13 @@ def _get_server_status(start_time: float, end_time: float, def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: - server = aio.server(options=(('grpc.so_reuseport', 1),)) + channel_args = tuple( + (arg.name, + arg.str_value) if arg.HasField('str_value') else (arg.name, + int(arg.int_value)) + for arg in config.channel_args) + + server = aio.server(options=channel_args + (('grpc.so_reuseport', 1),)) if config.server_type == control_pb2.ASYNC_SERVER: servicer = benchmark_servicer.BenchmarkServicer() benchmark_service_pb2_grpc.add_BenchmarkServiceServicer_to_server( diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index c8c7f8875ed..376690184d2 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -829,8 +829,8 @@ class PythonAsyncIOLanguage: return 1200 def scenarios(self): - for outstanding in [32, 64, 128, 256]: - for channels in [1, 5]: + for outstanding in [32, 64, 128, 256, 512]: + for channels in [1, 4]: yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong_%dx%d_max' % ( @@ -843,7 +843,7 @@ class PythonAsyncIOLanguage: outstanding=outstanding, channels=channels, unconstrained_client='async', - categories=[SMOKETEST, SCALABLE]) + categories=[SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong_%d_1thread' % @@ -856,7 +856,7 @@ class PythonAsyncIOLanguage: async_client_threads=1, async_server_threads=1, unconstrained_client='async', - categories=[SMOKETEST, SCALABLE]) + categories=[SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_generic_async_streaming_ping_pong', @@ -872,14 +872,16 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - async_server_threads=1) + async_server_threads=1, + categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong', rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - async_server_threads=1) + async_server_threads=1, + categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong', From 72514e9bf48452e0e3b2a3fd21552c731543f24d Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 14:45:55 -0800 Subject: [PATCH 109/129] Adding more comments & fix the outstanding channel count --- .../grpcio_tests/tests_aio/benchmark/benchmark_client.py | 3 +++ tools/run_tests/performance/scenario_config.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index 1c0b2ea3d1e..57d7e3f400b 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -42,7 +42,10 @@ class BenchmarkClient(abc.ABC): def __init__(self, address: str, config: control_pb2.ClientConfig, hist: histogram.Histogram): + # Disables underlying reuse of subchannels unique_option = (('iv', random.random()),) + + # Parses the channel argument from config channel_args = tuple( (arg.name, arg.str_value) if arg.HasField('str_value') else ( arg.name, int(arg.int_value)) for arg in config.channel_args) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index 376690184d2..c99e105da23 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -829,7 +829,7 @@ class PythonAsyncIOLanguage: return 1200 def scenarios(self): - for outstanding in [32, 64, 128, 256, 512]: + for outstanding in [64, 128, 256]: for channels in [1, 4]: yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong_%dx%d_max' % @@ -840,7 +840,7 @@ class PythonAsyncIOLanguage: rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - outstanding=outstanding, + outstanding=outstanding * channels, channels=channels, unconstrained_client='async', categories=[SCALABLE]) From f89448a9d526b9787fb7a1f40af1a671b771daac Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 15:05:40 -0800 Subject: [PATCH 110/129] Adding more comments --- .../tests_aio/benchmark/worker_servicer.py | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index aea8b88cc55..b1b144d2d18 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -13,13 +13,13 @@ # limitations under the License. import asyncio +import collections import logging -import os import multiprocessing +import os import sys import time from typing import Tuple -import collections import grpc from grpc.experimental import aio @@ -28,11 +28,10 @@ from src.proto.grpc.testing import (benchmark_service_pb2_grpc, control_pb2, stats_pb2, worker_service_pb2_grpc) from tests.qps import histogram from tests.unit import resources -from tests_aio.benchmark import benchmark_client, benchmark_servicer from tests.unit.framework.common import get_socket +from tests_aio.benchmark import benchmark_client, benchmark_servicer _NUM_CORES = multiprocessing.cpu_count() -_NUM_CORE_PYTHON_CAN_USE = 1 _WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' _LOGGER = logging.getLogger(__name__) @@ -41,6 +40,7 @@ _LOGGER = logging.getLogger(__name__) class _SubWorker( collections.namedtuple('_SubWorker', ['process', 'port', 'channel', 'stub'])): + """A data class that holds information about a child qps worker.""" def _repr(self): return f'<_SubWorker pid={self.process.pid} port={self.port}>' @@ -54,6 +54,7 @@ class _SubWorker( def _get_server_status(start_time: float, end_time: float, port: int) -> control_pb2.ServerStatus: + """Creates ServerStatus proto message.""" end_time = time.time() elapsed_time = end_time - start_time stats = stats_pb2.ServerStats(time_elapsed=elapsed_time, @@ -63,6 +64,7 @@ def _get_server_status(start_time: float, end_time: float, def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: + """Creates a server object according to the ServerConfig.""" channel_args = tuple( (arg.name, arg.str_value) if arg.HasField('str_value') else (arg.name, @@ -104,6 +106,7 @@ def _create_server(config: control_pb2.ServerConfig) -> Tuple[aio.Server, int]: def _get_client_status(start_time: float, end_time: float, qps_data: histogram.Histogram ) -> control_pb2.ClientStatus: + """Creates ClientStatus proto message.""" latencies = qps_data.get_data() end_time = time.time() elapsed_time = end_time - start_time @@ -117,6 +120,7 @@ def _get_client_status(start_time: float, end_time: float, def _create_client(server: str, config: control_pb2.ClientConfig, qps_data: histogram.Histogram ) -> benchmark_client.BenchmarkClient: + """Creates a client object according to the ClientConfig.""" if config.load_params.WhichOneof('load') != 'closed_loop': raise NotImplementedError( f'Unsupported load parameter {config.load_params}') @@ -137,12 +141,14 @@ def _create_client(server: str, config: control_pb2.ClientConfig, def _pick_an_unused_port() -> int: + """Picks an unused TCP port.""" _, port, sock = get_socket() sock.close() return port async def _create_sub_worker() -> _SubWorker: + """Creates a child qps worker as a subprocess.""" port = _pick_an_unused_port() _LOGGER.info('Creating sub worker at port [%d]...', port) @@ -202,8 +208,10 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): _LOGGER.info('Port picked [%d]', config.port) if config.async_server_threads == 1: + # If async_server_threads == 1, start the server in this process. await self._run_single_server(config, request_iterator, context) else: + # If async_server_threads > 1, offload to other processes. sub_workers = await asyncio.gather(*( _create_sub_worker() for _ in range(config.async_server_threads))) @@ -225,11 +233,12 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): config.port, )) + _LOGGER.info('Servers are ready to serve.') + async for request in request_iterator: end_time = time.time() for call in calls: - _LOGGER.debug('Fetching status...') await call.write(request) # Reports from sub workers doesn't matter await call.read() @@ -293,8 +302,10 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): config.async_client_threads = _NUM_CORES if config.async_client_threads == 1: + # If async_client_threads == 1, run the benchmark in this process. await self._run_single_client(config, request_iterator, context) else: + # If async_client_threads > 1, offload the work to other processes. sub_workers = await asyncio.gather(*( _create_sub_worker() for _ in range(config.async_client_threads))) From 5a7093639ff5f8b3a6592b16d67a366dacbbfaf8 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 15:17:16 -0800 Subject: [PATCH 111/129] Suppress server stop log spamming --- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 5 +++++ .../grpcio_tests/tests_aio/benchmark/benchmark_client.py | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index c21b50425a6..6ffc4695bf5 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -476,6 +476,11 @@ async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop): except _ServerStoppedError: _LOGGER.info('Aborting RPC due to server stop.') except Exception as e: + if rpc_state.server._status == AIO_SERVER_STATUS_STOPPED: + if isinstance(asyncio.CancelledError, e) or isinstance(ExecuteBatchError, e): + _LOGGER.info('Aborting RPC due to server stop.') + return + _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % ( type(e).__name__, _decode(rpc_state.method()), diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index 57d7e3f400b..51e399a8751 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -140,6 +140,8 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient): await call.write(self._request) await call.read() self._record_query_time(time.time() - start_time) + await call.done_writing() + assert grpc.StatusCode.OK == await call.code() async def run(self): await super().run() From 37552d3e628631554ad785e4fb9934cc8dd44968 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 15:20:12 -0800 Subject: [PATCH 112/129] Restrucutre exception catches --- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 6ffc4695bf5..0ba62f8eb56 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -477,7 +477,7 @@ async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop): _LOGGER.info('Aborting RPC due to server stop.') except Exception as e: if rpc_state.server._status == AIO_SERVER_STATUS_STOPPED: - if isinstance(asyncio.CancelledError, e) or isinstance(ExecuteBatchError, e): + if isinstance(ExecuteBatchError, e): _LOGGER.info('Aborting RPC due to server stop.') return From 728f5881a2fb01ef906244ec0215e2739799f5f1 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 15:26:44 -0800 Subject: [PATCH 113/129] Remove unused exception check condition --- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 0ba62f8eb56..c21b50425a6 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -476,11 +476,6 @@ async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop): except _ServerStoppedError: _LOGGER.info('Aborting RPC due to server stop.') except Exception as e: - if rpc_state.server._status == AIO_SERVER_STATUS_STOPPED: - if isinstance(ExecuteBatchError, e): - _LOGGER.info('Aborting RPC due to server stop.') - return - _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % ( type(e).__name__, _decode(rpc_state.method()), From 50a7c863ddf262b3261f77d2ab4073b57d65246b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 10 Feb 2020 15:35:49 -0800 Subject: [PATCH 114/129] Add nto1 scenario between aio and C++ --- tools/run_tests/performance/scenario_config.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index c99e105da23..88a7410424a 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -906,13 +906,23 @@ class PythonAsyncIOLanguage: unconstrained_client='async') yield _ping_pong_scenario( - 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong', + 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong_1thread', rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', server_language='c++', categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( + 'python_asyncio_to_cpp_protobuf_async_unary_ping_pong_max', + rpc_type='UNARY', + client_type='ASYNC_CLIENT', + server_type='ASYNC_SERVER', + unconstrained_client='async', + async_client_threads=0, + server_language='c++', + categories=[SMOKETEST, SCALABLE]) + yield _ping_pong_scenario( 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', rpc_type='STREAMING', From c22b161d4eeb05a9f3e9308deb80fab6087e5b6d Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 13:13:56 -0800 Subject: [PATCH 115/129] Improve benchmark automations: 1. Use monotonic time; 2. Improve readabilities; 3. Add two more fields for number of processes. --- src/proto/grpc/testing/control.proto | 6 ++ .../tests_aio/benchmark/benchmark_client.py | 5 +- .../tests_aio/benchmark/worker_servicer.py | 70 +++++++++---------- .../run_tests/performance/scenario_config.py | 40 +++++++---- 4 files changed, 70 insertions(+), 51 deletions(-) diff --git a/src/proto/grpc/testing/control.proto b/src/proto/grpc/testing/control.proto index 91255d14415..742b21926e7 100644 --- a/src/proto/grpc/testing/control.proto +++ b/src/proto/grpc/testing/control.proto @@ -117,6 +117,9 @@ message ClientConfig { // If 0, disabled. Else, specifies the period between gathering latency // medians in milliseconds. int32 median_latency_collection_interval_millis = 20; + + // Number of client processes. 0 indicates no restriction. + int32 client_processes = 21; } message ClientStatus { ClientStats stats = 1; } @@ -163,6 +166,9 @@ message ServerConfig { // Buffer pool size (no buffer pool specified if unset) int32 resource_quota_size = 1001; repeated ChannelArg channel_args = 1002; + + // Number of server processes. 0 indicates no restriction. + int32 server_processes = 21; } message ServerArgs { diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index 51e399a8751..b36e0e42828 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -104,9 +104,9 @@ class UnaryAsyncBenchmarkClient(BenchmarkClient): self._stopped = asyncio.Event() async def _send_request(self): - start_time = time.time() + start_time = time.monotonic() await self._stub.UnaryCall(self._request) - self._record_query_time(time.time() - start_time) + self._record_query_time(time.monotonic() - start_time) async def _infinite_sender(self) -> None: while self._running: @@ -141,7 +141,6 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient): await call.read() self._record_query_time(time.time() - start_time) await call.done_writing() - assert grpc.StatusCode.OK == await call.code() async def run(self): await super().run() diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index b1b144d2d18..b0c15a09bb0 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -55,8 +55,9 @@ class _SubWorker( def _get_server_status(start_time: float, end_time: float, port: int) -> control_pb2.ServerStatus: """Creates ServerStatus proto message.""" - end_time = time.time() + end_time = time.monotonic() elapsed_time = end_time - start_time + # TODO(lidiz) Collect accurate time system to compute QPS/core-second. stats = stats_pb2.ServerStats(time_elapsed=elapsed_time, time_user=elapsed_time, time_system=elapsed_time) @@ -108,8 +109,9 @@ def _get_client_status(start_time: float, end_time: float, ) -> control_pb2.ClientStatus: """Creates ClientStatus proto message.""" latencies = qps_data.get_data() - end_time = time.time() + end_time = time.monotonic() elapsed_time = end_time - start_time + # TODO(lidiz) Collect accurate time system to compute QPS/core-second. stats = stats_pb2.ClientStats(latencies=latencies, time_elapsed=elapsed_time, time_user=elapsed_time, @@ -181,11 +183,11 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): await server.start() _LOGGER.info('Server started at port [%d]', port) - start_time = time.time() + start_time = time.monotonic() await context.write(_get_server_status(start_time, start_time, port)) async for request in request_iterator: - end_time = time.time() + end_time = time.monotonic() status = _get_server_status(start_time, end_time, port) if request.mark.reset: start_time = end_time @@ -197,35 +199,32 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): config = config_request.setup _LOGGER.info('Received ServerConfig: %s', config) - if config.async_server_threads <= 0: - _LOGGER.info('async_server_threads can\'t be [%d]', - config.async_server_threads) - _LOGGER.info('Using async_server_threads == [%d]', _NUM_CORES) - config.async_server_threads = _NUM_CORES + if config.server_processes <= 0: + _LOGGER.info('Using server_processes == [%d]', _NUM_CORES) + config.server_processes = _NUM_CORES if config.port == 0: config.port = _pick_an_unused_port() _LOGGER.info('Port picked [%d]', config.port) - if config.async_server_threads == 1: - # If async_server_threads == 1, start the server in this process. + if config.server_processes == 1: + # If server_processes == 1, start the server in this process. await self._run_single_server(config, request_iterator, context) else: - # If async_server_threads > 1, offload to other processes. + # If server_processes > 1, offload to other processes. sub_workers = await asyncio.gather(*( - _create_sub_worker() - for _ in range(config.async_server_threads))) + _create_sub_worker() for _ in range(config.server_processes))) calls = [worker.stub.RunServer() for worker in sub_workers] - config_request.setup.async_server_threads = 1 + config_request.setup.server_processes = 1 for call in calls: await call.write(config_request) # An empty status indicates the peer is ready await call.read() - start_time = time.time() + start_time = time.monotonic() await context.write( _get_server_status( start_time, @@ -236,7 +235,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): _LOGGER.info('Servers are ready to serve.') async for request in request_iterator: - end_time = time.time() + end_time = time.monotonic() for call in calls: await call.write(request) @@ -265,7 +264,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): running_tasks = [] qps_data = histogram.Histogram(config.histogram_params.resolution, config.histogram_params.max_possible) - start_time = time.time() + start_time = time.monotonic() # Create a client for each channel as asyncio.Task for i in range(config.client_channels): @@ -274,16 +273,16 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): _LOGGER.info('Client created against server [%s]', server) running_tasks.append(self._loop.create_task(client.run())) - end_time = time.time() + end_time = time.monotonic() await context.write(_get_client_status(start_time, end_time, qps_data)) # Respond to stat requests async for request in request_iterator: - end_time = time.time() + end_time = time.monotonic() status = _get_client_status(start_time, end_time, qps_data) if request.mark.reset: qps_data.reset() - start_time = time.time() + start_time = time.monotonic() await context.write(status) # Cleanup the clients @@ -295,39 +294,38 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): config = config_request.setup _LOGGER.info('Received ClientConfig: %s', config) - if config.async_client_threads <= 0: - _LOGGER.info('async_client_threads can\'t be [%d]', - config.async_client_threads) - _LOGGER.info('Using async_client_threads == [%d]', _NUM_CORES) - config.async_client_threads = _NUM_CORES + if config.client_processes <= 0: + _LOGGER.info('client_processes can\'t be [%d]', + config.client_processes) + _LOGGER.info('Using client_processes == [%d]', _NUM_CORES) + config.client_processes = _NUM_CORES - if config.async_client_threads == 1: - # If async_client_threads == 1, run the benchmark in this process. + if config.client_processes == 1: + # If client_processes == 1, run the benchmark in this process. await self._run_single_client(config, request_iterator, context) else: - # If async_client_threads > 1, offload the work to other processes. + # If client_processes > 1, offload the work to other processes. sub_workers = await asyncio.gather(*( - _create_sub_worker() - for _ in range(config.async_client_threads))) + _create_sub_worker() for _ in range(config.client_processes))) calls = [worker.stub.RunClient() for worker in sub_workers] - config_request.setup.async_client_threads = 1 + config_request.setup.client_processes = 1 for call in calls: await call.write(config_request) # An empty status indicates the peer is ready await call.read() - start_time = time.time() + start_time = time.monotonic() result = histogram.Histogram(config.histogram_params.resolution, config.histogram_params.max_possible) - end_time = time.time() + end_time = time.monotonic() await context.write(_get_client_status(start_time, end_time, result)) async for request in request_iterator: - end_time = time.time() + end_time = time.monotonic() for call in calls: _LOGGER.debug('Fetching status...') @@ -340,7 +338,7 @@ class WorkerServicer(worker_service_pb2_grpc.WorkerServiceServicer): status = _get_client_status(start_time, end_time, result) if request.mark.reset: result.reset() - start_time = time.time() + start_time = time.monotonic() _LOGGER.debug('Reporting count=[%d]', status.stats.latencies.count) await context.write(status) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index 88a7410424a..2ab5689f63d 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -118,8 +118,9 @@ def _ping_pong_scenario(name, unconstrained_client=None, client_language=None, server_language=None, - async_client_threads=0, async_server_threads=0, + client_processes=0, + server_processes=0, server_threads_per_cq=0, client_threads_per_cq=0, warmup_seconds=WARMUP_SECONDS, @@ -143,6 +144,7 @@ def _ping_pong_scenario(name, 'outstanding_rpcs_per_channel': 1, 'client_channels': 1, 'async_client_threads': 1, + 'client_processes': client_processes, 'threads_per_cq': client_threads_per_cq, 'rpc_type': rpc_type, 'histogram_params': HISTOGRAM_PARAMS, @@ -152,6 +154,7 @@ def _ping_pong_scenario(name, 'server_type': server_type, 'security_params': _get_secargs(secure), 'async_server_threads': async_server_threads, + 'server_processes': server_processes, 'threads_per_cq': server_threads_per_cq, 'channel_args': [], }, @@ -188,7 +191,7 @@ def _ping_pong_scenario(name, 'num_clients'] = num_clients if num_clients is not None else 0 # use as many clients as available. scenario['client_config']['outstanding_rpcs_per_channel'] = deep scenario['client_config']['client_channels'] = wide - scenario['client_config']['async_client_threads'] = async_client_threads + scenario['client_config']['async_client_threads'] = 0 if offered_load is not None: optimization_target = 'latency' else: @@ -220,7 +223,7 @@ def _ping_pong_scenario(name, scenario['SERVER_LANGUAGE'] = server_language if categories: scenario['CATEGORIES'] = categories - if len(excluded_poll_engines): + if excluded_poll_engines: # The polling engines for which this scenario is excluded scenario['EXCLUDED_POLL_ENGINES'] = excluded_poll_engines return scenario @@ -794,7 +797,7 @@ class PythonLanguage: client_type='SYNC_CLIENT', server_type='ASYNC_SERVER', server_language='c++', - async_server_threads=1, + async_server_threads=0, categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( @@ -842,6 +845,8 @@ class PythonAsyncIOLanguage: server_type='ASYNC_SERVER', outstanding=outstanding * channels, channels=channels, + client_processes=0, + server_processes=0, unconstrained_client='async', categories=[SCALABLE]) @@ -853,8 +858,8 @@ class PythonAsyncIOLanguage: server_type='ASYNC_SERVER', outstanding=outstanding, channels=1, - async_client_threads=1, - async_server_threads=1, + client_processes=1, + server_processes=1, unconstrained_client='async', categories=[SCALABLE]) @@ -863,7 +868,8 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER', - async_server_threads=1, + client_processes=1, + server_processes=1, use_generic_payload=True, categories=[SMOKETEST, SCALABLE]) @@ -872,7 +878,8 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - async_server_threads=1, + client_processes=1, + server_processes=1, categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( @@ -880,7 +887,8 @@ class PythonAsyncIOLanguage: rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - async_server_threads=1, + client_processes=1, + server_processes=1, categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( @@ -888,7 +896,8 @@ class PythonAsyncIOLanguage: rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', - async_server_threads=1, + client_processes=1, + server_processes=1, categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( @@ -911,6 +920,8 @@ class PythonAsyncIOLanguage: client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', server_language='c++', + client_processes=1, + unconstrained_client='async', categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( @@ -919,15 +930,18 @@ class PythonAsyncIOLanguage: client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', unconstrained_client='async', - async_client_threads=0, + client_processes=0, server_language='c++', categories=[SMOKETEST, SCALABLE]) yield _ping_pong_scenario( - 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong', + 'python_asyncio_to_cpp_protobuf_sync_streaming_ping_pong_1thread', rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', + client_processes=1, + server_processes=1, + unconstrained_client='async', server_language='c++') yield _ping_pong_scenario( @@ -937,6 +951,8 @@ class PythonAsyncIOLanguage: server_type='ASYNC_SERVER', req_size=1024 * 1024, resp_size=1024 * 1024, + client_processes=1, + server_processes=1, categories=[SMOKETEST, SCALABLE]) def __str__(self): From fdbeb3c5c336f29d1b22ed05db7153cdd400868e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 13:26:24 -0800 Subject: [PATCH 116/129] Enforce 1 channel per client --- tools/run_tests/performance/scenario_config.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py index 2ab5689f63d..34e74e214fc 100644 --- a/tools/run_tests/performance/scenario_config.py +++ b/tools/run_tests/performance/scenario_config.py @@ -832,7 +832,7 @@ class PythonAsyncIOLanguage: return 1200 def scenarios(self): - for outstanding in [64, 128, 256]: + for outstanding in [64, 128, 256, 512]: for channels in [1, 4]: yield _ping_pong_scenario( 'python_asyncio_protobuf_async_unary_ping_pong_%dx%d_max' % @@ -868,6 +868,7 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_GENERIC_SERVER', + channels=1, client_processes=1, server_processes=1, use_generic_payload=True, @@ -878,6 +879,7 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', + channels=1, client_processes=1, server_processes=1, categories=[SMOKETEST, SCALABLE]) @@ -896,6 +898,7 @@ class PythonAsyncIOLanguage: rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', + channels=1, client_processes=1, server_processes=1, categories=[SMOKETEST, SCALABLE]) @@ -905,6 +908,7 @@ class PythonAsyncIOLanguage: rpc_type='UNARY', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', + channels=1, unconstrained_client='async') yield _ping_pong_scenario( @@ -912,6 +916,7 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', + channels=1, unconstrained_client='async') yield _ping_pong_scenario( @@ -920,6 +925,7 @@ class PythonAsyncIOLanguage: client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', server_language='c++', + channels=1, client_processes=1, unconstrained_client='async', categories=[SMOKETEST, SCALABLE]) @@ -930,6 +936,7 @@ class PythonAsyncIOLanguage: client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', unconstrained_client='async', + channels=1, client_processes=0, server_language='c++', categories=[SMOKETEST, SCALABLE]) @@ -939,6 +946,7 @@ class PythonAsyncIOLanguage: rpc_type='STREAMING', client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER', + channels=1, client_processes=1, server_processes=1, unconstrained_client='async', @@ -951,6 +959,7 @@ class PythonAsyncIOLanguage: server_type='ASYNC_SERVER', req_size=1024 * 1024, resp_size=1024 * 1024, + channels=1, client_processes=1, server_processes=1, categories=[SMOKETEST, SCALABLE]) From 16ea3833373e2277a16203c7a0fe8bc906164a71 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 15:40:52 -0800 Subject: [PATCH 117/129] Update qps scenarios --- test/cpp/qps/json_run_localhost_scenarios.bzl | 2 +- test/cpp/qps/qps_json_driver_scenarios.bzl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cpp/qps/json_run_localhost_scenarios.bzl b/test/cpp/qps/json_run_localhost_scenarios.bzl index 51202ca4b46..81b2a413140 100644 --- a/test/cpp/qps/json_run_localhost_scenarios.bzl +++ b/test/cpp/qps/json_run_localhost_scenarios.bzl @@ -1,3 +1,3 @@ """Scenarios run on localhost.""" -JSON_RUN_LOCALHOST_SCENARIOS = {"cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 16, "threads_per_cq": 1, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"poisson": {"offered_load": 37500}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 50, "req_size": 300}}, "client_channels": 300, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 1000000, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_1channel_1MBmsg_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_1channel_1MBmsg_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "threads_per_cq": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "threads_per_cq": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1mps_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 1000000, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_10mps_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_10mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_insecure_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_insecure_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_one_server_core_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_one_server_core_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 2, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 2}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_client_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_client_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 2, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 1000000}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 8388608, "req_size": 128}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_from_client_1channel_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_1channel_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_1channel_100rpcs_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_1channel_100rpcs_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 2, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 8388608, "req_size": 128}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_server_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_1cq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_1cq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 1000000, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_one_server_core_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_one_server_core_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 2}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 2, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_server_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1cq_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1cq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 1000000}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 1, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 1000000, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_secure_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_secure_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\''} +JSON_RUN_LOCALHOST_SCENARIOS = {"cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 16, "threads_per_cq": 1, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"poisson": {"offered_load": 37500}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 50, "req_size": 300}}, "client_channels": 300, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_1channel_1MBmsg_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_1channel_1MBmsg_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1mps_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_10mps_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_10mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_insecure_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_insecure_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_one_server_core_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_one_server_core_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_client_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_client_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 8388608, "req_size": 128}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_from_client_1channel_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_1channel_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_1channel_100rpcs_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_1channel_100rpcs_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 8388608, "req_size": 128}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_server_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_1cq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_1cq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_one_server_core_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_one_server_core_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_server_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 10, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1cq_secure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1cq_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_ping_pong_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_ping_pong_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 1, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_secure_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_secure_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": {"use_test_ca": true, "server_host_override": "foo.test.google.fr"}, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\''} diff --git a/test/cpp/qps/qps_json_driver_scenarios.bzl b/test/cpp/qps/qps_json_driver_scenarios.bzl index 03aefa0d84a..35ca167211d 100644 --- a/test/cpp/qps/qps_json_driver_scenarios.bzl +++ b/test/cpp/qps/qps_json_driver_scenarios.bzl @@ -1,3 +1,3 @@ """Scenarios of qps driver.""" -QPS_JSON_DRIVER_SCENARIOS = {"cpp_protobuf_sync_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_insecure_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_insecure_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 2, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 1000000, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 2, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 1000000}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 1000000, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_1channel_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_1channel_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_1channel_100rpcs_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_1channel_100rpcs_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 8388608, "req_size": 128}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 2}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 3, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "async_server_threads": 0, "threads_per_cq": 0, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}]}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0}, "num_clients": 0}]}\''} +QPS_JSON_DRIVER_SCENARIOS = {"cpp_protobuf_sync_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_ping_pong_insecure_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_ping_pong_insecure_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 65536, "req_size": 65536}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 1000000, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 13, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 1000000, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_1channel_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_1channel_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_unary_1channel_100rpcs_1MB": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_1channel_100rpcs_1MB", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 1048576, "req_size": 1048576}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 8388608, "req_size": 128}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING_FROM_CLIENT", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 2, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 2, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "SYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 16, "rpc_type": "STREAMING_FROM_SERVER", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "SYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_protobuf_async_unary_qps_unconstrained_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_unary_qps_unconstrained_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 3, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "UNARY", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 3, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_qps_unconstrained_10mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 0, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 10, "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\'', "cpp_generic_async_streaming_ping_pong_insecure": '\'{\'scenarios\' : [{"name": "cpp_generic_async_streaming_ping_pong_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"async_server_threads": 1, "security_params": null, "server_type": "ASYNC_GENERIC_SERVER", "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "latency", "name": "grpc.optimization_target"}], "async_client_threads": 1, "outstanding_rpcs_per_channel": 1, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "payload_config": {"bytebuf_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 1, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 1}]}\'', "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure": '\'{\'scenarios\' : [{"name": "cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure", "warmup_seconds": 0, "benchmark_seconds": 1, "num_servers": 1, "server_config": {"security_params": null, "server_type": "ASYNC_SERVER", "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_server_threads": 0, "threads_per_cq": 0, "server_processes": 0}, "client_config": {"security_params": null, "channel_args": [{"str_value": "throughput", "name": "grpc.optimization_target"}, {"int_value": 1, "name": "grpc.minimal_stack"}], "async_client_threads": 0, "outstanding_rpcs_per_channel": 100, "rpc_type": "STREAMING", "load_params": {"closed_loop": {}}, "histogram_params": {"resolution": 0.01, "max_possible": 60000000000.0}, "client_type": "ASYNC_CLIENT", "messages_per_stream": 1, "payload_config": {"simple_params": {"resp_size": 0, "req_size": 0}}, "client_channels": 64, "threads_per_cq": 0, "client_processes": 0}, "num_clients": 0}]}\''} From abebd4085dbc5387b61ea81ebf71c01bb5e33b5e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 11 Feb 2020 17:35:59 -0800 Subject: [PATCH 118/129] Generate tests.json --- tools/run_tests/generated/tests.json | 368 +++++++++++++-------------- 1 file changed, 184 insertions(+), 184 deletions(-) diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 92c9a91752a..27d03ad9458 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -62721,7 +62721,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_1channel_100rpcs_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_1channel_100rpcs_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62747,7 +62747,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_1channel_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_1channel_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62773,7 +62773,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 16, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 50, \"req_size\": 300}}, \"client_channels\": 300, \"threads_per_cq\": 0, \"load_params\": {\"poisson\": {\"offered_load\": 37500}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 16, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 50, \"req_size\": 300}}, \"client_channels\": 300, \"threads_per_cq\": 0, \"load_params\": {\"poisson\": {\"offered_load\": 37500}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62800,7 +62800,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62826,7 +62826,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62852,7 +62852,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62878,7 +62878,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62904,7 +62904,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62930,7 +62930,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62956,7 +62956,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -62982,7 +62982,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63008,7 +63008,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63034,7 +63034,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63060,7 +63060,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63086,7 +63086,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63112,7 +63112,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63138,7 +63138,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63164,7 +63164,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63190,7 +63190,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63216,7 +63216,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63242,7 +63242,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63268,7 +63268,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63294,7 +63294,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63320,7 +63320,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63346,7 +63346,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63372,7 +63372,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63398,7 +63398,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63424,7 +63424,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63450,7 +63450,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63476,7 +63476,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63502,7 +63502,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63528,7 +63528,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63554,7 +63554,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63580,7 +63580,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63606,7 +63606,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63632,7 +63632,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63658,7 +63658,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63684,7 +63684,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63710,7 +63710,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63736,7 +63736,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63762,7 +63762,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63788,7 +63788,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63814,7 +63814,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63840,7 +63840,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63866,7 +63866,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63892,7 +63892,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63918,7 +63918,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 1000000}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63944,7 +63944,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 2}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63970,7 +63970,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -63996,7 +63996,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64022,7 +64022,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64048,7 +64048,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64074,7 +64074,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64100,7 +64100,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64126,7 +64126,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64152,7 +64152,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64178,7 +64178,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64204,7 +64204,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64230,7 +64230,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64256,7 +64256,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64282,7 +64282,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64308,7 +64308,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64334,7 +64334,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64360,7 +64360,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64386,7 +64386,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64412,7 +64412,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64438,7 +64438,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64464,7 +64464,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64490,7 +64490,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64516,7 +64516,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64542,7 +64542,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64568,7 +64568,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64594,7 +64594,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64620,7 +64620,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64646,7 +64646,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64672,7 +64672,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64698,7 +64698,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -64725,7 +64725,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_1channel_100rpcs_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_1channel_100rpcs_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64751,7 +64751,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_1channel_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_1channel_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64777,7 +64777,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64803,7 +64803,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64829,7 +64829,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64855,7 +64855,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64881,7 +64881,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64907,7 +64907,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64933,7 +64933,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 1000000}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64959,7 +64959,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 2}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -64985,7 +64985,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65011,7 +65011,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65037,7 +65037,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65063,7 +65063,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65089,7 +65089,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65115,7 +65115,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65141,7 +65141,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65167,7 +65167,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65193,7 +65193,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65219,7 +65219,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65245,7 +65245,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65271,7 +65271,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65297,7 +65297,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65323,7 +65323,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65349,7 +65349,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65375,7 +65375,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65401,7 +65401,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65427,7 +65427,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65453,7 +65453,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65479,7 +65479,7 @@ "args": [ "--run_inproc", "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "boringssl": true, "ci_platforms": [ @@ -65504,7 +65504,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_1channel_100rpcs_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_1channel_100rpcs_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65545,7 +65545,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_1channel_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_1channel_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65586,7 +65586,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 16, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 50, \"req_size\": 300}}, \"client_channels\": 300, \"threads_per_cq\": 0, \"load_params\": {\"poisson\": {\"offered_load\": 37500}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_75Kqps_600channel_60Krpcs_300Breq_50Bresp\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 16, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 50, \"req_size\": 300}}, \"client_channels\": 300, \"threads_per_cq\": 0, \"load_params\": {\"poisson\": {\"offered_load\": 37500}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65627,7 +65627,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65668,7 +65668,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65709,7 +65709,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65750,7 +65750,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65791,7 +65791,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65832,7 +65832,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65873,7 +65873,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65914,7 +65914,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65955,7 +65955,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -65996,7 +65996,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66037,7 +66037,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66078,7 +66078,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66119,7 +66119,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66160,7 +66160,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66201,7 +66201,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66242,7 +66242,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66283,7 +66283,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66324,7 +66324,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66365,7 +66365,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66406,7 +66406,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66447,7 +66447,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66488,7 +66488,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66529,7 +66529,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66570,7 +66570,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66611,7 +66611,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66652,7 +66652,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66693,7 +66693,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66734,7 +66734,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66775,7 +66775,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66816,7 +66816,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66857,7 +66857,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66898,7 +66898,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66939,7 +66939,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -66980,7 +66980,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67021,7 +67021,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67062,7 +67062,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67103,7 +67103,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67144,7 +67144,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67185,7 +67185,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67226,7 +67226,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67267,7 +67267,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67308,7 +67308,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_1channel_1MBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67349,7 +67349,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_64KBmsg_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 65536, \"req_size\": 65536}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67390,7 +67390,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 1000000}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67431,7 +67431,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 2}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67472,7 +67472,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67513,7 +67513,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67554,7 +67554,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 1000000, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_1cq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 1000000, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 1000000, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67595,7 +67595,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"security_params\": null, \"threads_per_cq\": 2, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_2waysharedcq_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 2, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 2, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67636,7 +67636,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_GENERIC_SERVER\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 13, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67677,7 +67677,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67718,7 +67718,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_unary_1channel_64wide_128Breq_8MBresp_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 8388608, \"req_size\": 128}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67759,7 +67759,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67800,7 +67800,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure_1MB\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 1048576, \"req_size\": 1048576}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67841,7 +67841,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67882,7 +67882,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67923,7 +67923,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -67964,7 +67964,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68005,7 +68005,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68046,7 +68046,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68087,7 +68087,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68128,7 +68128,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68169,7 +68169,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68210,7 +68210,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68251,7 +68251,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_1mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 1, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68292,7 +68292,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_10mps_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"messages_per_stream\": 10, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68333,7 +68333,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68374,7 +68374,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68415,7 +68415,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68456,7 +68456,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_client_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_CLIENT\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68497,7 +68497,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68538,7 +68538,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"SYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"SYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68579,7 +68579,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 0, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 0, \"server_processes\": 0}, \"num_clients\": 1, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"latency\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"threads_per_cq\": 0, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, @@ -68620,7 +68620,7 @@ { "args": [ "--scenarios_json", - "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"security_params\": null, \"threads_per_cq\": 3, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}" + "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_from_server_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"server_type\": \"ASYNC_SERVER\", \"security_params\": null, \"threads_per_cq\": 3, \"server_processes\": 0}, \"num_clients\": 0, \"client_config\": {\"security_params\": null, \"channel_args\": [{\"str_value\": \"throughput\", \"name\": \"grpc.optimization_target\"}, {\"int_value\": 1, \"name\": \"grpc.minimal_stack\"}], \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING_FROM_SERVER\", \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"threads_per_cq\": 3, \"load_params\": {\"closed_loop\": {}}, \"client_type\": \"ASYNC_CLIENT\", \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}, \"client_processes\": 0}}]}" ], "auto_timeout_scaling": false, "boringssl": true, From dbdb2cc5c9332e27884e65729e24556f5210d818 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 14 Feb 2020 11:36:31 -0800 Subject: [PATCH 119/129] Fix the non-protobuf scenario --- src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi | 2 ++ .../grpcio_tests/tests_aio/benchmark/benchmark_servicer.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi index cf9269364ce..27d16cb0475 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi @@ -42,6 +42,8 @@ cdef bytes serialize(object serializer, object message): Failure to serialize is a fatal error. """ + if isinstance(message, str): + message = message.encode('utf-8') if serializer: return serializer(message) else: diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py index 6276a539320..50d3065cd19 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py @@ -51,5 +51,5 @@ class GenericBenchmarkServicer( return self._response async def StreamingCall(self, request_iterator, unused_context): - async for request in request_iterator: + async for _ in request_iterator: yield self._response From b92c3a2879b29d885644c15b0c127815d159f7e1 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Tue, 18 Feb 2020 17:25:55 -0800 Subject: [PATCH 120/129] Changed Closure to TestClosure to avoid name conflict --- .../microbenchmarks/bm_chttp2_transport.cc | 71 ++++++++++--------- test/cpp/microbenchmarks/bm_pollset.cc | 10 +-- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/test/cpp/microbenchmarks/bm_chttp2_transport.cc b/test/cpp/microbenchmarks/bm_chttp2_transport.cc index ae97569bf80..d7535248f09 100644 --- a/test/cpp/microbenchmarks/bm_chttp2_transport.cc +++ b/test/cpp/microbenchmarks/bm_chttp2_transport.cc @@ -154,14 +154,14 @@ class Fixture { grpc_transport* t_; }; -class Closure : public grpc_closure { +class TestClosure : public grpc_closure { public: - virtual ~Closure() {} + virtual ~TestClosure() {} }; template -std::unique_ptr MakeClosure(F f) { - struct C : public Closure { +std::unique_ptr MakeTestClosure(F f) { + struct C : public TestClosure { explicit C(const F& f) : f_(f) { GRPC_CLOSURE_INIT(this, Execute, this, nullptr); } @@ -170,7 +170,7 @@ std::unique_ptr MakeClosure(F f) { static_cast(arg)->f_(error); } }; - return std::unique_ptr(new C(f)); + return std::unique_ptr(new C(f)); } template @@ -267,15 +267,16 @@ static void BM_StreamCreateDestroy(benchmark::State& state) { op.cancel_stream = true; op.payload = &op_payload; op_payload.cancel_stream.cancel_error = GRPC_ERROR_CANCELLED; - std::unique_ptr next = MakeClosure([&, s](grpc_error* /*error*/) { - if (!state.KeepRunning()) { - delete s; - return; - } - s->Init(state); - s->Op(&op); - s->DestroyThen(next.get()); - }); + std::unique_ptr next = + MakeTestClosure([&, s](grpc_error* /*error*/) { + if (!state.KeepRunning()) { + delete s; + return; + } + s->Init(state); + s->Op(&op); + s->DestroyThen(next.get()); + }); grpc_core::Closure::Run(DEBUG_LOCATION, next.get(), GRPC_ERROR_NONE); f.FlushExecCtx(); track_counters.Finish(state); @@ -312,8 +313,8 @@ static void BM_StreamCreateSendInitialMetadataDestroy(benchmark::State& state) { auto* s = new Stream(&f); grpc_transport_stream_op_batch op; grpc_transport_stream_op_batch_payload op_payload(nullptr); - std::unique_ptr start; - std::unique_ptr done; + std::unique_ptr start; + std::unique_ptr done; auto reset_op = [&]() { op = {}; @@ -333,7 +334,7 @@ static void BM_StreamCreateSendInitialMetadataDestroy(benchmark::State& state) { f.FlushExecCtx(); gpr_event bm_done; gpr_event_init(&bm_done); - start = MakeClosure([&, s](grpc_error* /*error*/) { + start = MakeTestClosure([&, s](grpc_error* /*error*/) { if (!state.KeepRunning()) { delete s; gpr_event_set(&bm_done, (void*)1); @@ -346,7 +347,7 @@ static void BM_StreamCreateSendInitialMetadataDestroy(benchmark::State& state) { op.payload->send_initial_metadata.send_initial_metadata = &b; s->Op(&op); }); - done = MakeClosure([&](grpc_error* /*error*/) { + done = MakeTestClosure([&](grpc_error* /*error*/) { reset_op(); op.cancel_stream = true; op.payload->cancel_stream.cancel_error = GRPC_ERROR_CANCELLED; @@ -374,7 +375,7 @@ static void BM_TransportEmptyOp(benchmark::State& state) { op = {}; op.payload = &op_payload; }; - std::unique_ptr c = MakeClosure([&](grpc_error* /*error*/) { + std::unique_ptr c = MakeTestClosure([&](grpc_error* /*error*/) { if (!state.KeepRunning()) return; reset_op(); op.on_complete = c.get(); @@ -387,8 +388,8 @@ static void BM_TransportEmptyOp(benchmark::State& state) { op_payload.cancel_stream.cancel_error = GRPC_ERROR_CANCELLED; gpr_event* stream_cancel_done = new gpr_event; gpr_event_init(stream_cancel_done); - std::unique_ptr stream_cancel_closure = - MakeClosure([&](grpc_error* error) { + std::unique_ptr stream_cancel_closure = + MakeTestClosure([&](grpc_error* error) { GPR_ASSERT(error == GRPC_ERROR_NONE); gpr_event_set(stream_cancel_done, (void*)(1)); }); @@ -436,7 +437,7 @@ static void BM_TransportStreamSend(benchmark::State& state) { gpr_event* bm_done = new gpr_event; gpr_event_init(bm_done); - std::unique_ptr c = MakeClosure([&](grpc_error* /*error*/) { + std::unique_ptr c = MakeTestClosure([&](grpc_error* /*error*/) { if (!state.KeepRunning()) { gpr_event_set(bm_done, (void*)(1)); return; @@ -471,8 +472,8 @@ static void BM_TransportStreamSend(benchmark::State& state) { op.payload->cancel_stream.cancel_error = GRPC_ERROR_CANCELLED; gpr_event* stream_cancel_done = new gpr_event; gpr_event_init(stream_cancel_done); - std::unique_ptr stream_cancel_closure = - MakeClosure([&](grpc_error* error) { + std::unique_ptr stream_cancel_closure = + MakeTestClosure([&](grpc_error* error) { GPR_ASSERT(error == GRPC_ERROR_NONE); gpr_event_set(stream_cancel_done, (void*)(1)); }); @@ -575,17 +576,17 @@ static void BM_TransportStreamRecv(benchmark::State& state) { "addmd", grpc_metadata_batch_add_tail(&b, &storage[i], elems[i]))); } - std::unique_ptr do_nothing = - MakeClosure([](grpc_error* /*error*/) {}); + std::unique_ptr do_nothing = + MakeTestClosure([](grpc_error* /*error*/) {}); uint32_t received; - std::unique_ptr drain_start; - std::unique_ptr drain; - std::unique_ptr drain_continue; + std::unique_ptr drain_start; + std::unique_ptr drain; + std::unique_ptr drain_continue; grpc_slice recv_slice; - std::unique_ptr c = MakeClosure([&](grpc_error* /*error*/) { + std::unique_ptr c = MakeTestClosure([&](grpc_error* /*error*/) { if (!state.KeepRunning()) return; // force outgoing window to be yuge s->chttp2_stream()->flow_control->TestOnlyForceHugeWindow(); @@ -600,7 +601,7 @@ static void BM_TransportStreamRecv(benchmark::State& state) { f.PushInput(grpc_slice_ref(incoming_data)); }); - drain_start = MakeClosure([&](grpc_error* /*error*/) { + drain_start = MakeTestClosure([&](grpc_error* /*error*/) { if (recv_stream == nullptr) { GPR_ASSERT(!state.KeepRunning()); return; @@ -608,7 +609,7 @@ static void BM_TransportStreamRecv(benchmark::State& state) { grpc_core::Closure::Run(DEBUG_LOCATION, drain.get(), GRPC_ERROR_NONE); }); - drain = MakeClosure([&](grpc_error* /*error*/) { + drain = MakeTestClosure([&](grpc_error* /*error*/) { do { if (received == recv_stream->length()) { recv_stream.reset(); @@ -622,7 +623,7 @@ static void BM_TransportStreamRecv(benchmark::State& state) { grpc_slice_unref_internal(recv_slice), true)); }); - drain_continue = MakeClosure([&](grpc_error* /*error*/) { + drain_continue = MakeTestClosure([&](grpc_error* /*error*/) { recv_stream->Pull(&recv_slice); received += GRPC_SLICE_LENGTH(recv_slice); grpc_slice_unref_internal(recv_slice); @@ -657,8 +658,8 @@ static void BM_TransportStreamRecv(benchmark::State& state) { op.payload->cancel_stream.cancel_error = GRPC_ERROR_CANCELLED; gpr_event* stream_cancel_done = new gpr_event; gpr_event_init(stream_cancel_done); - std::unique_ptr stream_cancel_closure = - MakeClosure([&](grpc_error* error) { + std::unique_ptr stream_cancel_closure = + MakeTestClosure([&](grpc_error* error) { GPR_ASSERT(error == GRPC_ERROR_NONE); gpr_event_set(stream_cancel_done, (void*)(1)); }); diff --git a/test/cpp/microbenchmarks/bm_pollset.cc b/test/cpp/microbenchmarks/bm_pollset.cc index 0c6c1e62158..53e5102941e 100644 --- a/test/cpp/microbenchmarks/bm_pollset.cc +++ b/test/cpp/microbenchmarks/bm_pollset.cc @@ -157,14 +157,14 @@ static void BM_PollAddFd(benchmark::State& state) { } BENCHMARK(BM_PollAddFd); -class Closure : public grpc_closure { +class TestClosure : public grpc_closure { public: - virtual ~Closure() {} + virtual ~TestClosure() {} }; template -Closure* MakeClosure(F f) { - struct C : public Closure { +TestClosure* MakeTestClosure(F f) { + struct C : public TestClosure { explicit C(F f) : f_(f) { GRPC_CLOSURE_INIT(this, C::cbfn, this, nullptr); } static void cbfn(void* arg, grpc_error* /*error*/) { C* p = static_cast(arg); @@ -221,7 +221,7 @@ static void BM_SingleThreadPollOneFd(benchmark::State& state) { grpc_fd* wakeup = grpc_fd_create(wakeup_fd.read_fd, "wakeup_read", false); grpc_pollset_add_fd(ps, wakeup); bool done = false; - Closure* continue_closure = MakeClosure([&]() { + TestClosure* continue_closure = MakeTestClosure([&]() { GRPC_ERROR_UNREF(grpc_wakeup_fd_consume_wakeup(&wakeup_fd)); if (!state.KeepRunning()) { done = true; From c0e1dbc4456a4647438a0e967d5ba61c242878a2 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 18 Feb 2020 18:04:17 -0800 Subject: [PATCH 121/129] Update method naming & use os.path.join --- .../grpcio_tests/tests_aio/benchmark/benchmark_client.py | 9 ++++----- .../grpcio_tests/tests_aio/benchmark/worker_servicer.py | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py index b36e0e42828..51a046c20c7 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py @@ -108,14 +108,14 @@ class UnaryAsyncBenchmarkClient(BenchmarkClient): await self._stub.UnaryCall(self._request) self._record_query_time(time.monotonic() - start_time) - async def _infinite_sender(self) -> None: + async def _send_indefinitely(self) -> None: while self._running: await self._send_request() async def run(self) -> None: await super().run() self._running = True - senders = (self._infinite_sender() for _ in range(self._concurrency)) + senders = (self._send_indefinitely() for _ in range(self._concurrency)) await asyncio.gather(*senders) self._stopped.set() @@ -133,7 +133,7 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient): self._running = None self._stopped = asyncio.Event() - async def _one_streamming_call(self): + async def _one_streaming_call(self): call = self._stub.StreamingCall() while self._running: start_time = time.time() @@ -145,8 +145,7 @@ class StreamingAsyncBenchmarkClient(BenchmarkClient): async def run(self): await super().run() self._running = True - senders = ( - self._one_streamming_call() for _ in range(self._concurrency)) + senders = (self._one_streaming_call() for _ in range(self._concurrency)) await asyncio.gather(*senders) self._stopped.set() diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index b0c15a09bb0..720af70ea3d 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -32,7 +32,8 @@ from tests.unit.framework.common import get_socket from tests_aio.benchmark import benchmark_client, benchmark_servicer _NUM_CORES = multiprocessing.cpu_count() -_WORKER_ENTRY_FILE = os.path.split(os.path.abspath(__file__))[0] + '/worker.py' +_WORKER_ENTRY_FILE = os.path.join( + os.path.split(os.path.abspath(__file__))[0], '/worker.py') _LOGGER = logging.getLogger(__name__) From bbcaca2d83c06aa548fbe587f8ff16fe298f78d8 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 19 Feb 2020 13:09:46 -0800 Subject: [PATCH 122/129] Add uvloop argument --- src/python/grpcio_tests/tests_aio/benchmark/worker.py | 7 +++++++ .../grpcio_tests/tests_aio/benchmark/worker_servicer.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker.py b/src/python/grpcio_tests/tests_aio/benchmark/worker.py index ad6d3e7b1c2..94651b55057 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker.py @@ -46,6 +46,13 @@ if __name__ == '__main__': type=int, dest='port', help='The port the worker should listen on') + parser.add_argument('--uvloop', + action='store_true', + help='Use uvloop or not') args = parser.parse_args() + if args.uvloop: + import uvloop + uvloop.install() + asyncio.get_event_loop().run_until_complete(run_worker_server(args.port)) diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py index 720af70ea3d..4f80095cd20 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py @@ -33,7 +33,7 @@ from tests_aio.benchmark import benchmark_client, benchmark_servicer _NUM_CORES = multiprocessing.cpu_count() _WORKER_ENTRY_FILE = os.path.join( - os.path.split(os.path.abspath(__file__))[0], '/worker.py') + os.path.split(os.path.abspath(__file__))[0], 'worker.py') _LOGGER = logging.getLogger(__name__) From 77377fa9310d6cfcff57527e68edec51d919eeb9 Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Wed, 19 Feb 2020 14:35:59 -0800 Subject: [PATCH 123/129] Removed server builder and ssl creds stuff. --- test/cpp/client/credentials_test.cc | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index 8f824865b9c..1980ca5eddf 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -683,21 +683,16 @@ TEST_F(CredentialsTest, LoadTlsChannelCredentials) { // server credentials. TEST_F(CredentialsTest, LoadTlsServerCredentials) { grpc_init(); - //std::shared_ptr test_credential_reload( - // new TestTlsCredentialReload()); - //std::shared_ptr credential_reload_config( - // new TlsCredentialReloadConfig(test_credential_reload)); - - // The server builder is needed in order to properly initialize the C-core. - //ServerBuilder builder; - //(void)builder; - //TlsCredentialsOptions options = TlsCredentialsOptions( - // GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, - // GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr); - //std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = - // grpc::experimental::TlsServerCredentials(options); - ::grpc::SslServerCredentialsOptions options; - std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = ::grpc::SslServerCredentials(options); + std::shared_ptr test_credential_reload( + new TestTlsCredentialReload()); + std::shared_ptr credential_reload_config( + new TlsCredentialReloadConfig(test_credential_reload)); + + TlsCredentialsOptions options = TlsCredentialsOptions( + GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, + GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr); + std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = + grpc::experimental::TlsServerCredentials(options); GPR_ASSERT(server_credentials.get() != nullptr); grpc_shutdown(); } From e04e8285b9faf801284a38261e731a07761181e3 Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Wed, 19 Feb 2020 17:03:17 -0800 Subject: [PATCH 124/129] Removed config file. --- tools/internal_ci/macos/grpc_experiment.cfg | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 tools/internal_ci/macos/grpc_experiment.cfg diff --git a/tools/internal_ci/macos/grpc_experiment.cfg b/tools/internal_ci/macos/grpc_experiment.cfg deleted file mode 100644 index 3b15ca78b6a..00000000000 --- a/tools/internal_ci/macos/grpc_experiment.cfg +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2019 The 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. - -# Config file for the internal CI (in protobuf text format) - -# Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/macos/grpc_run_bazel_cpp_ios_tests.sh" From 3620abf059e289a1146323e21569f7e6d0cf7dab Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Thu, 20 Feb 2020 01:34:30 +0000 Subject: [PATCH 125/129] Properly follow precise conditions for callback inlining --- .../impl/codegen/server_callback_handlers.h | 262 ++++++++++++------ .../impl/codegen/server_callback_impl.h | 52 +++- .../grpcpp/impl/codegen/server_context_impl.h | 2 +- src/cpp/server/server_callback.cc | 56 +++- test/cpp/end2end/test_service_impl.cc | 17 +- 5 files changed, 271 insertions(+), 118 deletions(-) diff --git a/include/grpcpp/impl/codegen/server_callback_handlers.h b/include/grpcpp/impl/codegen/server_callback_handlers.h index 7752864175d..0c651245777 100644 --- a/include/grpcpp/impl/codegen/server_callback_handlers.h +++ b/include/grpcpp/impl/codegen/server_callback_handlers.h @@ -117,9 +117,19 @@ class CallbackUnaryHandler : public ::grpc::internal::MethodHandler { class ServerCallbackUnaryImpl : public ServerCallbackUnary { public: void Finish(::grpc::Status s) override { + // A callback that only contains a call to MaybeDone can be run as an + // inline callback regardless of whether or not OnDone is inlineable + // because if the actual OnDone callback needs to be scheduled, MaybeDone + // is responsible for dispatching to an executor thread if needed. Thus, + // when setting up the finish_tag_, we can set its own callback to + // inlineable. finish_tag_.Set( - call_.call(), [this](bool) { MaybeDone(); }, &finish_ops_, - reactor_.load(std::memory_order_relaxed)->InternalInlineable()); + call_.call(), + [this](bool) { + this->MaybeDone( + reactor_.load(std::memory_order_relaxed)->InternalInlineable()); + }, + &finish_ops_, /*can_inline=*/true); finish_ops_.set_core_cq_tag(&finish_tag_); if (!ctx_->sent_initial_metadata_) { @@ -144,13 +154,19 @@ class CallbackUnaryHandler : public ::grpc::internal::MethodHandler { void SendInitialMetadata() override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); + // The callback for this function should not be marked inline because it + // is directly invoking a user-controlled reaction + // (OnSendInitialMetadataDone). Thus it must be dispatched to an executor + // thread. However, any OnDone needed after that can be inlined because it + // is already running on an executor thread. meta_tag_.Set(call_.call(), [this](bool ok) { - reactor_.load(std::memory_order_relaxed) - ->OnSendInitialMetadataDone(ok); - MaybeDone(); + ServerUnaryReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); }, - &meta_ops_, false); + &meta_ops_, /*can_inline=*/false); meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { @@ -184,22 +200,20 @@ class CallbackUnaryHandler : public ::grpc::internal::MethodHandler { reactor_.store(reactor, std::memory_order_relaxed); this->BindReactor(reactor); this->MaybeCallOnCancel(reactor); - this->MaybeDone(); + this->MaybeDone(reactor->InternalInlineable()); } const RequestType* request() { return allocator_state_->request(); } ResponseType* response() { return allocator_state_->response(); } - void MaybeDone() override { - if (GPR_UNLIKELY(this->Unref() == 1)) { - reactor_.load(std::memory_order_relaxed)->OnDone(); - grpc_call* call = call_.call(); - auto call_requester = std::move(call_requester_); - allocator_state_->Release(); - this->~ServerCallbackUnaryImpl(); // explicitly call destructor - ::grpc::g_core_codegen_interface->grpc_call_unref(call); - call_requester(); - } + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + allocator_state_->Release(); + this->~ServerCallbackUnaryImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); } ServerReactor* reactor() override { @@ -255,8 +269,13 @@ class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler { static_cast<::grpc_impl::CallbackServerContext*>( param.server_context), param.call, std::move(param.call_requester)); + // Inlineable OnDone can be false in the CompletionOp callback because there + // is no read reactor that has an inlineable OnDone; this only applies to + // the DefaultReactor (which is unary). param.server_context->BeginCompletionOp( - param.call, [reader](bool) { reader->MaybeDone(); }, reader); + param.call, + [reader](bool) { reader->MaybeDone(/*inlineable_ondone=*/false); }, + reader); ServerReadReactor* reactor = nullptr; if (param.status.ok()) { @@ -287,8 +306,17 @@ class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler { class ServerCallbackReaderImpl : public ServerCallbackReader { public: void Finish(::grpc::Status s) override { - finish_tag_.Set(call_.call(), [this](bool) { MaybeDone(); }, &finish_ops_, - false); + // A finish tag with only MaybeDone can have its callback inlined + // regardless even if OnDone is not inlineable because this callback just + // checks a ref and then decides whether or not to dispatch OnDone. + finish_tag_.Set(call_.call(), + [this](bool) { + // Inlineable OnDone can be false here because there is + // no read reactor that has an inlineable OnDone; this + // only applies to the DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + }, + &finish_ops_, /*can_inline=*/true); if (!ctx_->sent_initial_metadata_) { finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, ctx_->initial_metadata_flags()); @@ -311,13 +339,17 @@ class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler { void SendInitialMetadata() override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. meta_tag_.Set(call_.call(), [this](bool ok) { - reactor_.load(std::memory_order_relaxed) - ->OnSendInitialMetadataDone(ok); - MaybeDone(); + ServerReadReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); }, - &meta_ops_, false); + &meta_ops_, /*can_inline=*/false); meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { @@ -344,31 +376,35 @@ class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler { void SetupReactor(ServerReadReactor* reactor) { reactor_.store(reactor, std::memory_order_relaxed); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. read_tag_.Set(call_.call(), - [this](bool ok) { - reactor_.load(std::memory_order_relaxed)->OnReadDone(ok); - MaybeDone(); + [this, reactor](bool ok) { + reactor->OnReadDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); }, - &read_ops_, false); + &read_ops_, /*can_inline=*/false); read_ops_.set_core_cq_tag(&read_tag_); this->BindReactor(reactor); this->MaybeCallOnCancel(reactor); - this->MaybeDone(); + // Inlineable OnDone can be false here because there is no read + // reactor that has an inlineable OnDone; this only applies to the + // DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); } ~ServerCallbackReaderImpl() {} ResponseType* response() { return &resp_; } - void MaybeDone() override { - if (GPR_UNLIKELY(this->Unref() == 1)) { - reactor_.load(std::memory_order_relaxed)->OnDone(); - grpc_call* call = call_.call(); - auto call_requester = std::move(call_requester_); - this->~ServerCallbackReaderImpl(); // explicitly call destructor - ::grpc::g_core_codegen_interface->grpc_call_unref(call); - call_requester(); - } + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + this->~ServerCallbackReaderImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); } ServerReactor* reactor() override { @@ -419,8 +455,13 @@ class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler { param.server_context), param.call, static_cast(param.request), std::move(param.call_requester)); + // Inlineable OnDone can be false in the CompletionOp callback because there + // is no write reactor that has an inlineable OnDone; this only applies to + // the DefaultReactor (which is unary). param.server_context->BeginCompletionOp( - param.call, [writer](bool) { writer->MaybeDone(); }, writer); + param.call, + [writer](bool) { writer->MaybeDone(/*inlineable_ondone=*/false); }, + writer); ServerWriteReactor* reactor = nullptr; if (param.status.ok()) { @@ -467,8 +508,17 @@ class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler { class ServerCallbackWriterImpl : public ServerCallbackWriter { public: void Finish(::grpc::Status s) override { - finish_tag_.Set(call_.call(), [this](bool) { MaybeDone(); }, &finish_ops_, - false); + // A finish tag with only MaybeDone can have its callback inlined + // regardless even if OnDone is not inlineable because this callback just + // checks a ref and then decides whether or not to dispatch OnDone. + finish_tag_.Set(call_.call(), + [this](bool) { + // Inlineable OnDone can be false here because there is + // no write reactor that has an inlineable OnDone; this + // only applies to the DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + }, + &finish_ops_, /*can_inline=*/true); finish_ops_.set_core_cq_tag(&finish_tag_); if (!ctx_->sent_initial_metadata_) { @@ -486,13 +536,17 @@ class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler { void SendInitialMetadata() override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. meta_tag_.Set(call_.call(), [this](bool ok) { - reactor_.load(std::memory_order_relaxed) - ->OnSendInitialMetadataDone(ok); - MaybeDone(); + ServerWriteReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); }, - &meta_ops_, false); + &meta_ops_, /*can_inline=*/false); meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { @@ -547,31 +601,34 @@ class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler { void SetupReactor(ServerWriteReactor* reactor) { reactor_.store(reactor, std::memory_order_relaxed); - write_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_.load(std::memory_order_relaxed)->OnWriteDone(ok); - MaybeDone(); - }, - &write_ops_, false); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. + write_tag_.Set(call_.call(), + [this, reactor](bool ok) { + reactor->OnWriteDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &write_ops_, /*can_inline=*/false); write_ops_.set_core_cq_tag(&write_tag_); this->BindReactor(reactor); this->MaybeCallOnCancel(reactor); - this->MaybeDone(); + // Inlineable OnDone can be false here because there is no write + // reactor that has an inlineable OnDone; this only applies to the + // DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); } ~ServerCallbackWriterImpl() { req_->~RequestType(); } const RequestType* request() { return req_; } - void MaybeDone() override { - if (GPR_UNLIKELY(this->Unref() == 1)) { - reactor_.load(std::memory_order_relaxed)->OnDone(); - grpc_call* call = call_.call(); - auto call_requester = std::move(call_requester_); - this->~ServerCallbackWriterImpl(); // explicitly call destructor - ::grpc::g_core_codegen_interface->grpc_call_unref(call); - call_requester(); - } + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + this->~ServerCallbackWriterImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); } ServerReactor* reactor() override { @@ -620,8 +677,13 @@ class CallbackBidiHandler : public ::grpc::internal::MethodHandler { static_cast<::grpc_impl::CallbackServerContext*>( param.server_context), param.call, std::move(param.call_requester)); + // Inlineable OnDone can be false in the CompletionOp callback because there + // is no bidi reactor that has an inlineable OnDone; this only applies to + // the DefaultReactor (which is unary). param.server_context->BeginCompletionOp( - param.call, [stream](bool) { stream->MaybeDone(); }, stream); + param.call, + [stream](bool) { stream->MaybeDone(/*inlineable_ondone=*/false); }, + stream); ServerBidiReactor* reactor = nullptr; if (param.status.ok()) { @@ -652,8 +714,17 @@ class CallbackBidiHandler : public ::grpc::internal::MethodHandler { : public ServerCallbackReaderWriter { public: void Finish(::grpc::Status s) override { - finish_tag_.Set(call_.call(), [this](bool) { MaybeDone(); }, &finish_ops_, - false); + // A finish tag with only MaybeDone can have its callback inlined + // regardless even if OnDone is not inlineable because this callback just + // checks a ref and then decides whether or not to dispatch OnDone. + finish_tag_.Set(call_.call(), + [this](bool) { + // Inlineable OnDone can be false here because there is + // no bidi reactor that has an inlineable OnDone; this + // only applies to the DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + }, + &finish_ops_, /*can_inline=*/true); finish_ops_.set_core_cq_tag(&finish_tag_); if (!ctx_->sent_initial_metadata_) { @@ -671,13 +742,17 @@ class CallbackBidiHandler : public ::grpc::internal::MethodHandler { void SendInitialMetadata() override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. meta_tag_.Set(call_.call(), [this](bool ok) { - reactor_.load(std::memory_order_relaxed) - ->OnSendInitialMetadataDone(ok); - MaybeDone(); + ServerBidiReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); }, - &meta_ops_, false); + &meta_ops_, /*can_inline=*/false); meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { @@ -733,35 +808,38 @@ class CallbackBidiHandler : public ::grpc::internal::MethodHandler { void SetupReactor(ServerBidiReactor* reactor) { reactor_.store(reactor, std::memory_order_relaxed); - write_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_.load(std::memory_order_relaxed)->OnWriteDone(ok); - MaybeDone(); - }, - &write_ops_, false); + // The callbacks for these functions should not be inlined because they + // invoke user-controlled reactions, but any resulting OnDones can be + // inlined in the executor to which a callback is dispatched. + write_tag_.Set(call_.call(), + [this, reactor](bool ok) { + reactor->OnWriteDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &write_ops_, /*can_inline=*/false); write_ops_.set_core_cq_tag(&write_tag_); read_tag_.Set(call_.call(), - [this](bool ok) { - reactor_.load(std::memory_order_relaxed)->OnReadDone(ok); - MaybeDone(); + [this, reactor](bool ok) { + reactor->OnReadDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); }, - &read_ops_, false); + &read_ops_, /*can_inline=*/false); read_ops_.set_core_cq_tag(&read_tag_); this->BindReactor(reactor); this->MaybeCallOnCancel(reactor); - this->MaybeDone(); - } - - void MaybeDone() override { - if (GPR_UNLIKELY(this->Unref() == 1)) { - reactor_.load(std::memory_order_relaxed)->OnDone(); - grpc_call* call = call_.call(); - auto call_requester = std::move(call_requester_); - this->~ServerCallbackReaderWriterImpl(); // explicitly call destructor - ::grpc::g_core_codegen_interface->grpc_call_unref(call); - call_requester(); - } + // Inlineable OnDone can be false here because there is no bidi + // reactor that has an inlineable OnDone; this only applies to the + // DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + } + + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + this->~ServerCallbackReaderWriterImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); } ServerReactor* reactor() override { diff --git a/include/grpcpp/impl/codegen/server_callback_impl.h b/include/grpcpp/impl/codegen/server_callback_impl.h index 6edf6e4dddd..aaf83b9b271 100644 --- a/include/grpcpp/impl/codegen/server_callback_impl.h +++ b/include/grpcpp/impl/codegen/server_callback_impl.h @@ -73,11 +73,33 @@ class ServerCallbackCall { public: virtual ~ServerCallbackCall() {} - // This object is responsible for tracking when it is safe to call - // OnCancel. This function should not be called until after the method handler - // is done and the RPC has completed with a cancellation. This is tracked by - // counting how many of these conditions have been met and calling OnCancel - // when none remain unmet. + // This object is responsible for tracking when it is safe to call OnDone and + // OnCancel. OnDone should not be called until the method handler is complete, + // Finish has been called, the ServerContext CompletionOp (which tracks + // cancellation or successful completion) has completed, and all outstanding + // Read/Write actions have seen their reactions. OnCancel should not be called + // until after the method handler is done and the RPC has completed with a + // cancellation. This is tracked by counting how many of these conditions have + // been met and calling OnCancel when none remain unmet. + + // Public versions of MaybeDone: one where we don't know the reactor in + // advance (used for the ServerContext CompletionOp), and one for where we + // know the inlineability of the OnDone reaction. You should set the inline + // flag to true if either the Reactor is InternalInlineable() or if this + // callback is already being forced to run dispatched to an executor + // (typically because it contains additional work than just the MaybeDone). + + void MaybeDone() { + if (GPR_UNLIKELY(Unref() == 1)) { + ScheduleOnDone(reactor()->InternalInlineable()); + } + } + + void MaybeDone(bool inline_ondone) { + if (GPR_UNLIKELY(Unref() == 1)) { + ScheduleOnDone(inline_ondone); + } + } // Fast version called with known reactor passed in, used from derived // classes, typically in non-cancel case @@ -101,14 +123,17 @@ class ServerCallbackCall { /// Increases the reference count void Ref() { callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); } - /// Decreases the reference count and returns the previous value - int Unref() { - return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel); - } - private: virtual ServerReactor* reactor() = 0; - virtual void MaybeDone() = 0; + + // CallOnDone performs the work required at completion of the RPC: invoking + // the OnDone function and doing all necessary cleanup. This function is only + // ever invoked on a fully-Unref'fed ServerCallbackCall. + virtual void CallOnDone() = 0; + + // If the OnDone reaction is inlineable, execute it inline. Otherwise send it + // to an executor. + void ScheduleOnDone(bool inline_ondone); // If the OnCancel reaction is inlineable, execute it inline. Otherwise send // it to an executor. @@ -121,6 +146,11 @@ class ServerCallbackCall { 1, std::memory_order_acq_rel) == 1; } + /// Decreases the reference count and returns the previous value + int Unref() { + return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel); + } + std::atomic_int on_cancel_conditions_remaining_{2}; std::atomic_int callbacks_outstanding_{ 3}; // reserve for start, Finish, and CompletionOp diff --git a/include/grpcpp/impl/codegen/server_context_impl.h b/include/grpcpp/impl/codegen/server_context_impl.h index 02049360559..ae0ea0e99f4 100644 --- a/include/grpcpp/impl/codegen/server_context_impl.h +++ b/include/grpcpp/impl/codegen/server_context_impl.h @@ -474,7 +474,7 @@ class ServerContextBase { ::grpc::Status status() const { return status_; } private: - void MaybeDone() override {} + void CallOnDone() override {} ::grpc_impl::internal::ServerReactor* reactor() override { return reactor_; } diff --git a/src/cpp/server/server_callback.cc b/src/cpp/server/server_callback.cc index 235c8ef4cfe..c1620b721ac 100644 --- a/src/cpp/server/server_callback.cc +++ b/src/cpp/server/server_callback.cc @@ -24,27 +24,59 @@ namespace grpc_impl { namespace internal { +void ServerCallbackCall::ScheduleOnDone(bool inline_ondone) { + if (inline_ondone) { + CallOnDone(); + } else { + // Unlike other uses of closure, do not Ref or Unref here since at this + // point, all the Ref'fing and Unref'fing is done for this call. + grpc_core::ExecCtx exec_ctx; + struct ClosureWithArg { + grpc_closure closure; + ServerCallbackCall* call; + explicit ClosureWithArg(ServerCallbackCall* call_arg) : call(call_arg) { + GRPC_CLOSURE_INIT(&closure, + [](void* void_arg, grpc_error*) { + ClosureWithArg* arg = + static_cast(void_arg); + arg->call->CallOnDone(); + delete arg; + }, + this, grpc_schedule_on_exec_ctx); + } + }; + ClosureWithArg* arg = new ClosureWithArg(this); + grpc_core::Executor::Run(&arg->closure, GRPC_ERROR_NONE); + } +} + void ServerCallbackCall::CallOnCancel(ServerReactor* reactor) { if (reactor->InternalInlineable()) { reactor->OnCancel(); } else { + // Ref to make sure that the closure executes before the whole call gets + // destructed, and Unref within the closure. Ref(); grpc_core::ExecCtx exec_ctx; - struct ClosureArg { + struct ClosureWithArg { + grpc_closure closure; ServerCallbackCall* call; ServerReactor* reactor; + ClosureWithArg(ServerCallbackCall* call_arg, ServerReactor* reactor_arg) + : call(call_arg), reactor(reactor_arg) { + GRPC_CLOSURE_INIT(&closure, + [](void* void_arg, grpc_error*) { + ClosureWithArg* arg = + static_cast(void_arg); + arg->reactor->OnCancel(); + arg->call->MaybeDone(); + delete arg; + }, + this, grpc_schedule_on_exec_ctx); + } }; - ClosureArg* arg = new ClosureArg{this, reactor}; - grpc_core::Executor::Run(GRPC_CLOSURE_CREATE( - [](void* void_arg, grpc_error*) { - ClosureArg* arg = - static_cast(void_arg); - arg->reactor->OnCancel(); - arg->call->MaybeDone(); - delete arg; - }, - arg, nullptr), - GRPC_ERROR_NONE); + ClosureWithArg* arg = new ClosureWithArg(this, reactor); + grpc_core::Executor::Run(&arg->closure, GRPC_ERROR_NONE); } } diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc index aed436098c2..94628195b06 100644 --- a/test/cpp/end2end/test_service_impl.cc +++ b/test/cpp/end2end/test_service_impl.cc @@ -839,7 +839,15 @@ CallbackTestServiceImpl::BidiStream( } setup_done_ = true; } - void OnDone() override { delete this; } + void OnDone() override { + { + // Use the same lock as finish to make sure that OnDone isn't inlined. + std::lock_guard l(finish_mu_); + EXPECT_TRUE(finished_); + finish_thread_.join(); + } + delete this; + } void OnCancel() override { EXPECT_TRUE(setup_done_); EXPECT_TRUE(ctx_->IsCancelled()); @@ -878,8 +886,12 @@ CallbackTestServiceImpl::BidiStream( void FinishOnce(const Status& s) { std::lock_guard l(finish_mu_); if (!finished_) { - Finish(s); finished_ = true; + // Finish asynchronously to make sure that there are no deadlocks. + finish_thread_ = std::thread([this, s] { + std::lock_guard l(finish_mu_); + Finish(s); + }); } } @@ -892,6 +904,7 @@ CallbackTestServiceImpl::BidiStream( std::mutex finish_mu_; bool finished_{false}; bool setup_done_{false}; + std::thread finish_thread_; }; return new Reactor(context); From 0fd5abefca2fc008dcbb8646f46241c560616538 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 19 Feb 2020 21:20:55 -0800 Subject: [PATCH 126/129] Don't depend on InlinedVector::clear to de-allocate --- src/core/lib/iomgr/ev_epollex_linux.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc index e44b7a4b4d1..353c25df8c1 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.cc +++ b/src/core/lib/iomgr/ev_epollex_linux.cc @@ -190,7 +190,15 @@ struct grpc_fd { grpc_iomgr_unregister_object(&iomgr_object); POLLABLE_UNREF(pollable_obj, "fd_pollable"); - pollset_fds.clear(); + + // To clear out the allocations of pollset_fds, we need to swap its + // contents with a newly-constructed (and soon to be destructed) local + // variable of its same type. This is because InlinedVector::clear is _not_ + // guaranteed to actually free up allocations and this is important since + // this object doesn't have a conventional destructor. + grpc_core::InlinedVector pollset_fds_tmp; + pollset_fds_tmp.swap(pollset_fds); + gpr_mu_destroy(&pollable_mu); gpr_mu_destroy(&orphan_mu); From 37e945c9458a4e7ef10596932434317210d71365 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 19 Feb 2020 21:46:36 -0800 Subject: [PATCH 127/129] Use absl::InlinedVector instead of grpc_core::InlinedVector --- src/core/lib/iomgr/ev_epollex_linux.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc index 353c25df8c1..f2fab7cbc47 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.cc +++ b/src/core/lib/iomgr/ev_epollex_linux.cc @@ -41,11 +41,11 @@ #include #include +#include "absl/container/inlined_vector.h" #include "src/core/lib/debug/stats.h" #include "src/core/lib/gpr/spinlock.h" #include "src/core/lib/gpr/tls.h" #include "src/core/lib/gpr/useful.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/sync.h" @@ -196,7 +196,7 @@ struct grpc_fd { // variable of its same type. This is because InlinedVector::clear is _not_ // guaranteed to actually free up allocations and this is important since // this object doesn't have a conventional destructor. - grpc_core::InlinedVector pollset_fds_tmp; + absl::InlinedVector pollset_fds_tmp; pollset_fds_tmp.swap(pollset_fds); gpr_mu_destroy(&pollable_mu); @@ -240,8 +240,8 @@ struct grpc_fd { // Protects pollable_obj and pollset_fds. gpr_mu pollable_mu; - grpc_core::InlinedVector pollset_fds; // Used in PO_MULTI. - pollable* pollable_obj = nullptr; // Used in PO_FD. + absl::InlinedVector pollset_fds; // Used in PO_MULTI. + pollable* pollable_obj = nullptr; // Used in PO_FD. grpc_core::LockfreeEvent read_closure; grpc_core::LockfreeEvent write_closure; From 4795b7e3611e145f2b262ed50fb6213ca50481b7 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 13 Feb 2020 23:36:07 -0800 Subject: [PATCH 128/129] Run xDS tests on Kokoro --- tools/internal_ci/linux/grpc_xds.cfg | 19 +++++++++++++++++++ tools/internal_ci/linux/grpc_xds.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 tools/internal_ci/linux/grpc_xds.cfg create mode 100755 tools/internal_ci/linux/grpc_xds.sh diff --git a/tools/internal_ci/linux/grpc_xds.cfg b/tools/internal_ci/linux/grpc_xds.cfg new file mode 100644 index 00000000000..ae91617fda5 --- /dev/null +++ b/tools/internal_ci/linux/grpc_xds.cfg @@ -0,0 +1,19 @@ +# Copyright 2020 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. + +# Config file for the internal CI (in protobuf text format) + +# Location of the continuous shell script in repository. +build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh" +timeout_mins: 60 diff --git a/tools/internal_ci/linux/grpc_xds.sh b/tools/internal_ci/linux/grpc_xds.sh new file mode 100755 index 00000000000..2e64455c9b2 --- /dev/null +++ b/tools/internal_ci/linux/grpc_xds.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Copyright 2020 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. + +set -ex + +# change to grpc repo root +cd $(dirname $0)/../../.. + +tools/run_tests/helper_scripts/prep_xds.sh +python3 tools/run_tests/run_xds_tests.py \ + --test_case=all \ + --project_id=grpc-testing \ + --gcp_suffix=$(date '+%s') \ + --verbose \ + --client_cmd='bazel run test/cpp/interop:xds_interop_client -- --server=xds-experimental:///{service_host}:{service_port} --stats_port={stats_port} --qps={qps}' From 7a149557596fe46b81898cd094ceb3cdd6f6afc5 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Thu, 30 Jan 2020 11:04:39 -0800 Subject: [PATCH 129/129] Replaced grpc_core::MakeUnique with absl::make_unique --- BUILD | 1 + BUILD.gn | 1 + CMakeLists.txt | 1 + build.yaml | 1 + gRPC-C++.podspec | 1 + gRPC-Core.podspec | 1 + grpc.gyp | 1 + .../filters/client_channel/client_channel.cc | 4 +- .../client_channel/http_connect_handshaker.cc | 2 +- .../client_channel/lb_policy/grpclb/grpclb.cc | 8 +- .../lb_policy/pick_first/pick_first.cc | 20 +- .../lb_policy/round_robin/round_robin.cc | 12 +- .../client_channel/lb_policy/xds/cds.cc | 8 +- .../client_channel/lb_policy/xds/xds.cc | 10 +- .../resolver/dns/c_ares/dns_resolver_ares.cc | 2 +- .../dns/c_ares/grpc_ares_ev_driver_libuv.cc | 2 +- .../dns/c_ares/grpc_ares_ev_driver_posix.cc | 2 +- .../dns/c_ares/grpc_ares_ev_driver_windows.cc | 2 +- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 6 +- .../resolver/dns/native/dns_resolver.cc | 4 +- .../resolver/fake/fake_resolver.cc | 2 +- .../resolver/sockaddr/sockaddr_resolver.cc | 6 +- .../resolver/xds/xds_resolver.cc | 4 +- .../client_channel/resolver_result_parsing.cc | 8 +- .../client_channel/resolving_lb_policy.cc | 8 +- .../filters/client_channel/service_config.cc | 2 +- .../client_channel/xds/xds_bootstrap.cc | 4 +- .../message_size/message_size_filter.cc | 6 +- src/core/lib/gprpp/memory.h | 8 +- .../security/transport/security_handshaker.cc | 4 +- .../session_cache/ssl_session_boringssl.cc | 2 +- .../ssl/session_cache/ssl_session_openssl.cc | 2 +- src/cpp/common/alts_util.cc | 2 +- test/core/channel/channelz_test.cc | 4 +- .../dns_resolver_connectivity_test.cc | 2 +- .../resolvers/dns_resolver_test.cc | 4 +- .../resolvers/sockaddr_resolver_test.cc | 4 +- .../client_channel/service_config_test.cc | 29 +- test/core/end2end/fuzzers/api_fuzzer.cc | 1206 +++++++++++++++++ test/core/end2end/goaway_server_test.cc | 2 +- test/core/gprpp/inlined_vector_test.cc | 16 +- .../readahead_handshaker_server_ssl.cc | 2 +- 42 files changed, 1313 insertions(+), 103 deletions(-) create mode 100644 test/core/end2end/fuzzers/api_fuzzer.cc diff --git a/BUILD b/BUILD index 1f1d9affc34..98bb2548b69 100644 --- a/BUILD +++ b/BUILD @@ -561,6 +561,7 @@ grpc_cc_library( "src/core/lib/profiling/timers.h", ], external_deps = [ + "absl/memory", "absl/strings", ], language = "c++", diff --git a/BUILD.gn b/BUILD.gn index 8dc1e1f1590..193816d66b1 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -162,6 +162,7 @@ config("grpc_config") { ] deps = [ ":absl/container:inlined_vector", + ":absl/memory:memory", ":absl/strings:strings", ":absl/types:optional", ] diff --git a/CMakeLists.txt b/CMakeLists.txt index f9a15dd8289..120b951eebc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1439,6 +1439,7 @@ target_include_directories(gpr target_link_libraries(gpr ${_gRPC_ALLTARGETS_LIBRARIES} absl::inlined_vector + absl::memory absl::strings absl::optional ) diff --git a/build.yaml b/build.yaml index 4a6de9e6ada..f685917fe0d 100644 --- a/build.yaml +++ b/build.yaml @@ -271,6 +271,7 @@ filegroups: - src/core/lib/profiling/stap_timers.cc deps: - absl/container:inlined_vector + - absl/memory:memory - absl/strings:strings - absl/types:optional uses: diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 44a59f601cb..e8b61788f7c 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -215,6 +215,7 @@ Pod::Spec.new do |s| ss.dependency 'gRPC-Core', version abseil_version = '0.20190808.1' ss.dependency 'abseil/container/inlined_vector', abseil_version + ss.dependency 'abseil/memory/memory', abseil_version ss.dependency 'abseil/strings/strings', abseil_version ss.dependency 'abseil/types/optional', abseil_version diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 6fdda1cb52e..43f3be101a9 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -175,6 +175,7 @@ Pod::Spec.new do |s| ss.dependency 'BoringSSL-GRPC', '0.0.7' abseil_version = '0.20190808.1' ss.dependency 'abseil/container/inlined_vector', abseil_version + ss.dependency 'abseil/memory/memory', abseil_version ss.dependency 'abseil/strings/strings', abseil_version ss.dependency 'abseil/types/optional', abseil_version ss.compiler_flags = '-DGRPC_SHADOW_BORINGSSL_SYMBOLS' diff --git a/grpc.gyp b/grpc.gyp index 3f3fd1fd814..4197a676c7c 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -442,6 +442,7 @@ 'type': 'static_library', 'dependencies': [ 'absl/container:inlined_vector', + 'absl/memory:memory', 'absl/strings:strings', 'absl/types:optional', ], diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 4987ae8207b..7fddb7912df 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1595,7 +1595,7 @@ void ChannelData::CreateResolvingLoadBalancingPolicyLocked() { LoadBalancingPolicy::Args lb_args; lb_args.combiner = combiner_; lb_args.channel_control_helper = - grpc_core::MakeUnique(this); + absl::make_unique(this); lb_args.args = channel_args_; grpc_core::UniquePtr target_uri(gpr_strdup(target_uri_.get())); resolving_lb_policy_.reset(new ResolvingLoadBalancingPolicy( @@ -1871,7 +1871,7 @@ void ChannelData::StartTransportOpLocked(void* arg, grpc_error* /*ignored*/) { MemoryOrder::RELEASE); chand->UpdateStateAndPickerLocked( GRPC_CHANNEL_SHUTDOWN, "shutdown from API", - grpc_core::MakeUnique( + absl::make_unique( GRPC_ERROR_REF(op->disconnect_with_error))); } } diff --git a/src/core/ext/filters/client_channel/http_connect_handshaker.cc b/src/core/ext/filters/client_channel/http_connect_handshaker.cc index cc8c5b02b1c..6e8c84e4a63 100644 --- a/src/core/ext/filters/client_channel/http_connect_handshaker.cc +++ b/src/core/ext/filters/client_channel/http_connect_handshaker.cc @@ -385,5 +385,5 @@ void grpc_http_connect_register_handshaker_factory() { using namespace grpc_core; HandshakerRegistry::RegisterHandshakerFactory( true /* at_start */, HANDSHAKER_CLIENT, - grpc_core::MakeUnique()); + absl::make_unique()); } diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 8035008d036..0e2d6cc7fb5 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -714,9 +714,9 @@ void GrpcLb::Helper::UpdateState(grpc_connectivity_state state, client_stats = parent_->lb_calld_->client_stats()->Ref(); } parent_->channel_control_helper()->UpdateState( - state, grpc_core::MakeUnique(parent_.get(), parent_->serverlist_, - std::move(picker), - std::move(client_stats))); + state, + absl::make_unique(parent_.get(), parent_->serverlist_, + std::move(picker), std::move(client_stats))); } void GrpcLb::Helper::RequestReresolution() { @@ -1946,7 +1946,7 @@ bool maybe_add_client_load_reporting_filter(grpc_channel_stack_builder* builder, void grpc_lb_policy_grpclb_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - grpc_core::MakeUnique()); + absl::make_unique()); grpc_channel_init_register_stage(GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, maybe_add_client_load_reporting_filter, diff --git a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc index 278af3fde75..246b15a3549 100644 --- a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +++ b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc @@ -201,7 +201,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() { GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(error)); + absl::make_unique(error)); return; } // If one of the subchannels in the new list is already in state @@ -319,10 +319,10 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked( GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); p->channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(error)); + absl::make_unique(error)); } else { p->channel_control_helper()->UpdateState( - GRPC_CHANNEL_CONNECTING, grpc_core::MakeUnique(p->Ref( + GRPC_CHANNEL_CONNECTING, absl::make_unique(p->Ref( DEBUG_LOCATION, "QueuePicker"))); } } else { @@ -338,7 +338,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked( p->selected_ = nullptr; p->subchannel_list_.reset(); p->channel_control_helper()->UpdateState( - GRPC_CHANNEL_IDLE, grpc_core::MakeUnique( + GRPC_CHANNEL_IDLE, absl::make_unique( p->Ref(DEBUG_LOCATION, "QueuePicker"))); } else { // This is unlikely but can happen when a subchannel has been asked @@ -347,10 +347,10 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked( if (connectivity_state == GRPC_CHANNEL_READY) { p->channel_control_helper()->UpdateState( GRPC_CHANNEL_READY, - grpc_core::MakeUnique(subchannel()->Ref())); + absl::make_unique(subchannel()->Ref())); } else { // CONNECTING p->channel_control_helper()->UpdateState( - connectivity_state, grpc_core::MakeUnique( + connectivity_state, absl::make_unique( p->Ref(DEBUG_LOCATION, "QueuePicker"))); } } @@ -395,7 +395,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked( GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); p->channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(error)); + absl::make_unique(error)); } } sd->CheckConnectivityStateAndStartWatchingLocked(); @@ -406,7 +406,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked( // Only update connectivity state in case 1. if (subchannel_list() == p->subchannel_list_.get()) { p->channel_control_helper()->UpdateState( - GRPC_CHANNEL_CONNECTING, grpc_core::MakeUnique(p->Ref( + GRPC_CHANNEL_CONNECTING, absl::make_unique(p->Ref( DEBUG_LOCATION, "QueuePicker"))); } break; @@ -446,7 +446,7 @@ void PickFirst::PickFirstSubchannelData::ProcessUnselectedReadyLocked() { } p->selected_ = this; p->channel_control_helper()->UpdateState( - GRPC_CHANNEL_READY, grpc_core::MakeUnique(subchannel()->Ref())); + GRPC_CHANNEL_READY, absl::make_unique(subchannel()->Ref())); for (size_t i = 0; i < subchannel_list()->num_subchannels(); ++i) { if (i != Index()) { subchannel_list()->subchannel(i)->ShutdownLocked(); @@ -503,7 +503,7 @@ class PickFirstFactory : public LoadBalancingPolicyFactory { void grpc_lb_policy_pick_first_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } void grpc_lb_policy_pick_first_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc index a26d0b53994..a5ab488ec55 100644 --- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc @@ -322,12 +322,12 @@ void RoundRobin::RoundRobinSubchannelList:: if (num_ready_ > 0) { /* 1) READY */ p->channel_control_helper()->UpdateState( - GRPC_CHANNEL_READY, grpc_core::MakeUnique(p, this)); + GRPC_CHANNEL_READY, absl::make_unique(p, this)); } else if (num_connecting_ > 0) { /* 2) CONNECTING */ p->channel_control_helper()->UpdateState( - GRPC_CHANNEL_CONNECTING, grpc_core::MakeUnique( - p->Ref(DEBUG_LOCATION, "QueuePicker"))); + GRPC_CHANNEL_CONNECTING, + absl::make_unique(p->Ref(DEBUG_LOCATION, "QueuePicker"))); } else if (num_transient_failure_ == num_subchannels()) { /* 3) TRANSIENT_FAILURE */ grpc_error* error = @@ -336,7 +336,7 @@ void RoundRobin::RoundRobinSubchannelList:: GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); p->channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(error)); + absl::make_unique(error)); } } @@ -453,7 +453,7 @@ void RoundRobin::UpdateLocked(UpdateArgs args) { GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(error)); + absl::make_unique(error)); subchannel_list_ = std::move(latest_pending_subchannel_list_); } else if (subchannel_list_ == nullptr) { // If there is no current list, immediately promote the new list to @@ -498,7 +498,7 @@ class RoundRobinFactory : public LoadBalancingPolicyFactory { void grpc_lb_policy_round_robin_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } void grpc_lb_policy_round_robin_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc index 5344cb3ddb1..41c031b97d8 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc @@ -148,7 +148,7 @@ void CdsLb::ClusterWatcher::OnClusterChanged(XdsApi::CdsUpdate cluster_data) { LoadBalancingPolicy::Args args; args.combiner = parent_->combiner(); args.args = parent_->args_; - args.channel_control_helper = grpc_core::MakeUnique(parent_->Ref()); + args.channel_control_helper = absl::make_unique(parent_->Ref()); parent_->child_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( "xds_experimental", std::move(args)); @@ -173,7 +173,7 @@ void CdsLb::ClusterWatcher::OnError(grpc_error* error) { if (parent_->child_policy_ == nullptr) { parent_->channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(error)); + absl::make_unique(error)); } else { GRPC_ERROR_UNREF(error); } @@ -273,7 +273,7 @@ void CdsLb::UpdateLocked(UpdateArgs args) { xds_client_->CancelClusterDataWatch( StringView(old_config->cluster().c_str()), cluster_watcher_); } - auto watcher = grpc_core::MakeUnique(Ref()); + auto watcher = absl::make_unique(Ref()); cluster_watcher_ = watcher.get(); xds_client_->WatchClusterData(StringView(config_->cluster().c_str()), std::move(watcher)); @@ -335,7 +335,7 @@ class CdsFactory : public LoadBalancingPolicyFactory { void grpc_lb_policy_cds_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } void grpc_lb_policy_cds_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index 5cd24724f6e..3dda5904a08 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -809,7 +809,7 @@ void XdsLb::UpdateLocked(UpdateArgs args) { xds_client()->CancelEndpointDataWatch(StringView(old_eds_service_name), endpoint_watcher_); } - auto watcher = grpc_core::MakeUnique( + auto watcher = absl::make_unique( Ref(DEBUG_LOCATION, "EndpointWatcher")); endpoint_watcher_ = watcher.get(); xds_client()->WatchEndpointData(StringView(eds_service_name()), @@ -1060,7 +1060,7 @@ void XdsLb::UpdateXdsPickerLocked() { GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(error)); + absl::make_unique(error)); return; } priorities_[current_priority_]->UpdateXdsPickerLocked(); @@ -1150,7 +1150,7 @@ XdsLb::LocalityMap::LocalityMap(RefCountedPtr xds_policy, if (priority_ == 0) { xds_policy_->channel_control_helper()->UpdateState( GRPC_CHANNEL_CONNECTING, - grpc_core::MakeUnique( + absl::make_unique( xds_policy_->Ref(DEBUG_LOCATION, "QueuePicker"))); } } @@ -1225,7 +1225,7 @@ void XdsLb::LocalityMap::UpdateXdsPickerLocked() { } xds_policy()->channel_control_helper()->UpdateState( GRPC_CHANNEL_READY, - grpc_core::MakeUnique( + absl::make_unique( xds_policy_->Ref(DEBUG_LOCATION, "LocalityPicker"), std::move(picker_list))); } @@ -1870,7 +1870,7 @@ class XdsFactory : public LoadBalancingPolicyFactory { void grpc_lb_policy_xds_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } void grpc_lb_policy_xds_shutdown() {} diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index 7f8ccafc0f2..a8215439d2a 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -499,7 +499,7 @@ void grpc_resolver_dns_ares_init() { } grpc_set_resolver_impl(&ares_resolver); grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } else { g_use_ares_dns_resolver = false; } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc index 62576c706ba..37bb903a3a5 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc @@ -173,7 +173,7 @@ class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory { std::unique_ptr NewGrpcPolledFdFactory( Combiner* combiner) { - return grpc_core::MakeUnique(); + return absl::make_unique(); } } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc index 8a51475d4ec..0b571a2bf33 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc @@ -99,7 +99,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { std::unique_ptr NewGrpcPolledFdFactory( Combiner* /*combiner*/) { - return grpc_core::MakeUnique(); + return absl::make_unique(); } } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index ed3daf3af77..0742c97a6fb 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -934,7 +934,7 @@ class GrpcPolledFdFactoryWindows : public GrpcPolledFdFactory { std::unique_ptr NewGrpcPolledFdFactory( Combiner* combiner) { - return grpc_core::MakeUnique(combiner); + return absl::make_unique(combiner); } } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index d2c00000fdc..761bed9a82d 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -185,7 +185,7 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, "request:%p on_hostbyname_done_locked host=%s ARES_SUCCESS", r, hr->host); if (*r->addresses_out == nullptr) { - *r->addresses_out = grpc_core::MakeUnique(); + *r->addresses_out = absl::make_unique(); } ServerAddressList& addresses = **r->addresses_out; for (size_t i = 0; hostent->h_addr_list[i] != nullptr; ++i) { @@ -480,7 +480,7 @@ static bool inner_resolve_as_ip_literal_locked( grpc_parse_ipv6_hostport(hostport->get(), &addr, false /* log errors */)) { GPR_ASSERT(*addrs == nullptr); - *addrs = grpc_core::MakeUnique(); + *addrs = absl::make_unique(); (*addrs)->emplace_back(addr.addr, addr.len, nullptr /* args */); return true; } @@ -543,7 +543,7 @@ static bool inner_maybe_resolve_localhost_manually_locked( } if (gpr_stricmp(host->get(), "localhost") == 0) { GPR_ASSERT(*addrs == nullptr); - *addrs = grpc_core::MakeUnique(); + *addrs = absl::make_unique(); uint16_t numeric_port = grpc_strhtons(port->get()); // Append the ipv6 loopback address. struct sockaddr_in6 ipv6_loopback_addr; diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index d7028a5eaa3..3b5b902effc 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -305,7 +305,7 @@ void grpc_resolver_dns_native_init() { if (gpr_stricmp(resolver.get(), "native") == 0) { gpr_log(GPR_DEBUG, "Using native dns resolver"); grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } else { grpc_core::ResolverRegistry::Builder::InitRegistry(); grpc_core::ResolverFactory* existing_factory = @@ -313,7 +313,7 @@ void grpc_resolver_dns_native_init() { if (existing_factory == nullptr) { gpr_log(GPR_DEBUG, "Using native dns resolver"); grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } } } diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index 906dad2b6aa..30666894511 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -386,7 +386,7 @@ class FakeResolverFactory : public ResolverFactory { void grpc_resolver_fake_init() { grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } void grpc_resolver_fake_shutdown() {} diff --git a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc index e946a911e6a..ef1304392cb 100644 --- a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc @@ -176,12 +176,12 @@ class UnixResolverFactory : public ResolverFactory { void grpc_resolver_sockaddr_init() { grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); #ifdef GRPC_HAVE_UNIX_SOCKET grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); #endif } diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index e7eed60c446..8b7354f8621 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -91,7 +91,7 @@ void XdsResolver::StartLocked() { grpc_error* error = GRPC_ERROR_NONE; xds_client_ = MakeOrphanable( combiner(), interested_parties_, StringView(server_name_.get()), - grpc_core::MakeUnique(Ref()), *args_, &error); + absl::make_unique(Ref()), *args_, &error); if (error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, "Failed to create xds client -- channel will remain in " @@ -129,7 +129,7 @@ class XdsResolverFactory : public ResolverFactory { void grpc_resolver_xds_init() { grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( - grpc_core::MakeUnique()); + absl::make_unique()); } void grpc_resolver_xds_shutdown() {} diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.cc b/src/core/ext/filters/client_channel/resolver_result_parsing.cc index 8b9f9ec7c74..080ecd354e6 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.cc +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.cc @@ -54,7 +54,7 @@ size_t ClientChannelServiceConfigParser::ParserIndex() { void ClientChannelServiceConfigParser::Register() { g_client_channel_service_config_parser_index = ServiceConfig::RegisterParser( - grpc_core::MakeUnique()); + absl::make_unique()); } namespace { @@ -95,7 +95,7 @@ std::unique_ptr ParseRetryPolicy( const Json& json, grpc_error** error) { GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); auto retry_policy = - grpc_core::MakeUnique(); + absl::make_unique(); if (json.type() != Json::Type::OBJECT) { *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:retryPolicy error:should be of type object"); @@ -387,7 +387,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, *error = GRPC_ERROR_CREATE_FROM_VECTOR("Client channel global parser", &error_list); if (*error == GRPC_ERROR_NONE) { - return grpc_core::MakeUnique( + return absl::make_unique( std::move(parsed_lb_config), std::move(lb_policy_name), retry_throttling, health_check_service_name); } @@ -433,7 +433,7 @@ ClientChannelServiceConfigParser::ParsePerMethodParams(const Json& json, } *error = GRPC_ERROR_CREATE_FROM_VECTOR("Client channel parser", &error_list); if (*error == GRPC_ERROR_NONE) { - return grpc_core::MakeUnique( + return absl::make_unique( timeout, wait_for_ready, std::move(retry_policy)); } return nullptr; diff --git a/src/core/ext/filters/client_channel/resolving_lb_policy.cc b/src/core/ext/filters/client_channel/resolving_lb_policy.cc index 26766801243..e27aa661476 100644 --- a/src/core/ext/filters/client_channel/resolving_lb_policy.cc +++ b/src/core/ext/filters/client_channel/resolving_lb_policy.cc @@ -188,15 +188,15 @@ ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy( GPR_ASSERT(process_resolver_result != nullptr); resolver_ = ResolverRegistry::CreateResolver( target_uri_.get(), args.args, interested_parties(), combiner(), - grpc_core::MakeUnique(Ref())); + absl::make_unique(Ref())); // Since the validity of args has been checked when create the channel, // CreateResolver() must return a non-null result. GPR_ASSERT(resolver_ != nullptr); if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) { gpr_log(GPR_INFO, "resolving_lb=%p: starting name resolution", this); } - channel_control_helper()->UpdateState( - GRPC_CHANNEL_CONNECTING, grpc_core::MakeUnique(Ref())); + channel_control_helper()->UpdateState(GRPC_CHANNEL_CONNECTING, + absl::make_unique(Ref())); resolver_->StartLocked(); } @@ -262,7 +262,7 @@ void ResolvingLoadBalancingPolicy::OnResolverError(grpc_error* error) { "Resolver transient failure", &error, 1); channel_control_helper()->UpdateState( GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_core::MakeUnique(state_error)); + absl::make_unique(state_error)); } GRPC_ERROR_UNREF(error); } diff --git a/src/core/ext/filters/client_channel/service_config.cc b/src/core/ext/filters/client_channel/service_config.cc index de3eafac778..884f68f2090 100644 --- a/src/core/ext/filters/client_channel/service_config.cc +++ b/src/core/ext/filters/client_channel/service_config.cc @@ -95,7 +95,7 @@ grpc_error* ServiceConfig::ParseJsonMethodConfigToServiceConfigVectorTable( const Json& json, InlinedVector::Entry, 10>* entries) { - auto objs_vector = grpc_core::MakeUnique(); + auto objs_vector = absl::make_unique(); InlinedVector error_list; for (size_t i = 0; i < g_registered_parsers->size(); i++) { grpc_error* parser_error = GRPC_ERROR_NONE; diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc index 8befdb153c8..fcc079819bc 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc @@ -42,7 +42,7 @@ std::unique_ptr XdsBootstrap::ReadFromFile(grpc_error** error) { Json json = Json::Parse(StringViewFromSlice(contents), error); grpc_slice_unref_internal(contents); if (*error != GRPC_ERROR_NONE) return nullptr; - return grpc_core::MakeUnique(std::move(json), error); + return absl::make_unique(std::move(json), error); } XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) { @@ -192,7 +192,7 @@ grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx, grpc_error* XdsBootstrap::ParseNode(Json* json) { InlinedVector error_list; - node_ = grpc_core::MakeUnique(); + node_ = absl::make_unique(); auto it = json->mutable_object()->find("id"); if (it != json->mutable_object()->end()) { if (it->second.type() != Json::Type::STRING) { diff --git a/src/core/ext/filters/message_size/message_size_filter.cc b/src/core/ext/filters/message_size/message_size_filter.cc index 6cecb943156..75f97d7aa08 100644 --- a/src/core/ext/filters/message_size/message_size_filter.cc +++ b/src/core/ext/filters/message_size/message_size_filter.cc @@ -86,13 +86,13 @@ MessageSizeParser::ParsePerMethodParams(const Json& json, grpc_error** error) { *error = GRPC_ERROR_CREATE_FROM_VECTOR("Message size parser", &error_list); return nullptr; } - return grpc_core::MakeUnique( - max_request_message_bytes, max_response_message_bytes); + return absl::make_unique(max_request_message_bytes, + max_response_message_bytes); } void MessageSizeParser::Register() { g_message_size_parser_index = - ServiceConfig::RegisterParser(grpc_core::MakeUnique()); + ServiceConfig::RegisterParser(absl::make_unique()); } size_t MessageSizeParser::ParserIndex() { return g_message_size_parser_index; } diff --git a/src/core/lib/gprpp/memory.h b/src/core/lib/gprpp/memory.h index 8206c34ffe3..4edc9b3d9c7 100644 --- a/src/core/lib/gprpp/memory.h +++ b/src/core/lib/gprpp/memory.h @@ -28,6 +28,8 @@ #include #include +#include "absl/memory/memory.h" + namespace grpc_core { class DefaultDeleteChar { @@ -44,12 +46,6 @@ class DefaultDeleteChar { template using UniquePtr = std::unique_ptr; -// TODO(veblush): Replace this with absl::make_unique once abseil is added. -template -inline std::unique_ptr MakeUnique(Args&&... args) { - return std::unique_ptr(new T(std::forward(args)...)); -} - } // namespace grpc_core #endif /* GRPC_CORE_LIB_GPRPP_MEMORY_H */ diff --git a/src/core/lib/security/transport/security_handshaker.cc b/src/core/lib/security/transport/security_handshaker.cc index 1f37b7f7763..4566657da72 100644 --- a/src/core/lib/security/transport/security_handshaker.cc +++ b/src/core/lib/security/transport/security_handshaker.cc @@ -559,10 +559,10 @@ RefCountedPtr SecurityHandshakerCreate( void SecurityRegisterHandshakerFactories() { HandshakerRegistry::RegisterHandshakerFactory( false /* at_start */, HANDSHAKER_CLIENT, - grpc_core::MakeUnique()); + absl::make_unique()); HandshakerRegistry::RegisterHandshakerFactory( false /* at_start */, HANDSHAKER_SERVER, - grpc_core::MakeUnique()); + absl::make_unique()); } } // namespace grpc_core diff --git a/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc b/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc index a2d71a4afac..612ecfffd46 100644 --- a/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +++ b/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc @@ -49,7 +49,7 @@ class BoringSslCachedSession : public SslCachedSession { std::unique_ptr SslCachedSession::Create( SslSessionPtr session) { - return grpc_core::MakeUnique(std::move(session)); + return absl::make_unique(std::move(session)); } } // namespace tsi diff --git a/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc b/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc index 2787f4b9b38..f45205cecce 100644 --- a/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +++ b/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc @@ -67,7 +67,7 @@ class OpenSslCachedSession : public SslCachedSession { std::unique_ptr SslCachedSession::Create( SslSessionPtr session) { - return grpc_core::MakeUnique(std::move(session)); + return absl::make_unique(std::move(session)); } } // namespace tsi diff --git a/src/cpp/common/alts_util.cc b/src/cpp/common/alts_util.cc index b6e0d26480f..f565894674c 100644 --- a/src/cpp/common/alts_util.cc +++ b/src/cpp/common/alts_util.cc @@ -53,7 +53,7 @@ std::unique_ptr GetAltsContextFromAuthContext( gpr_log(GPR_ERROR, "security_level is invalid."); return nullptr; } - return grpc_core::MakeUnique(AltsContext(ctx)); + return absl::make_unique(AltsContext(ctx)); } grpc::Status AltsClientAuthzCheck( diff --git a/test/core/channel/channelz_test.cc b/test/core/channel/channelz_test.cc index ebbbc31f6dd..b16d2d53e0b 100644 --- a/test/core/channel/channelz_test.cc +++ b/test/core/channel/channelz_test.cc @@ -481,8 +481,8 @@ TEST_F(ChannelzRegistryBasedTest, GetTopChannelsUuidAfterCompaction) { // these will delete and unregister themselves after this block. std::vector> odd_channels; for (int i = 0; i < kLoopIterations; i++) { - odd_channels.push_back(grpc_core::MakeUnique()); - even_channels.push_back(grpc_core::MakeUnique()); + odd_channels.push_back(absl::make_unique()); + even_channels.push_back(absl::make_unique()); } } std::string json_str = ChannelzRegistry::GetTopChannels(0); diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 95eafeff54f..56a552ea9ca 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -75,7 +75,7 @@ static grpc_ares_request* my_dns_lookup_ares_locked( error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Forced Failure"); } else { gpr_mu_unlock(&g_mu); - *addresses = grpc_core::MakeUnique(); + *addresses = absl::make_unique(); grpc_resolved_address dummy_resolved_address; memset(&dummy_resolved_address, 0, sizeof(dummy_resolved_address)); dummy_resolved_address.len = 123; diff --git a/test/core/client_channel/resolvers/dns_resolver_test.cc b/test/core/client_channel/resolvers/dns_resolver_test.cc index f86f52b4e92..12d5d186f14 100644 --- a/test/core/client_channel/resolvers/dns_resolver_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_test.cc @@ -45,7 +45,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, grpc_core::ResolverArgs args; args.uri = uri; args.combiner = g_combiner; - args.result_handler = grpc_core::MakeUnique(); + args.result_handler = absl::make_unique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); GPR_ASSERT(resolver != nullptr); @@ -62,7 +62,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, grpc_core::ResolverArgs args; args.uri = uri; args.combiner = g_combiner; - args.result_handler = grpc_core::MakeUnique(); + args.result_handler = absl::make_unique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); GPR_ASSERT(resolver == nullptr); diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc index 9b1d6779e8e..a6999f6ffbc 100644 --- a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc +++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc @@ -47,7 +47,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, grpc_core::ResolverArgs args; args.uri = uri; args.combiner = g_combiner; - args.result_handler = grpc_core::MakeUnique(); + args.result_handler = absl::make_unique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); GPR_ASSERT(resolver != nullptr); @@ -68,7 +68,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, grpc_core::ResolverArgs args; args.uri = uri; args.combiner = g_combiner; - args.result_handler = grpc_core::MakeUnique(); + args.result_handler = absl::make_unique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); GPR_ASSERT(resolver == nullptr); diff --git a/test/core/client_channel/service_config_test.cc b/test/core/client_channel/service_config_test.cc index 27ea0580e69..ad874736ffb 100644 --- a/test/core/client_channel/service_config_test.cc +++ b/test/core/client_channel/service_config_test.cc @@ -59,7 +59,7 @@ class TestParser1 : public ServiceConfig::Parser { GRPC_ERROR_CREATE_FROM_STATIC_STRING(InvalidValueErrorMessage()); return nullptr; } - return grpc_core::MakeUnique(value); + return absl::make_unique(value); } return nullptr; } @@ -91,7 +91,7 @@ class TestParser2 : public ServiceConfig::Parser { GRPC_ERROR_CREATE_FROM_STATIC_STRING(InvalidValueErrorMessage()); return nullptr; } - return grpc_core::MakeUnique(value); + return absl::make_unique(value); } return nullptr; } @@ -139,10 +139,10 @@ class ServiceConfigTest : public ::testing::Test { void SetUp() override { ServiceConfig::Shutdown(); ServiceConfig::Init(); - EXPECT_TRUE(ServiceConfig::RegisterParser( - grpc_core::MakeUnique()) == 0); - EXPECT_TRUE(ServiceConfig::RegisterParser( - grpc_core::MakeUnique()) == 1); + EXPECT_TRUE( + ServiceConfig::RegisterParser(absl::make_unique()) == 0); + EXPECT_TRUE( + ServiceConfig::RegisterParser(absl::make_unique()) == 1); } }; @@ -301,10 +301,10 @@ class ErroredParsersScopingTest : public ::testing::Test { void SetUp() override { ServiceConfig::Shutdown(); ServiceConfig::Init(); - EXPECT_TRUE(ServiceConfig::RegisterParser( - grpc_core::MakeUnique()) == 0); - EXPECT_TRUE(ServiceConfig::RegisterParser( - grpc_core::MakeUnique()) == 1); + EXPECT_TRUE( + ServiceConfig::RegisterParser(absl::make_unique()) == 0); + EXPECT_TRUE( + ServiceConfig::RegisterParser(absl::make_unique()) == 1); } }; @@ -346,9 +346,10 @@ class ClientChannelParserTest : public ::testing::Test { void SetUp() override { ServiceConfig::Shutdown(); ServiceConfig::Init(); - EXPECT_TRUE(ServiceConfig::RegisterParser( - grpc_core::MakeUnique< - internal::ClientChannelServiceConfigParser>()) == 0); + EXPECT_TRUE( + ServiceConfig::RegisterParser( + absl::make_unique()) == + 0); } }; @@ -915,7 +916,7 @@ class MessageSizeParserTest : public ::testing::Test { ServiceConfig::Shutdown(); ServiceConfig::Init(); EXPECT_TRUE(ServiceConfig::RegisterParser( - grpc_core::MakeUnique()) == 0); + absl::make_unique()) == 0); } }; diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc new file mode 100644 index 00000000000..7b9883f29f8 --- /dev/null +++ b/test/core/end2end/fuzzers/api_fuzzer.cc @@ -0,0 +1,1206 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include +#include +#include +#include +#include + +#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" +#include "src/core/ext/filters/client_channel/server_address.h" +#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/iomgr/executor.h" +#include "src/core/lib/iomgr/resolve_address.h" +#include "src/core/lib/iomgr/tcp_client.h" +#include "src/core/lib/iomgr/timer.h" +#include "src/core/lib/iomgr/timer_manager.h" +#include "src/core/lib/slice/slice_internal.h" +#include "src/core/lib/surface/server.h" +#include "src/core/lib/transport/metadata.h" +#include "test/core/end2end/data/ssl_test_data.h" +#include "test/core/util/fuzzer_util.h" +#include "test/core/util/passthru_endpoint.h" + +using grpc_core::testing::grpc_fuzzer_get_next_byte; +using grpc_core::testing::grpc_fuzzer_get_next_string; +using grpc_core::testing::grpc_fuzzer_get_next_uint32; +using grpc_core::testing::input_stream; + +//////////////////////////////////////////////////////////////////////////////// +// logging + +bool squelch = true; +bool leak_check = true; + +static void dont_log(gpr_log_func_args* /*args*/) {} + +//////////////////////////////////////////////////////////////////////////////// +// global state + +static gpr_timespec g_now; +static grpc_server* g_server; +static grpc_channel* g_channel; +static grpc_resource_quota* g_resource_quota; + +extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type); + +static gpr_timespec now_impl(gpr_clock_type clock_type) { + GPR_ASSERT(clock_type != GPR_TIMESPAN); + gpr_timespec ts = g_now; + ts.clock_type = clock_type; + return ts; +} + +static void end(input_stream* inp) { inp->cur = inp->end; } + +static void read_buffer(input_stream* inp, char** buffer, size_t* length, + bool* special) { + *length = grpc_fuzzer_get_next_byte(inp); + if (*length == 255) { + if (special != nullptr) *special = true; + *length = grpc_fuzzer_get_next_byte(inp); + } else { + if (special != nullptr) *special = false; + } + *buffer = static_cast(gpr_malloc(*length)); + for (size_t i = 0; i < *length; i++) { + (*buffer)[i] = static_cast(grpc_fuzzer_get_next_byte(inp)); + } +} + +static grpc_slice maybe_intern(grpc_slice s, bool intern) { + grpc_slice r = intern ? grpc_slice_intern(s) : grpc_slice_ref(s); + grpc_slice_unref(s); + return r; +} + +static grpc_slice read_string_like_slice(input_stream* inp) { + bool special; + char* s = grpc_fuzzer_get_next_string(inp, &special); + grpc_slice r = maybe_intern(grpc_slice_from_copied_string(s), special); + gpr_free(s); + return r; +} + +static grpc_slice read_buffer_like_slice(input_stream* inp) { + char* buffer; + size_t length; + bool special; + read_buffer(inp, &buffer, &length, &special); + grpc_slice r = + maybe_intern(grpc_slice_from_copied_buffer(buffer, length), special); + gpr_free(buffer); + return r; +} + +static uint32_t read_uint22(input_stream* inp) { + uint8_t b = grpc_fuzzer_get_next_byte(inp); + uint32_t x = b & 0x7f; + if (b & 0x80) { + x <<= 7; + b = grpc_fuzzer_get_next_byte(inp); + x |= b & 0x7f; + if (b & 0x80) { + x <<= 8; + x |= grpc_fuzzer_get_next_byte(inp); + } + } + return x; +} + +static grpc_byte_buffer* read_message(input_stream* inp) { + grpc_slice slice = grpc_slice_malloc(read_uint22(inp)); + memset(GRPC_SLICE_START_PTR(slice), 0, GRPC_SLICE_LENGTH(slice)); + grpc_byte_buffer* out = grpc_raw_byte_buffer_create(&slice, 1); + grpc_slice_unref(slice); + return out; +} + +static int read_int(input_stream* inp) { + return static_cast(grpc_fuzzer_get_next_uint32(inp)); +} + +static grpc_channel_args* read_args(input_stream* inp) { + size_t n = grpc_fuzzer_get_next_byte(inp); + grpc_arg* args = static_cast(gpr_malloc(sizeof(*args) * n)); + for (size_t i = 0; i < n; i++) { + switch (grpc_fuzzer_get_next_byte(inp)) { + case 1: + args[i].type = GRPC_ARG_STRING; + args[i].key = grpc_fuzzer_get_next_string(inp, nullptr); + args[i].value.string = grpc_fuzzer_get_next_string(inp, nullptr); + break; + case 2: + args[i].type = GRPC_ARG_INTEGER; + args[i].key = grpc_fuzzer_get_next_string(inp, nullptr); + args[i].value.integer = read_int(inp); + break; + case 3: + args[i].type = GRPC_ARG_POINTER; + args[i].key = gpr_strdup(GRPC_ARG_RESOURCE_QUOTA); + args[i].value.pointer.vtable = grpc_resource_quota_arg_vtable(); + args[i].value.pointer.p = g_resource_quota; + grpc_resource_quota_ref(g_resource_quota); + break; + default: + end(inp); + n = i; + break; + } + } + grpc_channel_args* a = + static_cast(gpr_malloc(sizeof(*a))); + a->args = args; + a->num_args = n; + return a; +} + +typedef struct cred_artifact_ctx { + int num_release; + char* release[3]; +} cred_artifact_ctx; +#define CRED_ARTIFACT_CTX_INIT \ + { \ + 0, { 0 } \ + } + +static void cred_artifact_ctx_finish(cred_artifact_ctx* ctx) { + for (int i = 0; i < ctx->num_release; i++) { + gpr_free(ctx->release[i]); + } +} + +static const char* read_cred_artifact(cred_artifact_ctx* ctx, input_stream* inp, + const char** builtins, + size_t num_builtins) { + uint8_t b = grpc_fuzzer_get_next_byte(inp); + if (b == 0) return nullptr; + if (b == 1) + return ctx->release[ctx->num_release++] = + grpc_fuzzer_get_next_string(inp, nullptr); + if (b >= num_builtins + 1) { + end(inp); + return nullptr; + } + return builtins[b - 1]; +} + +static grpc_channel_credentials* read_ssl_channel_creds(input_stream* inp) { + cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT; + static const char* builtin_root_certs[] = {test_root_cert}; + static const char* builtin_private_keys[] = { + test_server1_key, test_self_signed_client_key, test_signed_client_key}; + static const char* builtin_cert_chains[] = { + test_server1_cert, test_self_signed_client_cert, test_signed_client_cert}; + const char* root_certs = read_cred_artifact( + &ctx, inp, builtin_root_certs, GPR_ARRAY_SIZE(builtin_root_certs)); + const char* private_key = read_cred_artifact( + &ctx, inp, builtin_private_keys, GPR_ARRAY_SIZE(builtin_private_keys)); + const char* certs = read_cred_artifact(&ctx, inp, builtin_cert_chains, + GPR_ARRAY_SIZE(builtin_cert_chains)); + grpc_ssl_pem_key_cert_pair key_cert_pair = {private_key, certs}; + grpc_channel_credentials* creds = grpc_ssl_credentials_create( + root_certs, + private_key != nullptr && certs != nullptr ? &key_cert_pair : nullptr, + nullptr, nullptr); + cred_artifact_ctx_finish(&ctx); + return creds; +} + +static grpc_call_credentials* read_call_creds(input_stream* inp, int depth) { + if (depth > 64) { + // prevent creating infinitely deep call creds + end(inp); + return nullptr; + } + switch (grpc_fuzzer_get_next_byte(inp)) { + default: + end(inp); + return nullptr; + case 0: + return nullptr; + case 1: { + grpc_call_credentials* c1 = read_call_creds(inp, depth + 1); + grpc_call_credentials* c2 = read_call_creds(inp, depth + 1); + if (c1 != nullptr && c2 != nullptr) { + grpc_call_credentials* out = + grpc_composite_call_credentials_create(c1, c2, nullptr); + grpc_call_credentials_release(c1); + grpc_call_credentials_release(c2); + return out; + } else if (c1 != nullptr) { + return c1; + } else if (c2 != nullptr) { + return c2; + } else { + return nullptr; + } + GPR_UNREACHABLE_CODE(return nullptr); + } + case 2: { + cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT; + const char* access_token = read_cred_artifact(&ctx, inp, nullptr, 0); + grpc_call_credentials* out = + access_token == nullptr + ? nullptr + : grpc_access_token_credentials_create(access_token, nullptr); + cred_artifact_ctx_finish(&ctx); + return out; + } + case 3: { + cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT; + const char* auth_token = read_cred_artifact(&ctx, inp, nullptr, 0); + const char* auth_selector = read_cred_artifact(&ctx, inp, nullptr, 0); + grpc_call_credentials* out = + auth_token == nullptr || auth_selector == nullptr + ? nullptr + : grpc_google_iam_credentials_create(auth_token, auth_selector, + nullptr); + cred_artifact_ctx_finish(&ctx); + return out; + } + /* TODO(ctiller): more cred types here */ + } +} + +static grpc_channel_credentials* read_channel_creds(input_stream* inp) { + switch (grpc_fuzzer_get_next_byte(inp)) { + case 0: + return read_ssl_channel_creds(inp); + break; + case 1: { + grpc_channel_credentials* c1 = read_channel_creds(inp); + grpc_call_credentials* c2 = read_call_creds(inp, 0); + if (c1 != nullptr && c2 != nullptr) { + grpc_channel_credentials* out = + grpc_composite_channel_credentials_create(c1, c2, nullptr); + grpc_channel_credentials_release(c1); + grpc_call_credentials_release(c2); + return out; + } else if (c1) { + return c1; + } else if (c2) { + grpc_call_credentials_release(c2); + return nullptr; + } else { + return nullptr; + } + GPR_UNREACHABLE_CODE(return nullptr); + } + case 2: + return nullptr; + default: + end(inp); + return nullptr; + } +} + +static bool is_eof(input_stream* inp) { return inp->cur == inp->end; } + +//////////////////////////////////////////////////////////////////////////////// +// dns resolution + +typedef struct addr_req { + grpc_timer timer; + char* addr; + grpc_closure* on_done; + grpc_resolved_addresses** addrs; + std::unique_ptr* addresses; +} addr_req; + +static void finish_resolve(void* arg, grpc_error* error) { + addr_req* r = static_cast(arg); + + if (error == GRPC_ERROR_NONE && 0 == strcmp(r->addr, "server")) { + if (r->addrs != nullptr) { + grpc_resolved_addresses* addrs = + static_cast(gpr_malloc(sizeof(*addrs))); + addrs->naddrs = 1; + addrs->addrs = static_cast( + gpr_malloc(sizeof(*addrs->addrs))); + addrs->addrs[0].len = 0; + *r->addrs = addrs; + } else if (r->addresses != nullptr) { + *r->addresses = absl::make_unique(); + grpc_resolved_address dummy_resolved_address; + memset(&dummy_resolved_address, 0, sizeof(dummy_resolved_address)); + dummy_resolved_address.len = 0; + (*r->addresses)->emplace_back(dummy_resolved_address, nullptr); + } + grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_done, GRPC_ERROR_NONE); + } else { + grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_done, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Resolution failed", &error, 1)); + } + + gpr_free(r->addr); + delete r; +} + +void my_resolve_address(const char* addr, const char* /*default_port*/, + grpc_pollset_set* /*interested_parties*/, + grpc_closure* on_done, + grpc_resolved_addresses** addrs) { + addr_req* r = new addr_req(); + r->addr = gpr_strdup(addr); + r->on_done = on_done; + r->addrs = addrs; + grpc_timer_init( + &r->timer, GPR_MS_PER_SEC + grpc_core::ExecCtx::Get()->Now(), + GRPC_CLOSURE_CREATE(finish_resolve, r, grpc_schedule_on_exec_ctx)); +} + +static grpc_address_resolver_vtable fuzzer_resolver = {my_resolve_address, + nullptr}; + +grpc_ares_request* my_dns_lookup_ares_locked( + const char* /*dns_server*/, const char* addr, const char* /*default_port*/, + grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, + std::unique_ptr* addresses, + bool /*check_grpclb*/, char** /*service_config_json*/, + int /*query_timeout*/, grpc_core::Combiner* /*combiner*/) { + addr_req* r = static_cast(gpr_malloc(sizeof(*r))); + r->addr = gpr_strdup(addr); + r->on_done = on_done; + r->addrs = nullptr; + r->addresses = addresses; + grpc_timer_init( + &r->timer, GPR_MS_PER_SEC + grpc_core::ExecCtx::Get()->Now(), + GRPC_CLOSURE_CREATE(finish_resolve, r, grpc_schedule_on_exec_ctx)); + return nullptr; +} + +static void my_cancel_ares_request_locked(grpc_ares_request* request) { + GPR_ASSERT(request == nullptr); +} + +//////////////////////////////////////////////////////////////////////////////// +// client connection + +static void sched_connect(grpc_closure* closure, grpc_endpoint** ep, + gpr_timespec deadline); + +typedef struct { + grpc_timer timer; + grpc_closure* closure; + grpc_endpoint** ep; + gpr_timespec deadline; +} future_connect; + +static void do_connect(void* arg, grpc_error* error) { + future_connect* fc = static_cast(arg); + if (error != GRPC_ERROR_NONE) { + *fc->ep = nullptr; + grpc_core::ExecCtx::Run(DEBUG_LOCATION, fc->closure, GRPC_ERROR_REF(error)); + } else if (g_server != nullptr) { + grpc_endpoint* client; + grpc_endpoint* server; + grpc_passthru_endpoint_create(&client, &server, g_resource_quota, nullptr); + *fc->ep = client; + + grpc_transport* transport = + grpc_create_chttp2_transport(nullptr, server, false); + grpc_server_setup_transport(g_server, transport, nullptr, nullptr, nullptr); + grpc_chttp2_transport_start_reading(transport, nullptr, nullptr); + + grpc_core::ExecCtx::Run(DEBUG_LOCATION, fc->closure, GRPC_ERROR_NONE); + } else { + sched_connect(fc->closure, fc->ep, fc->deadline); + } + gpr_free(fc); +} + +static void sched_connect(grpc_closure* closure, grpc_endpoint** ep, + gpr_timespec deadline) { + if (gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) < 0) { + *ep = nullptr; + grpc_core::ExecCtx::Run( + DEBUG_LOCATION, closure, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connect deadline exceeded")); + return; + } + + future_connect* fc = static_cast(gpr_malloc(sizeof(*fc))); + fc->closure = closure; + fc->ep = ep; + fc->deadline = deadline; + grpc_timer_init( + &fc->timer, GPR_MS_PER_SEC + grpc_core::ExecCtx::Get()->Now(), + GRPC_CLOSURE_CREATE(do_connect, fc, grpc_schedule_on_exec_ctx)); +} + +static void my_tcp_client_connect(grpc_closure* closure, grpc_endpoint** ep, + grpc_pollset_set* /*interested_parties*/, + const grpc_channel_args* /*channel_args*/, + const grpc_resolved_address* /*addr*/, + grpc_millis deadline) { + sched_connect(closure, ep, + grpc_millis_to_timespec(deadline, GPR_CLOCK_MONOTONIC)); +} + +grpc_tcp_client_vtable fuzz_tcp_client_vtable = {my_tcp_client_connect}; + +//////////////////////////////////////////////////////////////////////////////// +// test driver + +typedef struct validator { + void (*validate)(void* arg, bool success); + void* arg; +} validator; + +static validator* create_validator(void (*validate)(void* arg, bool success), + void* arg) { + validator* v = static_cast(gpr_malloc(sizeof(*v))); + v->validate = validate; + v->arg = arg; + return v; +} + +static void assert_success_and_decrement(void* counter, bool success) { + GPR_ASSERT(success); + --*static_cast(counter); +} + +static void decrement(void* counter, bool /*success*/) { + --*static_cast(counter); +} + +typedef struct connectivity_watch { + int* counter; + gpr_timespec deadline; +} connectivity_watch; + +static connectivity_watch* make_connectivity_watch(gpr_timespec s, + int* counter) { + connectivity_watch* o = + static_cast(gpr_malloc(sizeof(*o))); + o->deadline = s; + o->counter = counter; + return o; +} + +static void validate_connectivity_watch(void* p, bool success) { + connectivity_watch* w = static_cast(p); + if (!success) { + GPR_ASSERT(gpr_time_cmp(gpr_now(w->deadline.clock_type), w->deadline) >= 0); + } + --*w->counter; + gpr_free(w); +} + +static void free_non_null(void* p) { + GPR_ASSERT(p != nullptr); + gpr_free(p); +} + +typedef enum { ROOT, CLIENT, SERVER, PENDING_SERVER } call_state_type; + +#define DONE_FLAG_CALL_CLOSED ((uint64_t)(1 << 0)) + +typedef struct call_state { + call_state_type type; + grpc_call* call; + grpc_byte_buffer* recv_message; + grpc_status_code status; + grpc_metadata_array recv_initial_metadata; + grpc_metadata_array recv_trailing_metadata; + grpc_slice recv_status_details; + int cancelled; + int pending_ops; + bool sent_initial_metadata; + grpc_call_details call_details; + grpc_byte_buffer* send_message; + // starts at 0, individual flags from DONE_FLAG_xxx are set + // as different operations are completed + uint64_t done_flags; + + // array of pointers to free later + size_t num_to_free; + size_t cap_to_free; + void** to_free; + + // array of slices to unref + size_t num_slices_to_unref; + size_t cap_slices_to_unref; + grpc_slice** slices_to_unref; + + struct call_state* next; + struct call_state* prev; +} call_state; + +static call_state* g_active_call; + +static call_state* new_call(call_state* sibling, call_state_type type) { + call_state* c = static_cast(gpr_malloc(sizeof(*c))); + memset(c, 0, sizeof(*c)); + if (sibling != nullptr) { + c->next = sibling; + c->prev = sibling->prev; + c->next->prev = c->prev->next = c; + } else { + c->next = c->prev = c; + } + c->type = type; + return c; +} + +static call_state* maybe_delete_call_state(call_state* call) { + call_state* next = call->next; + + if (call->call != nullptr) return next; + if (call->pending_ops != 0) return next; + + if (call == g_active_call) { + g_active_call = call->next; + GPR_ASSERT(call != g_active_call); + } + + call->prev->next = call->next; + call->next->prev = call->prev; + grpc_metadata_array_destroy(&call->recv_initial_metadata); + grpc_metadata_array_destroy(&call->recv_trailing_metadata); + grpc_slice_unref(call->recv_status_details); + grpc_call_details_destroy(&call->call_details); + + for (size_t i = 0; i < call->num_slices_to_unref; i++) { + grpc_slice_unref(*call->slices_to_unref[i]); + gpr_free(call->slices_to_unref[i]); + } + for (size_t i = 0; i < call->num_to_free; i++) { + gpr_free(call->to_free[i]); + } + gpr_free(call->to_free); + gpr_free(call->slices_to_unref); + + gpr_free(call); + + return next; +} + +static void add_to_free(call_state* call, void* p) { + if (call->num_to_free == call->cap_to_free) { + call->cap_to_free = GPR_MAX(8, 2 * call->cap_to_free); + call->to_free = static_cast( + gpr_realloc(call->to_free, sizeof(*call->to_free) * call->cap_to_free)); + } + call->to_free[call->num_to_free++] = p; +} + +static grpc_slice* add_slice_to_unref(call_state* call, grpc_slice s) { + if (call->num_slices_to_unref == call->cap_slices_to_unref) { + call->cap_slices_to_unref = GPR_MAX(8, 2 * call->cap_slices_to_unref); + call->slices_to_unref = static_cast(gpr_realloc( + call->slices_to_unref, + sizeof(*call->slices_to_unref) * call->cap_slices_to_unref)); + } + call->slices_to_unref[call->num_slices_to_unref] = + static_cast(gpr_malloc(sizeof(grpc_slice))); + *call->slices_to_unref[call->num_slices_to_unref++] = s; + return call->slices_to_unref[call->num_slices_to_unref - 1]; +} + +static void read_metadata(input_stream* inp, size_t* count, + grpc_metadata** metadata, call_state* cs) { + *count = grpc_fuzzer_get_next_byte(inp); + if (*count) { + *metadata = + static_cast(gpr_malloc(*count * sizeof(**metadata))); + memset(*metadata, 0, *count * sizeof(**metadata)); + for (size_t i = 0; i < *count; i++) { + (*metadata)[i].key = read_string_like_slice(inp); + (*metadata)[i].value = read_buffer_like_slice(inp); + (*metadata)[i].flags = grpc_fuzzer_get_next_uint32(inp); + add_slice_to_unref(cs, (*metadata)[i].key); + add_slice_to_unref(cs, (*metadata)[i].value); + } + } else { + *metadata = static_cast(gpr_malloc(1)); + } + add_to_free(cs, *metadata); +} + +static call_state* destroy_call(call_state* call) { + grpc_call_unref(call->call); + call->call = nullptr; + return maybe_delete_call_state(call); +} + +static void finished_request_call(void* csp, bool success) { + call_state* cs = static_cast(csp); + GPR_ASSERT(cs->pending_ops > 0); + --cs->pending_ops; + if (success) { + GPR_ASSERT(cs->call != nullptr); + cs->type = SERVER; + } else { + maybe_delete_call_state(cs); + } +} + +typedef struct { + call_state* cs; + uint8_t has_ops; +} batch_info; + +static void finished_batch(void* p, bool /*success*/) { + batch_info* bi = static_cast(p); + --bi->cs->pending_ops; + if ((bi->has_ops & (1u << GRPC_OP_RECV_MESSAGE)) && + (bi->cs->done_flags & DONE_FLAG_CALL_CLOSED)) { + GPR_ASSERT(bi->cs->recv_message == nullptr); + } + if ((bi->has_ops & (1u << GRPC_OP_RECV_MESSAGE) && + bi->cs->recv_message != nullptr)) { + grpc_byte_buffer_destroy(bi->cs->recv_message); + bi->cs->recv_message = nullptr; + } + if ((bi->has_ops & (1u << GRPC_OP_SEND_MESSAGE))) { + grpc_byte_buffer_destroy(bi->cs->send_message); + bi->cs->send_message = nullptr; + } + if ((bi->has_ops & (1u << GRPC_OP_RECV_STATUS_ON_CLIENT)) || + (bi->has_ops & (1u << GRPC_OP_RECV_CLOSE_ON_SERVER))) { + bi->cs->done_flags |= DONE_FLAG_CALL_CLOSED; + } + maybe_delete_call_state(bi->cs); + gpr_free(bi); +} + +static validator* make_finished_batch_validator(call_state* cs, + uint8_t has_ops) { + batch_info* bi = static_cast(gpr_malloc(sizeof(*bi))); + bi->cs = cs; + bi->has_ops = has_ops; + return create_validator(finished_batch, bi); +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + grpc_test_only_set_slice_hash_seed(0); + char* grpc_trace_fuzzer = gpr_getenv("GRPC_TRACE_FUZZER"); + if (squelch && grpc_trace_fuzzer == nullptr) gpr_set_log_function(dont_log); + gpr_free(grpc_trace_fuzzer); + input_stream inp = {data, data + size}; + grpc_set_tcp_client_impl(&fuzz_tcp_client_vtable); + gpr_now_impl = now_impl; + grpc_init(); + grpc_timer_manager_set_threading(false); + { + grpc_core::ExecCtx exec_ctx; + grpc_core::Executor::SetThreadingAll(false); + } + grpc_set_resolver_impl(&fuzzer_resolver); + grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; + grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; + + GPR_ASSERT(g_channel == nullptr); + GPR_ASSERT(g_server == nullptr); + + bool server_shutdown = false; + int pending_server_shutdowns = 0; + int pending_channel_watches = 0; + int pending_pings = 0; + + g_active_call = new_call(nullptr, ROOT); + g_resource_quota = grpc_resource_quota_create("api_fuzzer"); + + grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); + + while (!is_eof(&inp) || g_channel != nullptr || g_server != nullptr || + pending_channel_watches > 0 || pending_pings > 0 || + g_active_call->type != ROOT || g_active_call->next != g_active_call) { + if (is_eof(&inp)) { + if (g_channel != nullptr) { + grpc_channel_destroy(g_channel); + g_channel = nullptr; + } + if (g_server != nullptr) { + if (!server_shutdown) { + grpc_server_shutdown_and_notify( + g_server, cq, + create_validator(assert_success_and_decrement, + &pending_server_shutdowns)); + server_shutdown = true; + pending_server_shutdowns++; + } else if (pending_server_shutdowns == 0) { + grpc_server_destroy(g_server); + g_server = nullptr; + } + } + call_state* s = g_active_call; + do { + if (s->type != PENDING_SERVER && s->call != nullptr) { + s = destroy_call(s); + } else { + s = s->next; + } + } while (s != g_active_call); + + g_now = gpr_time_add(g_now, gpr_time_from_seconds(1, GPR_TIMESPAN)); + } + + grpc_timer_manager_tick(); + + switch (grpc_fuzzer_get_next_byte(&inp)) { + // terminate on bad bytes + default: + end(&inp); + break; + // tickle completion queue + case 0: { + grpc_event ev = grpc_completion_queue_next( + cq, gpr_inf_past(GPR_CLOCK_REALTIME), nullptr); + switch (ev.type) { + case GRPC_OP_COMPLETE: { + validator* v = static_cast(ev.tag); + v->validate(v->arg, ev.success); + gpr_free(v); + break; + } + case GRPC_QUEUE_TIMEOUT: + break; + case GRPC_QUEUE_SHUTDOWN: + abort(); + break; + } + break; + } + // increment global time + case 1: { + g_now = gpr_time_add( + g_now, gpr_time_from_micros(grpc_fuzzer_get_next_uint32(&inp), + GPR_TIMESPAN)); + break; + } + // create an insecure channel + case 2: { + if (g_channel == nullptr) { + char* target = grpc_fuzzer_get_next_string(&inp, nullptr); + char* target_uri; + gpr_asprintf(&target_uri, "dns:%s", target); + grpc_channel_args* args = read_args(&inp); + g_channel = grpc_insecure_channel_create(target_uri, args, nullptr); + GPR_ASSERT(g_channel != nullptr); + { + grpc_core::ExecCtx exec_ctx; + grpc_channel_args_destroy(args); + } + gpr_free(target_uri); + gpr_free(target); + } else { + end(&inp); + } + break; + } + // destroy a channel + case 3: { + if (g_channel != nullptr) { + grpc_channel_destroy(g_channel); + g_channel = nullptr; + } else { + end(&inp); + } + break; + } + // bring up a server + case 4: { + if (g_server == nullptr) { + grpc_channel_args* args = read_args(&inp); + g_server = grpc_server_create(args, nullptr); + GPR_ASSERT(g_server != nullptr); + { + grpc_core::ExecCtx exec_ctx; + grpc_channel_args_destroy(args); + } + grpc_server_register_completion_queue(g_server, cq, nullptr); + grpc_server_start(g_server); + server_shutdown = false; + GPR_ASSERT(pending_server_shutdowns == 0); + } else { + end(&inp); + } + break; + } + // begin server shutdown + case 5: { + if (g_server != nullptr) { + grpc_server_shutdown_and_notify( + g_server, cq, + create_validator(assert_success_and_decrement, + &pending_server_shutdowns)); + pending_server_shutdowns++; + server_shutdown = true; + } else { + end(&inp); + } + break; + } + // cancel all calls if shutdown + case 6: { + if (g_server != nullptr && server_shutdown) { + grpc_server_cancel_all_calls(g_server); + } else { + end(&inp); + } + break; + } + // destroy server + case 7: { + if (g_server != nullptr && server_shutdown && + pending_server_shutdowns == 0) { + grpc_server_destroy(g_server); + g_server = nullptr; + } else { + end(&inp); + } + break; + } + // check connectivity + case 8: { + if (g_channel != nullptr) { + uint8_t try_to_connect = grpc_fuzzer_get_next_byte(&inp); + if (try_to_connect == 0 || try_to_connect == 1) { + grpc_channel_check_connectivity_state(g_channel, try_to_connect); + } else { + end(&inp); + } + } else { + end(&inp); + } + break; + } + // watch connectivity + case 9: { + if (g_channel != nullptr) { + grpc_connectivity_state st = + grpc_channel_check_connectivity_state(g_channel, 0); + if (st != GRPC_CHANNEL_SHUTDOWN) { + gpr_timespec deadline = gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(grpc_fuzzer_get_next_uint32(&inp), + GPR_TIMESPAN)); + grpc_channel_watch_connectivity_state( + g_channel, st, deadline, cq, + create_validator(validate_connectivity_watch, + make_connectivity_watch( + deadline, &pending_channel_watches))); + pending_channel_watches++; + } + } else { + end(&inp); + } + break; + } + // create a call + case 10: { + bool ok = true; + if (g_channel == nullptr) ok = false; + grpc_call* parent_call = nullptr; + if (g_active_call->type != ROOT) { + if (g_active_call->call == nullptr || g_active_call->type == CLIENT) { + end(&inp); + break; + } + parent_call = g_active_call->call; + } + uint32_t propagation_mask = grpc_fuzzer_get_next_uint32(&inp); + grpc_slice method = read_string_like_slice(&inp); + if (GRPC_SLICE_LENGTH(method) == 0) { + ok = false; + } + grpc_slice host = read_string_like_slice(&inp); + gpr_timespec deadline = + gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(grpc_fuzzer_get_next_uint32(&inp), + GPR_TIMESPAN)); + + if (ok) { + call_state* cs = new_call(g_active_call, CLIENT); + cs->call = + grpc_channel_create_call(g_channel, parent_call, propagation_mask, + cq, method, &host, deadline, nullptr); + } else { + end(&inp); + } + grpc_slice_unref(method); + grpc_slice_unref(host); + break; + } + // switch the 'current' call + case 11: { + g_active_call = g_active_call->next; + break; + } + // queue some ops on a call + case 12: { + if (g_active_call->type == PENDING_SERVER || + g_active_call->type == ROOT || g_active_call->call == nullptr) { + end(&inp); + break; + } + size_t num_ops = grpc_fuzzer_get_next_byte(&inp); + if (num_ops > 6) { + end(&inp); + break; + } + grpc_op* ops = + static_cast(gpr_malloc(sizeof(grpc_op) * num_ops)); + if (num_ops > 0) memset(ops, 0, sizeof(grpc_op) * num_ops); + bool ok = true; + size_t i; + grpc_op* op; + uint8_t has_ops = 0; + for (i = 0; i < num_ops; i++) { + op = &ops[i]; + switch (grpc_fuzzer_get_next_byte(&inp)) { + default: + /* invalid value */ + op->op = (grpc_op_type)-1; + ok = false; + break; + case GRPC_OP_SEND_INITIAL_METADATA: + if (g_active_call->sent_initial_metadata) { + ok = false; + } else { + g_active_call->sent_initial_metadata = true; + op->op = GRPC_OP_SEND_INITIAL_METADATA; + has_ops |= 1 << GRPC_OP_SEND_INITIAL_METADATA; + read_metadata(&inp, &op->data.send_initial_metadata.count, + &op->data.send_initial_metadata.metadata, + g_active_call); + } + break; + case GRPC_OP_SEND_MESSAGE: + op->op = GRPC_OP_SEND_MESSAGE; + if (g_active_call->send_message != nullptr) { + ok = false; + } else { + has_ops |= 1 << GRPC_OP_SEND_MESSAGE; + g_active_call->send_message = + op->data.send_message.send_message = read_message(&inp); + } + break; + case GRPC_OP_SEND_CLOSE_FROM_CLIENT: + op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; + has_ops |= 1 << GRPC_OP_SEND_CLOSE_FROM_CLIENT; + break; + case GRPC_OP_SEND_STATUS_FROM_SERVER: + op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; + has_ops |= 1 << GRPC_OP_SEND_STATUS_FROM_SERVER; + read_metadata( + &inp, + &op->data.send_status_from_server.trailing_metadata_count, + &op->data.send_status_from_server.trailing_metadata, + g_active_call); + op->data.send_status_from_server.status = + static_cast( + grpc_fuzzer_get_next_byte(&inp)); + op->data.send_status_from_server.status_details = + add_slice_to_unref(g_active_call, + read_buffer_like_slice(&inp)); + break; + case GRPC_OP_RECV_INITIAL_METADATA: + op->op = GRPC_OP_RECV_INITIAL_METADATA; + has_ops |= 1 << GRPC_OP_RECV_INITIAL_METADATA; + op->data.recv_initial_metadata.recv_initial_metadata = + &g_active_call->recv_initial_metadata; + break; + case GRPC_OP_RECV_MESSAGE: + if (g_active_call->done_flags & DONE_FLAG_CALL_CLOSED) { + ok = false; + } else { + op->op = GRPC_OP_RECV_MESSAGE; + has_ops |= 1 << GRPC_OP_RECV_MESSAGE; + op->data.recv_message.recv_message = + &g_active_call->recv_message; + } + break; + case GRPC_OP_RECV_STATUS_ON_CLIENT: + op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; + op->data.recv_status_on_client.status = &g_active_call->status; + op->data.recv_status_on_client.trailing_metadata = + &g_active_call->recv_trailing_metadata; + op->data.recv_status_on_client.status_details = + &g_active_call->recv_status_details; + break; + case GRPC_OP_RECV_CLOSE_ON_SERVER: + op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; + has_ops |= 1 << GRPC_OP_RECV_CLOSE_ON_SERVER; + op->data.recv_close_on_server.cancelled = + &g_active_call->cancelled; + break; + } + op->reserved = nullptr; + op->flags = grpc_fuzzer_get_next_uint32(&inp); + } + if (g_channel == nullptr) ok = false; + if (ok) { + validator* v = make_finished_batch_validator(g_active_call, has_ops); + g_active_call->pending_ops++; + grpc_call_error error = grpc_call_start_batch( + g_active_call->call, ops, num_ops, v, nullptr); + if (error != GRPC_CALL_OK) { + v->validate(v->arg, false); + gpr_free(v); + } + } else { + end(&inp); + } + if (!ok && (has_ops & (1 << GRPC_OP_SEND_MESSAGE))) { + grpc_byte_buffer_destroy(g_active_call->send_message); + g_active_call->send_message = nullptr; + } + gpr_free(ops); + + break; + } + // cancel current call + case 13: { + if (g_active_call->type != ROOT && g_active_call->call != nullptr) { + grpc_call_cancel(g_active_call->call, nullptr); + } else { + end(&inp); + } + break; + } + // get a calls peer + case 14: { + if (g_active_call->type != ROOT && g_active_call->call != nullptr) { + free_non_null(grpc_call_get_peer(g_active_call->call)); + } else { + end(&inp); + } + break; + } + // get a channels target + case 15: { + if (g_channel != nullptr) { + free_non_null(grpc_channel_get_target(g_channel)); + } else { + end(&inp); + } + break; + } + // send a ping on a channel + case 16: { + if (g_channel != nullptr) { + pending_pings++; + grpc_channel_ping(g_channel, cq, + create_validator(decrement, &pending_pings), + nullptr); + } else { + end(&inp); + } + break; + } + // enable a tracer + case 17: { + char* tracer = grpc_fuzzer_get_next_string(&inp, nullptr); + grpc_tracer_set_enabled(tracer, 1); + gpr_free(tracer); + break; + } + // disable a tracer + case 18: { + char* tracer = grpc_fuzzer_get_next_string(&inp, nullptr); + grpc_tracer_set_enabled(tracer, 0); + gpr_free(tracer); + break; + } + // request a server call + case 19: { + if (g_server == nullptr) { + end(&inp); + break; + } + call_state* cs = new_call(g_active_call, PENDING_SERVER); + cs->pending_ops++; + validator* v = create_validator(finished_request_call, cs); + grpc_call_error error = + grpc_server_request_call(g_server, &cs->call, &cs->call_details, + &cs->recv_initial_metadata, cq, cq, v); + if (error != GRPC_CALL_OK) { + v->validate(v->arg, false); + gpr_free(v); + } + break; + } + // destroy a call + case 20: { + if (g_active_call->type != ROOT && + g_active_call->type != PENDING_SERVER && + g_active_call->call != nullptr) { + destroy_call(g_active_call); + } else { + end(&inp); + } + break; + } + // resize the buffer pool + case 21: { + grpc_resource_quota_resize(g_resource_quota, read_uint22(&inp)); + break; + } + // create a secure channel + case 22: { + if (g_channel == nullptr) { + char* target = grpc_fuzzer_get_next_string(&inp, nullptr); + char* target_uri; + gpr_asprintf(&target_uri, "dns:%s", target); + grpc_channel_args* args = read_args(&inp); + grpc_channel_credentials* creds = read_channel_creds(&inp); + g_channel = + grpc_secure_channel_create(creds, target_uri, args, nullptr); + GPR_ASSERT(g_channel != nullptr); + { + grpc_core::ExecCtx exec_ctx; + grpc_channel_args_destroy(args); + } + gpr_free(target_uri); + gpr_free(target); + grpc_channel_credentials_release(creds); + } else { + end(&inp); + } + break; + } + } + } + + GPR_ASSERT(g_channel == nullptr); + GPR_ASSERT(g_server == nullptr); + GPR_ASSERT(g_active_call->type == ROOT); + GPR_ASSERT(g_active_call->next == g_active_call); + gpr_free(g_active_call); + + grpc_completion_queue_shutdown(cq); + GPR_ASSERT( + grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME), nullptr) + .type == GRPC_QUEUE_SHUTDOWN); + grpc_completion_queue_destroy(cq); + + grpc_resource_quota_unref(g_resource_quota); + + grpc_shutdown_blocking(); + return 0; +} diff --git a/test/core/end2end/goaway_server_test.cc b/test/core/end2end/goaway_server_test.cc index 86f27295a5f..64603cbc1fc 100644 --- a/test/core/end2end/goaway_server_test.cc +++ b/test/core/end2end/goaway_server_test.cc @@ -119,7 +119,7 @@ static grpc_ares_request* my_dns_lookup_ares_locked( gpr_mu_unlock(&g_mu); error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Forced Failure"); } else { - *addresses = grpc_core::MakeUnique(); + *addresses = absl::make_unique(); grpc_sockaddr_in sa; sa.sin_family = GRPC_AF_INET; sa.sin_addr.s_addr = 0x100007f; diff --git a/test/core/gprpp/inlined_vector_test.cc b/test/core/gprpp/inlined_vector_test.cc index 9ad2bfad49a..6481405d1b4 100644 --- a/test/core/gprpp/inlined_vector_test.cc +++ b/test/core/gprpp/inlined_vector_test.cc @@ -63,7 +63,7 @@ TEST(InlinedVectorTest, ValuesAreInlined) { TEST(InlinedVectorTest, PushBackWithMove) { InlinedVector, 1> v; - std::unique_ptr i = grpc_core::MakeUnique(3); + std::unique_ptr i = absl::make_unique(3); v.push_back(std::move(i)); EXPECT_EQ(nullptr, i.get()); EXPECT_EQ(1UL, v.size()); @@ -304,15 +304,15 @@ TEST(InlinedVectorTest, MoveAssignmentAllocatedAllocated) { // and move methods are called correctly. class Value { public: - explicit Value(int v) : value_(grpc_core::MakeUnique(v)) {} + explicit Value(int v) : value_(absl::make_unique(v)) {} // copyable Value(const Value& v) { - value_ = grpc_core::MakeUnique(*v.value_); + value_ = absl::make_unique(*v.value_); copied_ = true; } Value& operator=(const Value& v) { - value_ = grpc_core::MakeUnique(*v.value_); + value_ = absl::make_unique(*v.value_); copied_ = true; return *this; } @@ -463,10 +463,10 @@ TEST(InlinedVectorTest, MoveAssignmentMovesElementsAllocated) { TEST(InlinedVectorTest, PopBackInlined) { InlinedVector, 2> v; // Add two elements, pop one out - v.push_back(grpc_core::MakeUnique(3)); + v.push_back(absl::make_unique(3)); EXPECT_EQ(1UL, v.size()); EXPECT_EQ(3, *v[0]); - v.push_back(grpc_core::MakeUnique(5)); + v.push_back(absl::make_unique(5)); EXPECT_EQ(2UL, v.size()); EXPECT_EQ(5, *v[1]); v.pop_back(); @@ -478,7 +478,7 @@ TEST(InlinedVectorTest, PopBackAllocated) { InlinedVector, kInlinedSize> v; // Add elements to ensure allocated backing. for (size_t i = 0; i < kInlinedSize + 1; ++i) { - v.push_back(grpc_core::MakeUnique(3)); + v.push_back(absl::make_unique(3)); EXPECT_EQ(i + 1, v.size()); } size_t sz = v.size(); @@ -494,7 +494,7 @@ TEST(InlinedVectorTest, Resize) { EXPECT_EQ(5UL, v.size()); EXPECT_EQ(nullptr, v[4]); // Size down. - v[4] = grpc_core::MakeUnique(5); + v[4] = absl::make_unique(5); v.resize(1); EXPECT_EQ(1UL, v.size()); } diff --git a/test/core/handshake/readahead_handshaker_server_ssl.cc b/test/core/handshake/readahead_handshaker_server_ssl.cc index 7b3b8393442..b22cd4bdbd3 100644 --- a/test/core/handshake/readahead_handshaker_server_ssl.cc +++ b/test/core/handshake/readahead_handshaker_server_ssl.cc @@ -81,7 +81,7 @@ int main(int /*argc*/, char* /*argv*/ []) { grpc_init(); HandshakerRegistry::RegisterHandshakerFactory( true /* at_start */, HANDSHAKER_SERVER, - grpc_core::MakeUnique()); + absl::make_unique()); const char* full_alpn_list[] = {"grpc-exp", "h2"}; GPR_ASSERT(server_ssl_test(full_alpn_list, 2, "grpc-exp")); grpc_shutdown_blocking();