Antonio García created THRIFT-3392:
--------------------------------------

             Summary: Java TZlibTransport does not close its wrapper streams 
upon close()
                 Key: THRIFT-3392
                 URL: https://issues.apache.org/jira/browse/THRIFT-3392
             Project: Thrift
          Issue Type: Bug
          Components: Java - Library
    Affects Versions: 0.9.3
            Reporter: Antonio García


While setting up a short demo project using the new Java TZlibTransport in 
0.9.3, I wrote code like this:

try (TProtocol proto = new TJSONProtocol(new TZlibTransport(...))) {
  Blog blog = new Blog();
  // set up fields in blog
  proto.write(blog);
}

However, when I went to look at the file, I found it mostly empty (with only 
the header bytes). I had a look at the TZlibTransport code, which seems to be a 
subclass of TIOStreamTransport that wraps its underlying transport using Java 
inflater/deflater streams:

 public TZlibTransport(TTransport transport, int compressionLevel) {
         transport_ = transport;
        inputStream_ = new InflaterInputStream(new 
TTransportInputStream(transport_), new Inflater());
        outputStream_ = new DeflaterOutputStream(new 
TTransportOutputStream(transport_), new Deflater(compressionLevel, false), 
true);
     }

However, on its close method it only closes the transport and not the 
underlying streams, forcing users to flush the transport before closing if they 
really want to write everything:

  public void close() {
        if (transport_.isOpen()) {
            transport_.close();
  }

I think it would be better if we simply relied on the close() method of the 
TIOStreamTransport, which closes the input and output streams if they have been 
created. Additionally, it would be better to create the input stream on the 
first read and the output stream on the first write: otherwise, we will get an 
error during closing if we're only reading (as TIOStreamTransport will still 
try to close the output side, resulting in writes from the deflater).

I have a first version of a fix for these issues: I'll turn it into a pull 
request on Github.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to