@@ -71,8 +71,14 @@ type RegionInfo struct {
7171 queryStats * pdpb.QueryStats
7272 flowRoundDivisor uint64
7373 // buckets is not thread unsafe, it should be accessed by the request `report buckets` with greater version.
74- buckets unsafe.Pointer
75- fromHeartbeat bool
74+ buckets unsafe.Pointer
75+ // source is used to indicate region's source, such as FromHeartbeat/FromSync/InDisk.
76+ source RegionSource
77+ }
78+
79+ // GetRegionSource returns the region source.
80+ func (r * RegionInfo ) GetRegionSource () RegionSource {
81+ return r .source
7682}
7783
7884// NewRegionInfo creates RegionInfo with region's meta and leader peer.
@@ -171,6 +177,7 @@ func RegionFromHeartbeat(heartbeat *pdpb.RegionHeartbeatRequest, opts ...RegionC
171177 interval : heartbeat .GetInterval (),
172178 replicationStatus : heartbeat .GetReplicationStatus (),
173179 queryStats : heartbeat .GetQueryStats (),
180+ source : FromHeartbeat ,
174181 }
175182
176183 for _ , opt := range opts {
@@ -639,11 +646,6 @@ func (r *RegionInfo) IsFlashbackChanged(l *RegionInfo) bool {
639646 return r .meta .FlashbackStartTs != l .meta .FlashbackStartTs || r .meta .IsInFlashback != l .meta .IsInFlashback
640647}
641648
642- // IsFromHeartbeat returns whether the region info is from the region heartbeat.
643- func (r * RegionInfo ) IsFromHeartbeat () bool {
644- return r .fromHeartbeat
645- }
646-
647649func (r * RegionInfo ) isInvolved (startKey , endKey []byte ) bool {
648650 return bytes .Compare (r .GetStartKey (), startKey ) >= 0 && (len (endKey ) == 0 || (len (r .GetEndKey ()) > 0 && bytes .Compare (r .GetEndKey (), endKey ) <= 0 ))
649651}
@@ -683,7 +685,7 @@ func GenerateRegionGuideFunc(enableLog bool) RegionGuideFunc {
683685 }
684686 saveKV , saveCache , isNew = true , true , true
685687 } else {
686- if ! origin .IsFromHeartbeat () {
688+ if origin .source == FromSync || origin . source == InDisk {
687689 isNew = true
688690 }
689691 r := region .GetRegionEpoch ()
@@ -793,6 +795,18 @@ type RegionsInfo struct {
793795 pendingPeers map [uint64 ]* regionTree // storeID -> sub regionTree
794796}
795797
798+ // RegionSource is the source of region.
799+ type RegionSource uint32
800+
801+ const (
802+ // InDisk means region is stale.
803+ InDisk RegionSource = iota
804+ // FromSync means region is stale.
805+ FromSync
806+ // FromHeartbeat means region is fresh.
807+ FromHeartbeat
808+ )
809+
796810// NewRegionsInfo creates RegionsInfo with tree, regions, leaders and followers
797811func NewRegionsInfo () * RegionsInfo {
798812 return & RegionsInfo {
@@ -840,6 +854,8 @@ func (r *RegionsInfo) CheckAndPutRegion(region *RegionInfo) []*RegionInfo {
840854 origin , overlaps , rangeChanged := r .setRegionLocked (region , true , ols ... )
841855 r .t .Unlock ()
842856 r .UpdateSubTree (region , origin , overlaps , rangeChanged )
857+ // InDisk means region is stale.
858+ r .AtomicAddStaleRegionCnt ()
843859 return overlaps
844860}
845861
@@ -857,6 +873,21 @@ func (r *RegionsInfo) PreCheckPutRegion(region *RegionInfo) (*RegionInfo, []*reg
857873 return origin , overlaps , err
858874}
859875
876+ // GetStaleRegionCnt returns the stale region count.
877+ func (r * RegionsInfo ) GetStaleRegionCnt () int64 {
878+ r .t .RLock ()
879+ defer r .t .RUnlock ()
880+ if r .tree .length () == 0 {
881+ return 0
882+ }
883+ return r .tree .staleRegionCnt
884+ }
885+
886+ // AtomicAddStaleRegionCnt atomically adds the stale region count.
887+ func (r * RegionsInfo ) AtomicAddStaleRegionCnt () {
888+ r .tree .AtomicAddStaleRegionCnt ()
889+ }
890+
860891// AtomicCheckAndPutRegion checks if the region is valid to put, if valid then put.
861892func (r * RegionsInfo ) AtomicCheckAndPutRegion (region * RegionInfo ) ([]* RegionInfo , error ) {
862893 r .t .Lock ()
@@ -870,6 +901,10 @@ func (r *RegionsInfo) AtomicCheckAndPutRegion(region *RegionInfo) ([]*RegionInfo
870901 r .t .Unlock ()
871902 return nil , err
872903 }
904+ // If origin is stale, need to sub the stale region count.
905+ if origin != nil && origin .source != FromHeartbeat && region .source == FromHeartbeat {
906+ r .tree .AtomicSubStaleRegionCnt ()
907+ }
873908 origin , overlaps , rangeChanged := r .setRegionLocked (region , true , ols ... )
874909 r .t .Unlock ()
875910 r .UpdateSubTree (region , origin , overlaps , rangeChanged )
0 commit comments