@@ -82,7 +82,19 @@ func loadClusterInfo(id core.IDAllocator, kv *core.KV, opt *scheduleOption) (*cl
8282 )
8383
8484 start = time .Now ()
85- if err := kv .LoadRegions (c .core .Regions ); err != nil {
85+ // used to load region from kv storage to cache storage.
86+ putRegion := func (region * core.RegionInfo ) []* metapb.Region {
87+ c .Lock ()
88+ defer c .Unlock ()
89+ origin , err := c .core .PreCheckPutRegion (region )
90+ if err != nil {
91+ log .Warn ("region is stale" , zap .Error (err ), zap .Stringer ("origin" , origin .GetMeta ()))
92+ // return the state region to delete.
93+ return []* metapb.Region {region .GetMeta ()}
94+ }
95+ return c .core .Regions .SetRegion (region )
96+ }
97+ if err := kv .LoadRegions (putRegion ); err != nil {
8698 return nil , err
8799 }
88100 log .Info ("load regions" ,
@@ -512,14 +524,10 @@ func (c *clusterInfo) updateStoreStatusLocked(id uint64) {
512524// handleRegionHeartbeat updates the region information.
513525func (c * clusterInfo ) handleRegionHeartbeat (region * core.RegionInfo ) error {
514526 c .RLock ()
515- origin := c .core .Regions .GetRegion (region .GetID ())
516- if origin == nil {
517- for _ , item := range c .core .Regions .GetOverlaps (region ) {
518- if region .GetRegionEpoch ().GetVersion () < item .GetRegionEpoch ().GetVersion () {
519- c .RUnlock ()
520- return ErrRegionIsStale (region .GetMeta (), item )
521- }
522- }
527+ origin , err := c .core .PreCheckPutRegion (region )
528+ if err != nil {
529+ c .RUnlock ()
530+ return err
523531 }
524532 isWriteUpdate , writeItem := c .CheckWriteStatus (region )
525533 isReadUpdate , readItem := c .CheckReadStatus (region )
@@ -538,10 +546,7 @@ func (c *clusterInfo) handleRegionHeartbeat(region *core.RegionInfo) error {
538546 } else {
539547 r := region .GetRegionEpoch ()
540548 o := origin .GetRegionEpoch ()
541- // Region meta is stale, return an error.
542- if r .GetVersion () < o .GetVersion () || r .GetConfVer () < o .GetConfVer () {
543- return ErrRegionIsStale (region .GetMeta (), origin .GetMeta ())
544- }
549+
545550 if r .GetVersion () > o .GetVersion () {
546551 log .Info ("region Version changed" ,
547552 zap .Uint64 ("region-id" , region .GetID ()),
0 commit comments