@@ -6,11 +6,11 @@ import (
66 "time"
77
88 "code.cloudfoundry.org/gorouter/config"
9-
109 "code.cloudfoundry.org/gorouter/route"
1110 "code.cloudfoundry.org/gorouter/test_util"
1211 . "github.com/onsi/ginkgo/v2"
1312 . "github.com/onsi/gomega"
13+ "github.com/onsi/gomega/gbytes"
1414)
1515
1616var _ = Describe ("HashBased" , func () {
@@ -257,7 +257,83 @@ var _ = Describe("HashBased", func() {
257257 Expect (endpoint .Stats .NumberConnections .Count ()).To (Equal (initialCount - 1 ))
258258 })
259259 })
260- Describe ("CalculateAverageLoad" , func () {
260+ Describe ("IsImbalancedOrOverloaded" , func () {
261+ var iter * route.HashBased
262+ var endpoints []* route.Endpoint
263+
264+ BeforeEach (func () {
265+ iter = route .NewHashBased (logger .Logger , pool , "" , false , false , "" ).(* route.HashBased )
266+ })
267+
268+ Context ("when endpoints have a lot of in-flight requests" , func () {
269+ var e1 , e2 , e3 * route.Endpoint
270+ BeforeEach (func () {
271+ e1 = route .NewEndpoint (& route.EndpointOpts {Host : "1.2.3.4" , Port : 5678 , LoadBalancingAlgorithm : "hash" , HashHeaderName : "tenant-id" , HashBalanceFactor : 1.2 , PrivateInstanceId : "ID1" })
272+ e2 = route .NewEndpoint (& route.EndpointOpts {Host : "2.2.3.4" , Port : 5678 , LoadBalancingAlgorithm : "hash" , HashHeaderName : "tenant-id" , HashBalanceFactor : 1.2 , PrivateInstanceId : "ID2" })
273+ e3 = route .NewEndpoint (& route.EndpointOpts {Host : "3.2.3.4" , Port : 5678 , LoadBalancingAlgorithm : "hash" , HashHeaderName : "tenant-id" , HashBalanceFactor : 1.2 , PrivateInstanceId : "ID3" })
274+ endpoints = []* route.Endpoint {e1 , e2 , e3 }
275+ for _ , e := range endpoints {
276+ pool .Put (e )
277+ }
278+
279+ })
280+ It ("mark the endpoint as overloaded" , func () {
281+ for i := 0 ; i < 500 ; i ++ {
282+ iter .PreRequest (e1 )
283+ }
284+ // in general 500 in flight requests counted by e1
285+ Expect (iter .IsImbalancedOrOverloaded (e1 , true )).To (BeTrue ())
286+ })
287+ It ("do not mark as imbalanced if every endpoint has 499 in-flight requests" , func () {
288+ for i := 0 ; i < 498 ; i ++ {
289+ iter .PreRequest (e1 )
290+ }
291+ for i := 0 ; i < 498 ; i ++ {
292+ iter .PreRequest (e2 )
293+ }
294+ for i := 0 ; i < 498 ; i ++ {
295+ iter .PreRequest (e3 )
296+ }
297+ // in general 500 in flight requests counted by e1
298+ Expect (iter .IsImbalancedOrOverloaded (e1 , false )).To (BeFalse ())
299+ })
300+
301+ It ("mark endpoint as overloaded if every endpoint has 500 in-flight requests" , func () {
302+ for i := 0 ; i < 499 ; i ++ {
303+ iter .PreRequest (e1 )
304+ }
305+ for i := 0 ; i < 499 ; i ++ {
306+ iter .PreRequest (e2 )
307+ }
308+ for i := 0 ; i < 499 ; i ++ {
309+ iter .PreRequest (e3 )
310+ }
311+ // in general 500 in flight requests counted by e1
312+ Expect (iter .IsImbalancedOrOverloaded (e1 , true )).To (BeTrue ())
313+ Eventually (logger ).Should (gbytes .Say ("hash-based-routing-endpoint-overloaded" ))
314+ Expect (iter .IsImbalancedOrOverloaded (e2 , true )).To (BeTrue ())
315+ Expect (iter .IsImbalancedOrOverloaded (e3 , true )).To (BeTrue ())
316+
317+ })
318+ It ("mark as imbalanced if it has more in-flight requests" , func () {
319+ for i := 0 ; i < 300 ; i ++ {
320+ iter .PreRequest (e1 )
321+ }
322+ for i := 0 ; i < 200 ; i ++ {
323+ iter .PreRequest (e2 )
324+ }
325+ for i := 0 ; i < 200 ; i ++ {
326+ iter .PreRequest (e3 )
327+ }
328+ Expect (iter .IsImbalancedOrOverloaded (e1 , false )).To (BeTrue ())
329+ Eventually (logger ).Should (gbytes .Say ("hash-based-routing-endpoint-imbalanced" ))
330+ Expect (iter .IsImbalancedOrOverloaded (e2 , false )).To (BeFalse ())
331+ Expect (iter .IsImbalancedOrOverloaded (e3 , false )).To (BeFalse ())
332+ })
333+ })
334+ })
335+
336+ Describe ("CalculateAverageNumberOfConnections" , func () {
261337 var iter * route.HashBased
262338 var endpoints []* route.Endpoint
263339
@@ -336,7 +412,6 @@ type MockHashLookupTable struct {
336412
337413// NewMockHashLookupTable creates a new mock lookup table with predefined mappings
338414func NewMockHashLookupTable (lookupTable []int , endpointList []string ) * MockHashLookupTable {
339-
340415 return & MockHashLookupTable {
341416 lookupTable : lookupTable ,
342417 endpointList : endpointList ,
0 commit comments