Commit ccb06730 authored by Pengfei Ni's avatar Pengfei Ni

Fix conflicted cache when the requests are canceled by other Azure operations

parent 3f2d0c73
...@@ -19,6 +19,7 @@ package azure ...@@ -19,6 +19,7 @@ package azure
import ( import (
"fmt" "fmt"
"net/http" "net/http"
"strings"
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-03-01/compute" "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-03-01/compute"
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2018-07-01/network" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2018-07-01/network"
...@@ -32,6 +33,11 @@ import ( ...@@ -32,6 +33,11 @@ import (
"k8s.io/klog" "k8s.io/klog"
) )
const (
// operationCancledErrorMessage means the operation is canceled by another new operation.
operationCancledErrorMessage = "canceledandsupersededduetoanotheroperation"
)
// requestBackoff if backoff is disabled in cloud provider it // requestBackoff if backoff is disabled in cloud provider it
// returns a new Backoff object steps = 1 // returns a new Backoff object steps = 1
// This is to make sure that the requested command executes // This is to make sure that the requested command executes
...@@ -162,6 +168,12 @@ func (az *Cloud) CreateOrUpdateSecurityGroup(service *v1.Service, sg network.Sec ...@@ -162,6 +168,12 @@ func (az *Cloud) CreateOrUpdateSecurityGroup(service *v1.Service, sg network.Sec
if resp != nil && resp.StatusCode == http.StatusPreconditionFailed { if resp != nil && resp.StatusCode == http.StatusPreconditionFailed {
az.nsgCache.Delete(*sg.Name) az.nsgCache.Delete(*sg.Name)
} }
// Invalidate the cache because another new operation has canceled the current request.
if strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.nsgCache.Delete(*sg.Name)
}
return err return err
} }
...@@ -187,6 +199,13 @@ func (az *Cloud) CreateOrUpdateSGWithRetry(service *v1.Service, sg network.Secur ...@@ -187,6 +199,13 @@ func (az *Cloud) CreateOrUpdateSGWithRetry(service *v1.Service, sg network.Secur
az.nsgCache.Delete(*sg.Name) az.nsgCache.Delete(*sg.Name)
return true, err return true, err
} }
// Invalidate the cache and abort backoff because another new operation has canceled the current request.
if err != nil && strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.nsgCache.Delete(*sg.Name)
return true, err
}
return done, retryError return done, retryError
}) })
} }
...@@ -212,6 +231,10 @@ func (az *Cloud) CreateOrUpdateLB(service *v1.Service, lb network.LoadBalancer) ...@@ -212,6 +231,10 @@ func (az *Cloud) CreateOrUpdateLB(service *v1.Service, lb network.LoadBalancer)
if resp != nil && resp.StatusCode == http.StatusPreconditionFailed { if resp != nil && resp.StatusCode == http.StatusPreconditionFailed {
az.lbCache.Delete(*lb.Name) az.lbCache.Delete(*lb.Name)
} }
// Invalidate the cache because another new operation has canceled the current request.
if strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.lbCache.Delete(*lb.Name)
}
return err return err
} }
...@@ -234,7 +257,12 @@ func (az *Cloud) createOrUpdateLBWithRetry(service *v1.Service, lb network.LoadB ...@@ -234,7 +257,12 @@ func (az *Cloud) createOrUpdateLBWithRetry(service *v1.Service, lb network.LoadB
// Invalidate the cache and abort backoff because ETAG precondition mismatch. // Invalidate the cache and abort backoff because ETAG precondition mismatch.
if resp != nil && resp.StatusCode == http.StatusPreconditionFailed { if resp != nil && resp.StatusCode == http.StatusPreconditionFailed {
az.nsgCache.Delete(*lb.Name) az.lbCache.Delete(*lb.Name)
return true, err
}
// Invalidate the cache and abort backoff because another new operation has canceled the current request.
if err != nil && strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.lbCache.Delete(*lb.Name)
return true, err return true, err
} }
return done, retryError return done, retryError
...@@ -456,6 +484,10 @@ func (az *Cloud) CreateOrUpdateRouteTable(routeTable network.RouteTable) error { ...@@ -456,6 +484,10 @@ func (az *Cloud) CreateOrUpdateRouteTable(routeTable network.RouteTable) error {
if resp != nil && resp.StatusCode == http.StatusPreconditionFailed { if resp != nil && resp.StatusCode == http.StatusPreconditionFailed {
az.rtCache.Delete(*routeTable.Name) az.rtCache.Delete(*routeTable.Name)
} }
// Invalidate the cache because another new operation has canceled the current request.
if err != nil && strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.rtCache.Delete(*routeTable.Name)
}
return az.processHTTPResponse(nil, "", resp, err) return az.processHTTPResponse(nil, "", resp, err)
} }
...@@ -480,6 +512,11 @@ func (az *Cloud) createOrUpdateRouteTableWithRetry(routeTable network.RouteTable ...@@ -480,6 +512,11 @@ func (az *Cloud) createOrUpdateRouteTableWithRetry(routeTable network.RouteTable
az.rtCache.Delete(*routeTable.Name) az.rtCache.Delete(*routeTable.Name)
return true, err return true, err
} }
// Invalidate the cache and abort backoff because another new operation has canceled the current request.
if err != nil && strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.rtCache.Delete(*routeTable.Name)
return true, err
}
return done, retryError return done, retryError
}) })
} }
...@@ -495,6 +532,10 @@ func (az *Cloud) CreateOrUpdateRoute(route network.Route) error { ...@@ -495,6 +532,10 @@ func (az *Cloud) CreateOrUpdateRoute(route network.Route) error {
if resp != nil && resp.StatusCode == http.StatusPreconditionFailed { if resp != nil && resp.StatusCode == http.StatusPreconditionFailed {
az.rtCache.Delete(az.RouteTableName) az.rtCache.Delete(az.RouteTableName)
} }
// Invalidate the cache because another new operation has canceled the current request.
if err != nil && strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.rtCache.Delete(az.RouteTableName)
}
return az.processHTTPResponse(nil, "", resp, err) return az.processHTTPResponse(nil, "", resp, err)
} }
...@@ -520,6 +561,13 @@ func (az *Cloud) createOrUpdateRouteWithRetry(route network.Route) error { ...@@ -520,6 +561,13 @@ func (az *Cloud) createOrUpdateRouteWithRetry(route network.Route) error {
az.rtCache.Delete(az.RouteTableName) az.rtCache.Delete(az.RouteTableName)
return true, err return true, err
} }
// Invalidate the cache and abort backoff because another new operation has canceled the current request.
if err != nil && strings.Contains(strings.ToLower(err.Error()), operationCancledErrorMessage) {
az.rtCache.Delete(az.RouteTableName)
return true, err
}
return done, retryError return done, retryError
}) })
} }
......
...@@ -874,6 +874,8 @@ func (az *Cloud) reconcileLoadBalancer(clusterName string, service *v1.Service, ...@@ -874,6 +874,8 @@ func (az *Cloud) reconcileLoadBalancer(clusterName string, service *v1.Service,
if wantLb && nodes != nil { if wantLb && nodes != nil {
// Add the machines to the backend pool if they're not already // Add the machines to the backend pool if they're not already
vmSetName := az.mapLoadBalancerNameToVMSet(lbName, clusterName) vmSetName := az.mapLoadBalancerNameToVMSet(lbName, clusterName)
// Etag would be changed when updating backend pools, so invalidate lbCache after it.
defer az.lbCache.Delete(lbName)
err := az.vmSet.EnsureHostsInPool(service, nodes, lbBackendPoolID, vmSetName, isInternal) err := az.vmSet.EnsureHostsInPool(service, nodes, lbBackendPoolID, vmSetName, isInternal)
if err != nil { if err != nil {
return nil, err return nil, err
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment