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 {