Skip to content

Commit 15766e9

Browse files
committed
DeviceManager: Return no error if the device not found while deleting
Discussion on issue intel#413, raised a requirement that PMEM-CSI should handle the DeleteVolume() call for volumes that the underlined device already deleted manually by the admin. So for such a volume we just ignore and return no error in DeviceManager.DeleteVolume(). This also makes DeleteVolume() idempotent.
1 parent 09497de commit 15766e9

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

pkg/pmem-device-manager/pmd-lvm.go

+17-4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package pmdmanager
22

33
import (
44
"fmt"
5+
"os"
56
"strconv"
67
"strings"
78
"sync"
89

910
"github.com/intel/pmem-csi/pkg/ndctl"
1011
pmemexec "github.com/intel/pmem-csi/pkg/pmem-exec"
12+
"github.com/pkg/errors"
1113
"k8s.io/klog"
1214
)
1315

@@ -152,11 +154,22 @@ func (lvm *pmemLvm) DeleteDevice(name string, flush bool) error {
152154
lvmMutex.Lock()
153155
defer lvmMutex.Unlock()
154156

155-
device, err := lvm.getDevice(name)
156-
if err != nil {
157+
var err error
158+
var device PmemDeviceInfo
159+
160+
if device, err = lvm.getDevice(name); err != nil {
161+
if os.IsNotExist(errors.Cause(err)) {
162+
return nil
163+
}
157164
return err
158165
}
159-
if err := ClearDevice(device, flush); err != nil {
166+
167+
if err = ClearDevice(device, flush); err != nil {
168+
if os.IsNotExist(errors.Cause(err)) {
169+
// Remove device from cache
170+
delete(lvm.devices, name)
171+
return nil
172+
}
160173
return err
161174
}
162175

@@ -194,7 +207,7 @@ func (lvm *pmemLvm) getDevice(id string) (PmemDeviceInfo, error) {
194207
return dev, nil
195208
}
196209

197-
return PmemDeviceInfo{}, fmt.Errorf("Device not found with name %s", id)
210+
return PmemDeviceInfo{}, errors.Wrapf(os.ErrNotExist, "no device found with id '%s'", id)
198211
}
199212

200213
func getUncachedDevice(id string, volumeGroup string) (PmemDeviceInfo, error) {

pkg/pmem-device-manager/pmd-ndctl.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package pmdmanager
22

33
import (
44
"fmt"
5+
"os"
56
"sync"
67

78
"github.com/intel/pmem-csi/pkg/ndctl"
@@ -143,12 +144,18 @@ func (pmem *pmemNdctl) DeleteDevice(name string, flush bool) error {
143144

144145
device, err := pmem.getDevice(name)
145146
if err != nil {
146-
return err
147+
// Assume not found device as already deleted
148+
// and return no error
149+
return nil
147150
}
148-
err = ClearDevice(device, flush)
149-
if err != nil {
151+
if err := ClearDevice(device, flush); err != nil {
152+
// Device might have already deleted
153+
if os.IsNotExist(err) {
154+
return nil
155+
}
150156
return err
151157
}
158+
152159
return pmem.ctx.DestroyNamespaceByName(name)
153160
}
154161

0 commit comments

Comments
 (0)