diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableResultScanner.java hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableResultScanner.java index b6823f9..a54e51e 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableResultScanner.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableResultScanner.java @@ -19,9 +19,6 @@ package org.apache.hadoop.hbase.client; import static org.apache.hadoop.hbase.client.ConnectionUtils.calcEstimatedSize; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; - import java.io.IOException; import java.io.InterruptedIOException; import java.util.ArrayDeque; @@ -32,6 +29,9 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.client.metrics.ScanMetrics; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Throwables; + /** * The {@link ResultScanner} implementation for {@link AsyncTable}. It will fetch data automatically * in background and cache it in memory. Typically the {@link #maxCacheSize} will be diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanner.java hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanner.java index cefc882..c8d4277 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanner.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableScanner.java @@ -23,8 +23,10 @@ import java.util.concurrent.ForkJoinPool; import java.util.function.Supplier; import java.util.stream.Collectors; +import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.testclassification.ClientTests; import org.apache.hadoop.hbase.testclassification.LargeTests; +import org.apache.hadoop.hbase.util.Bytes; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -55,6 +57,20 @@ public class TestAsyncTableScanner extends AbstractTestAsyncTableScan { @Override protected List doScan(Scan scan) throws Exception { AsyncTable table = ASYNC_CONN.getTable(TABLE_NAME, ForkJoinPool.commonPool()); + + // make sure that the first region is cached by doing a get + byte[] row = Bytes.toBytes(String.format("%03d", 1)); + Get get = new Get(row); + table.get(get).get(); + + // then move the region + try(Connection conn = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration()); + Admin admin = conn.getAdmin(); + RegionLocator regionLocator = conn.getRegionLocator(TABLE_NAME)) { + HRegionLocation loc = regionLocator.getRegionLocation(row); + admin.move(loc.getRegionInfo().getRegionName(), null); + } + List results = new ArrayList<>(); try (ResultScanner scanner = table.getScanner(scan)) { for (Result result; (result = scanner.next()) != null;) {