HBASE-7928 Scanning .META. with startRow and/or stopRow is not giving proper results (Ram)

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1451643 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
ramkrishna 2013-03-01 16:37:57 +00:00
parent 5dbc35782a
commit 0a0d9310c3
3 changed files with 55 additions and 0 deletions

View File

@ -529,9 +529,30 @@ public class HTable implements HTableInterface {
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}

View File

@ -359,6 +359,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";

View File

@ -537,6 +537,38 @@ public class TestAdmin {
}
}
@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 {