hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ramkris...@apache.org
Subject svn commit: r1451644 - in /hbase/branches/0.95: hbase-client/src/main/java/org/apache/hadoop/hbase/client/ hbase-common/src/main/java/org/apache/hadoop/hbase/ hbase-server/src/test/java/org/apache/hadoop/hbase/client/
Date Fri, 01 Mar 2013 16:39:16 GMT
Author: ramkrishna
Date: Fri Mar  1 16:39:16 2013
New Revision: 1451644

URL: http://svn.apache.org/r1451644
Log:
HBASE-7928 Scanning .META. with startRow and/or stopRow is not giving proper results (Ram)


Modified:
    hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
    hbase/branches/0.95/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java

Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java?rev=1451644&r1=1451643&r2=1451644&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
(original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
Fri Mar  1 16:39:16 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/branches/0.95/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java?rev=1451644&r1=1451643&r2=1451644&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
(original)
+++ hbase/branches/0.95/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
Fri Mar  1 16:39:16 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/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java?rev=1451644&r1=1451643&r2=1451644&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
(original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
Fri Mar  1 16:39:16 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 {



Mime
View raw message