diff --git a/server/cluster.go b/server/cluster.go index 14ec9b3b7ef8..8430650f3cb5 100644 --- a/server/cluster.go +++ b/server/cluster.go @@ -331,7 +331,7 @@ func (c *RaftCluster) processRegionHeartbeat(region *core.RegionInfo) error { for _, item := range c.core.GetOverlaps(region) { if region.GetRegionEpoch().GetVersion() < item.GetRegionEpoch().GetVersion() { c.RUnlock() - return ErrRegionIsStale(region.GetMeta(), item) + return ErrRegionIsStale(region.GetMeta(), item.GetMeta()) } } } @@ -438,19 +438,19 @@ func (c *RaftCluster) processRegionHeartbeat(region *core.RegionInfo) error { overlaps := c.core.PutRegion(region) if c.storage != nil { for _, item := range overlaps { - if err := c.storage.DeleteRegion(item); err != nil { + if err := c.storage.DeleteRegion(item.GetMeta()); err != nil { log.Error("failed to delete region from storage", - zap.Uint64("region-id", item.GetId()), - zap.Stringer("region-meta", core.RegionToHexMeta(item)), + zap.Uint64("region-id", item.GetID()), + zap.Stringer("region-meta", core.RegionToHexMeta(item.GetMeta())), zap.Error(err)) } } } for _, item := range overlaps { if c.regionStats != nil { - c.regionStats.ClearDefunctRegion(item.GetId()) + c.regionStats.ClearDefunctRegion(item.GetID()) } - c.labelLevelStats.ClearDefunctRegion(item.GetId(), c.GetLocationLabels()) + c.labelLevelStats.ClearDefunctRegion(item.GetID(), c.GetLocationLabels()) } // Update related stores. diff --git a/server/cluster_test.go b/server/cluster_test.go index ec0516b1a77e..bb6bc03b08ed 100644 --- a/server/cluster_test.go +++ b/server/cluster_test.go @@ -1245,11 +1245,9 @@ func (s *testClusterInfoSuite) TestRegionHeartbeat(c *C) { } } -func heartbeatRegions(c *C, cluster *RaftCluster, regions []*metapb.Region) { +func heartbeatRegions(c *C, cluster *RaftCluster, regions []*core.RegionInfo) { // Heartbeat and check region one by one. - for _, region := range regions { - r := core.NewRegionInfo(region, nil) - + for _, r := range regions { c.Assert(cluster.processRegionHeartbeat(r), IsNil) checkRegion(c, cluster.GetRegion(r.GetID()), r) @@ -1262,9 +1260,7 @@ func heartbeatRegions(c *C, cluster *RaftCluster, regions []*metapb.Region) { } // Check all regions after handling all heartbeats. - for _, region := range regions { - r := core.NewRegionInfo(region, nil) - + for _, r := range regions { checkRegion(c, cluster.GetRegion(r.GetID()), r) checkRegion(c, cluster.GetRegionInfoByKey(r.GetStartKey()), r) @@ -1321,14 +1317,7 @@ func (s *testClusterInfoSuite) TestRegionSplitAndMerge(c *C) { c.Assert(err, IsNil) cluster := createTestRaftCluster(mockid.NewIDAllocator(), opt, core.NewStorage(kv.NewMemoryKV())) - regions := []*metapb.Region{ - { - Id: 1, - StartKey: []byte{}, - EndKey: []byte{}, - RegionEpoch: &metapb.RegionEpoch{}, - }, - } + regions := []*core.RegionInfo{core.NewTestRegionInfo([]byte{}, []byte{})} // Byte will underflow/overflow if n > 7. n := 7 @@ -1403,25 +1392,25 @@ type testClusterUtilSuite struct{} func (s *testClusterUtilSuite) TestCheckStaleRegion(c *C) { // (0, 0) v.s. (0, 0) - region := core.NewRegion([]byte{}, []byte{}) - origin := core.NewRegion([]byte{}, []byte{}) - c.Assert(checkStaleRegion(region, origin), IsNil) - c.Assert(checkStaleRegion(origin, region), IsNil) + region := core.NewTestRegionInfo([]byte{}, []byte{}) + origin := core.NewTestRegionInfo([]byte{}, []byte{}) + c.Assert(checkStaleRegion(region.GetMeta(), origin.GetMeta()), IsNil) + c.Assert(checkStaleRegion(origin.GetMeta(), region.GetMeta()), IsNil) // (1, 0) v.s. (0, 0) - region.RegionEpoch.Version++ - c.Assert(checkStaleRegion(origin, region), IsNil) - c.Assert(checkStaleRegion(region, origin), NotNil) + region.GetRegionEpoch().Version++ + c.Assert(checkStaleRegion(origin.GetMeta(), region.GetMeta()), IsNil) + c.Assert(checkStaleRegion(region.GetMeta(), origin.GetMeta()), NotNil) // (1, 1) v.s. (0, 0) - region.RegionEpoch.ConfVer++ - c.Assert(checkStaleRegion(origin, region), IsNil) - c.Assert(checkStaleRegion(region, origin), NotNil) + region.GetRegionEpoch().ConfVer++ + c.Assert(checkStaleRegion(origin.GetMeta(), region.GetMeta()), IsNil) + c.Assert(checkStaleRegion(region.GetMeta(), origin.GetMeta()), NotNil) // (0, 1) v.s. (0, 0) - region.RegionEpoch.Version-- - c.Assert(checkStaleRegion(origin, region), IsNil) - c.Assert(checkStaleRegion(region, origin), NotNil) + region.GetRegionEpoch().Version-- + c.Assert(checkStaleRegion(origin.GetMeta(), region.GetMeta()), IsNil) + c.Assert(checkStaleRegion(region.GetMeta(), origin.GetMeta()), NotNil) } func mustSaveStores(c *C, s *core.Storage, n int) []*metapb.Store { diff --git a/server/core/basic_cluster.go b/server/core/basic_cluster.go index e765e4de0188..21dde25d3d24 100644 --- a/server/core/basic_cluster.go +++ b/server/core/basic_cluster.go @@ -257,7 +257,7 @@ func (bc *BasicCluster) TakeStore(storeID uint64) *StoreInfo { } // PutRegion put a region. -func (bc *BasicCluster) PutRegion(region *RegionInfo) []*metapb.Region { +func (bc *BasicCluster) PutRegion(region *RegionInfo) []*RegionInfo { bc.Lock() defer bc.Unlock() return bc.Regions.SetRegion(region) @@ -293,7 +293,7 @@ func (bc *BasicCluster) ScanRange(startKey, endKey []byte, limit int) []*RegionI } // GetOverlaps returns the regions which are overlapped with the specified region range. -func (bc *BasicCluster) GetOverlaps(region *RegionInfo) []*metapb.Region { +func (bc *BasicCluster) GetOverlaps(region *RegionInfo) []*RegionInfo { bc.RLock() defer bc.RUnlock() return bc.Regions.GetOverlaps(region) diff --git a/server/core/region.go b/server/core/region.go index 46e30a9dd168..60b585e9e9e8 100644 --- a/server/core/region.go +++ b/server/core/region.go @@ -492,7 +492,7 @@ func (r *RegionsInfo) GetRegion(regionID uint64) *RegionInfo { } // SetRegion sets the RegionInfo with regionID -func (r *RegionsInfo) SetRegion(region *RegionInfo) []*metapb.Region { +func (r *RegionsInfo) SetRegion(region *RegionInfo) []*RegionInfo { if origin := r.regions.Get(region.GetID()); origin != nil { r.RemoveRegion(origin) } @@ -510,16 +510,16 @@ func (r *RegionsInfo) TreeLength() int { } // GetOverlaps returns the regions which are overlapped with the specified region range. -func (r *RegionsInfo) GetOverlaps(region *RegionInfo) []*metapb.Region { - return r.tree.getOverlaps(region.meta) +func (r *RegionsInfo) GetOverlaps(region *RegionInfo) []*RegionInfo { + return r.tree.getOverlaps(region) } // AddRegion adds RegionInfo to regionTree and regionMap, also update leaders and followers by region peers -func (r *RegionsInfo) AddRegion(region *RegionInfo) []*metapb.Region { +func (r *RegionsInfo) AddRegion(region *RegionInfo) []*RegionInfo { // Add to tree and regions. - overlaps := r.tree.update(region.meta) + overlaps := r.tree.update(region) for _, item := range overlaps { - r.RemoveRegion(r.GetRegion(item.Id)) + r.RemoveRegion(r.GetRegion(item.GetID())) } r.regions.Put(region) @@ -573,7 +573,7 @@ func (r *RegionsInfo) AddRegion(region *RegionInfo) []*metapb.Region { // RemoveRegion removes RegionInfo from regionTree and regionMap func (r *RegionsInfo) RemoveRegion(region *RegionInfo) { // Remove from tree and regions. - r.tree.remove(region.meta) + r.tree.remove(region) r.regions.Delete(region.GetID()) // Remove from leaders and followers. for _, peer := range region.meta.GetPeers() { @@ -587,20 +587,20 @@ func (r *RegionsInfo) RemoveRegion(region *RegionInfo) { // SearchRegion searches RegionInfo from regionTree func (r *RegionsInfo) SearchRegion(regionKey []byte) *RegionInfo { - metaRegion := r.tree.search(regionKey) - if metaRegion == nil { + region := r.tree.search(regionKey) + if region == nil { return nil } - return r.GetRegion(metaRegion.GetId()) + return r.GetRegion(region.GetID()) } // SearchPrevRegion searches previous RegionInfo from regionTree func (r *RegionsInfo) SearchPrevRegion(regionKey []byte) *RegionInfo { - metaRegion := r.tree.searchPrev(regionKey) - if metaRegion == nil { + region := r.tree.searchPrev(regionKey) + if region == nil { return nil } - return r.GetRegion(metaRegion.GetId()) + return r.GetRegion(region.GetID()) } // GetRegions gets all RegionInfo from regionMap @@ -721,14 +721,14 @@ func (r *RegionsInfo) GetFollower(storeID uint64, regionID uint64) *RegionInfo { // `limit` regions. limit <= 0 means no limit. func (r *RegionsInfo) ScanRange(startKey, endKey []byte, limit int) []*RegionInfo { var res []*RegionInfo - r.tree.scanRange(startKey, func(meta *metapb.Region) bool { - if len(endKey) > 0 && bytes.Compare(meta.StartKey, endKey) >= 0 { + r.tree.scanRange(startKey, func(region *RegionInfo) bool { + if len(endKey) > 0 && bytes.Compare(region.GetStartKey(), endKey) >= 0 { return false } if limit > 0 && len(res) >= limit { return false } - res = append(res, r.GetRegion(meta.GetId())) + res = append(res, r.GetRegion(region.GetID())) return true }) return res @@ -736,20 +736,20 @@ func (r *RegionsInfo) ScanRange(startKey, endKey []byte, limit int) []*RegionInf // ScanRangeWithIterator scans from the first region containing or behind start key, // until iterator returns false. -func (r *RegionsInfo) ScanRangeWithIterator(startKey []byte, iterator func(metaRegion *metapb.Region) bool) { +func (r *RegionsInfo) ScanRangeWithIterator(startKey []byte, iterator func(region *RegionInfo) bool) { r.tree.scanRange(startKey, iterator) } // GetAdjacentRegions returns region's info that is adjacent with specific region func (r *RegionsInfo) GetAdjacentRegions(region *RegionInfo) (*RegionInfo, *RegionInfo) { - metaPrev, metaNext := r.tree.getAdjacentRegions(region.meta) + p, n := r.tree.getAdjacentRegions(region) var prev, next *RegionInfo // check key to avoid key range hole - if metaPrev != nil && bytes.Equal(metaPrev.region.EndKey, region.meta.StartKey) { - prev = r.GetRegion(metaPrev.region.GetId()) + if p != nil && bytes.Equal(p.region.GetEndKey(), region.GetStartKey()) { + prev = r.GetRegion(p.region.GetID()) } - if metaNext != nil && bytes.Equal(region.meta.EndKey, metaNext.region.StartKey) { - next = r.GetRegion(metaNext.region.GetId()) + if n != nil && bytes.Equal(region.GetEndKey(), n.region.GetStartKey()) { + next = r.GetRegion(n.region.GetID()) } return prev, next } diff --git a/server/core/region_storage.go b/server/core/region_storage.go index dd7b5db3f53a..43dc21189693 100644 --- a/server/core/region_storage.go +++ b/server/core/region_storage.go @@ -119,7 +119,7 @@ func deleteRegion(kv kv.Base, region *metapb.Region) error { return kv.Remove(regionPath(region.GetId())) } -func loadRegions(kv kv.Base, f func(region *RegionInfo) []*metapb.Region) error { +func loadRegions(kv kv.Base, f func(region *RegionInfo) []*RegionInfo) error { nextID := uint64(0) endKey := regionPath(math.MaxUint64) @@ -146,7 +146,7 @@ func loadRegions(kv kv.Base, f func(region *RegionInfo) []*metapb.Region) error nextID = region.GetId() + 1 overlaps := f(NewRegionInfo(region, nil)) for _, item := range overlaps { - if err := deleteRegion(kv, item); err != nil { + if err := deleteRegion(kv, item.GetMeta()); err != nil { return err } } diff --git a/server/core/region_tree.go b/server/core/region_tree.go index 3de33c789ad6..233a6803baa4 100644 --- a/server/core/region_tree.go +++ b/server/core/region_tree.go @@ -24,7 +24,7 @@ import ( var _ btree.Item = ®ionItem{} type regionItem struct { - region *metapb.Region + region *RegionInfo } // Less returns true if the region start key is less than the other. @@ -58,7 +58,7 @@ func (t *regionTree) length() int { } // getOverlaps gets the regions which are overlapped with the specified region range. -func (t *regionTree) getOverlaps(region *metapb.Region) []*metapb.Region { +func (t *regionTree) getOverlaps(region *RegionInfo) []*RegionInfo { item := ®ionItem{region: region} // note that find() gets the last item that is less or equal than the region. @@ -72,10 +72,10 @@ func (t *regionTree) getOverlaps(region *metapb.Region) []*metapb.Region { result = item } - var overlaps []*metapb.Region + var overlaps []*RegionInfo t.tree.AscendGreaterOrEqual(result, func(i btree.Item) bool { over := i.(*regionItem) - if len(region.EndKey) > 0 && bytes.Compare(region.EndKey, over.region.StartKey) <= 0 { + if len(region.GetEndKey()) > 0 && bytes.Compare(region.GetEndKey(), over.region.GetStartKey()) <= 0 { return false } overlaps = append(overlaps, over.region) @@ -87,13 +87,13 @@ func (t *regionTree) getOverlaps(region *metapb.Region) []*metapb.Region { // 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(region *metapb.Region) []*metapb.Region { +func (t *regionTree) update(region *RegionInfo) []*RegionInfo { overlaps := t.getOverlaps(region) for _, item := range overlaps { log.Debug("overlapping region", - zap.Uint64("region-id", item.GetId()), - zap.Stringer("delete-region", RegionToHexMeta(item)), - zap.Stringer("update-region", RegionToHexMeta(region))) + zap.Uint64("region-id", item.GetID()), + zap.Stringer("delete-region", RegionToHexMeta(item.GetMeta())), + zap.Stringer("update-region", RegionToHexMeta(region.GetMeta()))) t.tree.Delete(®ionItem{item}) } @@ -105,9 +105,9 @@ func (t *regionTree) update(region *metapb.Region) []*metapb.Region { // remove removes a region if the region is in the tree. // It will do nothing if it cannot find the region or the found region // is not the same with the region. -func (t *regionTree) remove(region *metapb.Region) { +func (t *regionTree) remove(region *RegionInfo) { result := t.find(region) - if result == nil || result.region.GetId() != region.GetId() { + if result == nil || result.region.GetID() != region.GetID() { return } @@ -115,8 +115,8 @@ func (t *regionTree) remove(region *metapb.Region) { } // search returns a region that contains the key. -func (t *regionTree) search(regionKey []byte) *metapb.Region { - region := &metapb.Region{StartKey: regionKey} +func (t *regionTree) search(regionKey []byte) *RegionInfo { + region := &RegionInfo{meta: &metapb.Region{StartKey: regionKey}} result := t.find(region) if result == nil { return nil @@ -125,8 +125,8 @@ func (t *regionTree) search(regionKey []byte) *metapb.Region { } // searchPrev returns the previous region of the region where the regionKey is located. -func (t *regionTree) searchPrev(regionKey []byte) *metapb.Region { - curRegion := &metapb.Region{StartKey: regionKey} +func (t *regionTree) searchPrev(regionKey []byte) *RegionInfo { + curRegion := &RegionInfo{meta: &metapb.Region{StartKey: regionKey}} curRegionItem := t.find(curRegion) if curRegionItem == nil { return nil @@ -135,7 +135,7 @@ func (t *regionTree) searchPrev(regionKey []byte) *metapb.Region { if prevRegionItem == nil { return nil } - if !bytes.Equal(prevRegionItem.region.EndKey, curRegionItem.region.StartKey) { + if !bytes.Equal(prevRegionItem.region.GetEndKey(), curRegionItem.region.GetStartKey()) { return nil } return prevRegionItem.region @@ -143,7 +143,7 @@ func (t *regionTree) searchPrev(regionKey []byte) *metapb.Region { // find is a helper function to find an item that contains the regions start // key. -func (t *regionTree) find(region *metapb.Region) *regionItem { +func (t *regionTree) find(region *RegionInfo) *regionItem { item := ®ionItem{region: region} var result *regionItem @@ -152,7 +152,7 @@ func (t *regionTree) find(region *metapb.Region) *regionItem { return false }) - if result == nil || !result.Contains(region.StartKey) { + if result == nil || !result.Contains(region.GetStartKey()) { return nil } @@ -161,30 +161,30 @@ func (t *regionTree) find(region *metapb.Region) *regionItem { // scanRage scans from the first region containing or behind the start key // until f return false -func (t *regionTree) scanRange(startKey []byte, f func(*metapb.Region) bool) { - region := &metapb.Region{StartKey: startKey} +func (t *regionTree) scanRange(startKey []byte, f func(*RegionInfo) bool) { + region := &RegionInfo{meta: &metapb.Region{StartKey: startKey}} // find if there is a region with key range [s, d), s < startKey < d startItem := t.find(region) if startItem == nil { - startItem = ®ionItem{region: &metapb.Region{StartKey: startKey}} + startItem = ®ionItem{region: &RegionInfo{meta: &metapb.Region{StartKey: startKey}}} } t.tree.AscendGreaterOrEqual(startItem, func(item btree.Item) bool { return f(item.(*regionItem).region) }) } -func (t *regionTree) getAdjacentRegions(region *metapb.Region) (*regionItem, *regionItem) { - item := ®ionItem{region: &metapb.Region{StartKey: region.StartKey}} +func (t *regionTree) getAdjacentRegions(region *RegionInfo) (*regionItem, *regionItem) { + item := ®ionItem{region: &RegionInfo{meta: &metapb.Region{StartKey: region.GetStartKey()}}} var prev, next *regionItem t.tree.AscendGreaterOrEqual(item, func(i btree.Item) bool { - if bytes.Equal(item.region.StartKey, i.(*regionItem).region.StartKey) { + if bytes.Equal(item.region.GetStartKey(), i.(*regionItem).region.GetStartKey()) { return true } next = i.(*regionItem) return false }) t.tree.DescendLessOrEqual(item, func(i btree.Item) bool { - if bytes.Equal(item.region.StartKey, i.(*regionItem).region.StartKey) { + if bytes.Equal(item.region.GetStartKey(), i.(*regionItem).region.GetStartKey()) { return true } prev = i.(*regionItem) diff --git a/server/core/region_tree_test.go b/server/core/region_tree_test.go index 84b7eb7a2d28..2817aa170b0c 100644 --- a/server/core/region_tree_test.go +++ b/server/core/region_tree_test.go @@ -118,10 +118,10 @@ func (s *testRegionSuite) TestRegionTree(c *C) { c.Assert(tree.search([]byte("a")), IsNil) - regionA := NewRegion([]byte("a"), []byte("b")) - regionB := NewRegion([]byte("b"), []byte("c")) - regionC := NewRegion([]byte("c"), []byte("d")) - regionD := NewRegion([]byte("d"), []byte{}) + regionA := NewTestRegionInfo([]byte("a"), []byte("b")) + regionB := NewTestRegionInfo([]byte("b"), []byte("c")) + regionC := NewTestRegionInfo([]byte("c"), []byte("d")) + regionD := NewTestRegionInfo([]byte("d"), []byte{}) tree.update(regionA) tree.update(regionC) @@ -168,7 +168,7 @@ func (s *testRegionSuite) TestRegionTree(c *C) { tree.update(region0) c.Assert(tree.search([]byte{}), Equals, region0) anotherRegion0 := newRegionItem([]byte{}, []byte("a")).region - anotherRegion0.Id = 123 + anotherRegion0.meta.Id = 123 tree.remove(anotherRegion0) c.Assert(tree.search([]byte{}), Equals, region0) @@ -192,12 +192,12 @@ func (s *testRegionSuite) TestRegionTree(c *C) { c.Assert(tree.search([]byte("e")), Equals, regionE) } -func updateRegions(c *C, tree *regionTree, regions []*metapb.Region) { +func updateRegions(c *C, tree *regionTree, regions []*RegionInfo) { for _, region := range regions { tree.update(region) - c.Assert(tree.search(region.StartKey), Equals, region) - if len(region.EndKey) > 0 { - end := region.EndKey[0] + c.Assert(tree.search(region.GetStartKey()), Equals, region) + if len(region.GetEndKey()) > 0 { + end := region.GetEndKey()[0] c.Assert(tree.search([]byte{end - 1}), Equals, region) c.Assert(tree.search([]byte{end + 1}), Not(Equals), region) } @@ -206,7 +206,7 @@ func updateRegions(c *C, tree *regionTree, regions []*metapb.Region) { func (s *testRegionSuite) TestRegionTreeSplitAndMerge(c *C) { tree := newRegionTree() - regions := []*metapb.Region{newRegionItem([]byte{}, []byte{}).region} + regions := []*RegionInfo{newRegionItem([]byte{}, []byte{}).region} // Byte will underflow/overflow if n > 7. n := 7 @@ -235,13 +235,13 @@ func (s *testRegionSuite) TestRegionTreeSplitAndMerge(c *C) { } func newRegionItem(start, end []byte) *regionItem { - return ®ionItem{region: NewRegion(start, end)} + return ®ionItem{region: NewTestRegionInfo(start, end)} } func BenchmarkRegionTreeUpdate(b *testing.B) { tree := newRegionTree() for i := 0; i < b.N; i++ { - item := &metapb.Region{StartKey: []byte(fmt.Sprintf("%20d", i)), EndKey: []byte(fmt.Sprintf("%20d", i+1))} + item := &RegionInfo{meta: &metapb.Region{StartKey: []byte(fmt.Sprintf("%20d", i)), EndKey: []byte(fmt.Sprintf("%20d", i+1))}} tree.update(item) } } diff --git a/server/core/storage.go b/server/core/storage.go index a937d5830af0..54e393a35fd5 100644 --- a/server/core/storage.go +++ b/server/core/storage.go @@ -129,7 +129,7 @@ func (s *Storage) LoadRegion(regionID uint64, region *metapb.Region) (bool, erro } // LoadRegions loads all regions from storage to RegionsInfo. -func (s *Storage) LoadRegions(f func(region *RegionInfo) []*metapb.Region) error { +func (s *Storage) LoadRegions(f func(region *RegionInfo) []*RegionInfo) error { if atomic.LoadInt32(&s.useRegionStorage) > 0 { return loadRegions(s.regionStorage, f) } diff --git a/server/core/test_util.go b/server/core/test_util.go index f7b79fd1f5f3..d8bfc0bb1e06 100644 --- a/server/core/test_util.go +++ b/server/core/test_util.go @@ -16,68 +16,67 @@ package core import ( "math" - "github.com/gogo/protobuf/proto" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" ) -// SplitRegions split a set of metapb.Region by the middle of regionKey -func SplitRegions(regions []*metapb.Region) []*metapb.Region { - results := make([]*metapb.Region, 0, len(regions)*2) +// SplitRegions split a set of RegionInfo by the middle of regionKey +func SplitRegions(regions []*RegionInfo) []*RegionInfo { + results := make([]*RegionInfo, 0, len(regions)*2) for _, region := range regions { start, end := byte(0), byte(math.MaxUint8) - if len(region.StartKey) > 0 { - start = region.StartKey[0] + if len(region.GetStartKey()) > 0 { + start = region.GetStartKey()[0] } - if len(region.EndKey) > 0 { - end = region.EndKey[0] + if len(region.GetEndKey()) > 0 { + end = region.GetEndKey()[0] } middle := []byte{start/2 + end/2} - left := proto.Clone(region).(*metapb.Region) - left.Id = region.Id + uint64(len(regions)) - left.EndKey = middle - left.RegionEpoch.Version++ - right := proto.Clone(region).(*metapb.Region) - right.Id = region.Id + uint64(len(regions)*2) - right.StartKey = middle - right.RegionEpoch.Version++ + left := region.Clone() + left.meta.Id = region.GetID() + uint64(len(regions)) + left.meta.EndKey = middle + left.meta.RegionEpoch.Version++ + right := region.Clone() + right.meta.Id = region.GetID() + uint64(len(regions)*2) + right.meta.StartKey = middle + right.meta.RegionEpoch.Version++ results = append(results, left, right) } return results } -// MergeRegions merge a set of metapb.Region by regionKey -func MergeRegions(regions []*metapb.Region) []*metapb.Region { - results := make([]*metapb.Region, 0, len(regions)/2) +// MergeRegions merge a set of RegionInfo by regionKey +func MergeRegions(regions []*RegionInfo) []*RegionInfo { + results := make([]*RegionInfo, 0, len(regions)/2) for i := 0; i < len(regions); i += 2 { left := regions[i] right := regions[i] if i+1 < len(regions) { right = regions[i+1] } - region := &metapb.Region{ - Id: left.Id + uint64(len(regions)), - StartKey: left.StartKey, - EndKey: right.EndKey, - } - if left.RegionEpoch.Version > right.RegionEpoch.Version { - region.RegionEpoch = left.RegionEpoch + region := &RegionInfo{meta: &metapb.Region{ + Id: left.GetID() + uint64(len(regions)), + StartKey: left.GetStartKey(), + EndKey: right.GetEndKey(), + }} + if left.GetRegionEpoch().GetVersion() > right.GetRegionEpoch().GetVersion() { + region.meta.RegionEpoch = left.GetRegionEpoch() } else { - region.RegionEpoch = right.RegionEpoch + region.meta.RegionEpoch = right.GetRegionEpoch() } - region.RegionEpoch.Version++ + region.meta.RegionEpoch.Version++ results = append(results, region) } return results } -// NewRegion create a metapb.Region -func NewRegion(start, end []byte) *metapb.Region { - return &metapb.Region{ +// NewTestRegionInfo creates a RegionInfo for test. +func NewTestRegionInfo(start, end []byte) *RegionInfo { + return &RegionInfo{meta: &metapb.Region{ StartKey: start, EndKey: end, RegionEpoch: &metapb.RegionEpoch{}, - } + }} } // NewStoreInfoWithLabel is create a store with specified labels.