@@ -49,7 +49,9 @@ const (
49
49
errLeaseFailed = "AcquireDiskLeaseFailed"
50
50
errLeaseIDMissing = "LeaseIdMissing"
51
51
errContainerNotFound = "ContainerNotFound"
52
- errDiskBlobNotFound = "DiskBlobNotFound"
52
+ errStatusCode400 = "statuscode=400"
53
+ errInvalidParameter = `code="invalidparameter"`
54
+ errTargetInstanceIds = `target="instanceids"`
53
55
sourceSnapshot = "snapshot"
54
56
sourceVolume = "volume"
55
57
@@ -214,24 +216,32 @@ func (c *controllerCommon) DetachDisk(diskName, diskURI string, nodeName types.N
214
216
c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
215
217
c .vmLockMap .UnlockEntry (strings .ToLower (string (nodeName )))
216
218
217
- if err != nil && retry .IsErrorRetriable (err ) && c .cloud .CloudProviderBackoff {
218
- klog .V (2 ).Infof ("azureDisk - update backing off: detach disk(%s, %s), err: %v" , diskName , diskURI , err )
219
- retryErr := kwait .ExponentialBackoff (c .cloud .RequestBackoff (), func () (bool , error ) {
220
- c .vmLockMap .LockEntry (strings .ToLower (string (nodeName )))
221
- c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "detaching" )
222
- err := vmset .DetachDisk (diskName , diskURI , nodeName )
223
- c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
224
- c .vmLockMap .UnlockEntry (strings .ToLower (string (nodeName )))
225
-
226
- retriable := false
227
- if err != nil && retry .IsErrorRetriable (err ) {
228
- retriable = true
219
+ if err != nil {
220
+ if isInstanceNotFoundError (err ) {
221
+ // if host doesn't exist, no need to detach
222
+ klog .Warningf ("azureDisk - got InstanceNotFoundError(%v), DetachDisk(%s) will assume disk is already detached" ,
223
+ err , diskURI )
224
+ return nil
225
+ }
226
+ if retry .IsErrorRetriable (err ) && c .cloud .CloudProviderBackoff {
227
+ klog .Warningf ("azureDisk - update backing off: detach disk(%s, %s), err: %v" , diskName , diskURI , err )
228
+ retryErr := kwait .ExponentialBackoff (c .cloud .RequestBackoff (), func () (bool , error ) {
229
+ c .vmLockMap .LockEntry (strings .ToLower (string (nodeName )))
230
+ c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "detaching" )
231
+ err := vmset .DetachDisk (diskName , diskURI , nodeName )
232
+ c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
233
+ c .vmLockMap .UnlockEntry (strings .ToLower (string (nodeName )))
234
+
235
+ retriable := false
236
+ if err != nil && retry .IsErrorRetriable (err ) {
237
+ retriable = true
238
+ }
239
+ return ! retriable , err
240
+ })
241
+ if retryErr != nil {
242
+ err = retryErr
243
+ klog .V (2 ).Infof ("azureDisk - update abort backoff: detach disk(%s, %s), err: %v" , diskName , diskURI , err )
229
244
}
230
- return ! retriable , err
231
- })
232
- if retryErr != nil {
233
- err = retryErr
234
- klog .V (2 ).Infof ("azureDisk - update abort backoff: detach disk(%s, %s), err: %v" , diskName , diskURI , err )
235
245
}
236
246
}
237
247
if err != nil {
@@ -426,3 +436,8 @@ func getValidCreationData(subscriptionID, resourceGroup, sourceResourceID, sourc
426
436
SourceResourceID : & sourceResourceID ,
427
437
}, nil
428
438
}
439
+
440
+ func isInstanceNotFoundError (err error ) bool {
441
+ errMsg := strings .ToLower (err .Error ())
442
+ return strings .Contains (errMsg , errStatusCode400 ) && strings .Contains (errMsg , errInvalidParameter ) && strings .Contains (errMsg , errTargetInstanceIds )
443
+ }
0 commit comments