[
https://issues.apache.org/jira/browse/ZOOKEEPER-2249?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16297745#comment-16297745
]
ASF GitHub Bot commented on ZOOKEEPER-2249:
-------------------------------------------
Github user phunt commented on a diff in the pull request:
https://github.com/apache/zookeeper/pull/436#discussion_r157918305
--- Diff: src/java/main/org/apache/zookeeper/server/persistence/Util.java
---
@@ -211,7 +211,7 @@ public static long padLogFile(FileOutputStream f,long
currentSize,
long preAllocSize) throws IOException{
long position = f.getChannel().position();
if (position + 4096 >= currentSize) {
- currentSize = currentSize + preAllocSize;
+ currentSize = position + preAllocSize;
--- End diff --
Nice catch Abe! This looks like a reasonable fix, however it results in the
doc'd invariant not being followed
"allocates space in the transaction log file in blocks of preAllocSize
kilobytes"
I believe in this case you want something which will maintain the file as a
multiple of this value.
Perhaps a while loop inside the conditional, replacing "currentSize =
currentSize + preAllocSize;" with:
while (position + 4096 >= currentSize) {
currentSize = currentSize + preAllocSize
}
> CRC check failed when preAllocSize smaller than node data
> ---------------------------------------------------------
>
> Key: ZOOKEEPER-2249
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2249
> Project: ZooKeeper
> Issue Type: Bug
> Affects Versions: 3.5.3, 3.4.11, 3.6.0
> Reporter: Benjamin Jaton
> Assignee: Abraham Fine
> Labels: server
>
> Unexpected exception, exiting abnormally
> java.io.IOException: CRC check failed
> org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.next(FileTxnLog.java:612)
>
> org.apache.zookeeper.server.persistence.FileTxnSnapLog.restore(FileTxnSnapLog.java:157)
>
> org.apache.zookeeper.server.ZKDatabase.loadDataBase(ZKDatabase.java:223)
> org.apache.zookeeper.server.ZooKeeperServer.loadData(ZooKeeperServer.java:272)
>
> org.apache.zookeeper.server.ZooKeeperServer.startdata(ZooKeeperServer.java:399)
> To reproduce, set the preAllocSize to 8MB, the jute.maxbuffer to 20MB and try
> saving a 15MB node several times.
> In my case the erroneous CRC appears after the second save. I use the
> LogFormatter class to detect it.
> I suspect that the CRC error happens when the new transaction log is created,
> the code probably expects to have enough room to save the transaction when
> creating a new file, but it's too small.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)