diff --git a/internal/locate/region_cache.go b/internal/locate/region_cache.go index e21703f3..a3eba8d8 100644 --- a/internal/locate/region_cache.go +++ b/internal/locate/region_cache.go @@ -358,6 +358,7 @@ func (r *Region) isCacheTTLExpired(ts int64) bool { return ts-lastAccess > regionCacheTTLSec } +// checkRegionCacheTTL returns false means the region cache is expired. func (r *Region) checkRegionCacheTTL(ts int64) bool { // Only consider use percentage on this failpoint, for example, "2%return" if _, err := util.EvalFailpoint("invalidateRegionCache"); err == nil { diff --git a/internal/locate/region_request.go b/internal/locate/region_request.go index f4718cee..7d2aaf82 100644 --- a/internal/locate/region_request.go +++ b/internal/locate/region_request.go @@ -910,9 +910,14 @@ func newReplicaSelector( regionCache *RegionCache, regionID RegionVerID, req *tikvrpc.Request, opts ...StoreSelectorOption, ) (*replicaSelector, error) { cachedRegion := regionCache.GetCachedRegionWithRLock(regionID) - if cachedRegion == nil || !cachedRegion.isValid() { - return nil, nil + if cachedRegion == nil { + return nil, errors.New("cached region not found") + } else if cachedRegion.checkNeedReload() { + return nil, errors.New("cached region need reload") + } else if !cachedRegion.checkRegionCacheTTL(time.Now().Unix()) { + return nil, errors.New("cached region ttl expired") } + regionStore := cachedRegion.getStore() replicas := make([]*replica, 0, regionStore.accessStoreNum(tiKVOnly)) for _, storeIdx := range regionStore.accessIndex[tiKVOnly] { @@ -1274,7 +1279,8 @@ func (s *RegionRequestSender) getRPCContext( if s.replicaSelector == nil { selector, err := newReplicaSelector(s.regionCache, regionID, req, opts...) if selector == nil || err != nil { - return nil, err + s.rpcError = err + return nil, nil } s.replicaSelector = selector }