Skip to content

Commit 142778a

Browse files
committed
fix: add non-retriable errors in azure clients
1 parent 0f13c5c commit 142778a

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/azure.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -499,22 +499,28 @@ func (az *Cloud) InitializeCloudFromConfig(config *Config, fromSecret bool) erro
499499
az.RouteTablesClient = routetableclient.New(azClientConfig.WithRateLimiter(config.RouteTableRateLimit))
500500
az.LoadBalancerClient = loadbalancerclient.New(azClientConfig.WithRateLimiter(config.LoadBalancerRateLimit))
501501
az.SecurityGroupsClient = securitygroupclient.New(azClientConfig.WithRateLimiter(config.SecurityGroupRateLimit))
502-
az.VirtualMachinesClient = vmclient.New(azClientConfig.WithRateLimiter(config.VirtualMachineRateLimit))
503502
az.PublicIPAddressesClient = publicipclient.New(azClientConfig.WithRateLimiter(config.PublicIPAddressRateLimit))
504503
az.VirtualMachineScaleSetsClient = vmssclient.New(azClientConfig.WithRateLimiter(config.VirtualMachineScaleSetRateLimit))
505-
az.DisksClient = diskclient.New(azClientConfig.WithRateLimiter(config.DiskRateLimit))
506504
az.VirtualMachineSizesClient = vmsizeclient.New(azClientConfig.WithRateLimiter(config.VirtualMachineSizeRateLimit))
507505
az.SnapshotsClient = snapshotclient.New(azClientConfig.WithRateLimiter(config.SnapshotRateLimit))
508506
az.StorageAccountClient = storageaccountclient.New(azClientConfig.WithRateLimiter(config.StorageAccountRateLimit))
509507

510508
// fileClient is not based on armclient, but it's still backoff retried.
511-
az.FileClient = newAzureFileClient(env, azClientConfig.Backoff)
509+
az.FileClient = newAzureFileClient(env, azClientConfig.Backoff.WithNonRetriableErrors([]string{}, []int{http.StatusNotFound}))
510+
511+
vmClientConfig := azClientConfig.WithRateLimiter(config.VirtualMachineRateLimit)
512+
vmClientConfig.Backoff = vmClientConfig.Backoff.WithNonRetriableErrors([]string{}, []int{http.StatusConflict})
513+
az.VirtualMachinesClient = vmclient.New(vmClientConfig)
512514

513515
// Error "not an active Virtual Machine Scale Set VM" is not retriable for VMSS VM.
514516
vmssVMClientConfig := azClientConfig.WithRateLimiter(config.VirtualMachineScaleSetRateLimit)
515-
vmssVMClientConfig.Backoff = vmssVMClientConfig.Backoff.WithNonRetriableErrors([]string{vmssVMNotActiveErrorMessage})
517+
vmssVMClientConfig.Backoff = vmssVMClientConfig.Backoff.WithNonRetriableErrors([]string{vmssVMNotActiveErrorMessage}, []int{http.StatusConflict})
516518
az.VirtualMachineScaleSetVMsClient = vmssvmclient.New(vmssVMClientConfig)
517519

520+
disksClientConfig := azClientConfig.WithRateLimiter(config.DiskRateLimit)
521+
disksClientConfig.Backoff = disksClientConfig.Backoff.WithNonRetriableErrors([]string{}, []int{http.StatusNotFound})
522+
az.DisksClient = diskclient.New(disksClientConfig)
523+
518524
if az.MaximumLoadBalancerRuleCount == 0 {
519525
az.MaximumLoadBalancerRuleCount = maximumLoadBalancerRuleCount
520526
}

staging/src/k8s.io/legacy-cloud-providers/azure/retry/azure_retry.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ type Backoff struct {
5858
Cap time.Duration
5959
// The errors indicate that the request shouldn't do more retrying.
6060
NonRetriableErrors []string
61+
// The HTTPStatusCode indicates that the request shouldn't do more retrying.
62+
NonRetriableHTTPStatusCodes []int
6163
}
6264

6365
// NewBackoff creates a new Backoff.
@@ -71,10 +73,11 @@ func NewBackoff(duration time.Duration, factor float64, jitter float64, steps in
7173
}
7274
}
7375

74-
// WithNonRetriableErrors returns a new *Backoff with NonRetriableErrors assigned.
75-
func (b *Backoff) WithNonRetriableErrors(errs []string) *Backoff {
76+
// WithNonRetriableErrors returns a new *Backoff with NonRetriableErrors, NonRetriableHTTPStatusCodes assigned.
77+
func (b *Backoff) WithNonRetriableErrors(errs []string, httpStatusCodes []int) *Backoff {
7678
newBackoff := *b
7779
newBackoff.NonRetriableErrors = errs
80+
newBackoff.NonRetriableHTTPStatusCodes = httpStatusCodes
7881
return &newBackoff
7982
}
8083

@@ -90,6 +93,11 @@ func (b *Backoff) isNonRetriableError(rerr *Error) bool {
9093
}
9194
}
9295

96+
for _, code := range b.NonRetriableHTTPStatusCodes {
97+
if rerr.HTTPStatusCode == code {
98+
return true
99+
}
100+
}
93101
return false
94102
}
95103

staging/src/k8s.io/legacy-cloud-providers/azure/retry/azure_retry_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ func TestStep(t *testing.T) {
7575
}
7676

7777
func TestDoBackoffRetry(t *testing.T) {
78-
backoff := &Backoff{Factor: 1.0, Steps: 3}
78+
backoff := &Backoff{
79+
Factor: 1.0,
80+
Steps: 3,
81+
NonRetriableHTTPStatusCodes: []int{http.StatusNotFound},
82+
}
7983
fakeRequest := &http.Request{
8084
URL: &url.URL{
8185
Host: "localhost",
@@ -122,4 +126,19 @@ func TestDoBackoffRetry(t *testing.T) {
122126
assert.Equal(t, 1, client.Attempts())
123127
assert.NotNil(t, resp)
124128
assert.Equal(t, 429, resp.StatusCode)
129+
130+
// retry on non retriable error
131+
r = mocks.NewResponseWithStatus("404 StatusNotFound", http.StatusNotFound)
132+
client = mocks.NewSender()
133+
client.AppendAndRepeatResponse(r, 1)
134+
expectedErr = &Error{
135+
Retriable: true,
136+
HTTPStatusCode: 404,
137+
RawError: fmt.Errorf("HTTP status code (404)"),
138+
}
139+
resp, err = doBackoffRetry(client, fakeRequest, backoff)
140+
assert.NotNil(t, resp)
141+
assert.Equal(t, 404, resp.StatusCode)
142+
assert.Equal(t, expectedErr.Error(), err)
143+
assert.Equal(t, 1, client.Attempts())
125144
}

0 commit comments

Comments
 (0)