You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2017/03/16 21:55:19 UTC

[2/2] hbase git commit: HBASE-17501 Revert "Revert "guard against NPE while reading FileTrailer and HFileBlock""

HBASE-17501 Revert "Revert "guard against NPE while reading FileTrailer and HFileBlock""

This reverts commit 9a4068dcf8caec644e6703ffa365a8649bbd336e.

This is a revert of a revert -- i.e. a restore -- just so I can add the
JIRA issue to the commit message.


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

Branch: refs/heads/master
Commit: 6fb44f7eb8ded5496d2348af21a9d5ca0dd39ab4
Parents: 9a4068d
Author: Michael Stack <st...@apache.org>
Authored: Thu Mar 16 14:54:17 2017 -0700
Committer: Michael Stack <st...@apache.org>
Committed: Thu Mar 16 14:54:17 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/6fb44f7e/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 7eac9c6..1854236 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
@@ -388,7 +388,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/6fb44f7e/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 fba15ba..0b140b6 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
@@ -1512,7 +1512,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/6fb44f7e/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);
+    }
+  }
+}