Mohammad Arshad created ZOOKEEPER-4843:
------------------------------------------

             Summary: Encountering an 'Unreasonable Length' error when 
configuring jute.maxbuffer to 1GB or more
                 Key: ZOOKEEPER-4843
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-4843
             Project: ZooKeeper
          Issue Type: Bug
    Affects Versions: 3.9.2, 3.8.4
            Reporter: Mohammad Arshad
            Assignee: Mohammad Arshad


*Problem:*
Encountering an 'Unreasonable Length' error when configuring jute.maxbuffer to 
1GB or more
{code:java}
2024-07-04 11:55:41,806 [myid:localhost:2181] - WARN  
[main-SendThread(localhost:2181):o.a.z.ClientCnxn$SendThread@1300] - Session 
0x0 for server localhost/127.0.0.1:2181, Closing socket connection.
Attempting reconnect except it is a SessionExpiredException.
java.io.IOException: Unreasonable length = 16
        at 
org.apache.jute.BinaryInputArchive.checkLength(BinaryInputArchive.java:166)
        at 
org.apache.jute.BinaryInputArchive.readBuffer(BinaryInputArchive.java:127)
        at 
org.apache.zookeeper.proto.ConnectResponse.deserialize(ConnectResponse.java:80)
        at 
org.apache.zookeeper.ClientCnxnSocket.readConnectResult(ClientCnxnSocket.java:141)
        at 
org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:86)
        at 
org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350)
        at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1289)
2024-07-04 11:55:42,567 [myid:] - INFO  [main:o.a.z.u.ServiceUtils@45] - 
Exiting JVM with code 0
{code}

*Analysis:*
If jute.maxbuffer is set to 1GB (equivalent to 1073741824 bytes), this means 
that both maxBufferSize and extraMaxBufferSize are also set to 1073741824.
Even when the response size (denoted as 'len') is minimal, the following 
condition check still fails:
{code:java}
if (len < 0 || len > maxBufferSize + extraMaxBufferSize) {
    throw new IOException(UNREASONBLE_LENGTH + len);
}
{code}
It is because (maxBufferSize + extraMaxBufferSize) overflow int MAX_VALUE and 
the result is a negative number.

*Solution:*
Configure jute.maxbuffer.extrasize explicitly and give a reasonable value, so 
that the sum of maxBufferSize and extraMaxBufferSize is less than 
Integer.MAX_VALUE.

*Improvement:*
While setting jute.maxbuffer to 1GB may seem unreasonable, it would be better 
to validate the maxBuffer and extraMaxBufferSize configuration.
If the sum of these two values is greater than Integer.MAX_VALUE, it should be 
handled gracefully by setting the sum to Integer.MAX_VALUE






--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to