PHOENIX-4839 IndexHalfStoreFileReaderGenerator throws NullPointerException (Aman Poonia)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/d101141f Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/d101141f Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/d101141f Branch: refs/heads/4.14-HBase-1.4 Commit: d101141fa7fd2a4908f88d0034ecd475c4f6747c Parents: 7dc6e89 Author: Lars Hofhansl <la...@apache.org> Authored: Fri Sep 14 12:35:57 2018 -0700 Committer: Vincent Poon <vincentp...@apache.org> Committed: Thu Sep 27 14:01:57 2018 -0700 ---------------------------------------------------------------------- .../regionserver/IndexHalfStoreFileReader.java | 42 ++++++++++++++++---- .../IndexHalfStoreFileReaderGenerator.java | 20 +++++----- 2 files changed, 44 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/d101141f/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java index 1f3113c..e2dff03 100644 --- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java +++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReader.java @@ -17,6 +17,8 @@ */ package org.apache.hadoop.hbase.regionserver; +import static org.apache.phoenix.coprocessor.BaseScannerRegionObserver.SCAN_START_ROW_SUFFIX; + import java.io.IOException; import java.util.Map; @@ -26,10 +28,12 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.io.Reference; import org.apache.hadoop.hbase.io.hfile.CacheConfig; +import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.index.IndexMaintainer; /** @@ -56,8 +60,9 @@ public class IndexHalfStoreFileReader extends StoreFile.Reader { private final Map<ImmutableBytesWritable, IndexMaintainer> indexMaintainers; private final byte[][] viewConstants; private final int offset; - private final HRegionInfo regionInfo; + private final HRegionInfo childRegionInfo; private final byte[] regionStartKeyInHFile; + private final HRegionInfo currentRegion; /** * @param fs @@ -69,7 +74,7 @@ public class IndexHalfStoreFileReader extends StoreFile.Reader { * @param conf * @param indexMaintainers * @param viewConstants - * @param regionInfo + * @param childRegionInfo * @param regionStartKeyInHFile * @param splitKey * @throws IOException @@ -78,8 +83,9 @@ public class IndexHalfStoreFileReader extends StoreFile.Reader { final FSDataInputStreamWrapper in, long size, final Reference r, final Configuration conf, final Map<ImmutableBytesWritable, IndexMaintainer> indexMaintainers, - final byte[][] viewConstants, final HRegionInfo regionInfo, - byte[] regionStartKeyInHFile, byte[] splitKey) throws IOException { + final byte[][] viewConstants, final HRegionInfo childRegionInfo, + byte[] regionStartKeyInHFile, byte[] splitKey, HRegionInfo currentRegion) + throws IOException { super(fs, p, in, size, cacheConf, conf); this.splitkey = splitKey == null ? r.getSplitKey() : splitKey; // Is it top or bottom half? @@ -87,9 +93,10 @@ public class IndexHalfStoreFileReader extends StoreFile.Reader { this.splitRow = CellUtil.cloneRow(KeyValue.createKeyValueFromKey(splitkey)); this.indexMaintainers = indexMaintainers; this.viewConstants = viewConstants; - this.regionInfo = regionInfo; + this.childRegionInfo = childRegionInfo; this.regionStartKeyInHFile = regionStartKeyInHFile; this.offset = regionStartKeyInHFile.length; + this.currentRegion = currentRegion; } public int getOffset() { @@ -105,7 +112,7 @@ public class IndexHalfStoreFileReader extends StoreFile.Reader { } public HRegionInfo getRegionInfo() { - return regionInfo; + return childRegionInfo; } public byte[] getRegionStartKeyInHFile() { @@ -126,8 +133,29 @@ public class IndexHalfStoreFileReader extends StoreFile.Reader { @Override public StoreFileScanner getStoreFileScanner(boolean cacheBlocks, boolean pread, boolean isCompaction, long readPt, - long scannerOrder, boolean canOptimizeForNonNullColumn) { + long scannerOrder, boolean canOptimizeForNonNullColumn) { return new LocalIndexStoreFileScanner(this, getScanner(cacheBlocks, pread, isCompaction), true, getHFileReader().hasMVCCInfo(), readPt, scannerOrder, canOptimizeForNonNullColumn); } + + @Override + public boolean passesKeyRangeFilter(Scan scan) { + if (scan.getAttribute(SCAN_START_ROW_SUFFIX) == null) { + // Scan from compaction. + return true; + } + byte[] startKey = currentRegion.getStartKey(); + byte[] endKey = currentRegion.getEndKey(); + // If the region start key is not the prefix of the scan start row then we can return empty + // scanners. This is possible during merge where one of the child region scan should not return any + // results as we go through merged region. + int prefixLength = + scan.getStartRow().length - scan.getAttribute(SCAN_START_ROW_SUFFIX).length; + if (Bytes.compareTo(scan.getStartRow(), 0, prefixLength, + (startKey.length == 0 ? new byte[endKey.length] : startKey), 0, + (startKey.length == 0 ? endKey.length : startKey.length)) != 0) { + return false; + } + return true; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/d101141f/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java index bf83147..d77a30f 100644 --- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java +++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/IndexHalfStoreFileReaderGenerator.java @@ -166,7 +166,7 @@ public class IndexHalfStoreFileReaderGenerator extends BaseRegionObserver { byte[][] viewConstants = getViewConstants(dataTable); return new IndexHalfStoreFileReader(fs, p, cacheConf, in, size, r, ctx .getEnvironment().getConfiguration(), indexMaintainers, viewConstants, - childRegion, regionStartKeyInHFile, splitKey); + childRegion, regionStartKeyInHFile, splitKey, region.getRegionInfo()); } catch (ClassNotFoundException e) { throw new IOException(e); } catch (SQLException e) { @@ -185,12 +185,14 @@ public class IndexHalfStoreFileReaderGenerator extends BaseRegionObserver { } @Override - public InternalScanner preCompactScannerOpen( - org.apache.hadoop.hbase.coprocessor.ObserverContext<RegionCoprocessorEnvironment> c, Store store, - java.util.List<? extends KeyValueScanner> scanners, ScanType scanType, long earliestPutTs, - InternalScanner s, CompactionRequest request) throws IOException { + public InternalScanner preCompact( + ObserverContext<RegionCoprocessorEnvironment> c, Store store, + InternalScanner s, ScanType scanType, + CompactionRequest request) throws IOException { - if (!IndexUtil.isLocalIndexStore(store)) { return s; } + if (!IndexUtil.isLocalIndexStore(store)) { + return s; + } if (!store.hasReferences()) { InternalScanner repairScanner = null; if (request.isMajor() && (!RepairUtil.isLocalIndexStoreFilesConsistent(c.getEnvironment(), store))) { @@ -203,7 +205,7 @@ public class IndexHalfStoreFileReaderGenerator extends BaseRegionObserver { } } if (repairScanner != null) { - if (s!=null) { + if (s != null) { s.close(); } return repairScanner; @@ -248,10 +250,6 @@ public class IndexHalfStoreFileReaderGenerator extends BaseRegionObserver { /** * @param env * @param store Local Index store - * @param scan - * @param scanType - * @param earliestPutTs - * @param request * @return StoreScanner for new Local Index data for a passed store and Null if repair is not possible * @throws IOException */