Discussion:
[lxc-devel] [lxd/master] Fix ZFS storage volume copies
stgraber on Github
2018-12-08 03:41:27 UTC
Permalink
From 4b8d6db89437388548b7afbf69879a3faa9e9b2a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <***@ubuntu.com>
Date: Fri, 7 Dec 2018 22:39:28 -0500
Subject: [PATCH 1/2] lxd/storage: Fix broken error handling
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #5339

Signed-off-by: Stéphane Graber <***@ubuntu.com>
---
lxd/storage_volumes_utils.go | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/lxd/storage_volumes_utils.go b/lxd/storage_volumes_utils.go
index b9c6253b6b..f8d4ab5066 100644
--- a/lxd/storage_volumes_utils.go
+++ b/lxd/storage_volumes_utils.go
@@ -615,10 +615,12 @@ func storagePoolVolumeCreateInternal(state *state.State, poolName string, vol *a
}
if err != nil {
poolID, _, _ := s.GetContainerPoolInfo()
- volumeType, err := storagePoolVolumeTypeNameToType(vol.Type)
- if err == nil {
+
+ volumeType, err1 := storagePoolVolumeTypeNameToType(vol.Type)
+ if err1 == nil {
state.Cluster.StoragePoolVolumeDelete("default", vol.Name, volumeType, poolID)
}
+
return err
}

@@ -666,10 +668,12 @@ func storagePoolVolumeSnapshotCreateInternal(state *state.State, poolName string
}
if err != nil {
poolID, _, _ := s.GetContainerPoolInfo()
- volumeType, err := storagePoolVolumeTypeNameToType(vol.Type)
- if err == nil {
+
+ volumeType, err1 := storagePoolVolumeTypeNameToType(vol.Type)
+ if err1 == nil {
state.Cluster.StoragePoolVolumeDelete("default", vol.Name, volumeType, poolID)
}
+
return err
}


From a2c5f268ed1012549b743a7b2489feb574178938 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <***@ubuntu.com>
Date: Fri, 7 Dec 2018 22:39:46 -0500
Subject: [PATCH 2/2] lxd/storage: Fix custom volume copies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

On ZFS, when a pool name doesn't match the zpool name or dataset, the
wrong paths were being accessed.

Closes #5339

Signed-off-by: Stéphane Graber <***@ubuntu.com>
---
lxd/storage_zfs.go | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index fc18db36e3..647db33b66 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -3169,14 +3169,17 @@ func (s *storageZfs) StoragePoolVolumeCopy(source *api.StorageVolumeSource) erro
successMsg := fmt.Sprintf("Copied ZFS storage volume \"%s\" on storage pool \"%s\" as \"%s\" to storage pool \"%s\"", source.Name, source.Pool, s.volume.Name, s.pool.Name)

if source.Pool != s.pool.Name {
+ logger.Errorf("wtf")
return s.doCrossPoolStorageVolumeCopy(source)
}

var snapshots []string
var err error

+ poolName := s.getOnDiskPoolName()
+
if !strings.Contains(source.Name, "/") {
- snapshots, err = zfsPoolListSnapshots(source.Pool, fmt.Sprintf("custom/%s", source.Name))
+ snapshots, err = zfsPoolListSnapshots(poolName, fmt.Sprintf("custom/%s", source.Name))
if err != nil {
return err
}
@@ -3188,7 +3191,6 @@ func (s *storageZfs) StoragePoolVolumeCopy(source *api.StorageVolumeSource) erro
if s.pool.Config["zfs.clone_copy"] != "" && !shared.IsTrue(s.pool.Config["zfs.clone_copy"]) {
err = s.copyVolumeWithoutSnapshotsFull(source)
} else {
- // TODO (monstermunchkin): implement
err = s.copyVolumeWithoutSnapshotsSparse(source)
}
if err != nil {
@@ -3197,8 +3199,6 @@ func (s *storageZfs) StoragePoolVolumeCopy(source *api.StorageVolumeSource) erro
} else {
targetStorageVolumeMountPoint := getStoragePoolVolumeMountPoint(s.pool.Name, s.volume.Name)

- poolName := s.getOnDiskPoolName()
-
tmpSnapshotName := fmt.Sprintf("copy-send-%s", uuid.NewRandom().String())
err := zfsPoolVolumeSnapshotCreate(poolName, fmt.Sprintf("custom/%s", source.Name), tmpSnapshotName)
if err != nil {

Loading...