[lxc-devel] [lxd/master] Fix CEPH unmap issues

stgraber on Github lxc-bot at linuxcontainers.org
Thu Feb 7 02:21:02 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190206/6d5ac763/attachment.bin>
-------------- next part --------------
From 7f7ae818c6b0914965c512bf0dfdb9bac5668b78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 6 Feb 2019 19:48:58 -0500
Subject: [PATCH 1/4] lxd/storage/ceph: Unmap volume after creation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #5421

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/storage_ceph.go | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 8158e7a1dc..944ec1bc83 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -380,10 +380,6 @@ func (s *storageCeph) StoragePoolVolumeCreate() error {
 		s.volume.Name, s.pool.Name)
 
 	defer func() {
-		if !revert {
-			return
-		}
-
 		err := cephRBDVolumeUnmap(s.ClusterName, s.OSDPoolName,
 			s.volume.Name, storagePoolVolumeTypeNameCustom,
 			s.UserName, true)

From 39d569e5242795f1e836daf45d37e3ec5a556670 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 6 Feb 2019 20:02:53 -0500
Subject: [PATCH 2/4] lxd/storage/ceph: Create custom mountpoints if missing
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #5421

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/storage_ceph.go | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 944ec1bc83..e9c1efa7fc 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -519,6 +519,13 @@ func (s *storageCeph) StoragePoolVolumeMount() (bool, error) {
 	ourMount := false
 	RBDDevPath := ""
 	if !shared.IsMountPoint(volumeMntPoint) {
+		if !shared.PathExists(volumeMntPoint) {
+			err := os.MkdirAll(volumeMntPoint, 0711)
+			if err != nil {
+				return false, err
+			}
+		}
+
 		RBDDevPath, ret = getRBDMappedDevPath(s.ClusterName, s.OSDPoolName,
 			storagePoolVolumeTypeNameCustom, s.volume.Name, true,
 			s.UserName)

From 27a60f7d1a609ae375cf3289e3424885b7942aff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 6 Feb 2019 21:19:04 -0500
Subject: [PATCH 3/4] lxd/containers: Call storage unmount on detach
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/container_lxc.go | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index d9e6174146..d4bc9fd5d2 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -8219,6 +8219,19 @@ func (c *containerLXC) removeDiskDevice(name string, m types.Device) error {
 		return err
 	}
 
+	// Check if pool-specific action should be taken
+	if m["pool"] != "" {
+		s, err := storagePoolVolumeInit(c.state, "default", m["pool"], m["source"], storagePoolVolumeTypeCustom)
+		if err != nil {
+			return err
+		}
+
+		_, err = s.StoragePoolVolumeUmount()
+		if err != nil {
+			return err
+		}
+	}
+
 	// Remove the host side
 	err = os.Remove(devPath)
 	if err != nil {

From bcc7aee9c8cf1f8ed31f0957622c4296ec70a2b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 6 Feb 2019 21:18:48 -0500
Subject: [PATCH 4/4] lxd/storage/ceph: Unmap on unmount
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #5421

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/storage_ceph.go | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index e9c1efa7fc..dd7323871c 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -583,7 +583,6 @@ func (s *storageCeph) StoragePoolVolumeUmount() (bool, error) {
 	if shared.IsMountPoint(volumeMntPoint) {
 		customerr = tryUnmount(volumeMntPoint, syscall.MNT_DETACH)
 		ourUmount = true
-		logger.Debugf(`Path "%s" is a mountpoint for RBD storage volume "%s" on storage pool "%s"`, volumeMntPoint, s.volume.Name, s.pool.Name)
 	}
 
 	lxdStorageMapLock.Lock()
@@ -598,6 +597,17 @@ func (s *storageCeph) StoragePoolVolumeUmount() (bool, error) {
 		return false, customerr
 	}
 
+	if ourUmount {
+		// Attempt to 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 for container "%s" on storage pool "%s": %s`, s.volume.Name, s.pool.Name, err)
+			return ourUmount, err
+		}
+	}
+
 	logger.Debugf(`Unmounted RBD storage volume "%s" on storage pool "%s"`,
 		s.volume.Name, s.pool.Name)
 	return ourUmount, nil


More information about the lxc-devel mailing list