|
|
|
@ -46,13 +46,14 @@ |
|
|
|
|
#include <grpc++/client_context.h> |
|
|
|
|
#include <grpc++/generic/generic_stub.h> |
|
|
|
|
#include <grpc/grpc.h> |
|
|
|
|
#include <grpc/support/cpu.h> |
|
|
|
|
#include <grpc/support/histogram.h> |
|
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
|
|
|
|
|
#include "src/proto/grpc/testing/services.grpc.pb.h" |
|
|
|
|
#include "test/cpp/qps/client.h" |
|
|
|
|
#include "test/cpp/qps/timer.h" |
|
|
|
|
#include "test/cpp/util/create_test_channel.h" |
|
|
|
|
#include "src/proto/grpc/testing/services.grpc.pb.h" |
|
|
|
|
|
|
|
|
|
namespace grpc { |
|
|
|
|
namespace testing { |
|
|
|
@ -164,14 +165,15 @@ class AsyncClient : public ClientImpl<StubType, RequestType> { |
|
|
|
|
std::function<std::unique_ptr<StubType>(std::shared_ptr<Channel>)> |
|
|
|
|
create_stub) |
|
|
|
|
: ClientImpl<StubType, RequestType>(config, create_stub), |
|
|
|
|
num_async_threads_(NumThreads(config)), |
|
|
|
|
channel_lock_(new std::mutex[config.client_channels()]), |
|
|
|
|
contexts_(config.client_channels()), |
|
|
|
|
max_outstanding_per_channel_(config.outstanding_rpcs_per_channel()), |
|
|
|
|
channel_count_(config.client_channels()), |
|
|
|
|
pref_channel_inc_(config.async_client_threads()) { |
|
|
|
|
SetupLoadTest(config, config.async_client_threads()); |
|
|
|
|
pref_channel_inc_(num_async_threads_) { |
|
|
|
|
SetupLoadTest(config, num_async_threads_); |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < config.async_client_threads(); i++) { |
|
|
|
|
for (int i = 0; i < num_async_threads_; i++) { |
|
|
|
|
cli_cqs_.emplace_back(new CompletionQueue); |
|
|
|
|
if (!closed_loop_) { |
|
|
|
|
rpc_deadlines_.emplace_back(); |
|
|
|
@ -324,6 +326,9 @@ class AsyncClient : public ClientImpl<StubType, RequestType> { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
|
int num_async_threads_; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
class boolean { // exists only to avoid data-race on vector<bool>
|
|
|
|
|
public: |
|
|
|
@ -338,6 +343,15 @@ class AsyncClient : public ClientImpl<StubType, RequestType> { |
|
|
|
|
private: |
|
|
|
|
bool val_; |
|
|
|
|
}; |
|
|
|
|
static int NumThreads(const ClientConfig& config) { |
|
|
|
|
int num_threads = config.async_client_threads(); |
|
|
|
|
if (num_threads <= 0) { // Use dynamic sizing
|
|
|
|
|
num_threads = gpr_cpu_num_cores(); |
|
|
|
|
gpr_log(GPR_INFO, "Sizing client server to %d threads", num_threads); |
|
|
|
|
} |
|
|
|
|
return num_threads; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::vector<std::unique_ptr<CompletionQueue>> cli_cqs_; |
|
|
|
|
|
|
|
|
|
std::vector<deadline_list> rpc_deadlines_; // per thread deadlines
|
|
|
|
@ -363,7 +377,7 @@ class AsyncUnaryClient GRPC_FINAL |
|
|
|
|
public: |
|
|
|
|
explicit AsyncUnaryClient(const ClientConfig& config) |
|
|
|
|
: AsyncClient(config, SetupCtx, BenchmarkStubCreator) { |
|
|
|
|
StartThreads(config.async_client_threads()); |
|
|
|
|
StartThreads(num_async_threads_); |
|
|
|
|
} |
|
|
|
|
~AsyncUnaryClient() GRPC_OVERRIDE { EndThreads(); } |
|
|
|
|
|
|
|
|
@ -461,7 +475,7 @@ class AsyncStreamingClient GRPC_FINAL |
|
|
|
|
// async streaming currently only supports closed loop
|
|
|
|
|
GPR_ASSERT(closed_loop_); |
|
|
|
|
|
|
|
|
|
StartThreads(config.async_client_threads()); |
|
|
|
|
StartThreads(num_async_threads_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
~AsyncStreamingClient() GRPC_OVERRIDE { EndThreads(); } |
|
|
|
@ -566,7 +580,7 @@ class GenericAsyncStreamingClient GRPC_FINAL |
|
|
|
|
// async streaming currently only supports closed loop
|
|
|
|
|
GPR_ASSERT(closed_loop_); |
|
|
|
|
|
|
|
|
|
StartThreads(config.async_client_threads()); |
|
|
|
|
StartThreads(num_async_threads_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
~GenericAsyncStreamingClient() GRPC_OVERRIDE { EndThreads(); } |
|
|
|
|