From 99d358bb0c74516d28a52f5d98204f8f40065bf7 Mon Sep 17 00:00:00 2001 From: James Moore Date: Fri, 24 Feb 2017 10:26:12 -0500 Subject: [PATCH] guard against NPE while reading FileTrailer and HFileBlock guard against NPE from FSInputStream#seek fix format --- .../hadoop/hbase/io/hfile/FixedFileTrailer.java | 3 ++- .../apache/hadoop/hbase/io/hfile/HFileBlock.java | 2 +- .../apache/hadoop/hbase/io/hfile/HFileUtil.java | 26 ++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java index f6ae291..ade67b5 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java +++ 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()); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java index 0dc0f80..351c3c4 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileBlock.java +++ 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) { diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java new file mode 100644 index 0000000..e1136ef --- /dev/null +++ hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileUtil.java @@ -0,0 +1,26 @@ +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); + } + } +} -- 2.7.4 (Apple Git-66)