Skip to content

Commit a624395

Browse files
committed
Merge branch 'feat/circuit-breaker'
Add per-backend circuit breaker config via BackendLBPolicy CRD
2 parents 8a9e505 + 8b8d0b2 commit a624395

4 files changed

Lines changed: 40 additions & 6 deletions

File tree

internal/gatewayapiexperimental/backendlbv1alpha2/types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ type BackendLBPolicySpec struct {
5757
TargetRefs []LocalPolicyTargetReference `json:"targetRefs"`
5858
SessionPersistence *SessionPersistence `json:"sessionPersistence,omitempty"`
5959
LoadBalancing *LoadBalancingPolicy `json:"loadBalancing,omitempty"`
60+
CircuitBreaker *CircuitBreakerConfig `json:"circuitBreaker,omitempty"`
61+
}
62+
63+
type CircuitBreakerConfig struct {
64+
MaxInflightRequests *int32 `json:"maxInflightRequests,omitempty"`
6065
}
6166

6267
type BackendLBPolicy struct {

internal/ir/types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ type BackendCluster struct {
211211
BackendTLSValidation *BackendTLSValidation `json:"backendTlsValidation,omitempty"`
212212
SessionPersistence *SessionPersistencePolicy `json:"sessionPersistence,omitempty"`
213213
LoadBalancing *LoadBalancingPolicy `json:"loadBalancing,omitempty"`
214+
CircuitBreaker *CircuitBreakerConfig `json:"circuitBreaker,omitempty"`
214215
Metadata map[string]string `json:"metadata,omitempty"`
215216
AIService *AIServiceConfig `json:"aiService,omitempty"`
216217
TokenPolicy *TokenPolicyConfig `json:"tokenPolicy,omitempty"`
@@ -274,6 +275,10 @@ type ConsistentHashPolicy struct {
274275
HeaderName string `json:"headerName,omitempty"`
275276
}
276277

278+
type CircuitBreakerConfig struct {
279+
MaxInflightRequests int `json:"maxInflightRequests,omitempty"`
280+
}
281+
277282
type SecretMaterial struct {
278283
Namespace string `json:"namespace"`
279284
Name string `json:"name"`

internal/translator/backend_lb_policy.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ type translatedBackendLBPolicy struct {
1515
backendKeys []string
1616
sessionPersistence *ir.SessionPersistencePolicy
1717
loadBalancing *ir.LoadBalancingPolicy
18+
circuitBreaker *ir.CircuitBreakerConfig
1819
policy backendlbv1alpha2.BackendLBPolicy
1920
}
2021

2122
type backendLBPolicyIndexes struct {
2223
sessionPersistence map[string]*ir.SessionPersistencePolicy
2324
loadBalancing map[string]*ir.LoadBalancingPolicy
25+
circuitBreaker map[string]*ir.CircuitBreakerConfig
2426
}
2527

2628
func buildBackendLBPolicyIndexes(
@@ -48,7 +50,8 @@ func buildBackendLBPolicyIndexesWithIndexes(
4850
policy.Spec.SessionPersistence,
4951
)
5052
loadBalancing := backendLoadBalancing(policy.Spec.LoadBalancing)
51-
if sessionPersistence == nil && loadBalancing == nil {
53+
circuitBreaker := backendCircuitBreaker(policy.Spec.CircuitBreaker)
54+
if sessionPersistence == nil && loadBalancing == nil && circuitBreaker == nil {
5255
continue
5356
}
5457

@@ -61,6 +64,7 @@ func buildBackendLBPolicyIndexesWithIndexes(
6164
backendKeys: backendKeys,
6265
sessionPersistence: sessionPersistence,
6366
loadBalancing: loadBalancing,
67+
circuitBreaker: circuitBreaker,
6468
policy: policy,
6569
})
6670
translationIndex := len(translations) - 1
@@ -74,6 +78,7 @@ func buildBackendLBPolicyIndexesWithIndexes(
7478

7579
sessionPersistence := make(map[string]*ir.SessionPersistencePolicy, len(owners))
7680
loadBalancing := make(map[string]*ir.LoadBalancingPolicy, len(owners))
81+
circuitBreaker := make(map[string]*ir.CircuitBreakerConfig, len(owners))
7782
for backendKey, ownerIndex := range owners {
7883
if item := translations[ownerIndex].sessionPersistence; item != nil {
7984
copyItem := *item
@@ -87,11 +92,16 @@ func buildBackendLBPolicyIndexesWithIndexes(
8792
}
8893
loadBalancing[backendKey] = &copyItem
8994
}
95+
if item := translations[ownerIndex].circuitBreaker; item != nil {
96+
copyItem := *item
97+
circuitBreaker[backendKey] = &copyItem
98+
}
9099
}
91100

92101
return backendLBPolicyIndexes{
93102
sessionPersistence: sessionPersistence,
94103
loadBalancing: loadBalancing,
104+
circuitBreaker: circuitBreaker,
95105
}
96106
}
97107

@@ -154,3 +164,12 @@ func backendLBPolicyBackendKeysWithIndexes(
154164
sort.Strings(keys)
155165
return compactStrings(keys), true
156166
}
167+
168+
func backendCircuitBreaker(cb *backendlbv1alpha2.CircuitBreakerConfig) *ir.CircuitBreakerConfig {
169+
if cb == nil || cb.MaxInflightRequests == nil {
170+
return nil
171+
}
172+
return &ir.CircuitBreakerConfig{
173+
MaxInflightRequests: int(*cb.MaxInflightRequests),
174+
}
175+
}

internal/translator/translator_backends.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,16 @@ func translateEffectiveBackends(
8282
service.logicalName,
8383
port.Port,
8484
)],
85-
LoadBalancing: backendLB.loadBalancing[backendClusterKey(
86-
service.namespace,
87-
service.logicalName,
88-
port.Port,
89-
)],
85+
LoadBalancing: backendLB.loadBalancing[backendClusterKey(
86+
service.namespace,
87+
service.logicalName,
88+
port.Port,
89+
)],
90+
CircuitBreaker: backendLB.circuitBreaker[backendClusterKey(
91+
service.namespace,
92+
service.logicalName,
93+
port.Port,
94+
)],
9095
Metadata: map[string]string{
9196
"service": service.logicalName,
9297
},

0 commit comments

Comments
 (0)