diff --git a/server/core/store.go b/server/core/store.go index 5e22b9ec0ab..12972f38229 100644 --- a/server/core/store.go +++ b/server/core/store.go @@ -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 diff --git a/server/core/store_test.go b/server/core/store_test.go index d377506a629..57530396cde 100644 --- a/server/core/store_test.go +++ b/server/core/store_test.go @@ -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) + } } diff --git a/server/core/test_util.go b/server/core/test_util.go index 77e9444651b..8444c0c32f8 100644 --- a/server/core/test_util.go +++ b/server/core/test_util.go @@ -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))