mirror of https://github.com/k3s-io/k3s
refactor detach azure disk retry operation
parent
3c949c7d41
commit
5376b645e3
|
@ -95,14 +95,32 @@ func (c *controllerCommon) AttachDisk(isManagedDisk bool, diskName, diskURI stri
|
||||||
return vmset.AttachDisk(isManagedDisk, diskName, diskURI, nodeName, lun, cachingMode)
|
return vmset.AttachDisk(isManagedDisk, diskName, diskURI, nodeName, lun, cachingMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetachDiskByName detaches a vhd from host. The vhd can be identified by diskName or diskURI.
|
// DetachDisk detaches a disk from host. The vhd can be identified by diskName or diskURI.
|
||||||
func (c *controllerCommon) DetachDiskByName(diskName, diskURI string, nodeName types.NodeName) error {
|
func (c *controllerCommon) DetachDisk(diskName, diskURI string, nodeName types.NodeName) error {
|
||||||
vmset, err := c.getNodeVMSet(nodeName)
|
vmset, err := c.getNodeVMSet(nodeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return vmset.DetachDiskByName(diskName, diskURI, nodeName)
|
resp, err := vmset.DetachDisk(diskName, diskURI, nodeName)
|
||||||
|
if c.cloud.CloudProviderBackoff && shouldRetryHTTPRequest(resp, err) {
|
||||||
|
klog.V(2).Infof("azureDisk - update backing off: detach disk(%s, %s), err: %v", diskName, diskURI, err)
|
||||||
|
retryErr := kwait.ExponentialBackoff(c.cloud.requestBackoff(), func() (bool, error) {
|
||||||
|
resp, err := vmset.DetachDisk(diskName, diskURI, nodeName)
|
||||||
|
return c.cloud.processHTTPRetryResponse(nil, "", resp, err)
|
||||||
|
})
|
||||||
|
if retryErr != nil {
|
||||||
|
err = retryErr
|
||||||
|
klog.V(2).Infof("azureDisk - update abort backoff: detach disk(%s, %s), err: %v", diskName, diskURI, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("azureDisk - detach disk(%s, %s) failed, err: %v", diskName, diskURI, err)
|
||||||
|
} else {
|
||||||
|
klog.V(2).Infof("azureDisk - detach disk(%s, %s) succeeded", diskName, diskURI)
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// getNodeDataDisks invokes vmSet interfaces to get data disks for the node.
|
// getNodeDataDisks invokes vmSet interfaces to get data disks for the node.
|
||||||
|
|
|
@ -18,6 +18,7 @@ package azure
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
||||||
|
@ -88,7 +89,7 @@ func (as *availabilitySet) AttachDisk(isManagedDisk bool, diskName, diskURI stri
|
||||||
if strings.Contains(detail, errLeaseFailed) || strings.Contains(detail, errDiskBlobNotFound) {
|
if strings.Contains(detail, errLeaseFailed) || strings.Contains(detail, errDiskBlobNotFound) {
|
||||||
// if lease cannot be acquired or disk not found, immediately detach the disk and return the original error
|
// if lease cannot be acquired or disk not found, immediately detach the disk and return the original error
|
||||||
klog.V(2).Infof("azureDisk - err %v, try detach disk(%s, %s)", err, diskName, diskURI)
|
klog.V(2).Infof("azureDisk - err %v, try detach disk(%s, %s)", err, diskName, diskURI)
|
||||||
as.DetachDiskByName(diskName, diskURI, nodeName)
|
as.DetachDisk(diskName, diskURI, nodeName)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
klog.V(2).Infof("azureDisk - attach disk(%s, %s) succeeded", diskName, diskURI)
|
klog.V(2).Infof("azureDisk - attach disk(%s, %s) succeeded", diskName, diskURI)
|
||||||
|
@ -96,20 +97,20 @@ func (as *availabilitySet) AttachDisk(isManagedDisk bool, diskName, diskURI stri
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetachDiskByName detaches a vhd from host
|
// DetachDisk detaches a disk from host
|
||||||
// the vhd can be identified by diskName or diskURI
|
// the vhd can be identified by diskName or diskURI
|
||||||
func (as *availabilitySet) DetachDiskByName(diskName, diskURI string, nodeName types.NodeName) error {
|
func (as *availabilitySet) DetachDisk(diskName, diskURI string, nodeName types.NodeName) (*http.Response, error) {
|
||||||
vm, err := as.getVirtualMachine(nodeName)
|
vm, err := as.getVirtualMachine(nodeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// if host doesn't exist, no need to detach
|
// if host doesn't exist, no need to detach
|
||||||
klog.Warningf("azureDisk - cannot find node %s, skip detaching disk(%s, %s)", nodeName, diskName, diskURI)
|
klog.Warningf("azureDisk - cannot find node %s, skip detaching disk(%s, %s)", nodeName, diskName, diskURI)
|
||||||
return nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
vmName := mapNodeNameToVMName(nodeName)
|
vmName := mapNodeNameToVMName(nodeName)
|
||||||
nodeResourceGroup, err := as.GetNodeResourceGroup(vmName)
|
nodeResourceGroup, err := as.GetNodeResourceGroup(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
disks := *vm.StorageProfile.DataDisks
|
disks := *vm.StorageProfile.DataDisks
|
||||||
|
@ -127,7 +128,7 @@ func (as *availabilitySet) DetachDiskByName(diskName, diskURI string, nodeName t
|
||||||
}
|
}
|
||||||
|
|
||||||
if !bFoundDisk {
|
if !bFoundDisk {
|
||||||
return fmt.Errorf("detach azure disk failure, disk %s not found, diskURI: %s", diskName, diskURI)
|
return nil, fmt.Errorf("detach azure disk failure, disk %s not found, diskURI: %s", diskName, diskURI)
|
||||||
}
|
}
|
||||||
|
|
||||||
newVM := compute.VirtualMachine{
|
newVM := compute.VirtualMachine{
|
||||||
|
@ -146,22 +147,7 @@ func (as *availabilitySet) DetachDiskByName(diskName, diskURI string, nodeName t
|
||||||
// Invalidate the cache right after updating
|
// Invalidate the cache right after updating
|
||||||
defer as.cloud.vmCache.Delete(vmName)
|
defer as.cloud.vmCache.Delete(vmName)
|
||||||
|
|
||||||
resp, err := as.VirtualMachinesClient.CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM)
|
return as.VirtualMachinesClient.CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM)
|
||||||
if as.CloudProviderBackoff && shouldRetryHTTPRequest(resp, err) {
|
|
||||||
klog.V(2).Infof("azureDisk - update(%s) backing off: vm(%s) detach disk(%s, %s), err: %v", nodeResourceGroup, vmName, diskName, diskURI, err)
|
|
||||||
retryErr := as.CreateOrUpdateVMWithRetry(nodeResourceGroup, vmName, newVM)
|
|
||||||
if retryErr != nil {
|
|
||||||
err = retryErr
|
|
||||||
klog.V(2).Infof("azureDisk - update(%s) abort backoff: vm(%s) detach disk(%s, %s), err: %v", nodeResourceGroup, vmName, diskName, diskURI, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
klog.Errorf("azureDisk - detach disk(%s, %s) failed, err: %v", diskName, diskURI, err)
|
|
||||||
} else {
|
|
||||||
klog.V(2).Infof("azureDisk - detach disk(%s, %s) succeeded", diskName, diskURI)
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDataDisks gets a list of data disks attached to the node.
|
// GetDataDisks gets a list of data disks attached to the node.
|
||||||
|
|
|
@ -18,6 +18,7 @@ package azure
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
||||||
|
@ -93,7 +94,7 @@ func (ss *scaleSet) AttachDisk(isManagedDisk bool, diskName, diskURI string, nod
|
||||||
if strings.Contains(detail, errLeaseFailed) || strings.Contains(detail, errDiskBlobNotFound) {
|
if strings.Contains(detail, errLeaseFailed) || strings.Contains(detail, errDiskBlobNotFound) {
|
||||||
// if lease cannot be acquired or disk not found, immediately detach the disk and return the original error
|
// if lease cannot be acquired or disk not found, immediately detach the disk and return the original error
|
||||||
klog.Infof("azureDisk - err %s, try detach disk(%s, %s)", detail, diskName, diskURI)
|
klog.Infof("azureDisk - err %s, try detach disk(%s, %s)", detail, diskName, diskURI)
|
||||||
ss.DetachDiskByName(diskName, diskURI, nodeName)
|
ss.DetachDisk(diskName, diskURI, nodeName)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
klog.V(2).Infof("azureDisk - attach disk(%s, %s) succeeded", diskName, diskURI)
|
klog.V(2).Infof("azureDisk - attach disk(%s, %s) succeeded", diskName, diskURI)
|
||||||
|
@ -101,18 +102,18 @@ func (ss *scaleSet) AttachDisk(isManagedDisk bool, diskName, diskURI string, nod
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetachDiskByName detaches a vhd from host
|
// DetachDisk detaches a disk from host
|
||||||
// the vhd can be identified by diskName or diskURI
|
// the vhd can be identified by diskName or diskURI
|
||||||
func (ss *scaleSet) DetachDiskByName(diskName, diskURI string, nodeName types.NodeName) error {
|
func (ss *scaleSet) DetachDisk(diskName, diskURI string, nodeName types.NodeName) (*http.Response, error) {
|
||||||
vmName := mapNodeNameToVMName(nodeName)
|
vmName := mapNodeNameToVMName(nodeName)
|
||||||
ssName, instanceID, vm, err := ss.getVmssVM(vmName)
|
ssName, instanceID, vm, err := ss.getVmssVM(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeResourceGroup, err := ss.GetNodeResourceGroup(vmName)
|
nodeResourceGroup, err := ss.GetNodeResourceGroup(vmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
disks := []compute.DataDisk{}
|
disks := []compute.DataDisk{}
|
||||||
|
@ -133,7 +134,7 @@ func (ss *scaleSet) DetachDiskByName(diskName, diskURI string, nodeName types.No
|
||||||
}
|
}
|
||||||
|
|
||||||
if !bFoundDisk {
|
if !bFoundDisk {
|
||||||
return fmt.Errorf("detach azure disk failure, disk %s not found, diskURI: %s", diskName, diskURI)
|
return nil, fmt.Errorf("detach azure disk failure, disk %s not found, diskURI: %s", diskName, diskURI)
|
||||||
}
|
}
|
||||||
|
|
||||||
newVM := compute.VirtualMachineScaleSetVM{
|
newVM := compute.VirtualMachineScaleSetVM{
|
||||||
|
@ -156,22 +157,7 @@ func (ss *scaleSet) DetachDiskByName(diskName, diskURI string, nodeName types.No
|
||||||
defer ss.vmssVMCache.Delete(key)
|
defer ss.vmssVMCache.Delete(key)
|
||||||
|
|
||||||
klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk(%s, %s)", nodeResourceGroup, nodeName, diskName, diskURI)
|
klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk(%s, %s)", nodeResourceGroup, nodeName, diskName, diskURI)
|
||||||
resp, err := ss.VirtualMachineScaleSetVMsClient.Update(ctx, nodeResourceGroup, ssName, instanceID, newVM)
|
return ss.VirtualMachineScaleSetVMsClient.Update(ctx, nodeResourceGroup, ssName, instanceID, newVM)
|
||||||
if ss.CloudProviderBackoff && shouldRetryHTTPRequest(resp, err) {
|
|
||||||
klog.V(2).Infof("azureDisk - update(%s) backing off: vm(%s) detach disk(%s, %s), err: %v", nodeResourceGroup, nodeName, diskName, diskURI, err)
|
|
||||||
retryErr := ss.UpdateVmssVMWithRetry(nodeResourceGroup, ssName, instanceID, newVM)
|
|
||||||
if retryErr != nil {
|
|
||||||
err = retryErr
|
|
||||||
klog.V(2).Infof("azureDisk - update(%s) abort backoff: vm(%s) detach disk(%s, %s), err: %v", nodeResourceGroup, nodeName, diskName, diskURI, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
klog.Errorf("azureDisk - detach disk(%s, %s) from %s failed, err: %v", diskName, diskURI, nodeName, err)
|
|
||||||
} else {
|
|
||||||
klog.V(2).Infof("azureDisk - detach disk(%s, %s) succeeded", diskName, diskURI)
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDataDisks gets a list of data disks attached to the node.
|
// GetDataDisks gets a list of data disks attached to the node.
|
||||||
|
|
|
@ -910,8 +910,8 @@ func (f *fakeVMSet) AttachDisk(isManagedDisk bool, diskName, diskURI string, nod
|
||||||
return fmt.Errorf("unimplemented")
|
return fmt.Errorf("unimplemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *fakeVMSet) DetachDiskByName(diskName, diskURI string, nodeName types.NodeName) error {
|
func (f *fakeVMSet) DetachDisk(diskName, diskURI string, nodeName types.NodeName) (*http.Response, error) {
|
||||||
return fmt.Errorf("unimplemented")
|
return nil, fmt.Errorf("unimplemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *fakeVMSet) GetDataDisks(nodeName types.NodeName) ([]compute.DataDisk, error) {
|
func (f *fakeVMSet) GetDataDisks(nodeName types.NodeName) ([]compute.DataDisk, error) {
|
||||||
|
|
|
@ -17,6 +17,8 @@ limitations under the License.
|
||||||
package azure
|
package azure
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
|
||||||
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network"
|
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network"
|
||||||
|
|
||||||
|
@ -60,8 +62,8 @@ type VMSet interface {
|
||||||
|
|
||||||
// AttachDisk attaches a vhd to vm. The vhd must exist, can be identified by diskName, diskURI, and lun.
|
// AttachDisk attaches a vhd to vm. The vhd must exist, can be identified by diskName, diskURI, and lun.
|
||||||
AttachDisk(isManagedDisk bool, diskName, diskURI string, nodeName types.NodeName, lun int32, cachingMode compute.CachingTypes) error
|
AttachDisk(isManagedDisk bool, diskName, diskURI string, nodeName types.NodeName, lun int32, cachingMode compute.CachingTypes) error
|
||||||
// DetachDiskByName detaches a vhd from host. The vhd can be identified by diskName or diskURI.
|
// DetachDisk detaches a vhd from host. The vhd can be identified by diskName or diskURI.
|
||||||
DetachDiskByName(diskName, diskURI string, nodeName types.NodeName) error
|
DetachDisk(diskName, diskURI string, nodeName types.NodeName) (*http.Response, error)
|
||||||
// GetDataDisks gets a list of data disks attached to the node.
|
// GetDataDisks gets a list of data disks attached to the node.
|
||||||
GetDataDisks(nodeName types.NodeName) ([]compute.DataDisk, error)
|
GetDataDisks(nodeName types.NodeName) ([]compute.DataDisk, error)
|
||||||
|
|
||||||
|
|
|
@ -301,7 +301,7 @@ func (d *azureDiskDetacher) Detach(diskURI string, nodeName types.NodeName) erro
|
||||||
getLunMutex.LockKey(instanceid)
|
getLunMutex.LockKey(instanceid)
|
||||||
defer getLunMutex.UnlockKey(instanceid)
|
defer getLunMutex.UnlockKey(instanceid)
|
||||||
|
|
||||||
err = diskController.DetachDiskByName("", diskURI, nodeName)
|
err = diskController.DetachDisk("", diskURI, nodeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Errorf("failed to detach azure disk %q, err %v", diskURI, err)
|
klog.Errorf("failed to detach azure disk %q, err %v", diskURI, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ type DiskController interface {
|
||||||
// Attaches the disk to the host machine.
|
// Attaches the disk to the host machine.
|
||||||
AttachDisk(isManagedDisk bool, diskName, diskUri string, nodeName types.NodeName, lun int32, cachingMode compute.CachingTypes) error
|
AttachDisk(isManagedDisk bool, diskName, diskUri string, nodeName types.NodeName, lun int32, cachingMode compute.CachingTypes) error
|
||||||
// Detaches the disk, identified by disk name or uri, from the host machine.
|
// Detaches the disk, identified by disk name or uri, from the host machine.
|
||||||
DetachDiskByName(diskName, diskUri string, nodeName types.NodeName) error
|
DetachDisk(diskName, diskUri string, nodeName types.NodeName) error
|
||||||
|
|
||||||
// Check if a list of volumes are attached to the node with the specified NodeName
|
// Check if a list of volumes are attached to the node with the specified NodeName
|
||||||
DisksAreAttached(diskNames []string, nodeName types.NodeName) (map[string]bool, error)
|
DisksAreAttached(diskNames []string, nodeName types.NodeName) (map[string]bool, error)
|
||||||
|
|
Loading…
Reference in New Issue