From 3676b38183c2d288c6daef1c0f3fd9b08f3927bc Mon Sep 17 00:00:00 2001
From: Craig Tiller <ctiller@google.com>
Date: Wed, 6 May 2015 13:01:05 -0700
Subject: [PATCH] Lose redundant tag on unary calls

---
 Makefile                               |  2 +-
 build.json                             |  2 +-
 include/grpc++/async_unary_call.h      |  5 ++---
 include/grpc++/impl/call.h             |  8 ++++++++
 src/compiler/cpp_generator.cc          |  6 +++---
 test/cpp/end2end/async_end2end_test.cc | 17 ++++++-----------
 test/cpp/qps/client_async.cc           | 23 +++++++++--------------
 7 files changed, 30 insertions(+), 33 deletions(-)

diff --git a/Makefile b/Makefile
index 244a211652..5f95aabb92 100644
--- a/Makefile
+++ b/Makefile
@@ -305,7 +305,7 @@ E = @echo
 Q = @
 endif
 
-VERSION = 0.7.0.0
+VERSION = 0.8.0.0
 
 CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
 CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
diff --git a/build.json b/build.json
index 10fd72d99e..217d84cdea 100644
--- a/build.json
+++ b/build.json
@@ -6,7 +6,7 @@
     "#": "The public version number of the library.",
     "version": {
       "major": 0,
-      "minor": 7,
+      "minor": 8,
       "micro": 0,
       "build": 0
     }
diff --git a/include/grpc++/async_unary_call.h b/include/grpc++/async_unary_call.h
index d1d5be5b50..3e58bf2130 100644
--- a/include/grpc++/async_unary_call.h
+++ b/include/grpc++/async_unary_call.h
@@ -49,9 +49,8 @@ class ClientAsyncResponseReader GRPC_FINAL {
  public:
   ClientAsyncResponseReader(ChannelInterface* channel, CompletionQueue* cq,
                             const RpcMethod& method, ClientContext* context,
-                            const grpc::protobuf::Message& request, void* tag)
+                            const grpc::protobuf::Message& request)
       : context_(context), call_(channel->CreateCall(method, context, cq)) {
-    init_buf_.Reset(tag);
     init_buf_.AddSendInitialMetadata(&context->send_initial_metadata_);
     init_buf_.AddSendMessage(request);
     init_buf_.AddClientSendClose();
@@ -79,7 +78,7 @@ class ClientAsyncResponseReader GRPC_FINAL {
  private:
   ClientContext* context_;
   Call call_;
-  CallOpBuffer init_buf_;
+  SneakyCallOpBuffer init_buf_;
   CallOpBuffer meta_buf_;
   CallOpBuffer finish_buf_;
 };
diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h
index d76ef61dd2..aae199db1b 100644
--- a/include/grpc++/impl/call.h
+++ b/include/grpc++/impl/call.h
@@ -123,6 +123,14 @@ class CallOpBuffer : public CompletionQueueTag {
   bool* recv_closed_;
 };
 
+// SneakyCallOpBuffer does not post completions to the completion queue
+class SneakyCallOpBuffer GRPC_FINAL : public CallOpBuffer {
+ public:
+  bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE {
+    return CallOpBuffer::FinalizeResult(tag, status) && false;
+  }
+};
+
 // Channel and Server implement this to allow them to hook performing ops
 class CallHook {
  public:
diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc
index 735e7e58a8..4c20e9a24a 100644
--- a/src/compiler/cpp_generator.cc
+++ b/src/compiler/cpp_generator.cc
@@ -233,7 +233,7 @@ void PrintHeaderClientMethod(grpc::protobuf::io::Printer *printer,
         "std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> "
         "Async$Method$(::grpc::ClientContext* context, "
         "const $Request$& request, "
-        "::grpc::CompletionQueue* cq, void* tag);\n");
+        "::grpc::CompletionQueue* cq);\n");
   } else if (ClientOnlyStreaming(method)) {
     printer->Print(
         *vars,
@@ -538,14 +538,14 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer,
         "std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> "
         "$ns$$Service$::Stub::Async$Method$(::grpc::ClientContext* context, "
         "const $Request$& request, "
-        "::grpc::CompletionQueue* cq, void* tag) {\n");
+        "::grpc::CompletionQueue* cq) {\n");
     printer->Print(*vars,
                    "  return std::unique_ptr< "
                    "::grpc::ClientAsyncResponseReader< $Response$>>(new "
                    "::grpc::ClientAsyncResponseReader< $Response$>("
                    "channel(), cq, "
                    "rpcmethod_$Method$_, "
-                   "context, request, tag));\n"
+                   "context, request));\n"
                    "}\n\n");
   } else if (ClientOnlyStreaming(method)) {
     printer->Print(*vars,
diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc
index 6c0dfadbb9..4c2f0fa13b 100644
--- a/test/cpp/end2end/async_end2end_test.cc
+++ b/test/cpp/end2end/async_end2end_test.cc
@@ -140,14 +140,13 @@ class AsyncEnd2endTest : public ::testing::Test {
 
       send_request.set_message("Hello");
       std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
-          stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
+          stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
 
       service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
                            tag(2));
 
       server_ok(2);
       EXPECT_EQ(send_request.message(), recv_request.message());
-      client_ok(1);
 
       send_response.set_message(recv_request.message());
       response_writer.Finish(send_response, Status::OK, tag(3));
@@ -195,7 +194,7 @@ TEST_F(AsyncEnd2endTest, AsyncNextRpc) {
 
   send_request.set_message("Hello");
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
-      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
+      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
 
   std::chrono::system_clock::time_point time_now(
       std::chrono::system_clock::now()),
@@ -208,7 +207,6 @@ TEST_F(AsyncEnd2endTest, AsyncNextRpc) {
 
   verify_timed_ok(&srv_cq_, 2, true, time_limit);
   EXPECT_EQ(send_request.message(), recv_request.message());
-  verify_timed_ok(&cli_cq_, 1, true, time_limit);
 
   send_response.set_message(recv_request.message());
   response_writer.Finish(send_response, Status::OK, tag(3));
@@ -398,7 +396,7 @@ TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
   cli_ctx.AddMetadata(meta2.first, meta2.second);
 
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
-      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
+      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
                        tag(2));
@@ -408,7 +406,6 @@ TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
   EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
   EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
   EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
-  client_ok(1);
 
   send_response.set_message(recv_request.message());
   response_writer.Finish(send_response, Status::OK, tag(3));
@@ -440,7 +437,7 @@ TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
   std::pair<grpc::string, grpc::string> meta2("key2", "val2");
 
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
-      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
+      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
                        tag(2));
@@ -448,7 +445,6 @@ TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
   EXPECT_EQ(send_request.message(), recv_request.message());
   srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
   srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
-  client_ok(1);
   response_writer.SendInitialMetadata(tag(3));
   server_ok(3);
 
@@ -488,7 +484,7 @@ TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
   std::pair<grpc::string, grpc::string> meta2("key2", "val2");
 
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
-      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
+      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
                        tag(2));
@@ -496,7 +492,6 @@ TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
   EXPECT_EQ(send_request.message(), recv_request.message());
   response_writer.SendInitialMetadata(tag(3));
   server_ok(3);
-  client_ok(1);
 
   send_response.set_message(recv_request.message());
   srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
@@ -549,7 +544,7 @@ TEST_F(AsyncEnd2endTest, MetadataRpc) {
   cli_ctx.AddMetadata(meta2.first, meta2.second);
 
   std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
-      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
+      stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
 
   service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
                        tag(2));
diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index 0aec1b1a57..e3ab57728d 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -75,19 +75,20 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
       TestService::Stub* stub, const RequestType& req,
       std::function<
           std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
-              TestService::Stub*, grpc::ClientContext*, const RequestType&,
-              void*)> start_req,
+              TestService::Stub*, grpc::ClientContext*, const RequestType&)>
+          start_req,
       std::function<void(grpc::Status, ResponseType*)> on_done)
       : context_(),
         stub_(stub),
         req_(req),
         response_(),
