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
vmCache *timedCache
lbCache *timedCache
*BlobDiskController
*ManagedDiskController
@ -252,6 +253,12 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) {
}
az.vmCache = vmCache
lbCache, err := az.newLBCache()
if err != nil {
return nil, err
}
az.lbCache = lbCache
if err := initDiskControllers(&az); err != nil {
return nil, err
}

View File

@ -142,7 +142,12 @@ func (az *Cloud) CreateOrUpdateLBWithRetry(lb network.LoadBalancer) error {
resp := <-respChan
err := <-errChan
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)
resp := <-respChan
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.vmSet = newAvailabilitySet(az)
az.vmCache, _ = az.newVMCache()
az.lbCache, _ = az.newLBCache()
return az
}

View File

@ -30,6 +30,7 @@ import (
var (
vmCacheTTL = time.Minute
lbCacheTTL = 2 * time.Minute
)
// 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) {
var realErr error
lb, err = az.LoadBalancerClient.Get(az.ResourceGroup, name, "")
exists, realErr = checkResourceExistsFromError(err)
if realErr != nil {
return lb, false, realErr
cachedLB, err := az.lbCache.Get(name)
if err != nil {
return lb, false, err
}
if !exists {
if cachedLB == nil {
return lb, false, nil
}
return lb, exists, err
return *(cachedLB.(*network.LoadBalancer)), true, nil
}
func (az *Cloud) newVMCache() (*timedCache, error) {
@ -171,3 +169,21 @@ func (az *Cloud) newVMCache() (*timedCache, error) {
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)
}