You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/11 19:45:43 UTC
svn commit: r1181985 -
/hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksRead.java
Author: nspiegelberg
Date: Tue Oct 11 17:45:43 2011
New Revision: 1181985
URL: http://svn.apache.org/viewvc?rev=1181985&view=rev
Log:
Add more cases to TestBlocksRead targetting the cases that lazy seek optimizations should help
Summary:
Add more cases to TestBlocksRead targetting the cases that lazy seek
optimizations should help.
-- Currently, lazy Seek optimization helps the multiple column get.
-- For single column get, more optimizations are yet to follow. At that point,
we'll have to adjust the test.
Test Plan: run test
Reviewers: mbautin, liyintang
Reviewed By: liyintang
CC: liyintang
Differential Revision: 329612
Modified:
hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksRead.java
Modified: hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksRead.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksRead.java?rev=1181985&r1=1181984&r2=1181985&view=diff
==============================================================================
--- hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksRead.java (original)
+++ hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksRead.java Tue Oct 11 17:45:43 2011
@@ -112,7 +112,7 @@ public class TestBlocksRead extends HBas
KeyValue[] kvs = region.get(get, null).raw();
long blocksEnd = getBlkAccessCount(cf);
if (expBlocks != -1) {
- assertEquals("Blocks Read Check", expBlocks, blocksEnd - blocksStart);
+ assertEquals("Blocks Read Check", expBlocks, blocksEnd - blocksStart);
}
System.out.println("Blocks Read = " + (blocksEnd - blocksStart) +
"Expected = " + expBlocks);
@@ -155,14 +155,12 @@ public class TestBlocksRead extends HBas
}
/**
- *
- * Test from client side for get with maxResultPerCF set
- *
+ * Test # of blocks read for some simple seek cases.
* @throws Exception
*/
@Test
public void testBlocksRead() throws Exception {
- byte [] TABLE = Bytes.toBytes("testLazySeek");
+ byte [] TABLE = Bytes.toBytes("testBlocksRead");
byte [] FAMILY = Bytes.toBytes("cf1");
byte [][] FAMILIES = new byte[][] { FAMILY };
KeyValue kvs[];
@@ -220,4 +218,138 @@ public class TestBlocksRead extends HBas
assertEquals(1, kvs.length);
verifyData(kvs[0], "row", "col5", 5);
}
+
+ /**
+ * Test # of blocks read (targetted at some of the cases Lazy Seek optimizes).
+ * @throws Exception
+ */
+ @Test
+ public void testLazySeekBlocksRead() throws Exception {
+ byte [] TABLE = Bytes.toBytes("testLazySeekBlocksRead");
+ byte [] FAMILY = Bytes.toBytes("cf1");
+ byte [][] FAMILIES = new byte[][] { FAMILY };
+ KeyValue kvs[];
+
+ HBaseConfiguration conf = getConf();
+ initHRegion(TABLE, getName(), conf, FAMILIES);
+
+ // File 1
+ putData(FAMILY, "row", "col1", 1);
+ putData(FAMILY, "row", "col2", 2);
+ region.flushcache();
+
+ // File 2
+ putData(FAMILY, "row", "col1", 3);
+ putData(FAMILY, "row", "col2", 4);
+ region.flushcache();
+
+ // Expected blocks read: 2.
+ //
+ // We still visit all files for top of the row delete
+ // marker. File 2's top block is also the KV we are
+ // interested. When lazy seek is further optimized
+ // the number of read blocks should drop to 1.
+ //
+ kvs = getData(FAMILY, "row", Arrays.asList("col1"), 2);
+ assertEquals(1, kvs.length);
+ verifyData(kvs[0], "row", "col1", 3);
+
+ // Expected blocks read: 3
+ //
+ // We still visit all files for top of the row delete
+ // marker. File 2's top block has the "col1" KV we are
+ // interested. We also need "col2" which is in a block
+ // of its own. So, we need that block as well.
+ //
+ // When lazy seek is further optimized the number of blocks
+ // read for this case should drop to 2.
+ //
+ kvs = getData(FAMILY, "row", Arrays.asList("col1", "col2"), 3);
+ assertEquals(2, kvs.length);
+ verifyData(kvs[0], "row", "col1", 3);
+ verifyData(kvs[1], "row", "col2", 4);
+
+ // File 3: Add another column
+ putData(FAMILY, "row", "col3", 5);
+ region.flushcache();
+
+ // Expected blocks read: 3
+ //
+ // We still visit all files for top of the row delete
+ // marker. File 3's top block has the "col3" KV we are
+ // interested.
+ //
+ // When lazy seek is further optimized the number of
+ // read blocks should drop to 1.
+ //
+ kvs = getData(FAMILY, "row", "col3", 3);
+ assertEquals(1, kvs.length);
+ verifyData(kvs[0], "row", "col3", 5);
+
+ // Get a column from older file.
+ // Expected blocks read: 3
+ //
+ // We still visit all files for top of the row delete
+ // marker. File 2's top block has the "col1" KV we are
+ // interested.
+ //
+ // When lazy seek is further optimized the number of
+ // read blocks should drop to 2. [We only need to
+ // consult File 2 & File 3.]
+ //
+ kvs = getData(FAMILY, "row", Arrays.asList("col1"), 3);
+ assertEquals(1, kvs.length);
+ verifyData(kvs[0], "row", "col1", 3);
+
+ // File 4: Delete the entire row.
+ deleteFamily(FAMILY, "row", 6);
+ region.flushcache();
+
+ // Expected blocks read: 6. Why? [TODO]
+ // With lazy seek, would have expected this to be lower.
+ // At least is shouldn't be worse than before.
+ kvs = getData(FAMILY, "row", "col1", 6);
+ assertEquals(0, kvs.length);
+ kvs = getData(FAMILY, "row", "col2", 6);
+ assertEquals(0, kvs.length);
+ kvs = getData(FAMILY, "row", "col3", 6);
+ assertEquals(0, kvs.length);
+ kvs = getData(FAMILY, "row", Arrays.asList("col1", "col2", "col3"), 6);
+ assertEquals(0, kvs.length);
+
+ // File 5: Delete with post data timestamp and insert some older
+ // date in new files.
+ deleteFamily(FAMILY, "row", 10);
+ region.flushcache();
+ putData(FAMILY, "row", "col1", 7);
+ putData(FAMILY, "row", "col2", 8);
+ putData(FAMILY, "row", "col3", 9);
+ region.flushcache();
+
+ // Expected blocks read: 10. Why? [TODO]
+ // With lazy seek, would have expected this to be lower.
+ // At least is shouldn't be worse than before.
+ //
+ kvs = getData(FAMILY, "row", Arrays.asList("col1", "col2", "col3"), 10);
+ assertEquals(0, kvs.length);
+
+ // File 6: Put back new data
+ putData(FAMILY, "row", "col1", 11);
+ putData(FAMILY, "row", "col2", 12);
+ putData(FAMILY, "row", "col3", 13);
+ region.flushcache();
+
+ // Expected blocks read: 9. Why? [TOD0]
+ //
+ // [Would have expected this to be 8.
+ // Six to go to the top of each file for delete marker. On file 6, the
+ // top block would serve "col1". And we should need two more to
+ // serve col2 and col3 from file 6.
+ //
+ kvs = getData(FAMILY, "row", Arrays.asList("col1", "col2", "col3"), 9);
+ assertEquals(3, kvs.length);
+ verifyData(kvs[0], "row", "col1", 11);
+ verifyData(kvs[1], "row", "col2", 12);
+ verifyData(kvs[2], "row", "col3", 13);
+ }
}