diff --git a/src/main/java/org/tikv/common/operation/iterator/ConcreteScanIterator.java b/src/main/java/org/tikv/common/operation/iterator/ConcreteScanIterator.java index eb6a270f3e..72422736e7 100644 --- a/src/main/java/org/tikv/common/operation/iterator/ConcreteScanIterator.java +++ b/src/main/java/org/tikv/common/operation/iterator/ConcreteScanIterator.java @@ -77,6 +77,10 @@ public class ConcreteScanIterator extends ScanIterator { client.setTimeout(conf.getScanTimeout()); BackOffer backOffer = ConcreteBackOffer.newScannerNextMaxBackOff(); currentCache = client.scan(backOffer, startKey, version); + // If we get region before scan, we will use region from cache which + // may have wrong end key. This may miss some regions that split from old region. + // Client will get the newest region during scan. So we need to + // update region after scan. region = client.getRegion(); return region; } diff --git a/src/main/java/org/tikv/common/operation/iterator/RawScanIterator.java b/src/main/java/org/tikv/common/operation/iterator/RawScanIterator.java index 5b27132699..08a64aaf87 100644 --- a/src/main/java/org/tikv/common/operation/iterator/RawScanIterator.java +++ b/src/main/java/org/tikv/common/operation/iterator/RawScanIterator.java @@ -57,6 +57,9 @@ public class RawScanIterator extends ScanIterator { } else { try { currentCache = client.rawScan(backOffer, startKey, limit, keyOnly); + // Client will get the newest region during scan. So we need to + // update region after scan. + region = client.getRegion(); } catch (final TiKVException e) { backOffer.doBackOff(BackOffFunction.BackOffFuncType.BoRegionMiss, e); continue; diff --git a/src/main/java/org/tikv/common/region/RegionStoreClient.java b/src/main/java/org/tikv/common/region/RegionStoreClient.java index 42576fa7ea..5ba0dd104b 100644 --- a/src/main/java/org/tikv/common/region/RegionStoreClient.java +++ b/src/main/java/org/tikv/common/region/RegionStoreClient.java @@ -1253,6 +1253,9 @@ public class RegionStoreClient extends AbstractRegionStoreClient { regionManager, this, resp -> resp.hasRegionError() ? resp.getRegionError() : null); RawScanResponse resp = callWithRetry(backOffer, TikvGrpc.getRawScanMethod(), factory, handler); + // RegionErrorHandler may refresh region cache due to outdated region info, + // This region need to get newest ino from cache. + region = regionManager.getRegionByKey(key, backOffer); return rawScanHelper(resp); } finally { requestTimer.observeDuration();