Author: kturner Date: Thu Jan 17 14:45:57 2013 New Revision: 1434696 URL: http://svn.apache.org/viewvc?rev=1434696&view=rev Log: ACCUMULO-962 fixed issue where rfile would read more data than it was supposed to. Added unit test that reproduced the bug.
Modified: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java accumulo/trunk/core/src/test/java/org/apache/accumulo/core/file/rfile/RFileTest.java Modified: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java?rev=1434696&r1=1434695&r2=1434696&view=diff ============================================================================== --- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java (original) +++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java Thu Jan 17 14:45:57 2013 @@ -642,6 +642,7 @@ public class RFile { private void _seek(Range range) throws IOException { this.range = range; + this.checkRange = true; if (blockCount == 0) { // its an empty file Modified: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/file/rfile/RFileTest.java URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/file/rfile/RFileTest.java?rev=1434696&r1=1434695&r2=1434696&view=diff ============================================================================== --- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/file/rfile/RFileTest.java (original) +++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/file/rfile/RFileTest.java Thu Jan 17 14:45:57 2013 @@ -28,6 +28,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Random; @@ -1442,6 +1443,63 @@ public class RFileTest { trf.closeReader(); } + @Test + public void testReseekUnconsumed() throws Exception { + TestRFile trf = new TestRFile(); + + trf.openWriter(); + + for (int i = 0; i < 2500; i++) { + trf.writer.append(nk(nf("r_", i), "cf1", "cq1", "L1", 42), nv("foo" + i)); + } + + trf.closeWriter(); + trf.openReader(); + + Set<ByteSequence> cfs = Collections.emptySet(); + + Random rand = new Random(); + + for (int count = 0; count < 100; count++) { + + int start = rand.nextInt(2300); + Range range = new Range(nk(nf("r_", start), "cf1", "cq1", "L1", 42), nk(nf("r_", start + 100), "cf1", "cq1", "L1", 42)); + + trf.reader.seek(range, cfs, false); + + int numToScan = rand.nextInt(100); + + for (int j = 0; j < numToScan; j++) { + assertTrue(trf.reader.hasTop()); + assertEquals(nk(nf("r_", start + j), "cf1", "cq1", "L1", 42), trf.reader.getTopKey()); + trf.reader.next(); + } + + assertTrue(trf.reader.hasTop()); + assertEquals(nk(nf("r_", start + numToScan), "cf1", "cq1", "L1", 42), trf.reader.getTopKey()); + + // seek a little forward from the last range and read a few keys within the unconsumed portion of the last range + + int start2 = start + numToScan + rand.nextInt(3); + int end2 = start2 + rand.nextInt(3); + + range = new Range(nk(nf("r_", start2), "cf1", "cq1", "L1", 42), nk(nf("r_", end2), "cf1", "cq1", "L1", 42)); + trf.reader.seek(range, cfs, false); + + for (int j = start2; j <= end2; j++) { + assertTrue(trf.reader.hasTop()); + assertEquals(nk(nf("r_", j), "cf1", "cq1", "L1", 42), trf.reader.getTopKey()); + trf.reader.next(); + } + + assertFalse(trf.reader.hasTop()); + + } + + trf.closeReader(); + } + + @Test(expected = NullPointerException.class) public void testMissingUnreleasedVersions() throws Exception { runVersionTest(5);