From 2e411373a2a155feac64952f168382c76f01885a Mon Sep 17 00:00:00 2001 From: yusing Date: Fri, 10 Oct 2025 21:46:02 +0800 Subject: [PATCH] fix(config): failed reload should not start providers in new state --- internal/config/events.go | 10 ++++++++-- internal/config/state.go | 22 ++++++++++------------ internal/config/types/state.go | 1 + 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/internal/config/events.go b/internal/config/events.go index 6aa6e54f..79296f89 100644 --- a/internal/config/events.go +++ b/internal/config/events.go @@ -39,12 +39,12 @@ func Load() error { state := NewState() cfgWatcher = watcher.NewConfigFileWatcher(common.ConfigFileName) - err := state.InitFromFileOrExit(common.ConfigPath) + err := errors.Join(state.InitFromFileOrExit(common.ConfigPath), state.StartProviders()) if err != nil { notifyError("init", err) } SetState(state) - return err + return nil } func notifyError(action string, err error) { @@ -72,6 +72,12 @@ func Reload() gperr.Error { // -> replace config -> start new subtasks GetState().Task().FinishAndWait("config changed") SetState(newState) + + if err := newState.StartProviders(); err != nil { + gperr.LogWarn("start providers error", err) + notifyError("start providers", err) + return nil // continue + } StartProxyServers() return nil } diff --git a/internal/config/state.go b/internal/config/state.go index 5f4a0823..4509ee79 100644 --- a/internal/config/state.go +++ b/internal/config/state.go @@ -108,8 +108,6 @@ func (state *state) Init(data []byte) error { errs.Add(state.initNotification()) errs.Add(state.initAccessLogger()) errs.Add(state.initEntrypoint()) - // this must be run after loadRouteProviders - errs.Add(state.startRouteProviders()) return errs.Error() } @@ -155,6 +153,16 @@ func (state *state) IterProviders() iter.Seq2[string, types.RouteProvider] { } } +func (state *state) StartProviders() error { + errs := gperr.NewGroup("provider errors") + for _, p := range state.providers.Range { + errs.Go(func() error { + return p.Start(state.Task()) + }) + } + return errs.Wait().Error() +} + func (state *state) NumProviders() int { return state.providers.Size() } @@ -390,13 +398,3 @@ func (state *state) printState() { l := log.Level(zerolog.InfoLevel) yaml.NewEncoder(l).Encode(state.Config) } - -func (state *state) startRouteProviders() error { - errs := gperr.NewGroup("provider errors") - for _, p := range state.providers.Range { - errs.Go(func() error { - return p.Start(state.Task()) - }) - } - return errs.Wait().Error() -} diff --git a/internal/config/types/state.go b/internal/config/types/state.go index 8bfe4c76..82b1d2ad 100644 --- a/internal/config/types/state.go +++ b/internal/config/types/state.go @@ -28,6 +28,7 @@ type State interface { DeleteProvider(key string) IterProviders() iter.Seq2[string, types.RouteProvider] NumProviders() int + StartProviders() error } // could be nil