diff --git a/adapter/provider/healthcheck.go b/adapter/provider/healthcheck.go index f16718e92..822a00d51 100644 --- a/adapter/provider/healthcheck.go +++ b/adapter/provider/healthcheck.go @@ -61,7 +61,7 @@ func (hc *HealthCheck) process() { } } -func (hc *HealthCheck) setProxy(proxies []C.Proxy) { +func (hc *HealthCheck) setProxies(proxies []C.Proxy) { hc.proxies = proxies } diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 8c88d1e8b..3c73d3614 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -57,6 +57,13 @@ func (bp *baseProvider) Version() uint32 { return bp.version } +func (bp *baseProvider) Initial() error { + if bp.healthCheck.auto() { + go bp.healthCheck.process() + } + return nil +} + func (bp *baseProvider) HealthCheck() { bp.healthCheck.check() } @@ -88,7 +95,7 @@ func (bp *baseProvider) RegisterHealthCheckTask(url string, expectedStatus utils func (bp *baseProvider) setProxies(proxies []C.Proxy) { bp.proxies = proxies bp.version += 1 - bp.healthCheck.setProxy(proxies) + bp.healthCheck.setProxies(proxies) if bp.healthCheck.auto() { go bp.healthCheck.check() } @@ -133,8 +140,8 @@ func (pp *proxySetProvider) Update() error { } func (pp *proxySetProvider) Initial() error { - if pp.healthCheck.auto() { - go pp.healthCheck.process() + if err := pp.baseProvider.Initial(); err != nil { + return err } _, err := pp.Fetcher.Initial() if err != nil { @@ -184,6 +191,8 @@ func NewProxySetProvider(name string, interval time.Duration, payload []map[stri return nil, err } pd.proxies = proxies + // direct call setProxies on hc to avoid starting a health check process immediately, it should be done by Initial() + hc.setProxies(proxies) } fetcher := resource.NewFetcher[[]C.Proxy](name, interval, vehicle, parser, pd.setProxies) @@ -233,13 +242,6 @@ func (ip *inlineProvider) VehicleType() types.VehicleType { return types.Inline } -func (ip *inlineProvider) Initial() error { - if ip.healthCheck.auto() { - go ip.healthCheck.process() - } - return nil -} - func (ip *inlineProvider) Update() error { // make api update happy ip.updateAt = time.Now() @@ -256,6 +258,8 @@ func NewInlineProvider(name string, payload []map[string]any, parser resource.Pa if err != nil { return nil, err } + // direct call setProxies on hc to avoid starting a health check process immediately, it should be done by Initial() + hc.setProxies(proxies) ip := &inlineProvider{ baseProvider: baseProvider{ @@ -299,13 +303,6 @@ func (cp *compatibleProvider) Update() error { return nil } -func (cp *compatibleProvider) Initial() error { - if cp.healthCheck.auto() { - go cp.healthCheck.process() - } - return nil -} - func (cp *compatibleProvider) VehicleType() types.VehicleType { return types.Compatible }