@@ -19,6 +19,7 @@ type clusterState struct {
1919 endpointSlices map [definitions.ResourceID ]* skipperEndpointSlice
2020 secrets map [definitions.ResourceID ]* secret
2121 cachedEndpoints map [endpointID ][]string
22+ cachedEndpointSlices map [endpointID ][]skipperEndpoint
2223 enableEndpointSlices bool
2324}
2425
@@ -49,8 +50,8 @@ func (state *clusterState) getServiceRG(namespace, name string) (*service, error
4950 return s , nil
5051}
5152
52- // GetEndpointsByService returns the skipper endpoints for kubernetes endpoints or endpointslices .
53- func (state * clusterState ) GetEndpointsByService (zone , namespace , name , protocol string , servicePort * servicePort ) ( []string , bool ) {
53+ // GetEndpointsByService returns the skipper endpoints for kubernetes endpoints.
54+ func (state * clusterState ) GetEndpointsByService (namespace , name , protocol string , servicePort * servicePort ) []string {
5455 epID := endpointID {
5556 ResourceID : newResourceID (namespace , name ),
5657 Protocol : protocol ,
@@ -60,34 +61,48 @@ func (state *clusterState) GetEndpointsByService(zone, namespace, name, protocol
6061 state .mu .Lock ()
6162 defer state .mu .Unlock ()
6263 if cached , ok := state .cachedEndpoints [epID ]; ok {
63- return cached , false
64+ return cached
6465 }
6566
6667 var targets []string
67- var targetsByZone []string
68- if state .enableEndpointSlices {
69- if eps , ok := state .endpointSlices [epID .ResourceID ]; ok {
70- targets , targetsByZone = eps .targetsByServicePort (zone , "TCP" , protocol , servicePort )
71- } else {
72- return nil , false
73- }
68+ if ep , ok := state .endpoints [epID .ResourceID ]; ok {
69+ targets = ep .targetsByServicePort (protocol , servicePort )
7470 } else {
75- if ep , ok := state .endpoints [epID .ResourceID ]; ok {
76- targets = ep .targetsByServicePort (protocol , servicePort )
77- } else {
78- return nil , false
79- }
80- }
81-
82- if len (targetsByZone ) >= minEndpointsByZone {
83- sort .Strings (targetsByZone )
84- state .cachedEndpoints [epID ] = targetsByZone
85- return targetsByZone , true
71+ return nil
8672 }
8773
8874 sort .Strings (targets )
8975 state .cachedEndpoints [epID ] = targets
90- return targets , false
76+ return targets
77+ }
78+
79+ // GetEndpointSlicesByService returns the skipper endpointslices for kubernetes endpointslices.
80+ func (state * clusterState ) GetEndpointSlicesByService (namespace , name , protocol string , servicePort * servicePort ) []skipperEndpoint {
81+ epID := endpointID {
82+ ResourceID : newResourceID (namespace , name ),
83+ Protocol : protocol ,
84+ TargetPort : servicePort .TargetPort .String (),
85+ }
86+
87+ state .mu .Lock ()
88+ defer state .mu .Unlock ()
89+ if cached , ok := state .cachedEndpointSlices [epID ]; ok {
90+ return cached
91+ }
92+
93+ var targets []skipperEndpoint
94+ if eps , ok := state .endpointSlices [epID .ResourceID ]; ok {
95+ targets = eps .targetsByServicePort ("TCP" , protocol , servicePort )
96+ } else {
97+ return nil
98+ }
99+
100+ sort .Slice (targets , func (i , j int ) bool {
101+ return targets [i ].Address < targets [j ].Address
102+ })
103+
104+ state .cachedEndpointSlices [epID ] = targets
105+ return targets
91106}
92107
93108// getEndpointAddresses returns the list of all addresses for the given service using endpoints or endpointslices.
@@ -121,7 +136,7 @@ func (state *clusterState) getEndpointAddresses(zone, namespace, name string) []
121136}
122137
123138// GetEndpointsByTarget returns the skipper endpoints for kubernetes endpoints or endpointslices.
124- func (state * clusterState ) GetEndpointsByTarget (zone , namespace , name , protocol , scheme string , target * definitions.BackendPort ) ( []string , bool ) {
139+ func (state * clusterState ) GetEndpointsByTarget (namespace , name , protocol , scheme string , target * definitions.BackendPort ) []string {
125140 epID := endpointID {
126141 ResourceID : newResourceID (namespace , name ),
127142 Protocol : protocol ,
@@ -131,32 +146,45 @@ func (state *clusterState) GetEndpointsByTarget(zone, namespace, name, protocol,
131146 state .mu .Lock ()
132147 defer state .mu .Unlock ()
133148 if cached , ok := state .cachedEndpoints [epID ]; ok {
134- return cached , false
149+ return cached
135150 }
136151
137152 var targets []string
138- var targetsByZone []string
139- if state .enableEndpointSlices {
140- if eps , ok := state .endpointSlices [epID .ResourceID ]; ok {
141- targets , targetsByZone = eps .targetsByServiceTarget (zone , protocol , scheme , target )
142- } else {
143- return nil , false
144- }
145- } else {
146- if ep , ok := state .endpoints [epID .ResourceID ]; ok {
147- targets = ep .targetsByServiceTarget (scheme , target )
148- } else {
149- return nil , false
150- }
151- }
152153
153- if len ( targetsByZone ) >= minEndpointsByZone {
154- sort . Strings ( targetsByZone )
155- state . cachedEndpoints [ epID ] = targetsByZone
156- return targetsByZone , true
154+ if ep , ok := state . endpoints [ epID . ResourceID ]; ok {
155+ targets = ep . targetsByServiceTarget ( scheme , target )
156+ } else {
157+ return nil
157158 }
158159
159160 sort .Strings (targets )
160161 state .cachedEndpoints [epID ] = targets
161- return targets , false
162+ return targets
163+ }
164+
165+ func (state * clusterState ) GetEndpointSlicesByTarget (namespace , name , protocol , scheme string , target * definitions.BackendPort ) []skipperEndpoint {
166+ epID := endpointID {
167+ ResourceID : newResourceID (namespace , name ),
168+ Protocol : protocol ,
169+ TargetPort : target .String (),
170+ }
171+
172+ state .mu .Lock ()
173+ defer state .mu .Unlock ()
174+ if cached , ok := state .cachedEndpointSlices [epID ]; ok {
175+ return cached
176+ }
177+
178+ var targets []skipperEndpoint
179+ if eps , ok := state .endpointSlices [epID .ResourceID ]; ok {
180+ targets = eps .targetsByServiceTarget (protocol , scheme , target )
181+ } else {
182+ return nil
183+ }
184+
185+ sort .Slice (targets , func (i , j int ) bool {
186+ return targets [i ].Address < targets [j ].Address
187+ })
188+ state .cachedEndpointSlices [epID ] = targets
189+ return targets
162190}
0 commit comments