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

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) ===

From 835bd66260e8447e4c421faaac06ed46d8af5cac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 22 Feb 2020 01:17:00 -0500
Subject: [PATCH 1/3] lxd/vm: Fix snapshots
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/instance/drivers/driver_qemu.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instance/drivers/driver_qemu.go 
b/lxd/instance/drivers/driver_qemu.go
index 010e56f111..0ceba5bca9 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -239,7 +239,7 @@ func qemuCreate(s *state.State, args db.InstanceArgs) 
(instance.Instance, error)
        }
 
        // Create a new database entry for the instance's storage volume.
-       _, err = s.Cluster.StoragePoolVolumeCreate(args.Project, args.Name, "", 
db.StoragePoolVolumeTypeVM, false, poolID, volumeConfig)
+       _, err = s.Cluster.StoragePoolVolumeCreate(args.Project, args.Name, "", 
db.StoragePoolVolumeTypeVM, vm.IsSnapshot(), poolID, volumeConfig)
        if err != nil {
                return nil, err
        }

From 41bda77336dda1f3956a81af032fa9a96e43424a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 22 Feb 2020 01:17:38 -0500
Subject: [PATCH 2/3] lxd/storage/ceph: Fix leftover rbd
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/storage/drivers/driver_ceph_volumes.go | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/lxd/storage/drivers/driver_ceph_volumes.go 
b/lxd/storage/drivers/driver_ceph_volumes.go
index 5e36a24fce..93bd1cd7e7 100644
--- a/lxd/storage/drivers/driver_ceph_volumes.go
+++ b/lxd/storage/drivers/driver_ceph_volumes.go
@@ -240,15 +240,6 @@ func (d *ceph) CreateVolumeFromCopy(vol Volume, srcVol 
Volume, copySnapshots boo
                        }
                }
 
-               ourMount, err := d.MountVolume(vol, op)
-               if err != nil {
-                       return err
-               }
-
-               if ourMount {
-                       defer d.UnmountVolume(vol, op)
-               }
-
                // For VMs, also copy the filesystem volume.
                if vol.IsVMBlock() {
                        srcFSVol := srcVol.NewVMBlockFilesystemVolume()

From fe9545f438c923b34e6d0f73f3d00dcfce93646c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 22 Feb 2020 01:18:10 -0500
Subject: [PATCH 3/3] lxd/storage/ceph: Fix zombie handling
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/storage/drivers/driver_ceph_utils.go   | 21 +++++-----
 lxd/storage/drivers/driver_ceph_volumes.go | 46 ++++++++++++++--------
 2 files changed, 40 insertions(+), 27 deletions(-)

diff --git a/lxd/storage/drivers/driver_ceph_utils.go 
b/lxd/storage/drivers/driver_ceph_utils.go
index 19039b211b..d3ecf1dd69 100644
--- a/lxd/storage/drivers/driver_ceph_utils.go
+++ b/lxd/storage/drivers/driver_ceph_utils.go
@@ -201,6 +201,7 @@ again:
                                }
                        }
                }
+
                return err
        }
 
