diff --git a/pkg/typeutil/size_test.go b/pkg/typeutil/size_test.go index eae092cdb5c..5d66f43d5a4 100644 --- a/pkg/typeutil/size_test.go +++ b/pkg/typeutil/size_test.go @@ -17,6 +17,7 @@ package typeutil import ( "encoding/json" + "github.com/docker/go-units" . "github.com/pingcap/check" ) @@ -41,23 +42,31 @@ func (s *testSizeSuite) TestJSON(c *C) { } func (s *testSizeSuite) TestParseMbFromText(c *C) { + const defaultValue = 2 + testdata := []struct { body []string size uint64 }{{ body: []string{"10Mib", "10MiB", "10M", "10MB"}, - size: uint64(10), + size: 10, }, { body: []string{"10GiB", "10Gib", "10G", "10GB"}, - size: uint64(10 * 1024), + size: 10 * units.GiB / units.MiB, + }, { + body: []string{"1024KiB", "1048576"}, + size: 1, + }, { + body: []string{"100KiB", "1023KiB", "1048575", "0"}, + size: 0, }, { body: []string{"10yiB", "10aib"}, - size: uint64(1), + size: defaultValue, }} for _, t := range testdata { for _, b := range t.body { - c.Assert(int(ParseMBFromText(b, 1)), Equals, int(t.size)) + c.Assert(ParseMBFromText(b, defaultValue), Equals, t.size) } } } diff --git a/server/config/store_config.go b/server/config/store_config.go index 27fc456dd08..12445378192 100644 --- a/server/config/store_config.go +++ b/server/config/store_config.go @@ -129,9 +129,14 @@ func (c *StoreConfig) CheckRegionSize(size, mergeSize uint64) error { if size < c.GetRegionMaxSize() { return nil } - + // This could happen when the region split size is set to a value less than 1MiB, + // which is a very extreme case, we just pass the check here to prevent panic. + regionSplitSize := c.GetRegionSplitSize() + if regionSplitSize == 0 { + return nil + } // the smallest of the split regions can not be merge again, so it's size should less merge size. - if smallSize := size % c.GetRegionSplitSize(); smallSize <= mergeSize && smallSize != 0 { + if smallSize := size % regionSplitSize; smallSize <= mergeSize && smallSize != 0 { log.Debug("region size is too small", zap.Uint64("size", size), zap.Uint64("merge-size", mergeSize), zap.Uint64("small-size", smallSize)) return errs.ErrCheckerMergeAgain.FastGenByArgs("the smallest region of the split regions is less than max-merge-region-size, " + "it will be merged again") diff --git a/server/config/store_config_test.go b/server/config/store_config_test.go index 478e1ebb3d7..821d5825610 100644 --- a/server/config/store_config_test.go +++ b/server/config/store_config_test.go @@ -147,4 +147,8 @@ func (t *testTiKVConfigSuite) TestMergeCheck(c *C) { c.Assert(config.CheckRegionKeys(v.keys, v.mergeKeys), NotNil) } } + // Test CheckRegionSize when the region split size is 0. + config.RegionSplitSize = "100KiB" + c.Assert(config.GetRegionSplitSize(), Equals, uint64(0)) + c.Assert(config.CheckRegionSize(defaultRegionMaxSize, 50), IsNil) }