From 1b363d8a0fe1bae7c297db66cad5d374f74ceaa0 Mon Sep 17 00:00:00 2001 From: Ryan Leung Date: Thu, 8 Dec 2022 15:26:04 +0800 Subject: [PATCH] *: reduce get overlap operations (#5615) ref tikv/pd#5606, ref tikv/pd#5648 Signed-off-by: Ryan Leung Co-authored-by: Ti Chi Robot --- server/cluster/cluster.go | 2 +- server/cluster/cluster_test.go | 10 +-- server/core/basic_cluster.go | 42 ---------- server/core/region.go | 115 ++++++++++++++++++--------- server/core/region_test.go | 16 ++-- server/core/region_tree.go | 18 ++--- server/core/region_tree_test.go | 2 +- server/region_syncer/client.go | 2 +- server/schedule/range_cluster.go | 2 +- server/schedulers/balance_test.go | 6 +- server/schedulers/scheduler_test.go | 2 +- server/storage/storage_test.go | 26 +++--- tools/pd-simulator/simulator/raft.go | 4 +- 13 files changed, 120 insertions(+), 127 deletions(-) diff --git a/server/cluster/cluster.go b/server/cluster/cluster.go index fdb56c529ce..72fed3b1217 100644 --- a/server/cluster/cluster.go +++ b/server/cluster/cluster.go @@ -829,7 +829,7 @@ var regionGuide = core.GenerateRegionGuideFunc(true) // processRegionHeartbeat updates the region information. func (c *RaftCluster) processRegionHeartbeat(region *core.RegionInfo) error { - origin, err := c.core.PreCheckPutRegion(region) + origin, _, err := c.core.PreCheckPutRegion(region) if err != nil { return err } diff --git a/server/cluster/cluster_test.go b/server/cluster/cluster_test.go index 025264c194f..b08c259d6c2 100644 --- a/server/cluster/cluster_test.go +++ b/server/cluster/cluster_test.go @@ -1678,7 +1678,7 @@ func Test(t *testing.T) { re.Nil(cache.GetRegionByKey(regionKey)) checkRegions(re, cache, regions[0:i]) - origin, overlaps, rangeChanged := cache.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged := cache.SetRegion(region) cache.UpdateSubTree(region, origin, overlaps, rangeChanged) checkRegion(re, cache.GetRegion(i), region) checkRegion(re, cache.GetRegionByKey(regionKey), region) @@ -1692,7 +1692,7 @@ func Test(t *testing.T) { // Update leader to peer np-1. newRegion := region.Clone(core.WithLeader(region.GetPeers()[np-1])) regions[i] = newRegion - origin, overlaps, rangeChanged = cache.SetRegionWithUpdate(newRegion) + origin, overlaps, rangeChanged = cache.SetRegion(newRegion) cache.UpdateSubTree(newRegion, origin, overlaps, rangeChanged) checkRegion(re, cache.GetRegion(i), newRegion) checkRegion(re, cache.GetRegionByKey(regionKey), newRegion) @@ -1707,7 +1707,7 @@ func Test(t *testing.T) { // Reset leader to peer 0. newRegion = region.Clone(core.WithLeader(region.GetPeers()[0])) regions[i] = newRegion - origin, overlaps, rangeChanged = cache.SetRegionWithUpdate(newRegion) + origin, overlaps, rangeChanged = cache.SetRegion(newRegion) cache.UpdateSubTree(newRegion, origin, overlaps, rangeChanged) checkRegion(re, cache.GetRegion(i), newRegion) checkRegions(re, cache, regions[0:(i+1)]) @@ -1729,7 +1729,7 @@ func Test(t *testing.T) { // check overlaps // clone it otherwise there are two items with the same key in the tree overlapRegion := regions[n-1].Clone(core.WithStartKey(regions[n-2].GetStartKey())) - origin, overlaps, rangeChanged := cache.SetRegionWithUpdate(overlapRegion) + origin, overlaps, rangeChanged := cache.SetRegion(overlapRegion) cache.UpdateSubTree(overlapRegion, origin, overlaps, rangeChanged) re.Nil(cache.GetRegion(n - 2)) re.NotNil(cache.GetRegion(n - 1)) @@ -1739,7 +1739,7 @@ func Test(t *testing.T) { for j := 0; j < cache.GetStoreLeaderCount(i); j++ { region := filter.SelectOneRegion(tc.RandLeaderRegions(i, []core.KeyRange{core.NewKeyRange("", "")}), nil, pendingFilter, downFilter) newRegion := region.Clone(core.WithPendingPeers(region.GetPeers())) - origin, overlaps, rangeChanged = cache.SetRegionWithUpdate(newRegion) + origin, overlaps, rangeChanged = cache.SetRegion(newRegion) cache.UpdateSubTree(newRegion, origin, overlaps, rangeChanged) } re.Nil(filter.SelectOneRegion(tc.RandLeaderRegions(i, []core.KeyRange{core.NewKeyRange("", "")}), nil, pendingFilter, downFilter)) diff --git a/server/core/basic_cluster.go b/server/core/basic_cluster.go index e395a56b9c7..c185cf507a8 100644 --- a/server/core/basic_cluster.go +++ b/server/core/basic_cluster.go @@ -16,11 +16,8 @@ package core import ( "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/log" - "github.com/tikv/pd/pkg/errs" "github.com/tikv/pd/pkg/syncutil" "github.com/tikv/pd/server/core/storelimit" - "go.uber.org/zap" ) // BasicCluster provides basic data member and interface for a tikv cluster. @@ -221,45 +218,6 @@ func (bc *BasicCluster) GetStoresWriteRate() (storeIDs []uint64, bytesRates, key return bc.getWriteRate(bc.RegionsInfo.GetStoreWriteRate) } -/* Regions write operations */ - -// PreCheckPutRegion checks if the region is valid to put. -func (bc *BasicCluster) PreCheckPutRegion(region *RegionInfo) (*RegionInfo, error) { - origin, overlaps := bc.RegionsInfo.GetRelevantRegions(region) - return check(region, origin, overlaps) -} - -// CheckAndPutRegion checks if the region is valid to put, if valid then put. -func (bc *BasicCluster) CheckAndPutRegion(region *RegionInfo) []*RegionInfo { - origin, err := bc.PreCheckPutRegion(region) - if err != nil { - log.Debug("region is stale", zap.Stringer("origin", origin.GetMeta()), errs.ZapError(err)) - // return the state region to delete. - return []*RegionInfo{region} - } - return bc.PutRegion(region) -} - -// PutRegion put a region. -func (bc *BasicCluster) PutRegion(region *RegionInfo) []*RegionInfo { - origin, overlaps, rangeChanged := bc.RegionsInfo.SetRegionWithUpdate(region) - bc.RegionsInfo.UpdateSubTree(region, origin, overlaps, rangeChanged) - return overlaps -} - -// RemoveRegionIfExist removes RegionInfo from regionTree and regionMap if exists. -func (bc *BasicCluster) RemoveRegionIfExist(id uint64) { - if r := bc.RegionsInfo.GetRegion(id); r != nil { - bc.RegionsInfo.RemoveRegion(r) - bc.RegionsInfo.RemoveRegionFromSubTree(r) - } -} - -// ResetRegionCache drops all region cache. -func (bc *BasicCluster) ResetRegionCache() { - bc.RegionsInfo.Reset() -} - // RegionSetInformer provides access to a shared informer of regions. type RegionSetInformer interface { GetRegionCount() int diff --git a/server/core/region.go b/server/core/region.go index 98e7232f79a..faddc868ff4 100644 --- a/server/core/region.go +++ b/server/core/region.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/kvproto/pkg/pdpb" "github.com/pingcap/kvproto/pkg/replication_modepb" "github.com/pingcap/log" + "github.com/tikv/pd/pkg/errs" "github.com/tikv/pd/pkg/logutil" "github.com/tikv/pd/pkg/syncutil" "github.com/tikv/pd/pkg/typeutil" @@ -746,45 +747,79 @@ func (r *RegionsInfo) getRegionLocked(regionID uint64) *RegionInfo { return nil } +// CheckAndPutRegion checks if the region is valid to put, if valid then put. +func (r *RegionsInfo) CheckAndPutRegion(region *RegionInfo) []*RegionInfo { + r.t.Lock() + origin := r.getRegionLocked(region.GetID()) + var ols []*regionItem + if origin == nil || !bytes.Equal(origin.GetStartKey(), region.GetStartKey()) || !bytes.Equal(origin.GetEndKey(), region.GetEndKey()) { + ols = r.tree.overlaps(®ionItem{RegionInfo: region}) + } + err := check(region, origin, ols) + if err != nil { + log.Debug("region is stale", zap.Stringer("origin", origin.GetMeta()), errs.ZapError(err)) + // return the state region to delete. + return []*RegionInfo{region} + } + origin, overlaps, rangeChanged := r.setRegionLocked(region, true, ols...) + r.t.Unlock() + r.UpdateSubTree(region, origin, overlaps, rangeChanged) + return overlaps +} + +// PutRegion put a region. +func (r *RegionsInfo) PutRegion(region *RegionInfo) []*RegionInfo { + origin, overlaps, rangeChanged := r.SetRegion(region) + r.UpdateSubTree(region, origin, overlaps, rangeChanged) + return overlaps +} + +// PreCheckPutRegion checks if the region is valid to put. +func (r *RegionsInfo) PreCheckPutRegion(region *RegionInfo) (*RegionInfo, []*regionItem, error) { + origin, overlaps := r.GetRelevantRegions(region) + err := check(region, origin, overlaps) + return origin, overlaps, err +} + // AtomicCheckAndPutRegion checks if the region is valid to put, if valid then put. func (r *RegionsInfo) AtomicCheckAndPutRegion(region *RegionInfo) ([]*RegionInfo, error) { r.t.Lock() - var overlaps []*RegionInfo + var ols []*regionItem origin := r.getRegionLocked(region.GetID()) if origin == nil || !bytes.Equal(origin.GetStartKey(), region.GetStartKey()) || !bytes.Equal(origin.GetEndKey(), region.GetEndKey()) { - overlaps = r.tree.getOverlaps(region) + ols = r.tree.overlaps(®ionItem{RegionInfo: region}) } - _, err := check(region, origin, overlaps) + err := check(region, origin, ols) if err != nil { r.t.Unlock() return nil, err } - origin, overlaps, rangeChanged := r.setRegionLocked(region) + origin, overlaps, rangeChanged := r.setRegionLocked(region, true, ols...) r.t.Unlock() r.UpdateSubTree(region, origin, overlaps, rangeChanged) return overlaps, nil } // GetRelevantRegions returns the relevant regions for a given region. -func (r *RegionsInfo) GetRelevantRegions(region *RegionInfo) (origin *RegionInfo, overlaps []*RegionInfo) { +func (r *RegionsInfo) GetRelevantRegions(region *RegionInfo) (origin *RegionInfo, overlaps []*regionItem) { r.t.RLock() defer r.t.RUnlock() origin = r.getRegionLocked(region.GetID()) if origin == nil || !bytes.Equal(origin.GetStartKey(), region.GetStartKey()) || !bytes.Equal(origin.GetEndKey(), region.GetEndKey()) { - overlaps = r.tree.getOverlaps(region) + overlaps = r.tree.overlaps(®ionItem{RegionInfo: region}) } return } -func check(region, origin *RegionInfo, overlaps []*RegionInfo) (*RegionInfo, error) { +func check(region, origin *RegionInfo, overlaps []*regionItem) error { for _, item := range overlaps { // PD ignores stale regions' heartbeats, unless it is recreated recently by unsafe recover operation. if region.GetRegionEpoch().GetVersion() < item.GetRegionEpoch().GetVersion() && !region.isRegionRecreated() { - return nil, errRegionIsStale(region.GetMeta(), item.GetMeta()) + return errRegionIsStale(region.GetMeta(), item.GetMeta()) } } if origin == nil { - return nil, nil + return nil } r := region.GetRegionEpoch() @@ -793,29 +828,20 @@ func check(region, origin *RegionInfo, overlaps []*RegionInfo) (*RegionInfo, err isTermBehind := region.GetTerm() > 0 && region.GetTerm() < origin.GetTerm() // Region meta is stale, return an error. if (isTermBehind || r.GetVersion() < o.GetVersion() || r.GetConfVer() < o.GetConfVer()) && !region.isRegionRecreated() { - return origin, errRegionIsStale(region.GetMeta(), origin.GetMeta()) + return errRegionIsStale(region.GetMeta(), origin.GetMeta()) } - return origin, nil -} - -// SetRegion sets the RegionInfo to regionTree and regionMap, also update leaders and followers by region peers -// overlaps: Other regions that overlap with the specified region, excluding itself. -func (r *RegionsInfo) SetRegion(region *RegionInfo) []*RegionInfo { - r.t.Lock() - defer r.t.Unlock() - _, overlaps, _ := r.setRegionLocked(region) - return overlaps + return nil } -// SetRegionWithUpdate sets the RegionInfo to regionTree and regionMap and return the update info of subtree. -func (r *RegionsInfo) SetRegionWithUpdate(region *RegionInfo) (*RegionInfo, []*RegionInfo, bool) { +// SetRegion sets the RegionInfo to regionTree and regionMap and return the update info of subtree. +func (r *RegionsInfo) SetRegion(region *RegionInfo) (*RegionInfo, []*RegionInfo, bool) { r.t.Lock() defer r.t.Unlock() - return r.setRegionLocked(region) + return r.setRegionLocked(region, false) } -func (r *RegionsInfo) setRegionLocked(region *RegionInfo) (*RegionInfo, []*RegionInfo, bool) { +func (r *RegionsInfo) setRegionLocked(region *RegionInfo, withOverlaps bool, ol ...*regionItem) (*RegionInfo, []*RegionInfo, bool) { var ( item *regionItem // Pointer to the *RegionInfo of this ID. origin *RegionInfo @@ -829,6 +855,16 @@ func (r *RegionsInfo) setRegionLocked(region *RegionInfo) (*RegionInfo, []*Regio if rangeChanged { // Delete itself in regionTree so that overlaps will not contain itself. // Because the regionItem is reused, there is no need to delete it in the regionMap. + idx := -1 + for i, o := range ol { + if o.GetID() == region.GetID() { + idx = i + break + } + } + if idx >= 0 { + ol = append(ol[:idx], ol[idx+1:]...) + } r.tree.remove(origin) // Update the RegionInfo in the regionItem. item.RegionInfo = region @@ -847,20 +883,17 @@ func (r *RegionsInfo) setRegionLocked(region *RegionInfo) (*RegionInfo, []*Regio var overlaps []*RegionInfo if rangeChanged { - // It has been removed and all information needs to be updated again. - overlaps = r.tree.update(item) + overlaps = r.tree.update(item, withOverlaps, ol...) for _, old := range overlaps { - o := r.getRegionLocked(old.GetID()) - // Remove from tree and regions. - r.tree.remove(o) - delete(r.regions, o.GetID()) + delete(r.regions, old.GetID()) } } + // return rangeChanged to prevent duplicated calculation return origin, overlaps, rangeChanged } // UpdateSubTree updates the subtree. -func (r *RegionsInfo) UpdateSubTree(region, origin *RegionInfo, toRemove []*RegionInfo, rangeChanged bool) { +func (r *RegionsInfo) UpdateSubTree(region, origin *RegionInfo, overlaps []*RegionInfo, rangeChanged bool) { r.st.Lock() defer r.st.Unlock() if origin != nil { @@ -875,7 +908,7 @@ func (r *RegionsInfo) UpdateSubTree(region, origin *RegionInfo, toRemove []*Regi } } if rangeChanged { - for _, re := range toRemove { + for _, re := range overlaps { r.removeRegionFromSubTreeLocked(re) } } @@ -890,7 +923,7 @@ func (r *RegionsInfo) UpdateSubTree(region, origin *RegionInfo, toRemove []*Regi store = newRegionTree() peersMap[storeID] = store } - store.update(item) + store.update(item, false) } // Add to leaders and followers. @@ -952,10 +985,10 @@ func (r *RegionsInfo) TreeLen() int { } // GetOverlaps returns the regions which are overlapped with the specified region range. -func (r *RegionsInfo) GetOverlaps(region *RegionInfo) []*RegionInfo { +func (r *RegionsInfo) GetOverlaps(region *RegionInfo) []*regionItem { r.t.RLock() defer r.t.RUnlock() - return r.tree.getOverlaps(region) + return r.tree.overlaps(®ionItem{RegionInfo: region}) } // RemoveRegion removes RegionInfo from regionTree and regionMap @@ -967,8 +1000,8 @@ func (r *RegionsInfo) RemoveRegion(region *RegionInfo) { delete(r.regions, region.GetID()) } -// Reset resets the regions info. -func (r *RegionsInfo) Reset() { +// ResetRegionCache resets the regions info. +func (r *RegionsInfo) ResetRegionCache() { r.t.Lock() r.tree = newRegionTree() r.regions = make(map[uint64]*regionItem) @@ -1004,6 +1037,14 @@ func (r *RegionsInfo) removeRegionFromSubTreeLocked(region *RegionInfo) { delete(r.subRegions, region.GetMeta().GetId()) } +// RemoveRegionIfExist removes RegionInfo from regionTree and regionMap if exists. +func (r *RegionsInfo) RemoveRegionIfExist(id uint64) { + if region := r.GetRegion(id); region != nil { + r.RemoveRegion(region) + r.RemoveRegionFromSubTree(region) + } +} + type peerSlice []*metapb.Peer func (s peerSlice) Len() int { diff --git a/server/core/region_test.go b/server/core/region_test.go index 98d7909ab0a..412d922b777 100644 --- a/server/core/region_test.go +++ b/server/core/region_test.go @@ -466,7 +466,7 @@ func TestSetRegion(t *testing.T) { StartKey: []byte(fmt.Sprintf("%20d", i*10)), EndKey: []byte(fmt.Sprintf("%20d", (i+1)*10)), }, peer1) - origin, overlaps, rangeChanged := regions.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged := regions.SetRegion(region) regions.UpdateSubTree(region, origin, overlaps, rangeChanged) } @@ -480,13 +480,13 @@ func TestSetRegion(t *testing.T) { EndKey: []byte(fmt.Sprintf("%20d", 211)), }, peer1) region.pendingPeers = append(region.pendingPeers, peer3) - origin, overlaps, rangeChanged := regions.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged := regions.SetRegion(region) regions.UpdateSubTree(region, origin, overlaps, rangeChanged) checkRegions(re, regions) re.Equal(97, regions.tree.length()) re.Len(regions.GetRegions(), 97) - origin, overlaps, rangeChanged = regions.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged = regions.SetRegion(region) regions.UpdateSubTree(region, origin, overlaps, rangeChanged) peer1 = &metapb.Peer{StoreId: uint64(2), Id: uint64(101)} peer2 = &metapb.Peer{StoreId: uint64(3), Id: uint64(102), Role: metapb.PeerRole_Learner} @@ -498,7 +498,7 @@ func TestSetRegion(t *testing.T) { EndKey: []byte(fmt.Sprintf("%20d", 212)), }, peer1) region.pendingPeers = append(region.pendingPeers, peer3) - origin, overlaps, rangeChanged = regions.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged = regions.SetRegion(region) regions.UpdateSubTree(region, origin, overlaps, rangeChanged) checkRegions(re, regions) re.Equal(97, regions.tree.length()) @@ -508,7 +508,7 @@ func TestSetRegion(t *testing.T) { region = region.Clone(WithStartKey([]byte(fmt.Sprintf("%20d", 175))), WithNewRegionID(201)) re.NotNil(regions.GetRegion(21)) re.NotNil(regions.GetRegion(18)) - origin, overlaps, rangeChanged = regions.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged = regions.SetRegion(region) regions.UpdateSubTree(region, origin, overlaps, rangeChanged) checkRegions(re, regions) re.Equal(96, regions.tree.length()) @@ -524,7 +524,7 @@ func TestSetRegion(t *testing.T) { SetWrittenBytes(40), SetWrittenKeys(10), SetReportInterval(0, 5)) - origin, overlaps, rangeChanged = regions.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged = regions.SetRegion(region) regions.UpdateSubTree(region, origin, overlaps, rangeChanged) checkRegions(re, regions) re.Equal(96, regions.tree.length()) @@ -636,7 +636,7 @@ func BenchmarkRandomRegion(b *testing.B) { StartKey: []byte(fmt.Sprintf("%20d", i)), EndKey: []byte(fmt.Sprintf("%20d", i+1)), }, peer) - origin, overlaps, rangeChanged := regions.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged := regions.SetRegion(region) regions.UpdateSubTree(region, origin, overlaps, rangeChanged) } b.ResetTimer() @@ -690,7 +690,7 @@ func BenchmarkAddRegion(b *testing.B) { } b.ResetTimer() for i := 0; i < b.N; i++ { - origin, overlaps, rangeChanged := regions.SetRegionWithUpdate(items[i]) + origin, overlaps, rangeChanged := regions.SetRegion(items[i]) regions.UpdateSubTree(items[i], origin, overlaps, rangeChanged) } } diff --git a/server/core/region_tree.go b/server/core/region_tree.go index 4029f8140e7..f631e3f9ed6 100644 --- a/server/core/region_tree.go +++ b/server/core/region_tree.go @@ -80,17 +80,6 @@ func (t *regionTree) length() int { return t.tree.Len() } -// getOverlaps gets the regions which are overlapped with the specified region range. -func (t *regionTree) getOverlaps(region *RegionInfo) []*RegionInfo { - item := ®ionItem{RegionInfo: region} - result := t.overlaps(item) - overlaps := make([]*RegionInfo, len(result)) - for i, r := range result { - overlaps[i] = r.RegionInfo - } - return overlaps -} - // GetOverlaps returns the range items that has some intersections with the given items. func (t *regionTree) overlaps(item *regionItem) []*regionItem { // note that Find() gets the last item that is less or equal than the item. @@ -118,14 +107,17 @@ func (t *regionTree) overlaps(item *regionItem) []*regionItem { // update updates the tree with the region. // It finds and deletes all the overlapped regions first, and then // insert the region. -func (t *regionTree) update(item *regionItem) []*RegionInfo { +func (t *regionTree) update(item *regionItem, withOverlaps bool, overlaps ...*regionItem) []*RegionInfo { region := item.RegionInfo t.totalSize += region.approximateSize regionWriteBytesRate, regionWriteKeysRate := region.GetWriteRate() t.totalWriteBytesRate += regionWriteBytesRate t.totalWriteKeysRate += regionWriteKeysRate - overlaps := t.overlaps(item) + if !withOverlaps { + overlaps = t.overlaps(item) + } + for _, old := range overlaps { t.tree.Delete(old) } diff --git a/server/core/region_tree_test.go b/server/core/region_tree_test.go index f50073f603d..796b83f176d 100644 --- a/server/core/region_tree_test.go +++ b/server/core/region_tree_test.go @@ -356,7 +356,7 @@ func TestRandomRegionDiscontinuous(t *testing.T) { func updateNewItem(tree *regionTree, region *RegionInfo) { item := ®ionItem{RegionInfo: region} - tree.update(item) + tree.update(item, false) } func checkRandomRegion(re *require.Assertions, tree *regionTree, regions []*RegionInfo, ranges []KeyRange) { diff --git a/server/region_syncer/client.go b/server/region_syncer/client.go index debf39f556f..20c0b9cb302 100644 --- a/server/region_syncer/client.go +++ b/server/region_syncer/client.go @@ -211,7 +211,7 @@ func (s *RegionSyncer) StartSyncWithLeader(addr string) { region = core.NewRegionInfo(r, regionLeader, core.SetFromHeartbeat(false)) } - origin, err := bc.PreCheckPutRegion(region) + origin, _, err := bc.PreCheckPutRegion(region) if err != nil { log.Debug("region is stale", zap.Stringer("origin", origin.GetMeta()), errs.ZapError(err)) continue diff --git a/server/schedule/range_cluster.go b/server/schedule/range_cluster.go index a9672e2a17d..631e6b04325 100644 --- a/server/schedule/range_cluster.go +++ b/server/schedule/range_cluster.go @@ -31,7 +31,7 @@ type RangeCluster struct { func GenRangeCluster(cluster Cluster, startKey, endKey []byte) *RangeCluster { subCluster := core.NewBasicCluster() for _, r := range cluster.ScanRegions(startKey, endKey, -1) { - origin, overlaps, rangeChanged := subCluster.SetRegionWithUpdate(r) + origin, overlaps, rangeChanged := subCluster.SetRegion(r) subCluster.UpdateSubTree(r, origin, overlaps, rangeChanged) } return &RangeCluster{ diff --git a/server/schedulers/balance_test.go b/server/schedulers/balance_test.go index 3c45daffbc1..56494018ba1 100644 --- a/server/schedulers/balance_test.go +++ b/server/schedulers/balance_test.go @@ -1310,7 +1310,7 @@ func TestScatterRangeBalance(t *testing.T) { core.SetApproximateKeys(1), core.SetApproximateSize(1), ) - origin, overlaps, rangeChanged := tc.SetRegionWithUpdate(regionInfo) + origin, overlaps, rangeChanged := tc.SetRegion(regionInfo) tc.UpdateSubTree(regionInfo, origin, overlaps, rangeChanged) } for i := 0; i < 100; i++ { @@ -1379,7 +1379,7 @@ func TestBalanceLeaderLimit(t *testing.T) { core.SetApproximateSize(96), ) - origin, overlaps, rangeChanged := tc.SetRegionWithUpdate(regionInfo) + origin, overlaps, rangeChanged := tc.SetRegion(regionInfo) tc.UpdateSubTree(regionInfo, origin, overlaps, rangeChanged) } @@ -1490,7 +1490,7 @@ func TestBalanceWhenRegionNotHeartbeat(t *testing.T) { core.SetApproximateSize(96), ) - origin, overlaps, rangeChanged := tc.SetRegionWithUpdate(regionInfo) + origin, overlaps, rangeChanged := tc.SetRegion(regionInfo) tc.UpdateSubTree(regionInfo, origin, overlaps, rangeChanged) } diff --git a/server/schedulers/scheduler_test.go b/server/schedulers/scheduler_test.go index 54a502ea985..755e5088003 100644 --- a/server/schedulers/scheduler_test.go +++ b/server/schedulers/scheduler_test.go @@ -118,7 +118,7 @@ func TestRejectLeader(t *testing.T) { break } } - origin, overlaps, rangeChanged := tc.SetRegionWithUpdate(region) + origin, overlaps, rangeChanged := tc.SetRegion(region) tc.UpdateSubTree(region, origin, overlaps, rangeChanged) ops, _ = sl.Schedule(tc, false) testutil.CheckTransferLeader(re, ops[0], operator.OpLeader, 1, 2) diff --git a/server/storage/storage_test.go b/server/storage/storage_test.go index 8793fbfc8c6..342ad302d9c 100644 --- a/server/storage/storage_test.go +++ b/server/storage/storage_test.go @@ -212,11 +212,11 @@ func TestLoadMinServiceGCSafePoint(t *testing.T) { func TestLoadRegions(t *testing.T) { re := require.New(t) storage := NewStorageWithMemoryBackend() - cache := core.NewRegionsInfo() + cache := core.NewBasicCluster() n := 10 regions := mustSaveRegions(re, storage, n) - re.NoError(storage.LoadRegions(context.Background(), cache.SetRegion)) + re.NoError(storage.LoadRegions(context.Background(), cache.CheckAndPutRegion)) re.Equal(n, cache.GetRegionCount()) for _, region := range cache.GetMetaRegions() { @@ -249,11 +249,11 @@ func newTestRegionMeta(regionID uint64) *metapb.Region { func TestLoadRegionsToCache(t *testing.T) { re := require.New(t) storage := NewStorageWithMemoryBackend() - cache := core.NewRegionsInfo() + cache := core.NewBasicCluster() n := 10 regions := mustSaveRegions(re, storage, n) - re.NoError(TryLoadRegionsOnce(context.Background(), storage, cache.SetRegion)) + re.NoError(TryLoadRegionsOnce(context.Background(), storage, cache.CheckAndPutRegion)) re.Equal(n, cache.GetRegionCount()) for _, region := range cache.GetMetaRegions() { @@ -262,7 +262,7 @@ func TestLoadRegionsToCache(t *testing.T) { n = 20 mustSaveRegions(re, storage, n) - re.NoError(TryLoadRegionsOnce(context.Background(), storage, cache.SetRegion)) + re.NoError(TryLoadRegionsOnce(context.Background(), storage, cache.CheckAndPutRegion)) re.Equal(n, cache.GetRegionCount()) } @@ -270,11 +270,11 @@ func TestLoadRegionsExceedRangeLimit(t *testing.T) { re := require.New(t) re.NoError(failpoint.Enable("github.com/tikv/pd/server/storage/kv/withRangeLimit", "return(500)")) storage := NewStorageWithMemoryBackend() - cache := core.NewRegionsInfo() + cache := core.NewBasicCluster() n := 1000 regions := mustSaveRegions(re, storage, n) - re.NoError(storage.LoadRegions(context.Background(), cache.SetRegion)) + re.NoError(storage.LoadRegions(context.Background(), cache.CheckAndPutRegion)) re.Equal(n, cache.GetRegionCount()) for _, region := range cache.GetMetaRegions() { re.Equal(regions[region.GetId()], region) @@ -287,13 +287,13 @@ func TestTrySwitchRegionStorage(t *testing.T) { defaultStorage := NewStorageWithMemoryBackend() localStorage := NewStorageWithMemoryBackend() storage := NewCoreStorage(defaultStorage, localStorage) - defaultCache := core.NewRegionsInfo() - localCache := core.NewRegionsInfo() + defaultCache := core.NewBasicCluster() + localCache := core.NewBasicCluster() TrySwitchRegionStorage(storage, false) regions10 := mustSaveRegions(re, storage, 10) - re.NoError(defaultStorage.LoadRegions(context.Background(), defaultCache.SetRegion)) - re.NoError(localStorage.LoadRegions(context.Background(), localCache.SetRegion)) + re.NoError(defaultStorage.LoadRegions(context.Background(), defaultCache.CheckAndPutRegion)) + re.NoError(localStorage.LoadRegions(context.Background(), localCache.CheckAndPutRegion)) re.Empty(localCache.GetMetaRegions()) re.Len(defaultCache.GetMetaRegions(), 10) for _, region := range defaultCache.GetMetaRegions() { @@ -302,8 +302,8 @@ func TestTrySwitchRegionStorage(t *testing.T) { TrySwitchRegionStorage(storage, true) regions20 := mustSaveRegions(re, storage, 20) - re.NoError(defaultStorage.LoadRegions(context.Background(), defaultCache.SetRegion)) - re.NoError(localStorage.LoadRegions(context.Background(), localCache.SetRegion)) + re.NoError(defaultStorage.LoadRegions(context.Background(), defaultCache.CheckAndPutRegion)) + re.NoError(localStorage.LoadRegions(context.Background(), localCache.CheckAndPutRegion)) re.Len(defaultCache.GetMetaRegions(), 10) re.Len(localCache.GetMetaRegions(), 20) for _, region := range defaultCache.GetMetaRegions() { diff --git a/tools/pd-simulator/simulator/raft.go b/tools/pd-simulator/simulator/raft.go index 45964eeecb2..2b6af1384dc 100644 --- a/tools/pd-simulator/simulator/raft.go +++ b/tools/pd-simulator/simulator/raft.go @@ -275,7 +275,9 @@ func (r *RaftEngine) GetRegions() []*core.RegionInfo { func (r *RaftEngine) SetRegion(region *core.RegionInfo) []*core.RegionInfo { r.Lock() defer r.Unlock() - return r.regionsInfo.SetRegion(region) + origin, overlaps, rangeChanged := r.regionsInfo.SetRegion(region) + r.regionsInfo.UpdateSubTree(region, origin, overlaps, rangeChanged) + return overlaps } // GetRegionByKey searches the RegionInfo from regionTree