@@ -345,12 +346,9 @@ func (d *ceph) rbdListSnapshotClones(vol Volume, 
snapshotName string) ([]string,
 // RBD storage volume has protected snapshots; a scenario most common when
 // creating a sparse copy of a container or when LXD updated an image and the
 // image still has dependent container clones.
-func (d *ceph) rbdMarkVolumeDeleted(vol Volume, newVolumeName string, suffix 
string) error {
+func (d *ceph) rbdMarkVolumeDeleted(vol Volume, newVolumeName string) error {
        newVol := NewVolume(d, d.name, vol.volType, vol.contentType, 
newVolumeName, nil, nil)
        deletedName := d.getRBDVolumeName(newVol, "", true, true)
-       if suffix != "" {
-               deletedName = fmt.Sprintf("%s_%s", deletedName, suffix)
-       }
        _, err := shared.RunCommand(
                "rbd",
                "--id", d.config["ceph.user.name"],
@@ -659,9 +657,8 @@ func (d *ceph) deleteVolume(vol Volume) (int, error) {
                                return 1, nil
                        }
 
-                       newVolumeName := fmt.Sprintf("%s_%s", vol.name,
-                               uuid.NewRandom().String())
-                       err := d.rbdMarkVolumeDeleted(vol, newVolumeName, "")
+                       newVolumeName := fmt.Sprintf("%s_%s", vol.name, 
uuid.NewRandom().String())
+                       err := d.rbdMarkVolumeDeleted(vol, newVolumeName)
                        if err != nil {
                                return -1, err
                        }
@@ -837,14 +834,12 @@ func (d *ceph) deleteVolumeSnapshot(vol Volume, 
snapshotName string) (int, error
                        return 1, nil
                }
 
-               err := d.rbdUnmapVolumeSnapshot(vol, snapshotName,
-                       true)
+               err := d.rbdUnmapVolumeSnapshot(vol, snapshotName, true)
                if err != nil {
                        return -1, err
                }
 
-               newSnapshotName := fmt.Sprintf("zombie_%s", snapshotName)
-
+               newSnapshotName := fmt.Sprintf("zombie_snapshot_%s", 
uuid.NewRandom().String())
                err = d.rbdRenameVolumeSnapshot(vol, snapshotName, 
newSnapshotName)
                if err != nil {
                        return -1, err
@@ -1073,6 +1068,10 @@ func (d *ceph) getRBDVolumeName(vol Volume, snapName 
string, zombie bool, withPo
        volumeType := string(vol.volType)
        parentName, snapshotName, isSnapshot := 
shared.InstanceGetParentAndSnapshotName(vol.name)
 
+       if vol.volType == VolumeTypeImage {
+               parentName = fmt.Sprintf("%s_%s", parentName, 
d.getRBDFilesystem(vol))
+       }
+
        if (vol.volType == VolumeTypeVM || vol.volType == VolumeTypeImage) && 
vol.contentType == ContentTypeBlock {
                parentName = fmt.Sprintf("%s.block", parentName)
        }
diff --git a/lxd/storage/drivers/driver_ceph_volumes.go 
b/lxd/storage/drivers/driver_ceph_volumes.go
index 93bd1cd7e7..645491fe9d 100644
--- a/lxd/storage/drivers/driver_ceph_volumes.go
+++ b/lxd/storage/drivers/driver_ceph_volumes.go
@@ -36,16 +36,22 @@ func (d *ceph) CreateVolume(vol Volume, filler 
*VolumeFiller, op *operations.Ope
                revert.Add(func() { os.Remove(vol.MountPath()) })
        }
 
+       // Figure out the potential zombie volume.
        zombieImageVol := NewVolume(d, d.name, VolumeType("zombie_image"), 
vol.contentType,
                fmt.Sprintf("%s_%s", vol.name, d.getRBDFilesystem(vol)), nil, 
nil)
+       if (vol.volType == VolumeTypeVM || vol.volType == VolumeTypeImage) && 
vol.contentType == ContentTypeBlock {
+               zombieImageVol = NewVolume(d, d.name, 
VolumeType("zombie_image"), vol.contentType,
+                       fmt.Sprintf("%s_%s.block", vol.name, 
d.getRBDFilesystem(vol)), nil, nil)
+       }
 
        // Check if we have a zombie image. If so, restore it otherwise
        // create a new image volume.
        if vol.volType == VolumeTypeImage && d.HasVolume(zombieImageVol) {
-               // Unmark deleted.
+               // Figure out the names.
                oldName := d.getRBDVolumeName(zombieImageVol, "", false, true)
                newName := d.getRBDVolumeName(vol, "", false, true)
 
+               // Rename back to active.
                _, err := shared.RunCommand(
                        "rbd",
                        "--id", d.config["ceph.user.name"],
@@ -57,6 +63,18 @@ func (d *ceph) CreateVolume(vol Volume, filler 
*VolumeFiller, op *operations.Ope
                        return err
                }
 
+               // For VMs, also create the filesystem volume.
+               if vol.IsVMBlock() {
+                       fsVol := vol.NewVMBlockFilesystemVolume()
+
+                       err := d.CreateVolume(fsVol, nil, op)
+                       if err != nil {
+                               return err
+                       }
+
+                       revert.Add(func() { d.DeleteVolume(fsVol, op) })
+               }
+
                revert.Success()
                return nil
        }
@@ -485,7 +503,7 @@ func (d *ceph) DeleteVolume(vol Volume, op 
*operations.Operation) error {
                                return err
                        }
 
-                       err = d.rbdMarkVolumeDeleted(vol, vol.name, 
vol.config["block.filesystem"])
+                       err = d.rbdMarkVolumeDeleted(vol, vol.name)
                }
                if err != nil {
                        return err
@@ -694,7 +712,7 @@ func (d *ceph) MountVolume(vol Volume, op 
*operations.Operation) (bool, error) {
 
 // UnmountVolume simulates unmounting a volume.
 func (d *ceph) UnmountVolume(vol Volume, op *operations.Operation) (bool, 
error) {
-       // For VMs, also mount the filesystem dataset.
+       // For VMs, also unmount the filesystem dataset.
        if vol.IsVMBlock() {
                fsVol := vol.NewVMBlockFilesystemVolume()
 
@@ -704,23 +722,19 @@ func (d *ceph) UnmountVolume(vol Volume, op 
*operations.Operation) (bool, error)
                }
        }
 
+       // Attempt to unmount the volume.
        mountPath := vol.MountPath()
-
-       if !shared.IsMountPoint(mountPath) {
-               return false, nil
-       }
-
-       err := TryUnmount(mountPath, unix.MNT_DETACH)
-       if err != nil {
-               return false, err
+       if shared.IsMountPoint(mountPath) {
+               err := TryUnmount(mountPath, unix.MNT_DETACH)
+               if err != nil {
+                       return false, err
+               }
        }
 
        // Attempt to unmap.
-       if vol.volType == VolumeTypeCustom {
-               err = d.rbdUnmapVolume(vol, true)
-               if err != nil {
-                       return true, err
-               }
+       err := d.rbdUnmapVolume(vol, true)
+       if err != nil {
+               return true, err
        }
 
        return true, nil
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to