diff --git a/config/config.go b/config/config.go index 89e4dd2729..5951ad83b8 100644 --- a/config/config.go +++ b/config/config.go @@ -741,6 +741,14 @@ func (c *Config) Load(confFile string) error { return err } +// MinDDLLease returns the minimum valid value of the DDL lease. +func (c *Config) MinDDLLease() time.Duration { + if c.Store == "tikv" { + return time.Second + } + return time.Duration(0) +} + // Valid checks if this config is valid. func (c *Config) Valid() error { if c.Log.EnableErrorStack == c.Log.DisableErrorStack && c.Log.EnableErrorStack != nbUnset { diff --git a/config/config_test.go b/config/config_test.go index 454ad5428f..0b9661cf43 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -19,6 +19,7 @@ import ( "path/filepath" "runtime" "testing" + "time" "github.com/BurntSushi/toml" . "github.com/pingcap/check" @@ -326,6 +327,11 @@ xkNuJ2BlEGkwWLiRbKy1lNBBFUXKuhh3L/EIY10WTnr3TQzeL6H1 c.Assert(tlsConfig, NotNil) c.Assert(os.Remove(certFile), IsNil) c.Assert(os.Remove(keyFile), IsNil) + + // for MinDDLLease + c.Assert(conf.MinDDLLease(), Equals, time.Duration(0)) + conf.Store = "tikv" + c.Assert(conf.MinDDLLease(), Equals, time.Second) } func (s *testConfigSuite) TestConfigDiff(c *C) { diff --git a/tidb-server/main.go b/tidb-server/main.go index 9b56415605..2eb7826ad5 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -268,9 +268,9 @@ func setupBinlogClient() { } if len(cfg.Binlog.BinlogSocket) == 0 { - client, err = pumpcli.NewPumpsClient(cfg.Path, cfg.Binlog.Strategy, parseDuration(cfg.Binlog.WriteTimeout), securityOption) + client, err = pumpcli.NewPumpsClient(cfg.Path, cfg.Binlog.Strategy, parseDuration(cfg.Binlog.WriteTimeout, 0), securityOption) } else { - client, err = pumpcli.NewLocalPumpsClient(cfg.Path, cfg.Binlog.BinlogSocket, parseDuration(cfg.Binlog.WriteTimeout), securityOption) + client, err = pumpcli.NewLocalPumpsClient(cfg.Path, cfg.Binlog.BinlogSocket, parseDuration(cfg.Binlog.WriteTimeout, 0), securityOption) } terror.MustNil(err) @@ -320,13 +320,16 @@ func instanceName() string { } // parseDuration parses lease argument string. -func parseDuration(lease string) time.Duration { +func parseDuration(lease string, minVal time.Duration) time.Duration { dur, err := time.ParseDuration(lease) if err != nil { dur, err = time.ParseDuration(lease + "s") } - if err != nil || dur < 0 { - log.Fatal("invalid lease duration", zap.String("lease", lease)) + if minVal < 0 { + minVal = 0 + } + if err != nil || dur < minVal { + log.Fatal("invalid lease duration", zap.Duration("min value", minVal), zap.String("lease", lease)) } return dur } @@ -526,12 +529,12 @@ func overrideConfig() { } func setGlobalVars() { - ddlLeaseDuration := parseDuration(cfg.Lease) + ddlLeaseDuration := parseDuration(cfg.Lease, cfg.MinDDLLease()) session.SetSchemaLease(ddlLeaseDuration) runtime.GOMAXPROCS(int(cfg.Performance.MaxProcs)) - statsLeaseDuration := parseDuration(cfg.Performance.StatsLease) + statsLeaseDuration := parseDuration(cfg.Performance.StatsLease, 0) session.SetStatsLease(statsLeaseDuration) - bindinfo.Lease = parseDuration(cfg.Performance.BindInfoLease) + bindinfo.Lease = parseDuration(cfg.Performance.BindInfoLease, 0) domain.RunAutoAnalyze = cfg.Performance.RunAutoAnalyze statistics.FeedbackProbability.Store(cfg.Performance.FeedbackProbability) handle.MaxQueryFeedbackCount.Store(int64(cfg.Performance.QueryFeedbackLimit)) @@ -573,7 +576,7 @@ func setGlobalVars() { } } - tikv.CommitMaxBackoff = int(parseDuration(cfg.TiKVClient.CommitTimeout).Seconds() * 1000) + tikv.CommitMaxBackoff = int(parseDuration(cfg.TiKVClient.CommitTimeout, 0).Seconds() * 1000) tikv.RegionCacheTTLSec = int64(cfg.TiKVClient.RegionCacheTTL) domainutil.RepairInfo.SetRepairMode(cfg.RepairMode) domainutil.RepairInfo.SetRepairTableList(cfg.RepairTableList)