Hello
I have code like this:TNonblockingTransport transport = new 
TNonblockingSocket("127.0.0.1", 9160, 10000);TAsyncClientManager clientManager 
= new TAsyncClientManager();TProtocolFactory protocolFactory = new 
TBinaryProtocol.Factory();
//generated thrift clientZipkinCollector.AsyncClient c = new 
ZipkinCollector.AsyncClient( protocolFactory, clientManager, 
transport);//calling methods in other threadsc.Log....
I am using async client with nio support (libthrift 0.9.1). I was looking 
inside the code and I was surprised about ___currentMethod in 
https://github.com/apache/thrift/blob/0.9.1/lib/java/src/org/apache/thrift/async/TAsyncClient.java#L28
My first question is the purpose of this variable. 
If it is a check to serialize reads and writes to NIO socket than you have a 
bug there. In this case you have unprotected critical section on 
___currentMethod. It can be mutated from two threads - one is Selector thread 
in TAsyncClientManager and the second one is main thread calling generated 
thrift protocol method (in this case Log)
public void Log(List<LogEntry> messages, 
org.apache.thrift.async.AsyncMethodCallback resultHandler) throws 
org.apache.thrift.TException { checkReady(); Log_call method_call = new 
Log_call(messages, resultHandler, this, ___protocolFactory, ___transport); 
this.___currentMethod = method_call; //<------mutating  
___manager.call(method_call);}
This can lead to unpredictable results.
Can some maintainer confirm this ? I would fill you a bug but at first I want 
to be sure that I did not missed something crucial.
Either way you should really reconsider using mutable variables in asynchronous 
environment. This can lead to serious mess.


Regards
Peter CipovJánošík

Reply via email to