[lxc-devel] [lxd/master] {ceph, lvm}: generate new UUIDS for btrfs filesystems

brauner on Github lxc-bot at linuxcontainers.org
Mon Nov 13 11:30:41 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20171113/d1cddf99/attachment.bin>
-------------- next part --------------
From 8ed26ab33d9e46a4ca3f857f872058f862ef1d3a Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 13 Nov 2017 12:24:06 +0100
Subject: [PATCH 1/2] lvm: generate new UUID on thinpools for btrfs

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 lxd/storage_lvm.go       |  5 +++--
 lxd/storage_lvm_utils.go | 21 ++++++++++++++++-----
 lxd/storage_utils.go     | 24 ++++++++++++++++++++++++
 3 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 6e0937962..f227e66f7 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -971,9 +971,10 @@ func (s *storageLvm) ContainerCreateFromImage(container container, fingerprint s
 	containerLvDevPath := getLvmDevPath(poolName, storagePoolVolumeAPIEndpointContainers, containerLvmName)
 	// Generate a new xfs's UUID
 	lvFsType := s.getLvmFilesystem()
-	if lvFsType == "xfs" {
-		_, err := xfsGenerateNewUUID(containerLvDevPath)
+	if s.useThinpool {
+		msg, err := fsGenerateNewUUID(lvFsType, containerLvDevPath)
 		if err != nil {
+			logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", lvFsType, containerName, s.pool.Name, msg)
 			return err
 		}
 	}
diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index 3eed137a9..6c14b34c4 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -295,12 +295,23 @@ func (s *storageLvm) copyContainerThinpool(target container, source container, r
 	containerLvmName := containerNameToLVName(containerName)
 	containerLvDevPath := getLvmDevPath(poolName,
 		storagePoolVolumeAPIEndpointContainers, containerLvmName)
-	if LVFilesystem == "xfs" {
-		msg, err := xfsGenerateNewUUID(containerLvDevPath)
+	if s.useThinpool {
+		// If btrfstune sees two btrfs filesystems with the same UUID it
+		// gets confused and wants both of them unmounted. So unmount
+		// the source as well.
+		if LVFilesystem == "btrfs" {
+			ourUmount, err := s.ContainerUmount(source.Name(), source.Path())
+			if err != nil {
+				return err
+			}
+			if ourUmount {
+				s.ContainerMount(source)
+			}
+		}
+
+		msg, err := fsGenerateNewUUID(LVFilesystem, containerLvDevPath)
 		if err != nil {
-			logger.Errorf(`Failed to create new xfs UUID for `+
-				`container "%s" on storage pool "%s": %s`,
-				containerName, s.pool.Name, msg)
+			logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", LVFilesystem, containerName, s.pool.Name, msg)
 			return err
 		}
 	}
diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go
index 923980aee..90019575d 100644
--- a/lxd/storage_utils.go
+++ b/lxd/storage_utils.go
@@ -214,6 +214,17 @@ func makeFSType(path string, fsType string, options *mkfsOptions) (string, error
 	return "", nil
 }
 
+func fsGenerateNewUUID(fstype string, lvpath string) (string, error) {
+	switch fstype {
+	case "btrfs":
+		return btrfsGenerateNewUUID(lvpath)
+	case "xfs":
+		return xfsGenerateNewUUID(lvpath)
+	}
+
+	return "", nil
+}
+
 func xfsGenerateNewUUID(lvpath string) (string, error) {
 	msg, err := shared.RunCommand(
 		"xfs_admin",
@@ -226,6 +237,19 @@ func xfsGenerateNewUUID(lvpath string) (string, error) {
 	return "", nil
 }
 
+func btrfsGenerateNewUUID(lvpath string) (string, error) {
+	msg, err := shared.RunCommand(
+		"btrfstune",
+		"-f",
+		"-u",
+		lvpath)
+	if err != nil {
+		return msg, err
+	}
+
+	return "", nil
+}
+
 func growFileSystem(fsType string, devPath string, mntpoint string) error {
 	var msg string
 	var err error

From 1e105566752030e16e0699e4634b90fe72f323ad Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 13 Nov 2017 12:28:32 +0100
Subject: [PATCH 2/2] ceph: generate new UUID for btrfs

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 lxd/storage_ceph.go       | 13 +++++--------
 lxd/storage_ceph_utils.go | 13 ++++---------
 2 files changed, 9 insertions(+), 17 deletions(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 32b0a5cf7..1af3cc410 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -1053,14 +1053,11 @@ func (s *storageCeph) ContainerCreateFromImage(container container, fingerprint
 
 	// Generate a new xfs's UUID
 	RBDFilesystem := s.getRBDFilesystem()
-	if RBDFilesystem == "xfs" {
-		msg, err := xfsGenerateNewUUID(RBDDevPath)
-		if err != nil {
-			logger.Errorf(`Failed to generate new xfs UUID for `+
-				`RBD storage volume for container "%s": %s`,
-				containerName, msg)
-			return err
-		}
+
+	msg, err := fsGenerateNewUUID(RBDFilesystem, RBDDevPath)
+	if err != nil {
+		logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", RBDFilesystem, containerName, s.pool.Name, msg)
+		return err
 	}
 
 	privileged := container.IsPrivileged()
diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go
index 22017c67b..8294bd499 100644
--- a/lxd/storage_ceph_utils.go
+++ b/lxd/storage_ceph_utils.go
@@ -837,15 +837,10 @@ func (s *storageCeph) copyWithoutSnapshotsSparse(target container,
 
 	// Generate a new xfs's UUID
 	RBDFilesystem := s.getRBDFilesystem()
-	if RBDFilesystem == "xfs" {
-		msg, err := xfsGenerateNewUUID(RBDDevPath)
-		if err != nil {
-			logger.Errorf(`Failed to generate new xfs UUID for `+
-				`RBD storage volume for container "%s" on `+
-				`storage pool "%s": %s`, targetContainerName,
-				s.pool.Name, msg)
-			return err
-		}
+	msg, err := fsGenerateNewUUID(RBDFilesystem, RBDDevPath)
+	if err != nil {
+		logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", RBDFilesystem, targetContainerName, s.pool.Name, msg)
+		return err
 	}
 
 	targetContainerMountPoint := getContainerMountPoint(s.pool.Name,


More information about the lxc-devel mailing list