diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java index a6f8373..9fa35c2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -45,6 +46,7 @@ import org.apache.hadoop.hbase.filter.FirstKeyValueMatchingQualifiersFilter; import org.apache.hadoop.hbase.filter.RandomRowFilter; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Pair; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -65,7 +67,7 @@ public class TestPartialResultsFromClientSide { private static final Log LOG = LogFactory.getLog(TestPartialResultsFromClientSide.class); private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); - + private final static int MINICLUSTER_SIZE = 3; private static Table TABLE = null; /** @@ -99,7 +101,7 @@ public class TestPartialResultsFromClientSide { @BeforeClass public static void setUpBeforeClass() throws Exception { - TEST_UTIL.startMiniCluster(3); + TEST_UTIL.startMiniCluster(MINICLUSTER_SIZE); TABLE = createTestTable(TABLE_NAME, ROWS, FAMILIES, QUALIFIERS, VALUE); } @@ -829,4 +831,116 @@ public class TestPartialResultsFromClientSide { testEquivalenceOfScanResults(TABLE, partialScan, oneshotScan); } } + + @Test + public void testPartialResultWhenRegionMove() throws IOException { + TableName testName = TableName.valueOf("testPartialResultWhenRegionMove"); + int numRows = 5; + int numFamilies = 5; + int numQualifiers = 5; + byte[][] rows = HTestConst.makeNAscii(Bytes.toBytes("testRow"), numRows); + byte[][] families = HTestConst.makeNAscii(Bytes.toBytes("testFamily"), numFamilies); + byte[][] qualifiers = HTestConst.makeNAscii(Bytes.toBytes("testQualifier"), numQualifiers); + byte[] value = Bytes.createMaxByteArray(100); + + Table tmpTable = createTestTable(testName, rows, families, qualifiers, value); + Scan scan = new Scan(); + scan.setMaxResultSize(1); + scan.setAllowPartialResults(true); + ResultScanner scanner = tmpTable.getScanner(scan); + for (int i = 0; i < numFamilies * numQualifiers; i++) { + scanner.next(); + } + Result result1 = scanner.next(); + assertEquals(1, result1.rawCells().length); + Cell c1 = result1.rawCells()[0]; + assertArrayEquals(rows[1], + Bytes.copy(c1.getRowArray(), c1.getRowOffset(), c1.getRowLength())); + assertArrayEquals(families[0], Bytes + .copy(c1.getFamilyArray(), c1.getFamilyOffset(), c1.getFamilyLength())); + assertArrayEquals(qualifiers[0], Bytes + .copy(c1.getQualifierArray(), c1.getQualifierOffset(), + c1.getQualifierLength())); + List> regions = MetaTableAccessor + .getTableRegionsAndLocations(TEST_UTIL.getConnection(), + tmpTable.getName()); + assertEquals(1, regions.size()); + HRegionInfo regionInfo = regions.get(0).getFirst(); + ServerName oldServerName = regions.get(0).getSecond(); + ServerName newServerName = oldServerName; + for (int i = 0; i < MINICLUSTER_SIZE; i++) { + ServerName name = + TEST_UTIL.getHBaseCluster().getRegionServer(i).getServerName(); + if (!name.equals(oldServerName)) { + newServerName = name; + } + } + TEST_UTIL.getAdmin().move(regionInfo.getEncodedNameAsBytes(), + Bytes.toBytes(newServerName.getServerName())); + Result result2 = scanner.next(); + assertEquals(1, result2.rawCells().length); + Cell c2 = result2.rawCells()[0]; + assertArrayEquals(rows[1], + Bytes.copy(c2.getRowArray(), c2.getRowOffset(), c2.getRowLength())); + assertArrayEquals(families[0], Bytes + .copy(c2.getFamilyArray(), c2.getFamilyOffset(), c2.getFamilyLength())); + assertArrayEquals(qualifiers[1], Bytes + .copy(c2.getQualifierArray(), c2.getQualifierOffset(), + c2.getQualifierLength())); + } + + @Test + public void testCompleteResultWhenRegionMove() throws IOException { + TableName testName = TableName.valueOf("testCompleteResultWhenRegionMove"); + int numRows = 5; + int numFamilies = 5; + int numQualifiers = 5; + byte[][] rows = HTestConst.makeNAscii(Bytes.toBytes("testRow"), numRows); + byte[][] families = HTestConst.makeNAscii(Bytes.toBytes("testFamily"), numFamilies); + byte[][] qualifiers = HTestConst.makeNAscii(Bytes.toBytes("testQualifier"), numQualifiers); + byte[] value = Bytes.createMaxByteArray(100); + + Table tmpTable = createTestTable(testName, rows, families, qualifiers, value); + Scan scan = new Scan(); + scan.setMaxResultSize(1); + scan.setCaching(1); + ResultScanner scanner = tmpTable.getScanner(scan); + scanner.next(); + Result result1 = scanner.next(); + assertEquals(numFamilies * numQualifiers, result1.rawCells().length); + Cell c1 = result1.rawCells()[0]; + assertArrayEquals(rows[1], + Bytes.copy(c1.getRowArray(), c1.getRowOffset(), c1.getRowLength())); + assertArrayEquals(families[0], Bytes + .copy(c1.getFamilyArray(), c1.getFamilyOffset(), c1.getFamilyLength())); + assertArrayEquals(qualifiers[0], Bytes + .copy(c1.getQualifierArray(), c1.getQualifierOffset(), + c1.getQualifierLength())); + List> regions = MetaTableAccessor + .getTableRegionsAndLocations(TEST_UTIL.getConnection(), + tmpTable.getName()); + assertEquals(1, regions.size()); + HRegionInfo regionInfo = regions.get(0).getFirst(); + ServerName oldServerName = regions.get(0).getSecond(); + ServerName newServerName = oldServerName; + for (int i = 0; i < MINICLUSTER_SIZE; i++) { + ServerName name = + TEST_UTIL.getHBaseCluster().getRegionServer(i).getServerName(); + if (!name.equals(oldServerName)) { + newServerName = name; + } + } + TEST_UTIL.getAdmin().move(regionInfo.getEncodedNameAsBytes(), + Bytes.toBytes(newServerName.getServerName())); + Result result2 = scanner.next(); + assertEquals(numFamilies * numQualifiers, result2.rawCells().length); + Cell c2 = result2.rawCells()[0]; + assertArrayEquals(rows[2], + Bytes.copy(c2.getRowArray(), c2.getRowOffset(), c2.getRowLength())); + assertArrayEquals(families[0], Bytes + .copy(c2.getFamilyArray(), c2.getFamilyOffset(), c2.getFamilyLength())); + assertArrayEquals(qualifiers[0], Bytes + .copy(c2.getQualifierArray(), c2.getQualifierOffset(), + c2.getQualifierLength())); + } } \ No newline at end of file