The nonblocking servers is supposed to use TransportFactory to read the data
----------------------------------------------------------------------------

                 Key: THRIFT-1429
                 URL: https://issues.apache.org/jira/browse/THRIFT-1429
             Project: Thrift
          Issue Type: Bug
    Affects Versions: 0.7
            Reporter: Jerome Boulon


The nonblocking servers (TNonblockingServer) presume that you are using a 
framed transport and use that information to read the data as though it were 
framed. However, once it is loaded into memory, it is supposed to be wrapped up 
in the transport that the transport factory returns so that we can do 
post-processing.
This does not seems to be the case anymore.

Use case: Implement another transport on top of TFramedTransport
For testing purposed I wrapped a TFramedTransport inside another 
TFramedTransport.

On the client side:

transport = new TFramedTransport(socket);
TTransport transport2 = new TFramedTransport(transport);
protocol = new TBinaryProtocol(transport2);
transport2.open();
service = new MyService.Client(protocol);
long count = service.getCounter("My counter");

On the server side:
serverTransport = new TNonblockingServerSocket(port);
processor =  new MyService.Processor(new ServerIMPL());
THsHaServer.Args options = new THsHaServer.Args(serverTransport); 
options.workerThreads(1);
options.processor(processor);
options.transportFactory(new TFramedTransport.Factory());
server = new THsHaServer(options);

I'm getting this exception:

2385 [pool-1-thread-1] WARN org.apache.thrift.server.TNonblockingServer - 
Exception while invoking!
org.apache.thrift.transport.TTransportException: Cannot read. Remote side has 
closed. Tried to read 1 bytes, but only got 0 bytes. (This is often indicative 
of an internal error on the server side. Please check your server logs.)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:86)
at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:378)
at org.apache.thrift.protocol.TBinaryProtocol.readByte(TBinaryProtocol.java:264)
at 
org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:215)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:22)
at 
org.apache.thrift.server.TNonblockingServer$FrameBuffer.invoke(TNonblockingServer.java:651)
at org.apache.thrift.server.THsHaServer$Invocation.run(THsHaServer.java:201)
at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)

private TTransport getInputTransport() {
    return new TMemoryInputTransport(buffer_.array());
}
Why the buffer is not wrapped by the transportFactory similarly to the 
getOutputTransport's method?
This method looks suspicious to me but I'm not familiar with TNonblockingServer 
so ... 


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to