Skip to content

Commit

Permalink
Update rule management to avoid sporadic 503 errors
Browse files Browse the repository at this point in the history
  • Loading branch information
shraddhabang committed Feb 28, 2025
1 parent 7541235 commit 3f7216c
Show file tree
Hide file tree
Showing 3 changed files with 1,724 additions and 22 deletions.
44 changes: 22 additions & 22 deletions pkg/deploy/elbv2/listener_rule_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,27 +126,7 @@ func (m *defaultListenerRuleManager) Delete(ctx context.Context, sdkLR ListenerR
}

func (m *defaultListenerRuleManager) SetRulePriorities(ctx context.Context, matchedResAndSDKLRsBySettings []resAndSDKListenerRulePair, unmatchedSDKLRs []ListenerRuleWithTags) error {
var lastAvailablePriority int32 = 50000
var sdkLRs []ListenerRuleWithTags

// Sort the unmatched existing SDK rules based on their priority to be pushed down in same order
sort.Slice(unmatchedSDKLRs, func(i, j int) bool {
priorityI, _ := strconv.Atoi(awssdk.ToString(unmatchedSDKLRs[i].ListenerRule.Priority))
priorityJ, _ := strconv.Atoi(awssdk.ToString(unmatchedSDKLRs[j].ListenerRule.Priority))
return priorityI < priorityJ
})
// Push down all the unmatched existing SDK rules on load balancer so that updated rules can take their place
for _, sdkLR := range slices.Backward(unmatchedSDKLRs) {
sdkLR.ListenerRule.Priority = awssdk.String(strconv.Itoa(int(lastAvailablePriority)))
sdkLRs = append(sdkLRs, sdkLR)
lastAvailablePriority--
}
//Reprioratize matched rules by settings
for _, resAndSDKLR := range matchedResAndSDKLRsBySettings {
resAndSDKLR.sdkLR.ListenerRule.Priority = awssdk.String(strconv.Itoa(int(resAndSDKLR.resLR.Spec.Priority)))
sdkLRs = append(sdkLRs, resAndSDKLR.sdkLR)
}
req := buildSDKSetRulePrioritiesInput(sdkLRs)
req := buildSDKSetRulePrioritiesInput(matchedResAndSDKLRsBySettings, unmatchedSDKLRs)
m.logger.Info("setting listener rule priorities",
"rule priority pairs", req.RulePriorities)
if _, err := m.elbv2Client.SetRulePrioritiesWithContext(ctx, req); err != nil {
Expand Down Expand Up @@ -217,8 +197,28 @@ func buildSDKModifyListenerRuleInput(_ elbv2model.ListenerRuleSpec, desiredActio
return sdkObj
}

func buildSDKSetRulePrioritiesInput(sdkLRs []ListenerRuleWithTags) *elbv2sdk.SetRulePrioritiesInput {
func buildSDKSetRulePrioritiesInput(matchedResAndSDKLRsBySettings []resAndSDKListenerRulePair, unmatchedSDKLRs []ListenerRuleWithTags) *elbv2sdk.SetRulePrioritiesInput {
var rulePriorities []elbv2types.RulePriorityPair
var lastAvailablePriority int32 = 50000
var sdkLRs []ListenerRuleWithTags

// Sort the unmatched existing SDK rules based on their priority to be pushed down in same order
sort.Slice(unmatchedSDKLRs, func(i, j int) bool {
priorityI, _ := strconv.Atoi(awssdk.ToString(unmatchedSDKLRs[i].ListenerRule.Priority))
priorityJ, _ := strconv.Atoi(awssdk.ToString(unmatchedSDKLRs[j].ListenerRule.Priority))
return priorityI < priorityJ
})
// Push down all the unmatched existing SDK rules on load balancer so that updated rules can take their place
for _, sdkLR := range slices.Backward(unmatchedSDKLRs) {
sdkLR.ListenerRule.Priority = awssdk.String(strconv.Itoa(int(lastAvailablePriority)))
sdkLRs = append(sdkLRs, sdkLR)
lastAvailablePriority--
}
//Re-Prioritize matched rules by settings
for _, resAndSDKLR := range matchedResAndSDKLRsBySettings {
resAndSDKLR.sdkLR.ListenerRule.Priority = awssdk.String(strconv.Itoa(int(resAndSDKLR.resLR.Spec.Priority)))
sdkLRs = append(sdkLRs, resAndSDKLR.sdkLR)
}
for _, sdkLR := range sdkLRs {
p, _ := strconv.ParseInt(awssdk.ToString(sdkLR.ListenerRule.Priority), 10, 32)
rulePriorityPair := elbv2types.RulePriorityPair{
Expand Down
Loading

0 comments on commit 3f7216c

Please sign in to comment.