The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3820

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Signed-off-by: Christian Brauner <[email protected]>
From dc647553d1094f426ec68ed1337a6e23841efd84 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 12:37:52 +0200
Subject: [PATCH 01/15] zfs: existence check before delete for pools

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_zfs.go | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index a2f6445f3..3e4ee465b 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -323,9 +323,12 @@ func (s *storageZfs) zfsPoolCreate() error {
 func (s *storageZfs) StoragePoolDelete() error {
        logger.Infof("Deleting ZFS storage pool \"%s\".", s.pool.Name)
 
-       err := zfsFilesystemEntityDelete(s.pool.Config["source"], 
s.getOnDiskPoolName())
-       if err != nil {
-               return err
+       poolName := s.getOnDiskPoolName()
+       if zfsFilesystemEntityExists(poolName, "") {
+               err := zfsFilesystemEntityDelete(s.pool.Config["source"], 
poolName)
+               if err != nil {
+                       return err
+               }
        }
 
        storagePoolMntPoint := getStoragePoolMountPoint(s.pool.Name)

From 35f6d813e964d3f861636fdd1a1cf760af6a6076 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 12:41:38 +0200
Subject: [PATCH 02/15] zfs: existence check before custom delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_zfs.go | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index 3e4ee465b..0776d0f02 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -406,9 +406,12 @@ func (s *storageZfs) StoragePoolVolumeDelete() error {
        fs := fmt.Sprintf("custom/%s", s.volume.Name)
        customPoolVolumeMntPoint := getStoragePoolVolumeMountPoint(s.pool.Name, 
s.volume.Name)
 
-       err := zfsPoolVolumeDestroy(s.getOnDiskPoolName(), fs)
-       if err != nil {
-               return err
+       poolName := s.getOnDiskPoolName()
+       if zfsFilesystemEntityExists(poolName, fs) {
+               err := zfsPoolVolumeDestroy(s.getOnDiskPoolName(), fs)
+               if err != nil {
+                       return err
+               }
        }
 
        if shared.PathExists(customPoolVolumeMntPoint) {
@@ -418,7 +421,7 @@ func (s *storageZfs) StoragePoolVolumeDelete() error {
                }
        }
 
-       err = db.StoragePoolVolumeDelete(
+       err := db.StoragePoolVolumeDelete(
                s.s.DB,
                s.volume.Name,
                storagePoolVolumeTypeCustom,

From 1def4ffba5d73ca8a838af20527fbbb5bf740be7 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 12:46:36 +0200
Subject: [PATCH 03/15] btrfs: existence check before custom delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_btrfs.go | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index b78b415ad..b6216bd87 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -548,9 +548,11 @@ func (s *storageBtrfs) StoragePoolVolumeDelete() error {
 
        // Delete subvolume.
        customSubvolumeName := getStoragePoolVolumeMountPoint(s.pool.Name, 
s.volume.Name)
-       err = btrfsSubVolumesDelete(customSubvolumeName)
-       if err != nil {
-               return err
+       if shared.PathExists(customSubvolumeName) && 
isBtrfsSubVolume(customSubvolumeName) {
+               err = btrfsSubVolumesDelete(customSubvolumeName)
+               if err != nil {
+                       return err
+               }
        }
 
        // Delete the mountpoint.

From f4cae1384524710b24d93fc3760a94a25f90374b Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 12:48:00 +0200
Subject: [PATCH 04/15] btrfs: existence check before container delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_btrfs.go | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index b6216bd87..7e38d3311 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -778,9 +778,11 @@ func (s *storageBtrfs) ContainerDelete(container 
container) error {
 
        // Delete the subvolume.
        containerSubvolumeName := getContainerMountPoint(s.pool.Name, 
container.Name())
-       err = btrfsSubVolumesDelete(containerSubvolumeName)
-       if err != nil {
-               return err
+       if shared.PathExists(containerSubvolumeName) && 
isBtrfsSubVolume(containerSubvolumeName) {
+               err = btrfsSubVolumesDelete(containerSubvolumeName)
+               if err != nil {
+                       return err
+               }
        }
 
        // Delete the container's symlink to the subvolume.

From 563fe49a18a10d0c18a26092f90f546fcd902840 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 12:49:49 +0200
Subject: [PATCH 05/15] btrfs: existence check before snapshot delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_btrfs.go | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index 7e38d3311..e3d7c59e3 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -1159,9 +1159,11 @@ func (s *storageBtrfs) 
ContainerSnapshotDelete(snapshotContainer container) erro
        }
 
        snapshotSubvolumeName := getSnapshotMountPoint(s.pool.Name, 
snapshotContainer.Name())
-       err = btrfsSubVolumesDelete(snapshotSubvolumeName)
-       if err != nil {
-               return err
+       if shared.PathExists(snapshotSubvolumeName) && 
isBtrfsSubVolume(snapshotSubvolumeName) {
+               err = btrfsSubVolumesDelete(snapshotSubvolumeName)
+               if err != nil {
+                       return err
+               }
        }
 
        sourceSnapshotMntPoint := shared.VarPath("snapshots", 
snapshotContainer.Name())
@@ -1224,9 +1226,11 @@ func (s *storageBtrfs) ContainerSnapshotStop(container 
container) (bool, error)
                return false, nil
        }
 
-       err = btrfsSubVolumesDelete(snapshotSubvolumeName)
-       if err != nil {
-               return false, err
+       if shared.PathExists(snapshotSubvolumeName) && 
isBtrfsSubVolume(snapshotSubvolumeName) {
+               err = btrfsSubVolumesDelete(snapshotSubvolumeName)
+               if err != nil {
+                       return false, err
+               }
        }
 
        err = os.Rename(roSnapshotSubvolumeName, snapshotSubvolumeName)

From 75d6a616bd90f12df8816f5ff64cada6df6bb735 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 12:55:32 +0200
Subject: [PATCH 06/15] btrfs: existence check before image delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_btrfs.go | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index e3d7c59e3..815fc653f 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -1398,9 +1398,11 @@ func (s *storageBtrfs) ImageDelete(fingerprint string) 
error {
        // Delete the btrfs subvolume. The path with which we
        // do this is ${LXD_DIR}/storage-pools/<pool>/images/<fingerprint>.
        imageSubvolumeName := getImageMountPoint(s.pool.Name, fingerprint)
-       err = btrfsSubVolumesDelete(imageSubvolumeName)
-       if err != nil {
-               return err
+       if shared.PathExists(imageSubvolumeName) && 
isBtrfsSubVolume(imageSubvolumeName) {
+               err = btrfsSubVolumesDelete(imageSubvolumeName)
+               if err != nil {
+                       return err
+               }
        }
 
        err = s.deleteImageDbPoolVolume(fingerprint)

From b68dd63deb02522e9e206cf084a34affda364ced Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:02:56 +0200
Subject: [PATCH 07/15] lvm: existence check before pool delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_lvm.go | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index ece80e331..336a5b1cc 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -331,8 +331,10 @@ func (s *storageLvm) StoragePoolDelete() error {
        }
 
        poolName := s.getOnDiskPoolName()
+       poolExists, _ := storageVGExists(poolName)
+
        // Delete the thinpool.
-       if s.useThinpool {
+       if s.useThinpool && poolExists {
                // Check that the thinpool actually exists. For example, it
                // won't when the user has never created a storage volume in the
                // storage pool.
@@ -357,7 +359,7 @@ func (s *storageLvm) StoragePoolDelete() error {
        }
 
        // Remove the volume group.
-       if count == 0 {
+       if count == 0 && poolExists {
                output, err := shared.TryRunCommand("vgremove", "-f", poolName)
                if err != nil {
                        logger.Errorf("failed to destroy the volume group for 
the lvm storage pool: %s", output)

From 559c04677c2f328313359686d225b0188319068d Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:06:48 +0200
Subject: [PATCH 08/15] lvm: existence check before custom delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_lvm.go | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 336a5b1cc..710d71994 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -523,10 +523,16 @@ func (s *storageLvm) StoragePoolVolumeCreate() error {
 func (s *storageLvm) StoragePoolVolumeDelete() error {
        logger.Infof("Deleting LVM storage volume \"%s\" on storage pool 
\"%s\".", s.volume.Name, s.pool.Name)
 
-       customPoolVolumeMntPoint := getStoragePoolVolumeMountPoint(s.pool.Name, 
s.volume.Name)
-       _, err := s.StoragePoolVolumeUmount()
-       if err != nil {
-               return err
+       poolName := s.getOnDiskPoolName()
+       customLvmDevPath := getLvmDevPath(poolName,
+               storagePoolVolumeAPIEndpointCustom, s.volume.Name)
+       lvExists, _ := storageLVExists(customLvmDevPath)
+
+       if lvExists {
+               _, err := s.StoragePoolVolumeUmount()
+               if err != nil {
+                       return err
+               }
        }
 
        volumeType, err := storagePoolVolumeTypeNameToAPIEndpoint(s.volume.Type)
@@ -534,12 +540,14 @@ func (s *storageLvm) StoragePoolVolumeDelete() error {
                return err
        }
 
-       poolName := s.getOnDiskPoolName()
-       err = s.removeLV(poolName, volumeType, s.volume.Name)
-       if err != nil {
-               return err
+       if lvExists {
+               err = s.removeLV(poolName, volumeType, s.volume.Name)
+               if err != nil {
+                       return err
+               }
        }
 
+       customPoolVolumeMntPoint := getStoragePoolVolumeMountPoint(s.pool.Name, 
s.volume.Name)
        if shared.PathExists(customPoolVolumeMntPoint) {
                err := os.Remove(customPoolVolumeMntPoint)
                if err != nil {

From 24b9aca92bd10ec04c04bc34bfa11d609159d8f2 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:11:42 +0200
Subject: [PATCH 09/15] lvm: existence check before container delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_lvm.go | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 710d71994..98d053c9d 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -1008,21 +1008,27 @@ func (s *storageLvm) ContainerDelete(container 
container) error {
        }
 
        poolName := s.getOnDiskPoolName()
-       err := s.removeLV(poolName, storagePoolVolumeAPIEndpointContainers, 
containerLvmName)
-       if err != nil {
-               return err
+       containerLvmDevPath := getLvmDevPath(poolName,
+               storagePoolVolumeAPIEndpointContainers, containerLvmName)
+       lvExists, _ := storageLVExists(containerLvmDevPath)
+
+       if lvExists {
+               err := s.removeLV(poolName, 
storagePoolVolumeAPIEndpointContainers, containerLvmName)
+               if err != nil {
+                       return err
+               }
        }
 
        if container.IsSnapshot() {
                sourceName, _, _ := 
containerGetParentAndSnapshotName(containerName)
                snapshotMntPointSymlinkTarget := 
shared.VarPath("storage-pools", s.pool.Name, "snapshots", sourceName)
                snapshotMntPointSymlink := shared.VarPath("snapshots", 
sourceName)
-               err = deleteSnapshotMountpoint(containerMntPoint, 
snapshotMntPointSymlinkTarget, snapshotMntPointSymlink)
+               err := deleteSnapshotMountpoint(containerMntPoint, 
snapshotMntPointSymlinkTarget, snapshotMntPointSymlink)
                if err != nil {
                        return err
                }
        } else {
-               err = deleteContainerMountpoint(containerMntPoint, 
container.Path(), s.GetStorageTypeName())
+               err := deleteContainerMountpoint(containerMntPoint, 
container.Path(), s.GetStorageTypeName())
                if err != nil {
                        return err
                }

From 05f5a82c64fcaa4c776fc7c1cca4f9335f02b2f6 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:13:59 +0200
Subject: [PATCH 10/15] lvm: existence check before image delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_lvm.go | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 98d053c9d..871e2ce26 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -1583,15 +1583,21 @@ func (s *storageLvm) ImageDelete(fingerprint string) 
error {
        logger.Debugf("Deleting LVM storage volume for image \"%s\" on storage 
pool \"%s\".", fingerprint, s.pool.Name)
 
        if s.useThinpool {
-               _, err := s.ImageUmount(fingerprint)
-               if err != nil {
-                       return err
-               }
-
                poolName := s.getOnDiskPoolName()
-               err = s.removeLV(poolName, storagePoolVolumeAPIEndpointImages, 
fingerprint)
-               if err != nil {
-                       return err
+               imageLvmDevPath := getLvmDevPath(poolName,
+                       storagePoolVolumeAPIEndpointImages, fingerprint)
+               lvExists, _ := storageLVExists(imageLvmDevPath)
+
+               if lvExists {
+                       _, err := s.ImageUmount(fingerprint)
+                       if err != nil {
+                               return err
+                       }
+
+                       err = s.removeLV(poolName, 
storagePoolVolumeAPIEndpointImages, fingerprint)
+                       if err != nil {
+                               return err
+                       }
                }
        }
 

From 6ecf25a3905d2bf700d5e3397eb5ca0bc95f3eb3 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:17:17 +0200
Subject: [PATCH 11/15] ceph: existence check before pool delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_ceph.go | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index c73a4b4d8..589d9133e 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -270,11 +270,10 @@ func (s *storageCeph) StoragePoolDelete() error {
                s.pool.Name, s.ClusterName)
 
        // test if pool exists
-       if !cephOSDPoolExists(s.ClusterName, s.OSDPoolName, s.UserName) {
-               msg := fmt.Sprintf(`CEPH osd storage pool "%s" does not exist `+
+       poolExists := cephOSDPoolExists(s.ClusterName, s.OSDPoolName, 
s.UserName)
+       if !poolExists {
+               logger.Warnf(`CEPH osd storage pool "%s" does not exist `+
                        `in cluster "%s"`, s.OSDPoolName, s.ClusterName)
-               logger.Errorf(msg)
-               return fmt.Errorf(msg)
        }
 
        // Check whether we own the pool and only remove in this case.
@@ -285,13 +284,15 @@ func (s *storageCeph) StoragePoolDelete() error {
                        s.OSDPoolName, s.ClusterName)
 
                // Delete the osd pool.
-               err := cephOSDPoolDestroy(s.ClusterName, s.OSDPoolName,
-                       s.UserName)
-               if err != nil {
-                       logger.Errorf(`Failed to delete CEPH OSD storage pool `+
-                               `"%s" in cluster "%s": %s`, s.pool.Name,
-                               s.ClusterName, err)
-                       return err
+               if poolExists {
+                       err := cephOSDPoolDestroy(s.ClusterName, s.OSDPoolName,
+                               s.UserName)
+                       if err != nil {
+                               logger.Errorf(`Failed to delete CEPH OSD 
storage pool `+
+                                       `"%s" in cluster "%s": %s`, s.pool.Name,
+                                       s.ClusterName, err)
+                               return err
+                       }
                }
                logger.Debugf(`Deleted CEPH OSD storage pool "%s" in cluster 
"%s"`,
                        s.pool.Name, s.ClusterName)
@@ -299,15 +300,17 @@ func (s *storageCeph) StoragePoolDelete() error {
 
        // Delete the mountpoint for the storage pool.
        poolMntPoint := getStoragePoolMountPoint(s.pool.Name)
-       err := os.RemoveAll(poolMntPoint)
-       if err != nil {
-               logger.Errorf(`Failed to delete mountpoint "%s" for CEPH osd `+
-                       `storage pool "%s" in cluster "%s": %s`, poolMntPoint,
-                       s.OSDPoolName, s.ClusterName, err)
-               return err
+       if shared.PathExists(poolMntPoint) {
+               err := os.RemoveAll(poolMntPoint)
+               if err != nil {
+                       logger.Errorf(`Failed to delete mountpoint "%s" for 
CEPH osd `+
+                               `storage pool "%s" in cluster "%s": %s`, 
poolMntPoint,
+                               s.OSDPoolName, s.ClusterName, err)
+                       return err
+               }
+               logger.Debugf(`Deleted mountpoint "%s" for CEPH osd storage 
pool "%s" `+
+                       `in cluster "%s"`, poolMntPoint, s.OSDPoolName, 
s.ClusterName)
        }
-       logger.Debugf(`Deleted mountpoint "%s" for CEPH osd storage pool "%s" `+
-               `in cluster "%s"`, poolMntPoint, s.OSDPoolName, s.ClusterName)
 
        logger.Infof(`Deleted CEPH OSD storage pool "%s" in cluster "%s"`,
                s.pool.Name, s.ClusterName)

From c96077ac97ba329f0173ca734fa08372623d14db Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:21:58 +0200
Subject: [PATCH 12/15] ceph: existence check before custom delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_ceph.go | 48 +++++++++++++++++++++++++++---------------------
 1 file changed, 27 insertions(+), 21 deletions(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 589d9133e..7ac397bf5 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -494,27 +494,31 @@ func (s *storageCeph) StoragePoolVolumeDelete() error {
                        `pool "%s"`, s.volume.Name, s.pool.Name)
        }
 
+       rbdVolumeExists := cephRBDVolumeExists(s.ClusterName, s.OSDPoolName,
+               s.volume.Name, storagePoolVolumeTypeNameCustom, s.UserName)
        // unmap
        err := cephRBDVolumeUnmap(s.ClusterName, s.OSDPoolName, s.volume.Name,
                storagePoolVolumeTypeNameCustom, s.UserName, true)
        if err != nil {
-               logger.Errorf(`Failed to unmap RBD storage volume "%s" on `+
+               logger.Warnf(`Failed to unmap RBD storage volume "%s" on `+
                        `storage pool "%s": %s`, s.volume.Name, s.pool.Name, 
err)
-               return err
+       } else {
+               logger.Debugf(`Unmapped RBD storage volume "%s" on storage `+
+                       `pool "%s"`, s.volume.Name, s.pool.Name)
        }
-       logger.Debugf(`Unmapped RBD storage volume "%s" on storage pool "%s"`,
-               s.volume.Name, s.pool.Name)
 
        // delete
-       err = cephRBDVolumeDelete(s.ClusterName, s.OSDPoolName, s.volume.Name,
-               storagePoolVolumeTypeNameCustom, s.UserName)
-       if err != nil {
-               logger.Errorf(`Failed to delete RBD storage volume "%s" on `+
-                       `storage pool "%s": %s`, s.volume.Name, s.pool.Name, 
err)
-               return err
+       if rbdVolumeExists {
+               err := cephRBDVolumeDelete(s.ClusterName, s.OSDPoolName, 
s.volume.Name,
+                       storagePoolVolumeTypeNameCustom, s.UserName)
+               if err != nil {
+                       logger.Errorf(`Failed to delete RBD storage volume "%s" 
on `+
+                               `storage pool "%s": %s`, s.volume.Name, 
s.pool.Name, err)
+                       return err
+               }
+               logger.Debugf(`Deleted RBD storage volume "%s" on storage pool 
"%s"`,
+                       s.volume.Name, s.pool.Name)
        }
-       logger.Debugf(`Deleted RBD storage volume "%s" on storage pool "%s"`,
-               s.volume.Name, s.pool.Name)
 
        err = db.StoragePoolVolumeDelete(
                s.s.DB,
@@ -529,16 +533,18 @@ func (s *storageCeph) StoragePoolVolumeDelete() error {
        logger.Debugf(`Deleted database entry for RBD storage volume "%s" on `+
                `storage pool "%s"`, s.volume.Name, s.pool.Name)
 
-       err = os.Remove(volumeMntPoint)
-       if err != nil {
-               logger.Errorf(`Failed to delete mountpoint "%s" for RBD `+
-                       `storage volume "%s" on storage pool "%s": %s"`,
-                       volumeMntPoint, s.volume.Name, s.pool.Name, err)
-               return err
+       if shared.PathExists(volumeMntPoint) {
+               err = os.Remove(volumeMntPoint)
+               if err != nil {
+                       logger.Errorf(`Failed to delete mountpoint "%s" for RBD 
`+
+                               `storage volume "%s" on storage pool "%s": %s"`,
+                               volumeMntPoint, s.volume.Name, s.pool.Name, err)
+                       return err
+               }
+               logger.Debugf(`Deleted mountpoint "%s" for RBD storage volume 
"%s" `+
+                       `on storage pool "%s"`, volumeMntPoint, s.volume.Name,
+                       s.pool.Name)
        }
-       logger.Debugf(`Deleted mountpoint "%s" for RBD storage volume "%s" `+
-               `on storage pool "%s"`, volumeMntPoint, s.volume.Name,
-               s.pool.Name)
 
        logger.Debugf(`Deleted RBD storage volume "%s" on storage pool "%s"`,
                s.volume.Name, s.pool.Name)

From dea3a1a23d81f025563512483fe1ca9f8a09479f Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:24:51 +0200
Subject: [PATCH 13/15] ceph: existence check before container delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_ceph.go | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 7ac397bf5..55554e9d7 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -1065,18 +1065,24 @@ func (s *storageCeph) ContainerDelete(container 
container) error {
                return err
        }
 
+       rbdVolumeExists := cephRBDVolumeExists(s.ClusterName, s.OSDPoolName,
+               containerName, storagePoolVolumeTypeNameContainer, s.UserName)
+
        // delete
-       ret := cephContainerDelete(s.ClusterName, s.OSDPoolName, containerName,
-               storagePoolVolumeTypeNameContainer, s.UserName)
-       if ret < 0 {
-               msg := fmt.Sprintf(`Failed to delete RBD storage volume for `+
-                       `container "%s" on storage pool "%s"`, containerName, 
s.pool.Name)
-               logger.Errorf(msg)
-               return fmt.Errorf(msg)
+       if rbdVolumeExists {
+               ret := cephContainerDelete(s.ClusterName, s.OSDPoolName, 
containerName,
+                       storagePoolVolumeTypeNameContainer, s.UserName)
+               if ret < 0 {
+                       msg := fmt.Sprintf(`Failed to delete RBD storage volume 
for `+
+                               `container "%s" on storage pool "%s"`, 
containerName, s.pool.Name)
+                       logger.Errorf(msg)
+                       return fmt.Errorf(msg)
+               }
        }
 
        containerMntPoint := getContainerMountPoint(s.pool.Name, containerName)
-       err = deleteContainerMountpoint(containerMntPoint, containerPath, 
s.GetStorageTypeName())
+       err = deleteContainerMountpoint(containerMntPoint, containerPath,
+               s.GetStorageTypeName())
        if err != nil {
                logger.Errorf(`Failed to delete mountpoint %s for RBD storage `+
                        `volume of container "%s" for RBD storage volume on `+

From 8bdec212fd4141cbe1a1063509b461991525e83d Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:28:37 +0200
Subject: [PATCH 14/15] ceph: existence check before snapshot delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_ceph.go | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 55554e9d7..174f69990 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -1812,15 +1812,21 @@ func (s *storageCeph) 
ContainerSnapshotDelete(snapshotContainer container) error
        sourceContainerName, sourceContainerSnapOnlyName, _ :=
                containerGetParentAndSnapshotName(snapshotContainerName)
        snapshotName := fmt.Sprintf("snapshot_%s", sourceContainerSnapOnlyName)
-       ret := cephContainerSnapshotDelete(s.ClusterName, s.OSDPoolName,
-               sourceContainerName, storagePoolVolumeTypeNameContainer,
-               snapshotName, s.UserName)
-       if ret < 0 {
-               msg := fmt.Sprintf(`Failed to delete RBD storage volume for `+
-                       `snapshot "%s" on storage pool "%s"`,
-                       snapshotContainerName, s.pool.Name)
-               logger.Errorf(msg)
-               return fmt.Errorf(msg)
+
+       rbdVolumeExists := cephRBDVolumeExists(s.ClusterName, s.OSDPoolName,
+               snapshotName, storagePoolVolumeTypeNameContainer, s.UserName)
+
+       if rbdVolumeExists {
+               ret := cephContainerSnapshotDelete(s.ClusterName, s.OSDPoolName,
+                       sourceContainerName, storagePoolVolumeTypeNameContainer,
+                       snapshotName, s.UserName)
+               if ret < 0 {
+                       msg := fmt.Sprintf(`Failed to delete RBD storage volume 
for `+
+                               `snapshot "%s" on storage pool "%s"`,
+                               snapshotContainerName, s.pool.Name)
+                       logger.Errorf(msg)
+                       return fmt.Errorf(msg)
+               }
        }
 
        snapshotContainerMntPoint := getSnapshotMountPoint(s.pool.Name,

From e24af92b39c4bbc22f4ffa06239f93dc91d7fdf0 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Wed, 20 Sep 2017 13:32:52 +0200
Subject: [PATCH 15/15] ceph: existence check before snapshot delete

Closes #3775.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_ceph.go | 49 ++++++++++++++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 21 deletions(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 174f69990..444eca592 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -2079,39 +2079,46 @@ func (s *storageCeph) ContainerSnapshotStop(c 
container) (bool, error) {
                `storage pool "%s"`, containerName, s.pool.Name)
 
        containerMntPoint := getSnapshotMountPoint(s.pool.Name, containerName)
-       err := tryUnmount(containerMntPoint, syscall.MNT_DETACH)
-       if err != nil {
-               logger.Errorf("Failed to unmount %s: %s", containerMntPoint,
-                       err)
-               return false, err
+       if shared.IsMountPoint(containerMntPoint) {
+               err := tryUnmount(containerMntPoint, syscall.MNT_DETACH)
+               if err != nil {
+                       logger.Errorf("Failed to unmount %s: %s", 
containerMntPoint,
+                               err)
+                       return false, err
+               }
+               logger.Debugf("Unmounted %s", containerMntPoint)
        }
-       logger.Debugf("Unmounted %s", containerMntPoint)
 
        containerOnlyName, snapOnlyName, _ := 
containerGetParentAndSnapshotName(containerName)
        cloneName := fmt.Sprintf("%s_%s_start_clone", containerOnlyName, 
snapOnlyName)
        // unmap
-       err = cephRBDVolumeUnmap(s.ClusterName, s.OSDPoolName, cloneName,
+       err := cephRBDVolumeUnmap(s.ClusterName, s.OSDPoolName, cloneName,
                "snapshots", s.UserName, true)
        if err != nil {
-               logger.Errorf(`Failed to unmap RBD storage volume for `+
+               logger.Warnf(`Failed to unmap RBD storage volume for `+
                        `container "%s" on storage pool "%s": %s`,
                        containerName, s.pool.Name, err)
-               return false, err
+       } else {
+               logger.Debugf(`Unmapped RBD storage volume for container "%s" `+
+                       `on storage pool "%s"`, containerName, s.pool.Name)
        }
-       logger.Debugf(`Unmapped RBD storage volume for container "%s" on `+
-               `storage pool "%s"`, containerName, s.pool.Name)
 
-       // delete
-       err = cephRBDVolumeDelete(s.ClusterName, s.OSDPoolName, cloneName,
-               "snapshots", s.UserName)
-       if err != nil {
-               logger.Errorf(`Failed to delete clone of RBD storage volume `+
-                       `for container "%s" on storage pool "%s": %s`,
-                       containerName, s.pool.Name, err)
-               return false, err
+       rbdVolumeExists := cephRBDVolumeExists(s.ClusterName, s.OSDPoolName,
+               containerName, storagePoolVolumeTypeNameContainer, s.UserName)
+
+       if rbdVolumeExists {
+               // delete
+               err = cephRBDVolumeDelete(s.ClusterName, s.OSDPoolName, 
cloneName,
+                       "snapshots", s.UserName)
+               if err != nil {
+                       logger.Errorf(`Failed to delete clone of RBD storage 
volume `+
+                               `for container "%s" on storage pool "%s": %s`,
+                               containerName, s.pool.Name, err)
+                       return false, err
+               }
+               logger.Debugf(`Deleted clone of RBD storage volume for 
container "%s" `+
+                       `on storage pool "%s"`, containerName, s.pool.Name)
        }
-       logger.Debugf(`Deleted clone of RBD storage volume for container "%s" `+
-               `on storage pool "%s"`, containerName, s.pool.Name)
 
        logger.Debugf(`Stopped RBD storage volume for snapshot "%s" on `+
                `storage pool "%s"`, containerName, s.pool.Name)
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to