Add cache for load balancer

This commit is contained in:
Pengfei Ni
2018-02-07 17:19:34 +08:00
parent 2badf1ff55
commit d22b6d9ebe
4 changed files with 44 additions and 10 deletions

View File

@@ -136,6 +136,7 @@ type Cloud struct {
VirtualMachineScaleSetVMsClient VirtualMachineScaleSetVMsClient VirtualMachineScaleSetVMsClient VirtualMachineScaleSetVMsClient
vmCache *timedCache vmCache *timedCache
lbCache *timedCache
*BlobDiskController *BlobDiskController
*ManagedDiskController *ManagedDiskController
@@ -252,6 +253,12 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) {
} }
az.vmCache = vmCache az.vmCache = vmCache
lbCache, err := az.newLBCache()
if err != nil {
return nil, err
}
az.lbCache = lbCache
if err := initDiskControllers(&az); err != nil { if err := initDiskControllers(&az); err != nil {
return nil, err return nil, err
} }

View File

@@ -142,7 +142,12 @@ func (az *Cloud) CreateOrUpdateLBWithRetry(lb network.LoadBalancer) error {
resp := <-respChan resp := <-respChan
err := <-errChan err := <-errChan
glog.V(10).Infof("LoadBalancerClient.CreateOrUpdate(%s): end", *lb.Name) glog.V(10).Infof("LoadBalancerClient.CreateOrUpdate(%s): end", *lb.Name)
return processRetryResponse(resp.Response, err) done, err := processRetryResponse(resp.Response, err)
if done && err == nil {
// Invalidate the cache right after updating
az.lbCache.Delete(*lb.Name)
}
return done, err
}) })
} }
@@ -283,7 +288,12 @@ func (az *Cloud) DeleteLBWithRetry(lbName string) error {
respChan, errChan := az.LoadBalancerClient.Delete(az.ResourceGroup, lbName, nil) respChan, errChan := az.LoadBalancerClient.Delete(az.ResourceGroup, lbName, nil)
resp := <-respChan resp := <-respChan
err := <-errChan err := <-errChan
return processRetryResponse(resp, err) done, err := processRetryResponse(resp, err)
if done && err == nil {
// Invalidate the cache right after deleting
az.lbCache.Delete(lbName)
}
return done, err
}) })
} }

View File

@@ -879,6 +879,7 @@ func getTestCloud() (az *Cloud) {
az.VirtualMachinesClient = newFakeAzureVirtualMachinesClient() az.VirtualMachinesClient = newFakeAzureVirtualMachinesClient()
az.vmSet = newAvailabilitySet(az) az.vmSet = newAvailabilitySet(az)
az.vmCache, _ = az.newVMCache() az.vmCache, _ = az.newVMCache()
az.lbCache, _ = az.newLBCache()
return az return az
} }

View File

@@ -30,6 +30,7 @@ import (
var ( var (
vmCacheTTL = time.Minute vmCacheTTL = time.Minute
lbCacheTTL = 2 * time.Minute
) )
// checkExistsFromError inspects an error and returns a true if err is nil, // checkExistsFromError inspects an error and returns a true if err is nil,
@@ -139,19 +140,16 @@ func (az *Cloud) getSubnet(virtualNetworkName string, subnetName string) (subnet
} }
func (az *Cloud) getAzureLoadBalancer(name string) (lb network.LoadBalancer, exists bool, err error) { func (az *Cloud) getAzureLoadBalancer(name string) (lb network.LoadBalancer, exists bool, err error) {
var realErr error cachedLB, err := az.lbCache.Get(name)
if err != nil {
lb, err = az.LoadBalancerClient.Get(az.ResourceGroup, name, "") return lb, false, err
exists, realErr = checkResourceExistsFromError(err)
if realErr != nil {
return lb, false, realErr
} }
if !exists { if cachedLB == nil {
return lb, false, nil return lb, false, nil
} }
return lb, exists, err return *(cachedLB.(*network.LoadBalancer)), true, nil
} }
func (az *Cloud) newVMCache() (*timedCache, error) { func (az *Cloud) newVMCache() (*timedCache, error) {
@@ -171,3 +169,21 @@ func (az *Cloud) newVMCache() (*timedCache, error) {
return newTimedcache(vmCacheTTL, getter) return newTimedcache(vmCacheTTL, getter)
} }
func (az *Cloud) newLBCache() (*timedCache, error) {
getter := func(key string) (interface{}, error) {
lb, err := az.LoadBalancerClient.Get(az.ResourceGroup, key, "")
exists, realErr := checkResourceExistsFromError(err)
if realErr != nil {
return nil, realErr
}
if !exists {
return nil, nil
}
return &lb, nil
}
return newTimedcache(lbCacheTTL, getter)
}