Alex Kormukhin created THRIFT-4681:
--------------------------------------

             Summary: Java async client cannot be reused after a model exception
                 Key: THRIFT-4681
                 URL: https://issues.apache.org/jira/browse/THRIFT-4681
             Project: Thrift
          Issue Type: Bug
          Components: Java - Library
    Affects Versions: 0.11.0
            Reporter: Alex Kormukhin
         Attachments: bug-async-client-not-reusable.zip

After any model (business) exception, java async client comes to an illegal 
state. This prevents it from being used again in the client pool. However, the 
synchronous client in the same case remains operational.

This feature of the asynchronous client makes it less efficient compared to 
synchronous when using client pools.

Attached test demonstrates this issue.
{code:java}
Tests run: 8, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 1.963 sec <<< 
FAILURE!
async_client_must_be_reusable_after_model_exceptions[serverImplementationType = 
SYNC_SERVER](org.apache.thrift.test.ClientReusabilityTest) Time elapsed: 0.032 
sec <<< ERROR!
java.lang.IllegalStateException: Client has an error!
at org.apache.thrift.async.TAsyncClient.checkReady(TAsyncClient.java:83)
at 
org.apache.thrift.test.model.TAppService01$AsyncClient.doSomething(TAppService01.java:91)
at 
org.apache.thrift.test.ClientReusabilityTest.checkAsyncClientReusability(ClientReusabilityTest.java:152)
at 
org.apache.thrift.test.ClientReusabilityTest.async_client_must_be_reusable_after_model_exceptions(ClientReusabilityTest.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at 
org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at 
org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at 
org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at 
org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at 
org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at 
org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at 
org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: TExampleException(message:example model exception)
at 
org.apache.thrift.test.model.TAppService01$doSomething_result$doSomething_resultStandardScheme.read(TAppService01.java:1099)
at 
org.apache.thrift.test.model.TAppService01$doSomething_result$doSomething_resultStandardScheme.read(TAppService01.java:1077)
at 
org.apache.thrift.test.model.TAppService01$doSomething_result.read(TAppService01.java:1019)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:88)
at 
org.apache.thrift.test.model.TAppService01$Client.recv_doSomething(TAppService01.java:62)
at 
org.apache.thrift.test.model.TAppService01$AsyncClient$doSomething_call.getResult(TAppService01.java:121)
at 
org.apache.thrift.test.model.TAppService01$AsyncClient$doSomething_call.getResult(TAppService01.java:97)
at 
org.apache.thrift.async.TAsyncMethodCall.cleanUpAndFireCallback(TAsyncMethodCall.java:235)
at 
org.apache.thrift.async.TAsyncMethodCall.doReadingResponseBody(TAsyncMethodCall.java:225)
at 
org.apache.thrift.async.TAsyncMethodCall.transition(TAsyncMethodCall.java:201)
at 
org.apache.thrift.async.TAsyncClientManager$SelectThread.transitionMethods(TAsyncClientManager.java:143)
at 
org.apache.thrift.async.TAsyncClientManager$SelectThread.run(TAsyncClientManager.java:113)

{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to