emopers created ZOOKEEPER-2369:
----------------------------------

             Summary: Flushing DataOutputStream before calling toByteArray on 
the underlying ByteArrayOutputStream
                 Key: ZOOKEEPER-2369
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2369
             Project: ZooKeeper
          Issue Type: Bug
            Reporter: emopers
            Priority: Minor


In ./src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
{code}
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos);
            bos.writeInt(-1, "len");
            rsp.serialize(bos, "connect");
            if (!cnxn.isOldClient) {
                bos.writeBool(
                        this instanceof ReadOnlyZooKeeperServer, "readOnly");
            }
            baos.close();
            ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
{code}

BinaryOutputArchive internally uses DataOutputStream as its stream, and when a 
DataOutputStream instance wraps an underlying ByteArrayOutputStream instance,
it is recommended to flush or close the DataOutputStream before invoking the 
underlying instances's toByteArray() . Also, it is a good practice to call 
flush/close explicitly as mentioned for example 
http://stackoverflow.com/questions/2984538/how-to-use-bytearrayoutputstream-and-dataoutputstream-simultaneously-java.
Moreover, "baos.close()" at second last line is not required as it is no-op 
according to 
[javadoc|http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html]
{quote}
Closing a ByteArrayOutputStream has no effect. The methods in this class can be 
called after the stream has been closed without generating an IOException.
{quote}
The patch is to add flush method on "bos" before calling toByteArray on "baos". 
Similar behavior is also present in the following files:
./src/java/main/org/apache/zookeeper/ClientCnxn.java
./src/java/main/org/apache/zookeeper/server/ZKDatabase.java
./src/java/main/org/apache/zookeeper/server/persistence/Util.java
./src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java

Let me know if this looks good. I can provide patch.



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

Reply via email to