diff --git a/server/config.go b/server/config.go index bdfce016991..2eada20a6e7 100644 --- a/server/config.go +++ b/server/config.go @@ -316,9 +316,27 @@ func (m *configMetaData) Child(path ...string) *configMetaData { } } +func (m *configMetaData) CheckUndecoded() error { + if m.meta == nil { + return nil + } + undecoded := m.meta.Undecoded() + if len(undecoded) == 0 { + return nil + } + errInfo := "Config contains undefined item: " + for _, key := range undecoded { + errInfo += key.String() + ", " + } + return errors.New(errInfo[:len(errInfo)-2]) +} + // Adjust is used to adjust the PD configurations. func (c *Config) Adjust(meta *toml.MetaData) error { configMetaData := newConfigMetadata(meta) + if err := configMetaData.CheckUndecoded(); err != nil { + return err + } if c.Name == "" { hostname, err := os.Hostname() diff --git a/server/config_test.go b/server/config_test.go index d67e6aaf029..6af01dabafc 100644 --- a/server/config_test.go +++ b/server/config_test.go @@ -114,4 +114,19 @@ leader-schedule-limit = 0 // When undefined, use default values. c.Assert(cfg.PreVote, IsTrue) c.Assert(cfg.Schedule.MaxMergeRegionKeys, Equals, uint64(defaultMaxMergeRegionKeys)) + + // Check undefined config fields + cfgData = ` +type = "pd" +name = "" +lease = 0 + +[schedule] +type = "random-merge" +` + cfg = NewConfig() + meta, err = toml.Decode(cfgData, &cfg) + c.Assert(err, IsNil) + err = cfg.Adjust(&meta) + c.Assert(err, NotNil) } diff --git a/server/coordinator.go b/server/coordinator.go index 396163a9335..b7d4c824b53 100644 --- a/server/coordinator.go +++ b/server/coordinator.go @@ -199,12 +199,11 @@ func (c *coordinator) run() { } s, err := schedule.CreateScheduler(schedulerCfg.Type, c.opController, schedulerCfg.Args...) if err != nil { - log.Errorf("can not create scheduler %s: %v", schedulerCfg.Type, err) - } else { - log.Infof("create scheduler %s", s.GetName()) - if err = c.addScheduler(s, schedulerCfg.Args...); err != nil { - log.Errorf("can not add scheduler %s: %v", s.GetName(), err) - } + log.Fatalf("can not create scheduler %s: %v", schedulerCfg.Type, err) + } + log.Infof("create scheduler %s", s.GetName()) + if err = c.addScheduler(s, schedulerCfg.Args...); err != nil { + log.Errorf("can not add scheduler %s: %v", s.GetName(), err) } // only record valid scheduler config