diff --git a/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java b/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java index be93d58..6475e8d 100644 --- a/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java +++ b/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java @@ -265,17 +265,8 @@ public class ClientScanner extends AbstractClientScanner { callable.setCaching(this.caching); // This flag is set when we want to skip the result returned. We do // this when we reset scanner because it split under us. - boolean skipFirst = false; do { try { - if (skipFirst) { - // Skip only the first row (which was the last row of the last - // already-processed batch). - callable.setCaching(1); - values = callable.withRetries(); - callable.setCaching(this.caching); - skipFirst = false; - } // Server returns a null values if scanning is to stop. Else, // returns an empty array if scanning is to go on and we've just // exhausted current region. @@ -303,12 +294,6 @@ public class ClientScanner extends AbstractClientScanner { } // Else, its signal from depths of ScannerCallable that we got an // NSRE on a next and that we need to reset the scanner. - if (this.lastResult != null) { - this.scan.setStartRow(this.lastResult.getRow()); - // Skip first row returned. We already let it out on previous - // invocation. - skipFirst = true; - } // Clear region this.currentRegion = null; continue; diff --git a/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java b/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java index aceaeed..91be48a 100644 --- a/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java +++ b/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java @@ -5058,6 +5058,31 @@ public class TestFromClientSide { } + @Test + public void testScansWithSplits() throws Exception { + byte[] TABLE = Bytes.toBytes("testScansWithSplits"); + HTable t = + TEST_UTIL.createTable(TABLE, new byte[][] { FAMILY }, 1, Bytes.toBytes("aaa"), + Bytes.toBytes("zzza"), 10); + TEST_UTIL.loadTable(t, FAMILY); + // scan/split a few time, make sure we always get exactly the same number of results. + for (int i=0; i<20; i++) { + if (i>0) Thread.sleep(1000); + Scan s = new Scan(Bytes.toBytes("fff"), Bytes.toBytes("qqq")); + s.setCaching(10); + ResultScanner rs = t.getScanner(s); + int c = 0; + while(rs.next() != null) c++; + assertEquals(7733, c); + TEST_UTIL.getHBaseAdmin().split(TABLE); + // Cannot check the number of region without risking updating the client cache, + // which is what we want to test (see MetaScanner/HTable, etc). + // So just wait a bit and run in a few loops, during which we should detect any + // kind of strange behavior. + } + t.close(); + } + @org.junit.Rule public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu = new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();