Author: bryanduxbury
Date: Wed Oct  6 00:28:10 2010
New Revision: 1004865

URL: http://svn.apache.org/viewvc?rev=1004865&view=rev
Log:
THRIFT-945. java: TAsyncClient class's currentMethod is never set, hence a 
second call on the same client will fail if a previous call is ongoing.

This patch adds a test for the problem and fixes the issue by setting the 
current method after a call has been started.

Added:
    
incubator/thrift/trunk/lib/java/test/org/apache/thrift/async/TestTAsyncClient.java
Modified:
    incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc
    
incubator/thrift/trunk/lib/java/src/org/apache/thrift/async/TAsyncClient.java

Modified: incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc?rev=1004865&r1=1004864&r2=1004865&view=diff
==============================================================================
--- incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc 
(original)
+++ incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc Wed 
Oct  6 00:28:10 2010
@@ -2440,7 +2440,6 @@ void t_java_generator::generate_service_
   string extends_client = "";
   if (tservice->get_extends() != NULL) {
     extends = type_name(tservice->get_extends()) + ".AsyncClient";
-    // extends_client = " extends " + extends + ".AsyncClient";
   }
 
   indent(f_service_) <<
@@ -2481,7 +2480,8 @@ void t_java_generator::generate_service_
     // Main method body   
     indent(f_service_) << "public " << function_signature_async(*f_iter, 
false) << " throws TException {" << endl;
     indent(f_service_) << "  checkReady();" << endl;
-    indent(f_service_) << "  " << funclassname << " method_call = new " + 
funclassname + "(" << async_argument_list(*f_iter, arg_struct, ret_type) << ", 
this, protocolFactory, transport);" << endl;    
+    indent(f_service_) << "  " << funclassname << " method_call = new " + 
funclassname + "(" << async_argument_list(*f_iter, arg_struct, ret_type) << ", 
this, protocolFactory, transport);" << endl;
+    indent(f_service_) << "  this.currentMethod = method_call;" << endl;
     indent(f_service_) << "  manager.call(method_call);" << endl;
     indent(f_service_) << "}" << endl;
 

Modified: 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/async/TAsyncClient.java
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/src/org/apache/thrift/async/TAsyncClient.java?rev=1004865&r1=1004864&r2=1004865&view=diff
==============================================================================
--- 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/async/TAsyncClient.java 
(original)
+++ 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/async/TAsyncClient.java 
Wed Oct  6 00:28:10 2010
@@ -25,7 +25,7 @@ public abstract class TAsyncClient {
   protected final TProtocolFactory protocolFactory;
   protected final TNonblockingTransport transport;
   protected final TAsyncClientManager manager;
-  private TAsyncMethodCall currentMethod;
+  protected TAsyncMethodCall currentMethod;
   private Throwable error;
   private long timeout;
 

Added: 
incubator/thrift/trunk/lib/java/test/org/apache/thrift/async/TestTAsyncClient.java
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/test/org/apache/thrift/async/TestTAsyncClient.java?rev=1004865&view=auto
==============================================================================
--- 
incubator/thrift/trunk/lib/java/test/org/apache/thrift/async/TestTAsyncClient.java
 (added)
+++ 
incubator/thrift/trunk/lib/java/test/org/apache/thrift/async/TestTAsyncClient.java
 Wed Oct  6 00:28:10 2010
@@ -0,0 +1,27 @@
+package org.apache.thrift.async;
+
+import org.apache.thrift.TException;
+
+import junit.framework.TestCase;
+import thrift.test.Srv;
+import thrift.test.Srv.AsyncClient;
+
+public class TestTAsyncClient extends TestCase {
+  public void testRaisesExceptionWhenUsedConcurrently() throws Exception {
+    TAsyncClientManager mockClientManager = new TAsyncClientManager() {
+      @Override
+      public void call(TAsyncMethodCall method) throws TException {
+        // do nothing
+      }
+    };
+
+    Srv.AsyncClient c = new AsyncClient(null, mockClientManager, null);
+    c.Janky(0, null);
+    try {
+      c.checkReady();
+      fail("should have hit an exception");
+    } catch (Exception e) {
+      // awesome
+    }
+  }
+}


Reply via email to