diff --git a/pkg/proxy/userspace/loadbalancer.go b/pkg/proxy/userspace/loadbalancer.go index dee5cb843de..2bf23d5b940 100644 --- a/pkg/proxy/userspace/loadbalancer.go +++ b/pkg/proxy/userspace/loadbalancer.go @@ -31,4 +31,5 @@ type LoadBalancer interface { NewService(service proxy.ServicePortName, sessionAffinityType api.ServiceAffinity, stickyMaxAgeMinutes int) error DeleteService(service proxy.ServicePortName) CleanupStaleStickySessions(service proxy.ServicePortName) + ServiceHasEndpoints(service proxy.ServicePortName) bool } diff --git a/pkg/proxy/userspace/roundrobin.go b/pkg/proxy/userspace/roundrobin.go index 3d52445837e..ca0ccc6eddf 100644 --- a/pkg/proxy/userspace/roundrobin.go +++ b/pkg/proxy/userspace/roundrobin.go @@ -120,6 +120,16 @@ func isSessionAffinity(affinity *affinityPolicy) bool { return true } +// ServiceHasEndpoints checks whether a service entry has endpoints. +func (lb *LoadBalancerRR) ServiceHasEndpoints(svcPort proxy.ServicePortName) bool { + lb.lock.Lock() + defer lb.lock.Unlock() + state, exists := lb.services[svcPort] + // TODO: while nothing ever assigns nil to the map, *some* of the code using the map + // checks for it. The code should all follow the same convention. + return exists && state != nil && len(state.endpoints) > 0 +} + // NextEndpoint returns a service endpoint. // The service endpoint is chosen using the round-robin algorithm. func (lb *LoadBalancerRR) NextEndpoint(svcPort proxy.ServicePortName, srcAddr net.Addr, sessionAffinityReset bool) (string, error) {