[ https://issues.apache.org/jira/browse/ZOOKEEPER-4843?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andor Molnar updated ZOOKEEPER-4843: ------------------------------------ Fix Version/s: 3.8.5 > 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.8.4, 3.9.2 > Reporter: Mohammad Arshad > Assignee: Mohammad Arshad > Priority: Major > Labels: pull-request-available > Fix For: 3.10.0, 3.8.5, 3.9.3 > > Time Spent: 1h 20m > Remaining Estimate: 0h > > *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)