[
https://issues.apache.org/jira/browse/ZOOKEEPER-3496?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Enrico Olivelli resolved ZOOKEEPER-3496.
----------------------------------------
Resolution: Fixed
Committed to master branch
Thank you [~arshad.mohammad]
> Transaction larger than jute.maxbuffer makes ZooKeeper unavailable
> ------------------------------------------------------------------
>
> Key: ZOOKEEPER-3496
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-3496
> Project: ZooKeeper
> Issue Type: Bug
> Affects Versions: 3.5.5, 3.4.14
> Reporter: Mohammad Arshad
> Assignee: Mohammad Arshad
> Priority: Critical
> Labels: pull-request-available
> Fix For: 3.6.0, 3.4.15, 3.5.7
>
> Attachments: ZOOKEEPER-3496-001.patch
>
> Time Spent: 6h
> Remaining Estimate: 0h
>
> *Problem:*
> ZooKeeper server fails to start, logs following error
> {code:java}
> Exception in thread "main" java.io.IOException: Unreasonable length = 1001025
> at
> org.apache.jute.BinaryInputArchive.checkLength(BinaryInputArchive.java:127)
> at
> org.apache.jute.BinaryInputArchive.readBuffer(BinaryInputArchive.java:92)
> {code}
> This indicates that one of the transactions size is more than the configured
> jute.maxbuffer values. But how transaction more than jute.maxbuffer size is
> allowed to write?
> *Analysis:*
> At ZooKeeper server jute.maxbuffer specifies the maximum size of a
> transaction. By default it is 1 MB at the server
> jute.maxbuffer is used for following:
> # Size sanity check of incoming request. Incoming requests size must not be
> more than jute.maxbuffer
> # Size sanity check of the transaction while reading from transaction or
> snapshot file. Transaction size must not be more than jute.maxbuffer+1024
> # Size sanity check of transaction while reading data from the leader.
> Transaction size must not be more than jute.maxbuffer+1024
> Request size sanity check is done in the beginning of a request processing
> but later request processing adds additional information into request then
> writes to transaction file. This additional information size is not
> considered in sanity check. This is how transaction larger than
> jute.maxbuffer are accepted into ZooKeeper.
> If this additional information size is less than 1024 Bytes then it is OK as
> ZooKeeper already takes care of it.
> But if this additional information size is more than 1024 bytes it allows the
> request, But while reading from transaction/snapshot file and while reading
> from leader it fails and make the ZooKeeper service unavailable
> +Example:+
> Suppose incoming request size is 1000000 Bytes
> Configured jute.maxbuffer is 1000000
> After processing the request ZooKeeper server adds 1025 more bytes
> In this case, request will be processed successfully, and 1000000+1025 bytes
> will be written to transaction file
> But while reading from the transaction log 1000000+1025 bytes cannot be read
> as max allowed length is 1000000(effectively 1000000+1024).
> *Solutions:*
> If incoming request size sanity check is done after populating all additional
> information then this problem is solved. But doing sanity check in the later
> stage of request processing will defeat the purpose of sanity check itself.
> So this we can not do
> Currently additional information size is constant 1024 Bytes [Code
> Reference|https://github.com/apache/zookeeper/blob/branch-3.5/zookeeper-jute/src/main/java/org/apache/jute/BinaryInputArchive.java#L126].
> We should increase this value and make it more reasonable. I propose to make
> this additional information size to same as the jute.maxbuffer. Also make
> additional information size configurable.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)