From f76ef29512146b60a5afb6b69f2321c328432c17 Mon Sep 17 00:00:00 2001 From: Jack Francis Date: Fri, 14 Jul 2017 17:13:40 -0700 Subject: [PATCH] backing off az.getIPForMachine in az.NodeAddresses also rate limiting the call to az.getVirtualMachine inside az.getIPForMachine --- .../providers/azure/azure_backoff.go | 16 ++++++++++++++++ .../providers/azure/azure_instances.go | 13 +++++++++++-- pkg/cloudprovider/providers/azure/azure_util.go | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/pkg/cloudprovider/providers/azure/azure_backoff.go b/pkg/cloudprovider/providers/azure/azure_backoff.go index 8d092983c13..00544b1b988 100644 --- a/pkg/cloudprovider/providers/azure/azure_backoff.go +++ b/pkg/cloudprovider/providers/azure/azure_backoff.go @@ -59,6 +59,22 @@ func (az *Cloud) VirtualMachineClientGetWithRetry(resourceGroup, vmName string, return machine, err } +// GetIPForMachineWithRetry invokes az.getIPForMachine with exponential backoff retry +func (az *Cloud) GetIPForMachineWithRetry(name types.NodeName) (string, error) { + var ip string + err := wait.ExponentialBackoff(az.resourceRequestBackoff, func() (bool, error) { + var retryErr error + ip, retryErr = az.getIPForMachine(name) + if retryErr != nil { + glog.Errorf("backoff: failure, will retry,err=%v", retryErr) + return false, nil + } + glog.V(2).Infof("backoff: success") + return true, nil + }) + return ip, err +} + // CreateOrUpdateSGWithRetry invokes az.SecurityGroupsClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateSGWithRetry(sg network.SecurityGroup) error { return wait.ExponentialBackoff(az.resourceRequestBackoff, func() (bool, error) { diff --git a/pkg/cloudprovider/providers/azure/azure_instances.go b/pkg/cloudprovider/providers/azure/azure_instances.go index 256428d8a39..f683093ac3a 100644 --- a/pkg/cloudprovider/providers/azure/azure_instances.go +++ b/pkg/cloudprovider/providers/azure/azure_instances.go @@ -41,8 +41,17 @@ func (az *Cloud) NodeAddresses(name types.NodeName) ([]v1.NodeAddress, error) { } ip, err := az.getIPForMachine(name) if err != nil { - glog.Errorf("error: az.NodeAddresses, az.getIPForMachine(%s), err=%v", name, err) - return nil, err + if az.CloudProviderBackoff { + glog.V(2).Infof("NodeAddresses(%s) backing off", name) + ip, err = az.GetIPForMachineWithRetry(name) + if err != nil { + glog.V(2).Infof("NodeAddresses(%s) abort backoff", name) + return nil, err + } + } else { + glog.Errorf("error: az.NodeAddresses, az.getIPForMachine(%s), err=%v", name, err) + return nil, err + } } return []v1.NodeAddress{ diff --git a/pkg/cloudprovider/providers/azure/azure_util.go b/pkg/cloudprovider/providers/azure/azure_util.go index 5f59da85918..8bbbb1104fc 100644 --- a/pkg/cloudprovider/providers/azure/azure_util.go +++ b/pkg/cloudprovider/providers/azure/azure_util.go @@ -249,6 +249,7 @@ outer: } func (az *Cloud) getIPForMachine(nodeName types.NodeName) (string, error) { + az.operationPollRateLimiter.Accept() machine, exists, err := az.getVirtualMachine(nodeName) if !exists { return "", cloudprovider.InstanceNotFound