@@ -51,6 +51,11 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
51
51
return nil , status .Error (codes .InvalidArgument , "CreateVolume Volume capabilities must be provided" )
52
52
}
53
53
54
+ if acquired := d .volumeLocks .TryAcquire (name ); ! acquired {
55
+ return nil , status .Errorf (codes .Aborted , volumeOperationAlreadyExistsFmt , name )
56
+ }
57
+ defer d .volumeLocks .Release (name )
58
+
54
59
volSizeBytes := int64 (req .GetCapacityRange ().GetRequiredBytes ())
55
60
requestGiB := int (util .RoundUpGiB (volSizeBytes ))
56
61
@@ -202,15 +207,20 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
202
207
203
208
// DeleteVolume delete a volume
204
209
func (d * Driver ) DeleteVolume (ctx context.Context , req * csi.DeleteVolumeRequest ) (* csi.DeleteVolumeResponse , error ) {
205
- if len (req .GetVolumeId ()) == 0 {
210
+ volumeID := req .GetVolumeId ()
211
+ if len (volumeID ) == 0 {
206
212
return nil , status .Error (codes .InvalidArgument , "Volume ID missing in request" )
207
213
}
208
214
209
215
if err := d .ValidateControllerServiceRequest (csi .ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME ); err != nil {
210
216
return nil , fmt .Errorf ("invalid delete volume req: %v" , req )
211
217
}
212
218
213
- volumeID := req .VolumeId
219
+ if acquired := d .volumeLocks .TryAcquire (volumeID ); ! acquired {
220
+ return nil , status .Errorf (codes .Aborted , volumeOperationAlreadyExistsFmt , volumeID )
221
+ }
222
+ defer d .volumeLocks .Release (volumeID )
223
+
214
224
resourceGroupName , accountName , containerName , err := GetContainerInfo (volumeID )
215
225
if err != nil {
216
226
klog .Errorf ("GetContainerInfo(%s) in DeleteVolume failed with error: %v" , volumeID , err )
@@ -254,20 +264,19 @@ func (d *Driver) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest)
254
264
}
255
265
256
266
klog .V (2 ).Infof ("container(%s) under rg(%s) account(%s) volumeID(%s) is deleted successfully" , containerName , resourceGroupName , accountName , volumeID )
257
-
258
267
return & csi.DeleteVolumeResponse {}, nil
259
268
}
260
269
261
270
// ValidateVolumeCapabilities return the capabilities of the volume
262
271
func (d * Driver ) ValidateVolumeCapabilities (ctx context.Context , req * csi.ValidateVolumeCapabilitiesRequest ) (* csi.ValidateVolumeCapabilitiesResponse , error ) {
263
- if len (req .GetVolumeId ()) == 0 {
272
+ volumeID := req .GetVolumeId ()
273
+ if len (volumeID ) == 0 {
264
274
return nil , status .Error (codes .InvalidArgument , "Volume ID missing in request" )
265
275
}
266
276
if req .GetVolumeCapabilities () == nil {
267
277
return nil , status .Error (codes .InvalidArgument , "Volume capabilities missing in request" )
268
278
}
269
279
270
- volumeID := req .VolumeId
271
280
resourceGroupName , accountName , containerName , err := GetContainerInfo (volumeID )
272
281
if err != nil {
273
282
klog .Errorf ("GetContainerInfo(%s) in ValidateVolumeCapabilities failed with error: %v" , volumeID , err )
0 commit comments