-        next_state_(&ClientRpcContextUnaryImpl::ReqSent),
+        next_state_(&ClientRpcContextUnaryImpl::RespDone),
         callback_(on_done),
         start_req_(start_req),
         start_(Timer::Now()),
-        response_reader_(
-            start_req(stub_, &context_, req_, ClientRpcContext::tag(this))) {}
+        response_reader_(start_req(stub_, &context_, req_)) {
+    response_reader_->Finish(&response_, &status_, ClientRpcContext::tag(this));
+  }
   ~ClientRpcContextUnaryImpl() GRPC_OVERRIDE {}
   bool RunNextState(bool ok, Histogram* hist) GRPC_OVERRIDE {
     bool ret = (this->*next_state_)(ok);
@@ -102,11 +103,6 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
   }
 
  private:
-  bool ReqSent(bool) {
-    next_state_ = &ClientRpcContextUnaryImpl::RespDone;
-    response_reader_->Finish(&response_, &status_, ClientRpcContext::tag(this));
-    return true;
-  }
   bool RespDone(bool) {
     next_state_ = &ClientRpcContextUnaryImpl::DoCallBack;
     return false;
@@ -122,8 +118,7 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
   bool (ClientRpcContextUnaryImpl::*next_state_)(bool);
   std::function<void(grpc::Status, ResponseType*)> callback_;
   std::function<std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
-      TestService::Stub*, grpc::ClientContext*, const RequestType&, void*)>
-      start_req_;
+      TestService::Stub*, grpc::ClientContext*, const RequestType&)> start_req_;
   grpc::Status status_;
   double start_;
   std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>
@@ -198,8 +193,8 @@ private:
                        const SimpleRequest& req) {
     auto check_done = [](grpc::Status s, SimpleResponse* response) {};
     auto start_req = [cq](TestService::Stub* stub, grpc::ClientContext* ctx,
-                          const SimpleRequest& request, void* tag) {
-      return stub->AsyncUnaryCall(ctx, request, cq, tag);
+                          const SimpleRequest& request) {
+      return stub->AsyncUnaryCall(ctx, request, cq);
     };
     new ClientRpcContextUnaryImpl<SimpleRequest, SimpleResponse>(
         stub, req, start_req, check_done);
-- 
GitLab