diff options
author | Noorain Panjwani <noorain.panjwani@gmail.com> | 2022-03-02 00:02:33 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-01 11:32:33 -0700 |
commit | 7ea5b2a818ff56f650c537be83c4230166f90a14 (patch) | |
tree | 0dcc35ee45b628279c66c5cf16464d2b4947132d | |
parent | 186fdba916a128fc2a837852d2ab04ac2efba413 (diff) |
core: Config load interval only reloads if changed (#4603)
-rw-r--r-- | caddy.go | 17 |
1 files changed, 15 insertions, 2 deletions
@@ -481,11 +481,23 @@ func finishSettingUp(ctx Context, cfg *Config) error { return fmt.Errorf("loading config loader module: %s", err) } runLoadedConfig := func(config []byte) { - Log().Info("applying dynamically-loaded config", zap.String("loader_module", val.(Module).CaddyModule().ID.Name()), zap.Int("pull_interval", int(cfg.Admin.Config.LoadInterval))) currentCfgMu.Lock() + defer currentCfgMu.Unlock() + + // Skip if there is no change in the config + if bytes.Equal(rawCfgJSON, config) { + return + } + + Log().Info("applying dynamically-loaded config", zap.String("loader_module", val.(Module).CaddyModule().ID.Name()), zap.Int("pull_interval", int(cfg.Admin.Config.LoadInterval))) err := unsyncedDecodeAndRun(config, false) - currentCfgMu.Unlock() if err == nil { + // success, so update our stored copy of the encoded + // config to keep it consistent with what caddy is now + // running (storing an encoded copy is not strictly + // necessary, but avoids an extra json.Marshal for + // each config change) + rawCfgJSON = config Log().Info("dynamically-loaded config applied successfully") } else { Log().Error("running dynamically-loaded config failed", zap.Error(err)) @@ -503,6 +515,7 @@ func finishSettingUp(ctx Context, cfg *Config) error { Log().Error("loading dynamic config failed", zap.Error(err)) return } + runLoadedConfig(loadedConfig) case <-ctx.Done(): if !timer.Stop() { |