diff --git a/adapter/outboundgroup/parser.go b/adapter/outboundgroup/parser.go index 422349fe..ea1b51e1 100644 --- a/adapter/outboundgroup/parser.go +++ b/adapter/outboundgroup/parser.go @@ -104,7 +104,7 @@ func ParseProxyGroup(config map[string]any, proxyMap map[string]C.Proxy, provide } } - hc := provider.NewHealthCheck(ps, groupOption.URL, uint(groupOption.Interval), true, expectedStatus) + hc := provider.NewHealthCheck(ps, testUrl, uint(groupOption.Interval), groupOption.Lazy, expectedStatus) pd, err := provider.NewCompatibleProvider(groupName, ps, hc) if err != nil { diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 01ae44ee..81ec6c63 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -252,6 +252,9 @@ func (cp *compatibleProvider) Update() error { } func (cp *compatibleProvider) Initial() error { + if cp.healthCheck.interval != 0 && cp.healthCheck.url != "" { + cp.HealthCheck() + } return nil } diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 857ed3c6..edab400f 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -112,6 +112,7 @@ func ApplyConfig(cfg *config.Config, force bool) { loadRuleProvider(cfg.RuleProviders) runtime.GC() tunnel.OnRunning() + hcCompatibleProvider(cfg.Providers) log.SetLevel(cfg.General.LogLevel) } @@ -265,7 +266,7 @@ func updateRules(rules []C.Rule, subRules map[string][]C.Rule, ruleProviders map func loadProvider(pv provider.Provider) { if pv.VehicleType() == provider.Compatible { - log.Infoln("Start initial compatible provider %s", pv.Name()) + return } else { log.Infoln("Start initial provider %s", (pv).Name()) } @@ -318,7 +319,27 @@ func loadProxyProvider(proxyProviders map[string]provider.ProxyProvider) { wg.Wait() } +func hcCompatibleProvider(proxyProviders map[string]provider.ProxyProvider) { + // limit concurrent size + wg := sync.WaitGroup{} + ch := make(chan struct{}, concurrentCount) + for _, proxyProvider := range proxyProviders { + proxyProvider := proxyProvider + if proxyProvider.VehicleType() == provider.Compatible { + log.Infoln("Start initial Compatible provider %s", proxyProvider.Name()) + wg.Add(1) + ch <- struct{}{} + go func() { + defer func() { <-ch; wg.Done() }() + if err := proxyProvider.Initial(); err != nil { + log.Errorln("initial Compatible provider %s error: %v", proxyProvider.Name(), err) + } + }() + } + } + +} func updateTun(general *config.General) { if general == nil { return