diff options
Diffstat (limited to 'test/cpp/qps/server_async.cc')
-rw-r--r-- | test/cpp/qps/server_async.cc | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc index 3403ffd326..96d7e5ef74 100644 --- a/test/cpp/qps/server_async.cc +++ b/test/cpp/qps/server_async.cc @@ -1,36 +1,22 @@ /* * - * Copyright 2015, Google Inc. - * All rights reserved. + * Copyright 2015 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * 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 * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * 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 <algorithm> #include <forward_list> #include <functional> #include <memory> @@ -104,9 +90,14 @@ class AsyncQpsServerTest final : public grpc::testing::Server { gpr_log(GPR_INFO, "Sizing async server to %d threads", num_threads); } - for (int i = 0; i < num_threads; i++) { + int tpc = std::max(1, config.threads_per_cq()); // 1 if unspecified + int num_cqs = (num_threads + tpc - 1) / tpc; // ceiling operator + for (int i = 0; i < num_cqs; i++) { srv_cqs_.emplace_back(builder.AddCompletionQueue()); } + for (int i = 0; i < num_threads; i++) { + cq_.emplace_back(i % srv_cqs_.size()); + } if (config.resource_quota_size() > 0) { builder.SetResourceQuota(ResourceQuota("AsyncQpsServerTest") @@ -120,7 +111,7 @@ class AsyncQpsServerTest final : public grpc::testing::Server { std::placeholders::_2); for (int i = 0; i < 5000; i++) { - for (int j = 0; j < num_threads; j++) { + for (int j = 0; j < num_cqs; j++) { if (request_unary_function) { auto request_unary = std::bind( request_unary_function, &async_service_, std::placeholders::_1, @@ -205,7 +196,7 @@ class AsyncQpsServerTest final : public grpc::testing::Server { // Wait until work is available or we are shutting down bool ok; void *got_tag; - while (srv_cqs_[thread_idx]->Next(&got_tag, &ok)) { + while (srv_cqs_[cq_[thread_idx]]->Next(&got_tag, &ok)) { ServerRpcContext *ctx = detag(got_tag); // The tag is a pointer to an RPC context to invoke // Proceed while holding a lock to make sure that @@ -214,6 +205,7 @@ class AsyncQpsServerTest final : public grpc::testing::Server { if (shutdown_state_[thread_idx]->shutdown) { return; } + std::lock_guard<ServerRpcContext> l2(*ctx); const bool still_going = ctx->RunNextState(ok); // if this RPC context is done, refresh it if (!still_going) { @@ -226,9 +218,13 @@ class AsyncQpsServerTest final : public grpc::testing::Server { class ServerRpcContext { public: ServerRpcContext() {} + void lock() { mu_.lock(); } + void unlock() { mu_.unlock(); } virtual ~ServerRpcContext(){}; virtual bool RunNextState(bool) = 0; // next state, return false if done virtual void Reset() = 0; // start this back at a clean state + private: + std::mutex mu_; }; static void *tag(ServerRpcContext *func) { return reinterpret_cast<void *>(func); @@ -518,6 +514,7 @@ class AsyncQpsServerTest final : public grpc::testing::Server { std::vector<std::thread> threads_; std::unique_ptr<grpc::Server> server_; std::vector<std::unique_ptr<grpc::ServerCompletionQueue>> srv_cqs_; + std::vector<int> cq_; ServiceType async_service_; std::vector<std::unique_ptr<ServerRpcContext>> contexts_; |