Author: rawson Date: Wed Apr 21 00:01:26 2010 New Revision: 936118 URL: http://svn.apache.org/viewvc?rev=936118&view=rev Log: HBASE-2474 Bug in 2248 - mixed version reads (not allowed by spec)
Modified: hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/HBaseTestCase.java hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestHRegion.java hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestMemStore.java Modified: hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt?rev=936118&r1=936117&r2=936118&view=diff ============================================================================== --- hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt (original) +++ hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt Wed Apr 21 00:01:26 2010 @@ -88,6 +88,7 @@ Release 0.20.4 - Thu Apr 15 16:29:44 PDT HBASE-2440 Master UI should check against known bad JDK versions and warn the use (Todd Lipcon via Stack) HBASE-1892 [performance] make hbase splits run faster + HBASE-2474 Bug in 2248 - mixed version reads (not allowed by spec) NEW FEATURES HBASE-2257 [stargate] multiuser mode Modified: hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=936118&r1=936117&r2=936118&view=diff ============================================================================== --- hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original) +++ hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java Wed Apr 21 00:01:26 2010 @@ -1171,7 +1171,7 @@ public class HRegion implements HConstan throws IOException { return getScanner(scan, null); } - + protected InternalScanner getScanner(Scan scan, List<KeyValueScanner> additionalScanners) throws IOException { newScannerLock.readLock().lock(); try { @@ -1809,16 +1809,17 @@ public class HRegion implements HConstan * It is used to combine scanners from multiple Stores (aka column families). */ class RegionScanner implements InternalScanner { - private final KeyValueHeap storeHeap; + private KeyValueHeap storeHeap = null; private final byte [] stopRow; private Filter filter; private RowFilterInterface oldFilter; private List<KeyValue> results = new ArrayList<KeyValue>(); - private int isScan; + private Scan theScan = null; + private int isScan; + private List<KeyValueScanner> extraScanners = null; RegionScanner(Scan scan, List<KeyValueScanner> additionalScanners) { - ReadWriteConsistencyControl.resetThreadReadPoint(rwcc); -// DebugPrint.println("HRegionScanner.<init>, threadpoint = " + ReadWriteConsistencyControl.getThreadReadPoint()); + //DebugPrint.println("HRegionScanner.<init>"); this.filter = scan.getFilter(); this.oldFilter = scan.getOldFilter(); @@ -1828,23 +1829,29 @@ public class HRegion implements HConstan this.stopRow = scan.getStopRow(); } this.isScan = scan.isGetScan() ? -1 : 0; - + this.theScan = scan; + this.extraScanners = additionalScanners; + } + + RegionScanner(Scan scan) { + this(scan, null); + } + + void initHeap() { List<KeyValueScanner> scanners = new ArrayList<KeyValueScanner>(); - if (additionalScanners != null) { - scanners.addAll(additionalScanners); + if (extraScanners != null) { + scanners.addAll(extraScanners); } + for (Map.Entry<byte[], NavigableSet<byte[]>> entry : - scan.getFamilyMap().entrySet()) { + theScan.getFamilyMap().entrySet()) { Store store = stores.get(entry.getKey()); - scanners.add(store.getScanner(scan, entry.getValue())); + scanners.add(store.getScanner(theScan, entry.getValue())); } - this.storeHeap = + this.storeHeap = new KeyValueHeap(scanners.toArray(new KeyValueScanner[0]), comparator); } - - RegionScanner(Scan scan) { - this(scan, null); - } + /** * Reset both the filter and the old filter. @@ -1870,6 +1877,11 @@ public class HRegion implements HConstan // This could be a new thread from the last time we called next(). ReadWriteConsistencyControl.resetThreadReadPoint(rwcc); + // lazy init the store heap. + if (storeHeap == null) { + initHeap(); + } + results.clear(); boolean returnResult = nextInternal(); if (!returnResult && filterRow()) { Modified: hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/HBaseTestCase.java URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/HBaseTestCase.java?rev=936118&r1=936117&r2=936118&view=diff ============================================================================== --- hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/HBaseTestCase.java (original) +++ hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/HBaseTestCase.java Wed Apr 21 00:01:26 2010 @@ -666,4 +666,14 @@ public abstract class HBaseTestCase exte Bytes.toString(actual) + ">"); } } + + public static void assertEquals(byte[] expected, + byte[] actual) { + if (Bytes.compareTo(expected, actual) != 0) { + throw new AssertionFailedError("expected:<" + + Bytes.toStringBinary(expected) + "> but was:<" + + Bytes.toStringBinary(actual) + ">"); + } + } + } Modified: hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestHRegion.java URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestHRegion.java?rev=936118&r1=936117&r2=936118&view=diff ============================================================================== --- hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestHRegion.java (original) +++ hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestHRegion.java Wed Apr 21 00:01:26 2010 @@ -992,6 +992,7 @@ public class TestHRegion extends HBaseTe String method = this.getName(); initHRegion(tableName, method, families); + //Putting data in Region Put put = new Put(row1); put.add(fam1, null, null); @@ -1001,18 +1002,20 @@ public class TestHRegion extends HBaseTe region.put(put); Scan scan = null; - InternalScanner is = null; + HRegion.RegionScanner is = null; //Testing to see how many scanners that is produced by getScanner, starting //with known number, 2 - current = 1 scan = new Scan(); scan.addFamily(fam2); scan.addFamily(fam4); - is = region.getScanner(scan); + is = (RegionScanner) region.getScanner(scan); + is.initHeap(); // i dont like this test assertEquals(1, ((RegionScanner)is).getStoreHeap().getHeap().size()); scan = new Scan(); - is = region.getScanner(scan); + is = (RegionScanner) region.getScanner(scan); + is.initHeap(); assertEquals(families.length -1, ((RegionScanner)is).getStoreHeap().getHeap().size()); } @@ -2147,6 +2150,15 @@ public class TestHRegion extends HBaseTe result.getCellValue(families[0], qualifiers[0]).getTimestamp(); Assert.assertTrue(timestamp >= prevTimestamp); prevTimestamp = timestamp; + + byte [] gotValue = null; + for (KeyValue kv : result.raw()) { + byte [] thisValue = kv.getValue(); + if (gotValue != null) { + assertEquals(gotValue, thisValue); + } + gotValue = thisValue; + } } } Modified: hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestMemStore.java URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestMemStore.java?rev=936118&r1=936117&r2=936118&view=diff ============================================================================== --- hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestMemStore.java (original) +++ hadoop/hbase/branches/0.20_pre_durability/src/test/org/apache/hadoop/hbase/regionserver/TestMemStore.java Wed Apr 21 00:01:26 2010 @@ -297,6 +297,7 @@ public class TestMemStore extends TestCa rwcc.completeMemstoreInsert(w); // Assert that we can read back + ReadWriteConsistencyControl.resetThreadReadPoint(rwcc); KeyValueScanner s = this.memstore.getScanners()[0]; s.seek(kv); @@ -309,7 +310,7 @@ public class TestMemStore extends TestCa } } - public void no_testReadOwnWritesUnderConcurrency() throws Throwable { + public void testReadOwnWritesUnderConcurrency() throws Throwable { int NUM_THREADS = 8;