diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc index ad0cffabdad8f26ddc82e17a075043f3a8be4ddd..ab592abc3d7030e1ee9f452eed0dff51fc339f79 100644 --- a/test/cpp/qps/client_async.cc +++ b/test/cpp/qps/client_async.cc @@ -273,17 +273,23 @@ class AsyncClient : public Client { // Attempt to issue bool issued = false; for (int num_attempts = 0; num_attempts < channel_count_ && !issued; - num_attempts++, - next_channel_[thread_idx] = - (next_channel_[thread_idx]+1)%channel_count_) { - std::lock_guard<std::mutex> - g(channel_lock_[next_channel_[thread_idx]]); - if ((rpcs_outstanding_[next_channel_[thread_idx]] < - max_outstanding_per_channel_) && - !contexts_[next_channel_[thread_idx]].empty()) { - // Get an idle context from the front of the list - auto ctx = *(contexts_[next_channel_[thread_idx]].begin()); - contexts_[next_channel_[thread_idx]].pop_front(); + num_attempts++) { + bool can_issue = false; + ClientRpcContext* ctx; + { + std::lock_guard<std::mutex> + g(channel_lock_[next_channel_[thread_idx]]); + if ((rpcs_outstanding_[next_channel_[thread_idx]] < + max_outstanding_per_channel_) && + !contexts_[next_channel_[thread_idx]].empty()) { + // Get an idle context from the front of the list + ctx = *(contexts_[next_channel_[thread_idx]].begin()); + contexts_[next_channel_[thread_idx]].pop_front(); + rpcs_outstanding_[next_channel_[thread_idx]]++; + can_issue = true; + } + } + if (can_issue) { // do the work to issue rpc_deadlines_[thread_idx].emplace_back( grpc_time_source::now() + std::chrono::seconds(1)); @@ -291,11 +297,15 @@ class AsyncClient : public Client { --it; ctx->set_deadline_posn(it); ctx->Start(cli_cqs_[thread_idx].get()); - rpcs_outstanding_[next_channel_[thread_idx]]++; issued = true; + } else { + // Do a modular increment of next_channel only if we didn't issue + next_channel_[thread_idx] = + (next_channel_[thread_idx]+1)%channel_count_; } } if (issued) { + // We issued one; see when we can issue the next grpc_time next_issue; NextIssueTime(thread_idx, &next_issue); next_issue_[thread_idx]=next_issue;