fix(config): failed reload should not start providers in new state

This commit is contained in:
yusing
2025-10-10 21:46:02 +08:00
parent 3dedd66ad1
commit 2e411373a2
3 changed files with 19 additions and 14 deletions

View File

@@ -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
}

View File

@@ -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()
}

View File

@@ -28,6 +28,7 @@ type State interface {
DeleteProvider(key string)
IterProviders() iter.Seq2[string, types.RouteProvider]
NumProviders() int
StartProviders() error
}
// could be nil