From daec2bd7455ddd427616e4d7e4a2459a67f0f3a3 Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Wed, 7 Feb 2018 22:26:03 +0800 Subject: [PATCH] Add cache for route tables --- pkg/cloudprovider/providers/azure/azure.go | 7 ++++ .../providers/azure/azure_routes.go | 7 ++-- .../providers/azure/azure_routes_test.go | 1 + .../providers/azure/azure_test.go | 1 + .../providers/azure/azure_wrap.go | 32 ++++++++++++++----- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/pkg/cloudprovider/providers/azure/azure.go b/pkg/cloudprovider/providers/azure/azure.go index 1fd3eed2fc0..d26ea04080b 100644 --- a/pkg/cloudprovider/providers/azure/azure.go +++ b/pkg/cloudprovider/providers/azure/azure.go @@ -138,6 +138,7 @@ type Cloud struct { vmCache *timedCache lbCache *timedCache nsgCache *timedCache + rtCache *timedCache *BlobDiskController *ManagedDiskController @@ -266,6 +267,12 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) { } az.nsgCache = nsgCache + rtCache, err := az.newRouteTableCache() + if err != nil { + return nil, err + } + az.rtCache = rtCache + if err := initDiskControllers(&az); err != nil { return nil, err } diff --git a/pkg/cloudprovider/providers/azure/azure_routes.go b/pkg/cloudprovider/providers/azure/azure_routes.go index e08ca912581..c78de23d730 100644 --- a/pkg/cloudprovider/providers/azure/azure_routes.go +++ b/pkg/cloudprovider/providers/azure/azure_routes.go @@ -98,10 +98,9 @@ func (az *Cloud) createRouteTable() error { return err } - glog.V(10).Infof("RouteTablesClient.Get(%q): start", az.RouteTableName) - _, err = az.RouteTablesClient.Get(az.ResourceGroup, az.RouteTableName, "") - glog.V(10).Infof("RouteTablesClient.Get(%q): end", az.RouteTableName) - return err + // Invalidate the cache right after updating + az.rtCache.Delete(az.RouteTableName) + return nil } // CreateRoute creates the described managed route diff --git a/pkg/cloudprovider/providers/azure/azure_routes_test.go b/pkg/cloudprovider/providers/azure/azure_routes_test.go index 02041f0fa22..31f31ee4eb4 100644 --- a/pkg/cloudprovider/providers/azure/azure_routes_test.go +++ b/pkg/cloudprovider/providers/azure/azure_routes_test.go @@ -37,6 +37,7 @@ func TestCreateRoute(t *testing.T) { Location: "location", }, } + cloud.rtCache, _ = cloud.newRouteTableCache() expectedTable := network.RouteTable{ Name: &cloud.RouteTableName, Location: &cloud.Location, diff --git a/pkg/cloudprovider/providers/azure/azure_test.go b/pkg/cloudprovider/providers/azure/azure_test.go index 8226815efa2..e638e4522d4 100644 --- a/pkg/cloudprovider/providers/azure/azure_test.go +++ b/pkg/cloudprovider/providers/azure/azure_test.go @@ -881,6 +881,7 @@ func getTestCloud() (az *Cloud) { az.vmCache, _ = az.newVMCache() az.lbCache, _ = az.newLBCache() az.nsgCache, _ = az.newNSGCache() + az.rtCache, _ = az.newRouteTableCache() return az } diff --git a/pkg/cloudprovider/providers/azure/azure_wrap.go b/pkg/cloudprovider/providers/azure/azure_wrap.go index 792946cc907..d2bb36fe81a 100644 --- a/pkg/cloudprovider/providers/azure/azure_wrap.go +++ b/pkg/cloudprovider/providers/azure/azure_wrap.go @@ -33,6 +33,7 @@ var ( vmCacheTTL = time.Minute lbCacheTTL = 2 * time.Minute nsgCacheTTL = 2 * time.Minute + rtCacheTTL = 2 * time.Minute ) // checkExistsFromError inspects an error and returns a true if err is nil, @@ -83,19 +84,16 @@ func (az *Cloud) getVirtualMachine(nodeName types.NodeName) (vm compute.VirtualM } func (az *Cloud) getRouteTable() (routeTable network.RouteTable, exists bool, err error) { - var realErr error - - routeTable, err = az.RouteTablesClient.Get(az.ResourceGroup, az.RouteTableName, "") - exists, realErr = checkResourceExistsFromError(err) - if realErr != nil { - return routeTable, false, realErr + cachedRt, err := az.rtCache.Get(az.RouteTableName) + if err != nil { + return routeTable, false, err } - if !exists { + if cachedRt == nil { return routeTable, false, nil } - return routeTable, exists, err + return *(cachedRt.(*network.RouteTable)), true, nil } func (az *Cloud) getPublicIPAddress(pipResourceGroup string, pipName string) (pip network.PublicIPAddress, exists bool, err error) { @@ -220,3 +218,21 @@ func (az *Cloud) newNSGCache() (*timedCache, error) { return newTimedcache(nsgCacheTTL, getter) } + +func (az *Cloud) newRouteTableCache() (*timedCache, error) { + getter := func(key string) (interface{}, error) { + rt, err := az.RouteTablesClient.Get(az.ResourceGroup, key, "") + exists, realErr := checkResourceExistsFromError(err) + if realErr != nil { + return nil, realErr + } + + if !exists { + return nil, nil + } + + return &rt, nil + } + + return newTimedcache(rtCacheTTL, getter) +}