hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From st...@apache.org
Subject hbase git commit: guard against NPE while reading FileTrailer and HFileBlock
Date Mon, 13 Mar 2017 21:54:51 GMT
Repository: hbase
Updated Branches:
  refs/heads/branch-1.2 c368c8587 -> f61f02b2b


guard against NPE while reading FileTrailer and HFileBlock

guard against NPE from FSInputStream#seek

Signed-off-by: Michael Stack <stack@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f61f02b2
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f61f02b2
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f61f02b2

Branch: refs/heads/branch-1.2
Commit: f61f02b2b24af39545cc2754cfbc25122da60651
Parents: c368c85
Author: James Moore <jcmoore@hubspot.com>
Authored: Fri Feb 24 10:26:12 2017 -0500
Committer: Michael Stack <stack@apache.org>
Committed: Mon Mar 13 14:54:44 2017 -0700

----------------------------------------------------------------------
 .../hadoop/hbase/io/hfile/FixedFileTrailer.java |  3 +-
 .../hadoop/hbase/io/hfile/HFileBlock.java       |  2 +-
 .../apache/hadoop/hbase/io/hfile/HFileUtil.java | 43 ++++++++++++++++++++
 3 files changed, 46 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/f61f02b2/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java
index f6ae291..ade67b5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java
@@ -385,7 +385,8 @@ public class FixedFileTrailer {
       bufferSize = (int) fileSize;
     }
 
-    istream.seek(seekPoint);
+    HFileUtil.seekOnMultipleSources(istream, seekPoint);
+
     ByteBuffer buf = ByteBuffer.allocate(bufferSize);
     istream.readFully(buf.array(), buf.arrayOffset(),
         buf.arrayOffset() + buf.limit());

http://git-wip-us.apache.org/repos/asf/hbase/blob/f61f02b2/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java
index 0dc0f80..351c3c4 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java
@@ -1422,7 +1422,7 @@ public class HFileBlock implements Cacheable {
       if (!pread && streamLock.tryLock()) {
         // Seek + read. Better for scanning.
         try {
-          istream.seek(fileOffset);
+          HFileUtil.seekOnMultipleSources(istream, fileOffset);
 
           long realOffset = istream.getPos();
           if (realOffset != fileOffset) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/f61f02b2/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java
new file mode 100644
index 0000000..835450c
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.io.hfile;
+
+import java.io.IOException;
+
+import org.apache.hadoop.fs.FSDataInputStream;
+
+public class HFileUtil {
+
+  /** guards against NullPointer
+   * utility which tries to seek on the DFSIS and will try an alternative source
+   * if the FSDataInputStream throws an NPE HBASE-17501
+   * @param istream
+   * @param offset
+   * @throws IOException
+   */
+  static public void seekOnMultipleSources(FSDataInputStream istream, long offset) throws
IOException {
+    try {
+      // attempt to seek inside of current blockReader
+      istream.seek(offset);
+    } catch (NullPointerException e) {
+      // retry the seek on an alternate copy of the data
+      // this can occur if the blockReader on the DFSInputStream is null
+      istream.seekToNewSource(offset);
+    }
+  }
+}


Mime
View raw message