Skip to content

Commit 6c93c6a

Browse files
authored
Merge pull request #754 from andyzhangx/fix-delete-error-archived
fix: delete volume error in archive deletion mode
2 parents 3b8d72d + e0ea084 commit 6c93c6a

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

pkg/nfs/controllerserver.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"google.golang.org/grpc/codes"
3333
"google.golang.org/grpc/status"
3434
"google.golang.org/protobuf/types/known/timestamppb"
35+
azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache"
3536

3637
"k8s.io/klog/v2"
3738
)
@@ -151,6 +152,11 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
151152
}
152153
}
153154

155+
if acquired := cs.Driver.volumeLocks.TryAcquire(name); !acquired {
156+
return nil, status.Errorf(codes.Aborted, volumeOperationAlreadyExistsFmt, name)
157+
}
158+
defer cs.Driver.volumeLocks.Release(name)
159+
154160
nfsVol, err := newNFSVolume(name, reqCapacity, parameters, cs.Driver.defaultOnDeletePolicy)
155161
if err != nil {
156162
return nil, status.Error(codes.InvalidArgument, err.Error())
@@ -230,7 +236,21 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
230236
nfsVol.onDelete = cs.Driver.defaultOnDeletePolicy
231237
}
232238

239+
if acquired := cs.Driver.volumeLocks.TryAcquire(volumeID); !acquired {
240+
return nil, status.Errorf(codes.Aborted, volumeOperationAlreadyExistsFmt, volumeID)
241+
}
242+
defer cs.Driver.volumeLocks.Release(volumeID)
243+
233244
if !strings.EqualFold(nfsVol.onDelete, retain) {
245+
// check whether volumeID is in the cache
246+
cache, err := cs.Driver.volDeletionCache.Get(volumeID, azcache.CacheReadTypeDefault)
247+
if err != nil {
248+
return nil, status.Errorf(codes.Internal, err.Error())
249+
}
250+
if cache != nil {
251+
klog.V(2).Infof("DeleteVolume: volume %s is already deleted", volumeID)
252+
return &csi.DeleteVolumeResponse{}, nil
253+
}
234254
// mount nfs base share so we can delete the subdirectory
235255
if err = cs.internalMount(ctx, nfsVol, nil, volCap); err != nil {
236256
return nil, status.Errorf(codes.Internal, "failed to mount nfs server: %v", err.Error())
@@ -281,6 +301,7 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
281301
klog.V(2).Infof("DeleteVolume: volume(%s) is set to retain, not deleting/archiving subdirectory", volumeID)
282302
}
283303

304+
cs.Driver.volDeletionCache.Set(volumeID, "")
284305
return &csi.DeleteVolumeResponse{}, nil
285306
}
286307

pkg/nfs/nfs.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ type Driver struct {
5959
// a timed cache storing volume stats <volumeID, volumeStats>
6060
volStatsCache azcache.Resource
6161
volStatsCacheExpireInMinutes int
62+
// a timed cache storing volume deletion records <volumeID, "">
63+
volDeletionCache azcache.Resource
6264
}
6365

6466
const (
@@ -119,6 +121,9 @@ func NewDriver(options *DriverOptions) *Driver {
119121
if n.volStatsCache, err = azcache.NewTimedCache(time.Duration(options.VolStatsCacheExpireInMinutes)*time.Minute, getter, false); err != nil {
120122
klog.Fatalf("%v", err)
121123
}
124+
if n.volDeletionCache, err = azcache.NewTimedCache(time.Minute, getter, false); err != nil {
125+
klog.Fatalf("%v", err)
126+
}
122127
return n
123128
}
124129

0 commit comments

Comments
 (0)