You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ha...@apache.org on 2018/04/06 04:04:15 UTC
zookeeper git commit: ZOOKEEPER-3006: Potential NPE in
ZKDatabase#calculateTxnLogSizeLimit
Repository: zookeeper
Updated Branches:
refs/heads/master 13c9f899f -> fbd21329d
ZOOKEEPER-3006: Potential NPE in ZKDatabase#calculateTxnLogSizeLimit
LJ1043041006 found a potential NPE in ZKDatabase#calculateTxnLogSizeLimit: https://issues.apache.org/jira/browse/ZOOKEEPER-3006
```
//ZKDatabase
public long calculateTxnLogSizeLimit() {
long snapSize = 0;
try {
snapSize = snapLog.findMostRecentSnapshot().length();
} catch (IOException e) {
LOG.error("Unable to get size of most recent snapshot");
}
return (long) (snapSize * snapshotSizeFactor);
}
```
in FileTxnSnapLog#findMostRecentSnapshot(), it will return the result of FileSnap#findMostRecentSnapshot:
```
// called by FileTxnSnapLog#findMostRecentSnapshot()
public File findMostRecentSnapshot() throws IOException {
List<File> files = findNValidSnapshots(1);
if (files.size() == 0) {
return null;
}
return files.get(0);
}
```
So it will return null when the files sizes is 0, but ZKDatabase#calculateTxnLogSizeLimit has no null checker.
Author: Edward Ribeiro <ed...@gmail.com>
Reviewers: Andor Molnár <an...@cloudera.com>, Michael Han <ha...@apache.org>, maoling <ma...@sina.com>
Closes #493 from edwardoliveira/zk-3006-potential-npe
Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/fbd21329
Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/fbd21329
Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/fbd21329
Branch: refs/heads/master
Commit: fbd21329d32f185d198344f2d394175c92a82f9e
Parents: 13c9f89
Author: Edward Ribeiro <ed...@gmail.com>
Authored: Thu Apr 5 21:04:07 2018 -0700
Committer: Michael Han <ha...@apache.org>
Committed: Thu Apr 5 21:04:07 2018 -0700
----------------------------------------------------------------------
.../main/org/apache/zookeeper/server/ZKDatabase.java | 6 +++++-
.../zookeeper/test/ZkDatabaseCorruptionTest.java | 13 +++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/fbd21329/src/java/main/org/apache/zookeeper/server/ZKDatabase.java
----------------------------------------------------------------------
diff --git a/src/java/main/org/apache/zookeeper/server/ZKDatabase.java b/src/java/main/org/apache/zookeeper/server/ZKDatabase.java
index a03c955..7b00715 100644
--- a/src/java/main/org/apache/zookeeper/server/ZKDatabase.java
+++ b/src/java/main/org/apache/zookeeper/server/ZKDatabase.java
@@ -18,6 +18,7 @@
package org.apache.zookeeper.server;
+import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
@@ -302,7 +303,10 @@ public class ZKDatabase {
public long calculateTxnLogSizeLimit() {
long snapSize = 0;
try {
- snapSize = snapLog.findMostRecentSnapshot().length();
+ File snapFile = snapLog.findMostRecentSnapshot();
+ if (snapFile != null) {
+ snapSize = snapFile.length();
+ }
} catch (IOException e) {
LOG.error("Unable to get size of most recent snapshot");
}
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/fbd21329/src/java/test/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java
----------------------------------------------------------------------
diff --git a/src/java/test/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java b/src/java/test/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java
index 3ababcd..c757fc3 100644
--- a/src/java/test/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java
+++ b/src/java/test/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java
@@ -29,6 +29,7 @@ import org.apache.zookeeper.ZKTestCase;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.server.SyncRequestProcessor;
+import org.apache.zookeeper.server.ZKDatabase;
import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
import org.apache.zookeeper.server.quorum.QuorumPeer;
import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState;
@@ -39,6 +40,8 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static org.junit.Assert.assertEquals;
+
public class ZkDatabaseCorruptionTest extends ZKTestCase {
protected static final Logger LOG = LoggerFactory.getLogger(ZkDatabaseCorruptionTest.class);
public static final long CONNECTION_TIMEOUT = ClientTest.CONNECTION_TIMEOUT;
@@ -153,5 +156,15 @@ public class ZkDatabaseCorruptionTest extends ZKTestCase {
if (leaderSid != 5)QuorumBase.shutdown(qb.s5);
}
+ @Test
+ public void testAbsentRecentSnapshot() throws IOException {
+ ZKDatabase zkDatabase = new ZKDatabase(new FileTxnSnapLog(new File("foo"), new File("bar")){
+ @Override
+ public File findMostRecentSnapshot() throws IOException {
+ return null;
+ }
+ });
+ assertEquals(0, zkDatabase.calculateTxnLogSizeLimit());
+ }
}