diff --git a/pkg/proxy/topology.go b/pkg/proxy/topology.go index c8b447971ed..48b2e541136 100644 --- a/pkg/proxy/topology.go +++ b/pkg/proxy/topology.go @@ -162,12 +162,7 @@ func CategorizeEndpoints(endpoints []Endpoint, svcInfo ServicePort, nodeName str // hinted for this node's zone, then it returns "PreferSameZone". // - Otherwise it returns "" (meaning, no topology / default traffic distribution). func topologyModeFromHints(svcInfo ServicePort, endpoints []Endpoint, nodeName, zone string) string { - if len(endpoints) == 0 { - // The code below assumes at least 1 endpoint; if there are no endpoints, - // there are no hints. - return "" - } - + hasReadyEndpoints := false hasEndpointForNode := false allEndpointsHaveNodeHints := true hasEndpointForZone := false @@ -176,6 +171,7 @@ func topologyModeFromHints(svcInfo ServicePort, endpoints []Endpoint, nodeName, if !endpoint.IsReady() { continue } + hasReadyEndpoints = true if endpoint.NodeHints().Len() == 0 { allEndpointsHaveNodeHints = false @@ -190,6 +186,11 @@ func topologyModeFromHints(svcInfo ServicePort, endpoints []Endpoint, nodeName, } } + // If no ready endpoints exist, there are no hints to consider + if !hasReadyEndpoints { + return "" + } + if utilfeature.DefaultFeatureGate.Enabled(features.PreferSameTrafficDistribution) { if allEndpointsHaveNodeHints { if hasEndpointForNode { diff --git a/pkg/proxy/topology_test.go b/pkg/proxy/topology_test.go index 8e9ed4333d2..e15337a1732 100644 --- a/pkg/proxy/topology_test.go +++ b/pkg/proxy/topology_test.go @@ -398,6 +398,15 @@ func TestCategorizeEndpoints(t *testing.T) { clusterEndpoints: nil, localEndpoints: nil, allEndpoints: nil, + }, { + name: "single endpoint not ready, not serving, not terminating", + nodeLabels: map[string]string{v1.LabelTopologyZone: "zone-a"}, + serviceInfo: &BaseServicePortInfo{}, + endpoints: []Endpoint{ + &BaseEndpointInfo{endpoint: "10.0.0.0:80", ready: false, serving: false, terminating: false}, + }, + clusterEndpoints: sets.New[string](), + localEndpoints: nil, }} for _, tc := range testCases {