Cleaning up loopback removal process

pull/6/head
Serguei Bezverkhi 2018-01-30 17:56:53 -05:00
parent 9e2878d93c
commit 40e0c38988
4 changed files with 25 additions and 17 deletions

View File

@ -361,9 +361,10 @@ func (util *FCUtil) DetachBlockFCDisk(c fcDiskUnmapper, mapPath, devicePath stri
} }
loop, err := volumeutil.BlockVolumePathHandler.GetLoopDevice(blkUtil, dstPath) loop, err := volumeutil.BlockVolumePathHandler.GetLoopDevice(blkUtil, dstPath)
if err != nil { if err != nil {
glog.Warningf("fc: failed to get loopback for device: %v, err: %v", dstPath, err) if err.Error() != volumeutil.ErrDeviceNotFound {
} else { return fmt.Errorf("fc: failed to get loopback for destination path: %v, err: %v", dstPath, err)
glog.V(4).Infof("fc: found loopback: %v", loop) }
glog.Warning("fc: loopback for destination path: %s not found", dstPath)
} }
// Detach volume from kubelet node // 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) glog.Errorf("fc: last error occurred during detach disk:\n%v", lastErr)
return lastErr return lastErr
} }
if len(loop) != 0 {
// The volume was successfully detached from node. We can safely remove the loopback. // The volume was successfully detached from node. We can safely remove the loopback.
err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop) err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop)
if err != nil { if err != nil {
return fmt.Errorf("fc: failed to remove loopback :%v, err: %v", loop, err) return fmt.Errorf("fc: failed to remove loopback :%v, err: %v", loop, err)
}
} }
return nil return nil
} }

View File

@ -521,17 +521,22 @@ func (util *ISCSIUtil) DetachBlockISCSIDisk(c iscsiDiskUnmapper, mapPath string)
blkUtil := volumeutil.NewBlockVolumePathHandler() blkUtil := volumeutil.NewBlockVolumePathHandler()
loop, err := volumeutil.BlockVolumePathHandler.GetLoopDevice(blkUtil, devicePath) loop, err := volumeutil.BlockVolumePathHandler.GetLoopDevice(blkUtil, devicePath)
if err != nil { 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 // Detach a volume from kubelet node
err = util.detachISCSIDisk(c.exec, portals, iqn, iface, volName, initiatorName, found) err = util.detachISCSIDisk(c.exec, portals, iqn, iface, volName, initiatorName, found)
if err != nil { if err != nil {
return fmt.Errorf("failed to finish detachISCSIDisk, err: %v", err) return fmt.Errorf("failed to finish detachISCSIDisk, err: %v", err)
} }
// The volume was successfully detached from node. We can safely remove the loopback. if len(loop) != 0 {
err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop) // The volume was successfully detached from node. We can safely remove the loopback.
if err != nil { err = volumeutil.BlockVolumePathHandler.RemoveLoopDevice(blkUtil, loop)
return fmt.Errorf("failed to remove loopback :%v, err: %v", loop, err) if err != nil {
return fmt.Errorf("failed to remove loopback :%v, err: %v", loop, err)
}
} }
return nil return nil
} }

View File

@ -46,7 +46,6 @@ const (
ErrDeviceNotFound = "device not found" ErrDeviceNotFound = "device not found"
ErrDeviceNotSupported = "device not supported" ErrDeviceNotSupported = "device not supported"
ErrNotAvailable = "not available"
) )
// IsReady checks for the existence of a regular file // IsReady checks for the existence of a regular file

View File

@ -51,7 +51,7 @@ func (v VolumePathHandler) AttachFileDevice(path string) (string, error) {
func (v VolumePathHandler) GetLoopDevice(path string) (string, error) { func (v VolumePathHandler) GetLoopDevice(path string) (string, error) {
_, err := os.Stat(path) _, err := os.Stat(path)
if os.IsNotExist(err) { if os.IsNotExist(err) {
return "", errors.New(ErrNotAvailable) return "", errors.New(ErrDeviceNotFound)
} }
if err != nil { if err != nil {
return "", fmt.Errorf("not attachable: %v", err) return "", fmt.Errorf("not attachable: %v", err)
@ -84,9 +84,11 @@ func (v VolumePathHandler) RemoveLoopDevice(device string) error {
cmd := exec.Command(losetupPath, args...) cmd := exec.Command(losetupPath, args...)
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if err != nil { if err != nil {
if !strings.Contains(string(out), "No such device or address") { if _, err := os.Stat(device); os.IsNotExist(err) {
return err return nil
} }
glog.V(2).Infof("Failed to remove loopback device: %s: %v %s", device, err, out)
return err
} }
return nil return nil
} }