client_sync.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include <chrono>
20 #include <memory>
21 #include <mutex>
22 #include <sstream>
23 #include <string>
24 #include <thread>
25 #include <vector>
26 
27 #include <grpc/grpc.h>
28 #include <grpc/support/alloc.h>
29 #include <grpc/support/log.h>
30 #include <grpc/support/time.h>
31 #include <grpcpp/channel.h>
32 #include <grpcpp/client_context.h>
33 #include <grpcpp/server.h>
34 #include <grpcpp/server_builder.h>
35 
37 #include "src/proto/grpc/testing/benchmark_service.grpc.pb.h"
38 #include "test/cpp/qps/client.h"
41 
42 namespace grpc {
43 namespace testing {
44 
45 static std::unique_ptr<BenchmarkService::Stub> BenchmarkStubCreator(
46  const std::shared_ptr<Channel>& ch) {
47  return BenchmarkService::NewStub(ch);
48 }
49 
51  : public ClientImpl<BenchmarkService::Stub, SimpleRequest> {
52  public:
54  : ClientImpl<BenchmarkService::Stub, SimpleRequest>(
56  num_threads_ =
57  config.outstanding_rpcs_per_channel() * config.client_channels();
58  responses_.resize(num_threads_);
60  }
61 
62  ~SynchronousClient() override {}
63 
64  virtual bool InitThreadFuncImpl(size_t thread_idx) = 0;
65  virtual bool ThreadFuncImpl(HistogramEntry* entry, size_t thread_idx) = 0;
66 
67  void ThreadFunc(size_t thread_idx, Thread* t) override {
68  if (!InitThreadFuncImpl(thread_idx)) {
69  return;
70  }
71  for (;;) {
72  // run the loop body
73  HistogramEntry entry;
74  const bool thread_still_ok = ThreadFuncImpl(&entry, thread_idx);
75  t->UpdateHistogram(&entry);
76  if (!thread_still_ok || ThreadCompleted()) {
77  return;
78  }
79  }
80  }
81 
82  protected:
83  // WaitToIssue returns false if we realize that we need to break out
84  bool WaitToIssue(int thread_idx) {
85  if (!closed_loop_) {
86  const gpr_timespec next_issue_time = NextIssueTime(thread_idx);
87  // Avoid sleeping for too long continuously because we might
88  // need to terminate before then. This is an issue since
89  // exponential distribution can occasionally produce bad outliers
90  while (true) {
91  const gpr_timespec one_sec_delay =
94  if (gpr_time_cmp(next_issue_time, one_sec_delay) <= 0) {
95  gpr_sleep_until(next_issue_time);
96  return true;
97  } else {
98  gpr_sleep_until(one_sec_delay);
99  if (gpr_atm_acq_load(&thread_pool_done_) != static_cast<gpr_atm>(0)) {
100  return false;
101  }
102  }
103  }
104  }
105  return true;
106  }
107 
108  size_t num_threads_;
109  std::vector<SimpleResponse> responses_;
110 };
111 
113  public:
117  }
119 
120  bool InitThreadFuncImpl(size_t /*thread_idx*/) override { return true; }
121 
122  bool ThreadFuncImpl(HistogramEntry* entry, size_t thread_idx) override {
123  if (!WaitToIssue(thread_idx)) {
124  return true;
125  }
126  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
127  double start = UsageTimer::Now();
128  GPR_TIMER_SCOPE("SynchronousUnaryClient::ThreadFunc", 0);
130  grpc::Status s =
131  stub->UnaryCall(&context, request_, &responses_[thread_idx]);
132  if (s.ok()) {
133  entry->set_value((UsageTimer::Now() - start) * 1e9);
134  }
135  entry->set_status(s.error_code());
136  return true;
137  }
138 
139  private:
140  void DestroyMultithreading() final { EndThreads(); }
141 };
142 
143 template <class StreamType>
145  public:
152  messages_per_stream_(config.messages_per_stream()),
155  }
157  CleanupAllStreams([this](size_t thread_idx) {
158  // Don't log any kind of error since we may have canceled this
159  stream_[thread_idx]->Finish().IgnoreError();
160  });
161  }
162 
163  protected:
164  std::vector<grpc::ClientContext> context_;
165  std::vector<std::unique_ptr<StreamType>> stream_;
166  // stream_mu_ is only needed when changing an element of stream_ or context_
167  std::vector<std::mutex> stream_mu_;
168  // use struct Bool rather than bool because vector<bool> is not concurrent
169  struct Bool {
170  bool val;
171  Bool() : val(false) {}
172  };
173  std::vector<Bool> shutdown_;
175  std::vector<int> messages_issued_;
176 
177  void FinishStream(HistogramEntry* entry, size_t thread_idx) {
178  Status s = stream_[thread_idx]->Finish();
179  // don't set the value since the stream is failed and shouldn't be timed
180  entry->set_status(s.error_code());
181  if (!s.ok()) {
182  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
183  if (!shutdown_[thread_idx].val) {
184  gpr_log(GPR_ERROR, "Stream %" PRIuPTR " received an error %s",
185  thread_idx, s.error_message().c_str());
186  }
187  }
188  // Lock the stream_mu_ now because the client context could change
189  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
190  context_[thread_idx].~ClientContext();
191  new (&context_[thread_idx]) ClientContext();
192  }
193 
194  void CleanupAllStreams(const std::function<void(size_t)>& cleaner) {
195  std::vector<std::thread> cleanup_threads;
196  for (size_t i = 0; i < num_threads_; i++) {
197  cleanup_threads.emplace_back([this, i, cleaner] {
198  std::lock_guard<std::mutex> l(stream_mu_[i]);
199  shutdown_[i].val = true;
200  if (stream_[i]) {
201  cleaner(i);
202  }
203  });
204  }
205  for (auto& th : cleanup_threads) {
206  th.join();
207  }
208  }
209 
210  private:
211  void DestroyMultithreading() final {
213  [this](size_t thread_idx) { context_[thread_idx].TryCancel(); });
214  EndThreads();
215  }
216 };
217 
220  grpc::ClientReaderWriter<SimpleRequest, SimpleResponse>> {
221  public:
226  [this](size_t thread_idx) { stream_[thread_idx]->WritesDone(); });
227  }
228 
229  private:
230  bool InitThreadFuncImpl(size_t thread_idx) override {
231  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
232  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
233  if (!shutdown_[thread_idx].val) {
234  stream_[thread_idx] = stub->StreamingCall(&context_[thread_idx]);
235  } else {
236  return false;
237  }
238  messages_issued_[thread_idx] = 0;
239  return true;
240  }
241 
242  bool ThreadFuncImpl(HistogramEntry* entry, size_t thread_idx) override {
243  if (!WaitToIssue(thread_idx)) {
244  return true;
245  }
246  GPR_TIMER_SCOPE("SynchronousStreamingPingPongClient::ThreadFunc", 0);
247  double start = UsageTimer::Now();
248  if (stream_[thread_idx]->Write(request_) &&
249  stream_[thread_idx]->Read(&responses_[thread_idx])) {
250  entry->set_value((UsageTimer::Now() - start) * 1e9);
251  // don't set the status since there isn't one yet
252  if ((messages_per_stream_ != 0) &&
253  (++messages_issued_[thread_idx] < messages_per_stream_)) {
254  return true;
255  } else if (messages_per_stream_ == 0) {
256  return true;
257  } else {
258  // Fall through to the below resetting code after finish
259  }
260  }
261  stream_[thread_idx]->WritesDone();
262  FinishStream(entry, thread_idx);
263  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
264  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
265  if (!shutdown_[thread_idx].val) {
266  stream_[thread_idx] = stub->StreamingCall(&context_[thread_idx]);
267  } else {
268  stream_[thread_idx].reset();
269  return false;
270  }
271  messages_issued_[thread_idx] = 0;
272  return true;
273  }
274 };
275 
277  : public SynchronousStreamingClient<grpc::ClientWriter<SimpleRequest>> {
278  public:
283  [this](size_t thread_idx) { stream_[thread_idx]->WritesDone(); });
284  }
285 
286  private:
287  std::vector<double> last_issue_;
288 
289  bool InitThreadFuncImpl(size_t thread_idx) override {
290  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
291  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
292  if (!shutdown_[thread_idx].val) {
293  stream_[thread_idx] = stub->StreamingFromClient(&context_[thread_idx],
294  &responses_[thread_idx]);
295  } else {
296  return false;
297  }
298  last_issue_[thread_idx] = UsageTimer::Now();
299  return true;
300  }
301 
302  bool ThreadFuncImpl(HistogramEntry* entry, size_t thread_idx) override {
303  // Figure out how to make histogram sensible if this is rate-paced
304  if (!WaitToIssue(thread_idx)) {
305  return true;
306  }
307  GPR_TIMER_SCOPE("SynchronousStreamingFromClientClient::ThreadFunc", 0);
308  if (stream_[thread_idx]->Write(request_)) {
309  double now = UsageTimer::Now();
310  entry->set_value((now - last_issue_[thread_idx]) * 1e9);
311  last_issue_[thread_idx] = now;
312  return true;
313  }
314  stream_[thread_idx]->WritesDone();
315  FinishStream(entry, thread_idx);
316  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
317  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
318  if (!shutdown_[thread_idx].val) {
319  stream_[thread_idx] = stub->StreamingFromClient(&context_[thread_idx],
320  &responses_[thread_idx]);
321  } else {
322  stream_[thread_idx].reset();
323  return false;
324  }
325  return true;
326  }
327 };
328 
330  : public SynchronousStreamingClient<grpc::ClientReader<SimpleResponse>> {
331  public:
335 
336  private:
337  std::vector<double> last_recv_;
338 
339  bool InitThreadFuncImpl(size_t thread_idx) override {
340  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
341  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
342  if (!shutdown_[thread_idx].val) {
343  stream_[thread_idx] =
344  stub->StreamingFromServer(&context_[thread_idx], request_);
345  } else {
346  return false;
347  }
348  last_recv_[thread_idx] = UsageTimer::Now();
349  return true;
350  }
351 
352  bool ThreadFuncImpl(HistogramEntry* entry, size_t thread_idx) override {
353  GPR_TIMER_SCOPE("SynchronousStreamingFromServerClient::ThreadFunc", 0);
354  if (stream_[thread_idx]->Read(&responses_[thread_idx])) {
355  double now = UsageTimer::Now();
356  entry->set_value((now - last_recv_[thread_idx]) * 1e9);
357  last_recv_[thread_idx] = now;
358  return true;
359  }
360  FinishStream(entry, thread_idx);
361  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
362  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
363  if (!shutdown_[thread_idx].val) {
364  stream_[thread_idx] =
365  stub->StreamingFromServer(&context_[thread_idx], request_);
366  } else {
367  stream_[thread_idx].reset();
368  return false;
369  }
370  return true;
371  }
372 };
373 
376  grpc::ClientReaderWriter<SimpleRequest, SimpleResponse>> {
377  public:
382  [this](size_t thread_idx) { stream_[thread_idx]->WritesDone(); });
383  }
384 
385  private:
386  bool InitThreadFuncImpl(size_t thread_idx) override {
387  auto* stub = channels_[thread_idx % channels_.size()].get_stub();
388  std::lock_guard<std::mutex> l(stream_mu_[thread_idx]);
389  if (!shutdown_[thread_idx].val) {
390  stream_[thread_idx] = stub->StreamingBothWays(&context_[thread_idx]);
391  } else {
392  return false;
393  }
394  return true;
395  }
396 
398  size_t /*thread_idx*/) override {
399  // TODO (vjpai): Do this
400  return true;
401  }
402 };
403 
404 std::unique_ptr<Client> CreateSynchronousClient(const ClientConfig& config) {
405  GPR_ASSERT(!config.use_coalesce_api()); // not supported yet.
406  switch (config.rpc_type()) {
407  case UNARY:
408  return std::unique_ptr<Client>(new SynchronousUnaryClient(config));
409  case STREAMING:
410  return std::unique_ptr<Client>(
412  case STREAMING_FROM_CLIENT:
413  return std::unique_ptr<Client>(
415  case STREAMING_FROM_SERVER:
416  return std::unique_ptr<Client>(
418  case STREAMING_BOTH_WAYS:
419  return std::unique_ptr<Client>(
421  default:
422  assert(false);
423  return nullptr;
424  }
425 }
426 
427 } // namespace testing
428 } // namespace grpc
grpc::testing::SynchronousStreamingClient::stream_
std::vector< std::unique_ptr< StreamType > > stream_
Definition: client_sync.cc:165
GPR_TIMESPAN
@ GPR_TIMESPAN
Definition: gpr_types.h:45
messages_pb2.SimpleRequest
SimpleRequest
Definition: messages_pb2.py:597
testing
Definition: aws_request_signer_test.cc:25
now
static double now(void)
Definition: test/core/fling/client.cc:130
grpc::testing::HistogramEntry::set_status
void set_status(int status)
Definition: client.h:123
log.h
grpc::testing::SynchronousStreamingFromServerClient::last_recv_
std::vector< double > last_recv_
Definition: client_sync.cc:337
grpc::testing::SynchronousStreamingClient
Definition: client_sync.cc:144
timers.h
grpc
Definition: grpcpp/alarm.h:33
grpc::testing::Client::NextIssueTime
gpr_timespec NextIssueTime(int thread_idx)
Definition: client.h:244
grpc::testing::SynchronousStreamingClient::CleanupAllStreams
void CleanupAllStreams(const std::function< void(size_t)> &cleaner)
Definition: client_sync.cc:194
grpc::testing::SynchronousClient::num_threads_
size_t num_threads_
Definition: client_sync.cc:108
false
#define false
Definition: setup_once.h:323
GPR_TIMER_SCOPE
#define GPR_TIMER_SCOPE(tag, important)
Definition: src/core/lib/profiling/timers.h:43
grpc::testing::SynchronousUnaryClient::DestroyMultithreading
void DestroyMultithreading() final
Definition: client_sync.cc:140
grpc::testing::SynchronousStreamingClient::messages_issued_
std::vector< int > messages_issued_
Definition: client_sync.cc:175
grpc::testing::SynchronousStreamingClient::FinishStream
void FinishStream(HistogramEntry *entry, size_t thread_idx)
Definition: client_sync.cc:177
grpc::testing::SynchronousStreamingFromClientClient
Definition: client_sync.cc:276
grpc::testing::SynchronousStreamingFromServerClient::~SynchronousStreamingFromServerClient
~SynchronousStreamingFromServerClient() override
Definition: client_sync.cc:334
grpc::testing::SynchronousStreamingPingPongClient::~SynchronousStreamingPingPongClient
~SynchronousStreamingPingPongClient() override
Definition: client_sync.cc:224
grpc::testing::SynchronousStreamingBothWaysClient
Definition: client_sync.cc:374
grpc::testing::Client::SetupLoadTest
void SetupLoadTest(const ClientConfig &config, size_t num_threads)
Definition: client.h:355
grpc::testing::SynchronousStreamingFromServerClient::SynchronousStreamingFromServerClient
SynchronousStreamingFromServerClient(const ClientConfig &config)
Definition: client_sync.cc:332
grpc::testing::Client::Thread
Definition: client.h:257
time.h
grpc::testing::SynchronousClient::responses_
std::vector< SimpleResponse > responses_
Definition: client_sync.cc:109
grpc::testing::SynchronousStreamingClient::messages_per_stream_
const int messages_per_stream_
Definition: client_sync.cc:174
UsageTimer::Now
static double Now()
Definition: usage_timer.cc:38
grpc::testing::SynchronousStreamingPingPongClient::ThreadFuncImpl
bool ThreadFuncImpl(HistogramEntry *entry, size_t thread_idx) override
Definition: client_sync.cc:242
grpc::testing::SynchronousStreamingClient::SynchronousStreamingClient
SynchronousStreamingClient(const ClientConfig &config)
Definition: client_sync.cc:146
async_greeter_client.stub
stub
Definition: hellostreamingworld/async_greeter_client.py:26
grpc::testing::SynchronousUnaryClient::ThreadFuncImpl
bool ThreadFuncImpl(HistogramEntry *entry, size_t thread_idx) override
Definition: client_sync.cc:122
grpc::testing::BenchmarkStubCreator
static std::unique_ptr< BenchmarkService::Stub > BenchmarkStubCreator(const std::shared_ptr< Channel > &ch)
Definition: client_async.cc:303
interarrival.h
grpc::testing::HistogramEntry::set_value
void set_value(double v)
Definition: client.h:117
grpc::testing::SynchronousStreamingBothWaysClient::ThreadFuncImpl
bool ThreadFuncImpl(HistogramEntry *, size_t) override
Definition: client_sync.cc:397
grpc::testing::SynchronousClient::SynchronousClient
SynchronousClient(const ClientConfig &config)
Definition: client_sync.cc:53
grpc::testing::SynchronousStreamingFromClientClient::ThreadFuncImpl
bool ThreadFuncImpl(HistogramEntry *entry, size_t thread_idx) override
Definition: client_sync.cc:302
start
static uint64_t start
Definition: benchmark-pound.c:74
grpc::testing::SynchronousStreamingFromServerClient::InitThreadFuncImpl
bool InitThreadFuncImpl(size_t thread_idx) override
Definition: client_sync.cc:339
grpc::testing::SynchronousStreamingClient::shutdown_
std::vector< Bool > shutdown_
Definition: client_sync.cc:173
grpc::testing::SynchronousStreamingFromServerClient
Definition: client_sync.cc:329
grpc::testing::SynchronousStreamingBothWaysClient::SynchronousStreamingBothWaysClient
SynchronousStreamingBothWaysClient(const ClientConfig &config)
Definition: client_sync.cc:378
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
testing::internal::posix::Read
int Read(int fd, void *buf, unsigned int count)
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:2044
grpc::testing::Client::StartThreads
void StartThreads(size_t num_threads)
Definition: client.h:340
gpr_time_cmp
GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:30
grpc::testing::SynchronousStreamingClient::Bool::val
bool val
Definition: client_sync.cc:170
grpc::testing::SynchronousUnaryClient::SynchronousUnaryClient
SynchronousUnaryClient(const ClientConfig &config)
Definition: client_sync.cc:114
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc::testing::SynchronousStreamingBothWaysClient::~SynchronousStreamingBothWaysClient
~SynchronousStreamingBothWaysClient() override
Definition: client_sync.cc:380
gpr_sleep_until
GPRAPI void gpr_sleep_until(gpr_timespec until)
grpc.h
gpr_atm_acq_load
#define gpr_atm_acq_load(p)
Definition: impl/codegen/atm_gcc_atomic.h:52
framework.rpc.grpc_csds.ClientConfig
ClientConfig
Definition: grpc_csds.py:40
grpc::testing::SynchronousClient::ThreadFunc
void ThreadFunc(size_t thread_idx, Thread *t) override
Definition: client_sync.cc:67
grpc::testing::SynchronousStreamingClient::stream_mu_
std::vector< std::mutex > stream_mu_
Definition: client_sync.cc:167
channel.h
GPR_CLOCK_MONOTONIC
@ GPR_CLOCK_MONOTONIC
Definition: gpr_types.h:36
grpc::testing::SynchronousClient::~SynchronousClient
~SynchronousClient() override
Definition: client_sync.cc:62
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
gpr_now
GPRAPI gpr_timespec gpr_now(gpr_clock_type clock)
grpc::testing::SynchronousUnaryClient::InitThreadFuncImpl
bool InitThreadFuncImpl(size_t) override
Definition: client_sync.cc:120
grpc::ClientContext
Definition: grpcpp/impl/codegen/client_context.h:195
grpc::testing::HistogramEntry
Definition: client.h:112
grpc::testing::SynchronousStreamingClient::context_
std::vector< grpc::ClientContext > context_
Definition: client_sync.cc:164
gpr_atm
intptr_t gpr_atm
Definition: impl/codegen/atm_gcc_atomic.h:32
grpc::testing::Client::thread_pool_done_
gpr_atm thread_pool_done_
Definition: client.h:337
grpc::testing::CreateSynchronousClient
std::unique_ptr< Client > CreateSynchronousClient(const ClientConfig &config)
Definition: client_sync.cc:404
grpc::testing::Client::ThreadCompleted
bool ThreadCompleted()
Definition: client.h:253
client_context.h
grpc::testing::ClientImpl
Definition: client.h:427
testing::internal::posix::Write
int Write(int fd, const void *buf, unsigned int count)
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:2047
grpc::testing::SynchronousStreamingFromClientClient::last_issue_
std::vector< double > last_issue_
Definition: client_sync.cc:287
grpc::testing::SynchronousStreamingPingPongClient::SynchronousStreamingPingPongClient
SynchronousStreamingPingPongClient(const ClientConfig &config)
Definition: client_sync.cc:222
gpr_time_add
GPRAPI gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:135
grpc::testing::ClientImpl< BenchmarkService::Stub, SimpleRequest >::request_
SimpleRequest request_
Definition: client.h:504
grpc::testing::SynchronousStreamingClient::~SynchronousStreamingClient
~SynchronousStreamingClient() override
Definition: client_sync.cc:156
alloc.h
grpc::testing::ClientImpl< BenchmarkService::Stub, SimpleRequest >::channels_
std::vector< ClientChannelInfo > channels_
Definition: client.h:563
grpc::testing::SynchronousStreamingFromClientClient::InitThreadFuncImpl
bool InitThreadFuncImpl(size_t thread_idx) override
Definition: client_sync.cc:289
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
grpc::testing::SynchronousStreamingFromClientClient::SynchronousStreamingFromClientClient
SynchronousStreamingFromClientClient(const ClientConfig &config)
Definition: client_sync.cc:279
grpc::testing::Client::EndThreads
void EndThreads()
Definition: client.h:348
grpc::testing::SynchronousClient::InitThreadFuncImpl
virtual bool InitThreadFuncImpl(size_t thread_idx)=0
config_s
Definition: bloaty/third_party/zlib/deflate.c:120
grpc::testing::SynchronousStreamingClient::Bool
Definition: client_sync.cc:169
grpc::testing::SynchronousStreamingFromServerClient::ThreadFuncImpl
bool ThreadFuncImpl(HistogramEntry *entry, size_t thread_idx) override
Definition: client_sync.cc:352
grpc::testing::SynchronousStreamingBothWaysClient::InitThreadFuncImpl
bool InitThreadFuncImpl(size_t thread_idx) override
Definition: client_sync.cc:386
grpc::testing::SynchronousStreamingClient::Bool::Bool
Bool()
Definition: client_sync.cc:171
grpc::testing::SynchronousClient
Definition: client_sync.cc:50
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
ch
char ch
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3621
server.h
gpr_timespec
Definition: gpr_types.h:50
usage_timer.h
grpc::testing::SynchronousStreamingFromClientClient::~SynchronousStreamingFromClientClient
~SynchronousStreamingFromClientClient() override
Definition: client_sync.cc:281
function
std::function< bool(GrpcTool *, int, const char **, const CliCredentials &, GrpcToolOutputCallback)> function
Definition: grpc_tool.cc:250
grpc::testing::SynchronousClient::WaitToIssue
bool WaitToIssue(int thread_idx)
Definition: client_sync.cc:84
grpc::testing::SynchronousStreamingClient::DestroyMultithreading
void DestroyMultithreading() final
Definition: client_sync.cc:211
grpc::testing::Client::closed_loop_
bool closed_loop_
Definition: client.h:336
grpc::testing::SynchronousUnaryClient
Definition: client_sync.cc:112
client.h
server_builder.h
grpc::testing::SynchronousStreamingPingPongClient::InitThreadFuncImpl
bool InitThreadFuncImpl(size_t thread_idx) override
Definition: client_sync.cc:230
grpc::testing::SynchronousStreamingPingPongClient
Definition: client_sync.cc:218
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
gpr_time_from_seconds
GPRAPI gpr_timespec gpr_time_from_seconds(int64_t s, gpr_clock_type clock_type)
Definition: src/core/lib/gpr/time.cc:123
grpc::testing::SynchronousUnaryClient::~SynchronousUnaryClient
~SynchronousUnaryClient() override
Definition: client_sync.cc:118
grpc::testing::SynchronousClient::ThreadFuncImpl
virtual bool ThreadFuncImpl(HistogramEntry *entry, size_t thread_idx)=0


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:47