Skip to content

Commit

Permalink
core: change scoreV2 to adapt the higher disk capacity and amp . (tik…
Browse files Browse the repository at this point in the history
…v#4837) (tikv#5769)

close tikv#4805, ref tikv#4837

Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
Signed-off-by: bufferflies <1045931706@qq.com>

Co-authored-by: buffer <1045931706@qq.com>
Co-authored-by: bufferflies <1045931706@qq.com>
  • Loading branch information
ti-chi-bot and bufferflies committed Dec 9, 2022
1 parent d6d91a6 commit 1ced7dd
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 2 deletions.
2 changes: 1 addition & 1 deletion server/core/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ func (s *StoreInfo) regionScoreV2(delta int64, deviation int, lowSpaceRatio floa
var (
K, M float64 = 1, 256 // Experience value to control the weight of the available influence on score
F float64 = 50 // Experience value to prevent some nodes from running out of disk space prematurely.
B = 1e7
B = 1e10
)
F = math.Max(F, C*(1-lowSpaceRatio))
var score float64
Expand Down
50 changes: 49 additions & 1 deletion server/core/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,5 +124,53 @@ func (s *testStoreSuite) TestLowSpaceRatio(c *C) {
store.regionCount = 31
c.Assert(store.IsLowSpace(0.8), Equals, true)
store.rawStats.Available = store.rawStats.Capacity >> 2
c.Assert(store.IsLowSpace(0.8), Equals, false)
c.Assert(store.IsLowSpace(0.8), IsFalse)
}

func (s *testStoreSuite) TestLowSpaceScoreV2(c *C) {
testdata := []struct {
bigger *StoreInfo
small *StoreInfo
}{{
// store1 and store2 has same store available ratio and store1 less 50gb
bigger: NewStoreInfoWithAvailable(1, 20*gb, 100*gb, 1.4),
small: NewStoreInfoWithAvailable(2, 200*gb, 1000*gb, 1.4),
}, {
// store1 and store2 has same available space and less than 50gb
bigger: NewStoreInfoWithAvailable(1, 10*gb, 1000*gb, 1.4),
small: NewStoreInfoWithAvailable(2, 10*gb, 100*gb, 1.4),
}, {
// store1 and store2 has same available ratio less than 0.2
bigger: NewStoreInfoWithAvailable(1, 20*gb, 1000*gb, 1.4),
small: NewStoreInfoWithAvailable(2, 10*gb, 500*gb, 1.4),
}, {
// store1 and store2 has same available ratio
// but the store1 ratio less than store2 ((50-10)/50=0.8<(200-100)/200=0.5)
bigger: NewStoreInfoWithAvailable(1, 10*gb, 100*gb, 1.4),
small: NewStoreInfoWithAvailable(2, 100*gb, 1000*gb, 1.4),
}, {
// store1 and store2 has same usedSize and capacity
// but the bigger's amp is bigger
bigger: NewStoreInfoWithAvailable(1, 10*gb, 100*gb, 1.5),
small: NewStoreInfoWithAvailable(2, 10*gb, 100*gb, 1.4),
}, {
// store1 and store2 has same capacity and regionSize(40g)
// but store1 has less available space size
bigger: NewStoreInfoWithAvailable(1, 60*gb, 100*gb, 1),
small: NewStoreInfoWithAvailable(2, 80*gb, 100*gb, 2),
}, {
// store1 and store2 has same capacity and store2 (40g) has twice usedSize than store1 (20g)
// but store1 has higher amp, so store1(60g) has more regionSize (40g)
bigger: NewStoreInfoWithAvailable(1, 80*gb, 100*gb, 3),
small: NewStoreInfoWithAvailable(2, 60*gb, 100*gb, 1),
}, {
// store1's capacity is less than store2's capacity, but store2 has more available space,
bigger: NewStoreInfoWithAvailable(1, 2*gb, 100*gb, 3),
small: NewStoreInfoWithAvailable(2, 100*gb, 10*1000*gb, 3),
}}
for _, v := range testdata {
score1 := v.bigger.regionScoreV2(0, 0.0, 0.8)
score2 := v.small.regionScoreV2(0, 0.0, 0.8)
c.Assert(score1, Greater, score2)
}
}
18 changes: 18 additions & 0 deletions server/core/test_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,24 @@ func NewTestRegionInfo(start, end []byte) *RegionInfo {
}}
}

// NewStoreInfoWithAvailable is created with available and capacity
func NewStoreInfoWithAvailable(id, available, capacity uint64, amp float64) *StoreInfo {
stats := &pdpb.StoreStats{}
stats.Capacity = capacity
stats.Available = available
usedSize := capacity - available
regionSize := (float64(usedSize) * amp) / mb
store := NewStoreInfo(
&metapb.Store{
Id: id,
},
SetStoreStats(stats),
SetRegionCount(int(regionSize/96)),
SetRegionSize(int64(regionSize)),
)
return store
}

// NewStoreInfoWithLabel is create a store with specified labels.
func NewStoreInfoWithLabel(id uint64, regionCount int, labels map[string]string) *StoreInfo {
storeLabels := make([]*metapb.StoreLabel, 0, len(labels))
Expand Down

0 comments on commit 1ced7dd

Please sign in to comment.