diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index d0e5f93..dec3fb8 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -2675,6 +2675,11 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi } @Override + public RegionScanner getScanner(Scan scan, boolean skipCheckFamily) throws IOException { + return getScanner(scan, null, HConstants.NO_NONCE, HConstants.NO_NONCE, skipCheckFamily); + } + + @Override public RegionScanner getScanner(Scan scan, List additionalScanners) throws IOException { return getScanner(scan, additionalScanners, HConstants.NO_NONCE, HConstants.NO_NONCE); @@ -2682,6 +2687,11 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi private RegionScanner getScanner(Scan scan, List additionalScanners, long nonceGroup, long nonce) throws IOException { + return getScanner(scan, additionalScanners, nonceGroup, nonce, false); + } + + private RegionScanner getScanner(Scan scan, List additionalScanners, + long nonceGroup, long nonce, boolean skipCheckFamily) throws IOException { startRegionOperation(Operation.SCAN); try { // Verify families are all valid @@ -2691,8 +2701,10 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi scan.addFamily(family); } } else { - for (byte[] family : scan.getFamilyMap().keySet()) { - checkFamily(family); + if (!skipCheckFamily) { + for (byte[] family : scan.getFamilyMap().keySet()) { + checkFamily(family); + } } } return instantiateRegionScanner(scan, additionalScanners, nonceGroup, nonce); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 07e16c8..0b642c1 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -2345,7 +2345,8 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } RegionScanner scanner = null; try { - scanner = region.getScanner(scan); + // skip checkFamily() in region.getScanner() + scanner = region.getScanner(scan, true); scanner.next(results); } finally { if (scanner != null) { @@ -2732,8 +2733,9 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } isSmallScan = scan.isSmall(); - if (!scan.hasFamilies()) { - // Adding all families to scanner + boolean hasFamilyInScan = scan.hasFamilies(); + if (!hasFamilyInScan) { + // if no family is configured in scan, adding all families for (byte[] family: region.getTableDesc().getFamiliesKeys()) { scan.addFamily(family); } @@ -2743,7 +2745,9 @@ public class RSRpcServices implements HBaseRPCErrorHandler, scanner = region.getCoprocessorHost().preScannerOpen(scan); } if (scanner == null) { - scanner = region.getScanner(scan); + // If there is no family configured in scan, families are copied from + // table descriptor, checkFamily() can be skipped in getScanner(). + scanner = region.getScanner(scan, !hasFamilyInScan); } if (region.getCoprocessorHost() != null) { scanner = region.getCoprocessorHost().postScannerOpen(scan, scanner); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java index 295b825..cb29091 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java @@ -430,6 +430,19 @@ public interface Region extends ConfigurationObserver { RegionScanner getScanner(Scan scan) throws IOException; /** + * Return an iterator that scans over the HRegion, returning the indicated + * columns and rows specified by the {@link Scan}. + *

+ * This Iterator must be closed by the caller. + * + * @param scan configured {@link Scan} + * @param skipCheckFamily flag to indicate if checkFamily() needs to be skipped + * @return RegionScanner + * @throws IOException read exceptions + */ + RegionScanner getScanner(Scan scan, boolean skipCheckFamily) throws IOException; + + /** * Return an iterator that scans over the HRegion, returning the indicated columns and rows * specified by the {@link Scan}. The scanner will also include the additional scanners passed * along with the scanners for the specified Scan instance. Should be careful with the usage to