diff --git a/internal/locate/region_request.go b/internal/locate/region_request.go index 9335e87131..a9b856294b 100644 --- a/internal/locate/region_request.go +++ b/internal/locate/region_request.go @@ -1466,6 +1466,16 @@ func (s *RegionRequestSender) onRegionError(bo *retry.Backoffer, ctx *RPCContext return false, nil } + if regionErr.GetIsWitness() != nil { + s.regionCache.InvalidateCachedRegion(ctx.Region) + logutil.BgLogger().Debug("tikv reports `IsWitness`", zap.Stringer("ctx", ctx)) + err = bo.Backoff(retry.BoIsWitness, errors.Errorf("is witness, ctx: %v", ctx)) + if err != nil { + return false, err + } + return false, nil + } + // Since we expect that the workload should be stopped during the flashback progress, // if a request meets the FlashbackInProgress error, it should stop retrying immediately // to avoid unnecessary backoff and potential unexpected data status to the user. @@ -1617,16 +1627,6 @@ func (s *RegionRequestSender) onRegionError(bo *retry.Backoffer, ctx *RPCContext return true, nil } - if regionErr.GetIsWitness() != nil { - s.regionCache.InvalidateCachedRegion(ctx.Region) - logutil.BgLogger().Debug("tikv reports `IsWitness`", zap.Stringer("ctx", ctx)) - err = bo.Backoff(retry.BoRegionRecoveryInProgress, errors.Errorf("is witness, ctx: %v", ctx)) - if err != nil { - return false, err - } - return false, nil - } - logutil.BgLogger().Debug("tikv reports region failed", zap.Stringer("regionErr", regionErr), zap.Stringer("ctx", ctx))