You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by la...@apache.org on 2018/09/14 19:36:06 UTC

phoenix git commit: PHOENIX-4839 IndexHalfStoreFileReaderGenerator throws NullPointerException (Aman Poonia)

Repository: phoenix
Updated Branches:
  refs/heads/4.x-HBase-1.4 9d2cf0bb3 -> 61ce0eac6


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/61ce0eac
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/61ce0eac
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/61ce0eac

Branch: refs/heads/4.x-HBase-1.4
Commit: 61ce0eac668693a100a8cc56b145a805e9272024
Parents: 9d2cf0b
Author: Lars Hofhansl <la...@apache.org>
Authored: Fri Sep 14 12:35:57 2018 -0700
Committer: Lars Hofhansl <la...@apache.org>
Committed: Fri Sep 14 12:35: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/61ce0eac/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/61ce0eac/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 095e589..11f53eb 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
@@ -165,7 +165,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) {
@@ -184,12 +184,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))) {
@@ -202,7 +204,7 @@ public class IndexHalfStoreFileReaderGenerator extends BaseRegionObserver {
                 }
             }
             if (repairScanner != null) {
-                if (s!=null) {
+                if (s != null) {
                     s.close();
                 }
                 return repairScanner;
@@ -247,10 +249,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
      */