From 40e0c389887940c814f57f4b281e9621faa19c41 Mon Sep 17 00:00:00 2001 From: Serguei Bezverkhi Date: Tue, 30 Jan 2018 17:56:53 -0500 Subject: [PATCH] Cleaning up loopback removal process --- pkg/volume/fc/fc_util.go | 18 ++++++++++-------- pkg/volume/iscsi/iscsi_util.go | 15 ++++++++++----- pkg/volume/util/util.go | 1 - pkg/volume/util/util_linux.go | 8 +++++--- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/pkg/volume/fc/fc_util.go b/pkg/volume/fc/fc_util.go index 5c13c2cad8..3eff48ee52 100644 --- a/pkg/volume/fc/fc_util.go +++ b/pkg/volume/fc/fc_util.go @@ -361,9 +361,10 @@ func (util *FCUtil) DetachBlockFCDisk(c fcDiskUnmapper, mapPath, devicePath stri } loop, err := volumeutil.BlockVolumePathHandler.GetLoopDevice(blkUtil, dstPath) if err != nil { - glog.Warningf("fc: failed to get loopback for device: %v, err: %v", dstPath, err) - } else { - glog.V(4).Infof("fc: found loopback: %v", loop) + if err.Error() != volumeutil.ErrDeviceNotFound { + return fmt.Errorf("fc: failed to get loopback for destination path: %v, err: %v", dstPath, err) + } + glog.Warning("fc: loopback for destination path: %s not found", dstPath) } // Detach volume from kubelet node @@ -386,11 +387,12 @@ func (util *FCUtil) DetachBlockFCDisk(c fcDiskUnmapper, mapPath, devicePath stri glog.Errorf("fc: last error occurred during detach disk:\n%v", lastErr) return lastErr } - - // The volume was successfully detached from node. We can safely remove the loopback. - err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop) - if err != nil { - return fmt.Errorf("fc: failed to remove loopback :%v, err: %v", loop, err) + if len(loop) != 0 { + // The volume was successfully detached from node. We can safely remove the loopback. + err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop) + if err != nil { + return fmt.Errorf("fc: failed to remove loopback :%v, err: %v", loop, err) + } } return nil } diff --git a/pkg/volume/iscsi/iscsi_util.go b/pkg/volume/iscsi/iscsi_util.go index cfecfe57f8..149e972986 100644 --- a/pkg/volume/iscsi/iscsi_util.go +++ b/pkg/volume/iscsi/iscsi_util.go @@ -521,17 +521,22 @@ func (util *ISCSIUtil) DetachBlockISCSIDisk(c iscsiDiskUnmapper, mapPath string) blkUtil := volumeutil.NewBlockVolumePathHandler() loop, err := volumeutil.BlockVolumePathHandler.GetLoopDevice(blkUtil, devicePath) if err != nil { - return fmt.Errorf("failed to get loopback for device: %v, err: %v", devicePath, err) + if err.Error() != volumeutil.ErrDeviceNotFound { + return fmt.Errorf("failed to get loopback for device: %v, err: %v", devicePath, err) + } + glog.Warning("iscsi: loopback for device: %s not found", device) } // Detach a volume from kubelet node err = util.detachISCSIDisk(c.exec, portals, iqn, iface, volName, initiatorName, found) if err != nil { return fmt.Errorf("failed to finish detachISCSIDisk, err: %v", err) } - // The volume was successfully detached from node. We can safely remove the loopback. - err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop) - if err != nil { - return fmt.Errorf("failed to remove loopback :%v, err: %v", loop, err) + if len(loop) != 0 { + // The volume was successfully detached from node. We can safely remove the loopback. + err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop) + if err != nil { + return fmt.Errorf("failed to remove loopback :%v, err: %v", loop, err) + } } return nil } diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go index 6b6528f8ab..bcb436e6f8 100644 --- a/pkg/volume/util/util.go +++ b/pkg/volume/util/util.go @@ -46,7 +46,6 @@ const ( ErrDeviceNotFound = "device not found" ErrDeviceNotSupported = "device not supported" - ErrNotAvailable = "not available" ) // IsReady checks for the existence of a regular file diff --git a/pkg/volume/util/util_linux.go b/pkg/volume/util/util_linux.go index 755a10f012..f4bbe856a8 100644 --- a/pkg/volume/util/util_linux.go +++ b/pkg/volume/util/util_linux.go @@ -51,7 +51,7 @@ func (v VolumePathHandler) AttachFileDevice(path string) (string, error) { func (v VolumePathHandler) GetLoopDevice(path string) (string, error) { _, err := os.Stat(path) if os.IsNotExist(err) { - return "", errors.New(ErrNotAvailable) + return "", errors.New(ErrDeviceNotFound) } if err != nil { return "", fmt.Errorf("not attachable: %v", err) @@ -84,9 +84,11 @@ func (v VolumePathHandler) RemoveLoopDevice(device string) error { cmd := exec.Command(losetupPath, args...) out, err := cmd.CombinedOutput() if err != nil { - if !strings.Contains(string(out), "No such device or address") { - return err + if _, err := os.Stat(device); os.IsNotExist(err) { + return nil } + glog.V(2).Infof("Failed to remove loopback device: %s: %v %s", device, err, out) + return err } return nil }