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());
+    }
 
 }