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