func GetNextTarget(targetData *tykcommon.HostList, spec *APISpec, tryCount int) string { if spec.Proxy.EnableLoadBalancing { log.Debug("[PROXY] [LOAD BALANCING] Load balancer enabled, getting upstream target") // Use a HostList spec.RoundRobin.SetMax(targetData) pos := spec.RoundRobin.GetPos() if pos > (targetData.Len() - 1) { // problem spec.RoundRobin.SetMax(targetData) pos = 0 } gotHost, err := targetData.GetIndex(pos) if err != nil { log.Error("[PROXY] [LOAD BALANCING] ", err) return gotHost } thisHost := EnsureTransport(gotHost) // Check hosts against uptime tests if spec.Proxy.CheckHostAgainstUptimeTests { if !GlobalHostChecker.IsHostDown(thisHost) { // Don't overdo it if tryCount < targetData.Len() { // Host is down, skip return GetNextTarget(targetData, spec, tryCount+1) } log.Error("[PROXY] [LOAD BALANCING] All hosts seem to be down, all uptime tests are failing!") } } return thisHost } // Use standard target - might still be service data log.Debug("TARGET DATA:", targetData) gotHost, err := targetData.GetIndex(0) if err != nil { log.Error("[PROXY] ", err) return gotHost } return EnsureTransport(gotHost) }