@@ -23,6 +23,7 @@ import (
23
23
"fmt"
24
24
"path"
25
25
"strings"
26
+ "sync"
26
27
"time"
27
28
28
29
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
@@ -65,7 +66,9 @@ type controllerCommon struct {
65
66
location string
66
67
storageEndpointSuffix string
67
68
resourceGroup string
68
- cloud * Cloud
69
+ // store disk URI when disk is in attaching or detaching process
70
+ diskAttachDetachMap sync.Map
71
+ cloud * Cloud
69
72
}
70
73
71
74
// getNodeVMSet gets the VMSet interface based on config.VMType and the real virtual machine type.
@@ -151,6 +154,8 @@ func (c *controllerCommon) AttachDisk(isManagedDisk bool, diskName, diskURI stri
151
154
}
152
155
153
156
klog .V (2 ).Infof ("Trying to attach volume %q lun %d to node %q." , diskURI , lun , nodeName )
157
+ c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "attaching" )
158
+ defer c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
154
159
return lun , vmset .AttachDisk (isManagedDisk , diskName , diskURI , nodeName , lun , cachingMode , diskEncryptionSetID )
155
160
}
156
161
@@ -177,14 +182,18 @@ func (c *controllerCommon) DetachDisk(diskName, diskURI string, nodeName types.N
177
182
178
183
// make the lock here as small as possible
179
184
diskOpMutex .LockKey (instanceid )
185
+ c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "detaching" )
180
186
resp , err := vmset .DetachDisk (diskName , diskURI , nodeName )
187
+ c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
181
188
diskOpMutex .UnlockKey (instanceid )
182
189
183
190
if c .cloud .CloudProviderBackoff && shouldRetryHTTPRequest (resp , err ) {
184
191
klog .V (2 ).Infof ("azureDisk - update backing off: detach disk(%s, %s), err: %v" , diskName , diskURI , err )
185
192
retryErr := kwait .ExponentialBackoff (c .cloud .RequestBackoff (), func () (bool , error ) {
186
193
diskOpMutex .LockKey (instanceid )
194
+ c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "detaching" )
187
195
resp , err := vmset .DetachDisk (diskName , diskURI , nodeName )
196
+ c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
188
197
diskOpMutex .UnlockKey (instanceid )
189
198
return c .cloud .processHTTPRetryResponse (nil , "" , resp , err )
190
199
})
@@ -226,9 +235,13 @@ func (c *controllerCommon) GetDiskLun(diskName, diskURI string, nodeName types.N
226
235
if disk .Lun != nil && (disk .Name != nil && diskName != "" && strings .EqualFold (* disk .Name , diskName )) ||
227
236
(disk .Vhd != nil && disk .Vhd .URI != nil && diskURI != "" && strings .EqualFold (* disk .Vhd .URI , diskURI )) ||
228
237
(disk .ManagedDisk != nil && strings .EqualFold (* disk .ManagedDisk .ID , diskURI )) {
229
- // found the disk
230
- klog .V (2 ).Infof ("azureDisk - find disk: lun %d name %q uri %q" , * disk .Lun , diskName , diskURI )
231
- return * disk .Lun , nil
238
+ if disk .ToBeDetached != nil && * disk .ToBeDetached {
239
+ klog .Warningf ("azureDisk - find disk(ToBeDetached): lun %d name %q uri %q" , * disk .Lun , diskName , diskURI )
240
+ } else {
241
+ // found the disk
242
+ klog .V (2 ).Infof ("azureDisk - find disk: lun %d name %q uri %q" , * disk .Lun , diskName , diskURI )
243
+ return * disk .Lun , nil
244
+ }
232
245
}
233
246
}
234
247
return - 1 , fmt .Errorf ("cannot find Lun for disk %s" , diskName )
0 commit comments