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
