From 6f9f9951006917735dc4dfa4a3c9ba151185b31d Mon Sep 17 00:00:00 2001 From: yusing Date: Tue, 16 Dec 2025 15:04:21 +0800 Subject: [PATCH] fix(config): nil panic introduced in ff934a4bb2911f5fa3c23d8fe6fea252d881fdc3; remove duplicated log --- internal/config/events.go | 8 ++------ internal/config/types/state.go | 2 +- internal/watcher/health/monitor/monitor.go | 10 +--------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/internal/config/events.go b/internal/config/events.go index c64f4c25..5bccc603 100644 --- a/internal/config/events.go +++ b/internal/config/events.go @@ -52,15 +52,12 @@ func logNotifyWarn(action string, err error) { }) } -var nilState *state - func Load() error { if HasState() { panic(errors.New("config already loaded")) } state := NewState() config.WorkingState.Store(state) - defer config.WorkingState.Store(nilState) cfgWatcher = watcher.NewConfigFileWatcher(common.ConfigFileName) @@ -88,11 +85,11 @@ func Reload() gperr.Error { newState := NewState() config.WorkingState.Store(newState) - defer config.WorkingState.Store(nilState) err := newState.InitFromFile(common.ConfigPath) if err != nil { newState.Task().FinishAndWait(err) + config.WorkingState.Store(GetState()) logNotifyError("reload", err) return gperr.New(ansi.Warning("using last config")).With(err) } @@ -106,7 +103,6 @@ func Reload() gperr.Error { SetState(newState) if err := newState.StartProviders(); err != nil { - gperr.LogWarn("start providers error", err) logNotifyError("start providers", err) return nil // continue } @@ -121,7 +117,7 @@ func WatchChanges() { configEventFlushInterval, OnConfigChange, func(err gperr.Error) { - gperr.LogError("config reload error", err) + logNotifyError("config reload", err) }, ) eventQueue.Start(cfgWatcher.Events(t.Context())) diff --git a/internal/config/types/state.go b/internal/config/types/state.go index bbd5d870..83632350 100644 --- a/internal/config/types/state.go +++ b/internal/config/types/state.go @@ -36,7 +36,7 @@ type State interface { // could be nil before first call on Load var ActiveState synk.Value[State] -// nil-safe while loading config, nil otherwise +// working state while loading config, same as ActiveState after successful load var WorkingState synk.Value[State] var ErrConfigChanged = errors.New("config changed") diff --git a/internal/watcher/health/monitor/monitor.go b/internal/watcher/health/monitor/monitor.go index 79499b06..6afcac01 100644 --- a/internal/watcher/health/monitor/monitor.go +++ b/internal/watcher/health/monitor/monitor.go @@ -74,15 +74,7 @@ func NewMonitor(r types.Route) types.HealthMonCheck { } func newMonitor(u *url.URL, cfg types.HealthCheckConfig, healthCheckFunc HealthCheckFunc) *monitor { - state := config.WorkingState.Load() - if state == nil { - state = config.ActiveState.Load() - } - if state != nil { - cfg.ApplyDefaults(state.Value().Defaults.HealthCheck) - } else { - cfg.ApplyDefaults(types.HealthCheckConfig{}) // use config defaults - } + cfg.ApplyDefaults(config.WorkingState.Load().Value().Defaults.HealthCheck) mon := &monitor{ config: cfg, checkHealth: healthCheckFunc,