@@ -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.
@@ -145,6 +148,8 @@ func (c *controllerCommon) AttachDisk(isManagedDisk bool, diskName, diskURI stri
145
148
}
146
149
147
150
klog .V (2 ).Infof ("Trying to attach volume %q lun %d to node %q." , diskURI , lun , nodeName )
151
+ c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "attaching" )
152
+ defer c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
148
153
return lun , vmset .AttachDisk (isManagedDisk , diskName , diskURI , nodeName , lun , cachingMode )
149
154
}
150
155
@@ -171,14 +176,18 @@ func (c *controllerCommon) DetachDisk(diskName, diskURI string, nodeName types.N
171
176
172
177
// make the lock here as small as possible
173
178
diskOpMutex .LockKey (instanceid )
179
+ c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "detaching" )
174
180
resp , err := vmset .DetachDisk (diskName , diskURI , nodeName )
181
+ c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
175
182
diskOpMutex .UnlockKey (instanceid )
176
183
177
184
if c .cloud .CloudProviderBackoff && shouldRetryHTTPRequest (resp , err ) {
178
185
klog .V (2 ).Infof ("azureDisk - update backing off: detach disk(%s, %s), err: %v" , diskName , diskURI , err )
179
186
retryErr := kwait .ExponentialBackoff (c .cloud .RequestBackoff (), func () (bool , error ) {
180
187
diskOpMutex .LockKey (instanceid )
188
+ c .diskAttachDetachMap .Store (strings .ToLower (diskURI ), "detaching" )
181
189
resp , err := vmset .DetachDisk (diskName , diskURI , nodeName )
190
+ c .diskAttachDetachMap .Delete (strings .ToLower (diskURI ))
182
191
diskOpMutex .UnlockKey (instanceid )
183
192
return c .cloud .processHTTPRetryResponse (nil , "" , resp , err )
184
193
})
@@ -220,9 +229,13 @@ func (c *controllerCommon) GetDiskLun(diskName, diskURI string, nodeName types.N
220
229
if disk .Lun != nil && (disk .Name != nil && diskName != "" && strings .EqualFold (* disk .Name , diskName )) ||
221
230
(disk .Vhd != nil && disk .Vhd .URI != nil && diskURI != "" && strings .EqualFold (* disk .Vhd .URI , diskURI )) ||
222
231
(disk .ManagedDisk != nil && strings .EqualFold (* disk .ManagedDisk .ID , diskURI )) {
223
- // found the disk
224
- klog .V (2 ).Infof ("azureDisk - find disk: lun %d name %q uri %q" , * disk .Lun , diskName , diskURI )
225
- return * disk .Lun , nil
232
+ if disk .ToBeDetached != nil && * disk .ToBeDetached {
233
+ klog .Warningf ("azureDisk - find disk(ToBeDetached): lun %d name %q uri %q" , * disk .Lun , diskName , diskURI )
234
+ } else {
235
+ // found the disk
236
+ klog .V (2 ).Infof ("azureDisk - find disk: lun %d name %q uri %q" , * disk .Lun , diskName , diskURI )
237
+ return * disk .Lun , nil
238
+ }
226
239
}
227
240
}
228
241
return - 1 , fmt .Errorf ("cannot find Lun for disk %s" , diskName )
0 commit comments