You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2013/03/01 17:37:57 UTC
svn commit: r1451643 - in /hbase/trunk:
hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
Author: ramkrishna
Date: Fri Mar 1 16:37:57 2013
New Revision: 1451643
URL: http://svn.apache.org/r1451643
Log:
HBASE-7928 Scanning .META. with startRow and/or stopRow is not giving proper results (Ram)
Modified:
hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java?rev=1451643&r1=1451642&r2=1451643&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java Fri Mar 1 16:37:57 2013
@@ -529,9 +529,30 @@ public class HTable implements HTableInt
if (scan.getCaching() <= 0) {
scan.setCaching(getScannerCaching());
}
+ if (Bytes.equals(this.getTableName(), HConstants.META_TABLE_NAME)) {
+ changeStartAndStopRowIfMeta(scan);
+ }
+
return new ClientScanner(getConfiguration(), scan, getTableName(),
this.connection);
}
+ private void changeStartAndStopRowIfMeta(final Scan scan) {
+ if (scan.getStartRow() != null && scan.getStartRow().length != 0
+ && !isValidMetaTableRow(scan.getStartRow())) {
+ scan.setStartRow(Bytes.add(scan.getStartRow(), HConstants.META_ROW_DELIMITER_BYTES,
+ Bytes.toBytes(HConstants.ZEROES)));
+ }
+ if (scan.getStopRow() != null && scan.getStopRow().length != 0
+ && !isValidMetaTableRow(scan.getStopRow())) {
+ scan.setStopRow(Bytes.add(scan.getStopRow(), HConstants.META_ROW_DELIMITER_BYTES,
+ Bytes.toBytes(HConstants.NINES)));
+ }
+ }
+
+ private boolean isValidMetaTableRow(byte[] metaRow) {
+ return (com.google.common.primitives.Bytes
+ .indexOf(metaRow, HConstants.META_ROW_DELIMITER_BYTES) != -1);
+ }
/**
* {@inheritDoc}
Modified: hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java?rev=1451643&r1=1451642&r2=1451643&view=diff
==============================================================================
--- hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java (original)
+++ hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java Fri Mar 1 16:37:57 2013
@@ -358,6 +358,8 @@ public final class HConstants {
/** delimiter used between portions of a region name */
public static final int META_ROW_DELIMITER = ',';
+
+ public static final byte[] META_ROW_DELIMITER_BYTES = Bytes.toBytes(",,");
/** The catalog family as a string*/
public static final String CATALOG_FAMILY_STR = "info";
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java?rev=1451643&r1=1451642&r2=1451643&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java Fri Mar 1 16:37:57 2013
@@ -536,6 +536,38 @@ public class TestAdmin {
assertTrue(regionList.size() == min || regionList.size() == max);
}
}
+
+ @Test
+ public void testHBASE7928() throws Exception {
+ final byte[] tableName = Bytes.toBytes("a");
+ final byte[] tableName1 = Bytes.toBytes("b");
+ final byte[] tableName2 = Bytes.toBytes("c");
+ try {
+
+ TEST_UTIL.createTable(tableName, HConstants.CATALOG_FAMILY).close();
+
+ TEST_UTIL.createTable(tableName1, HConstants.CATALOG_FAMILY).close();
+
+ TEST_UTIL.createTable(tableName2, HConstants.CATALOG_FAMILY).close();
+ while (!admin.isTableAvailable(tableName2)) {
+ Thread.sleep(1);
+ }
+ Scan s = new Scan();
+ s.setStartRow(Bytes.toBytes("a1"));
+ s.setStopRow(Bytes.toBytes("b1"));
+ HTable table = new HTable(admin.getConfiguration(), HConstants.META_TABLE_NAME);
+ ResultScanner scanner = table.getScanner(s);
+ Result[] result = scanner.next(5);
+ assertEquals("Only one row should be selected", 1, result.length);
+ } finally {
+ admin.disableTable(tableName);
+ admin.deleteTable(tableName);
+ admin.disableTable(tableName1);
+ admin.deleteTable(tableName1);
+ admin.disableTable(tableName2);
+ admin.deleteTable(tableName2);
+ }
+ }
@Test
public void testCreateTableWithRegions() throws IOException, InterruptedException {