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);