[lxc-devel] [lxd/master] Fix storage leaks in tests

stgraber on Github lxc-bot at linuxcontainers.org
Tue Oct 20 22:42:49 UTC 2020


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/20201020/7b3b2c3f/attachment.bin>
-------------- next part --------------
From 027ed7dbad97446eec5c9d93c6754bd8635f7c2c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 20 Oct 2020 17:27:06 -0400
Subject: [PATCH 1/3] tests: Fix missing clustering cleanup
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>
---
 test/suites/clustering.sh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/test/suites/clustering.sh b/test/suites/clustering.sh
index 1ce7d1781b..0157dbbb2d 100644
--- a/test/suites/clustering.sh
+++ b/test/suites/clustering.sh
@@ -689,6 +689,8 @@ test_clustering_storage_single_node() {
   # Delete the storage pool
   LXD_DIR="${LXD_ONE_DIR}" lxc storage delete pool1
 
+  printf 'config: {}\ndevices: {}' | LXD_DIR="${LXD_ONE_DIR}" lxc profile edit default
+  LXD_DIR="${LXD_ONE_DIR}" lxc storage delete data
   LXD_DIR="${LXD_ONE_DIR}" lxd shutdown
   sleep 0.5
   rm -f "${LXD_ONE_DIR}/unix.socket"

From 39e66f7095c313d45cde5c770304f23ec7e034ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 20 Oct 2020 17:47:50 -0400
Subject: [PATCH 2/3] lxd/storage/zfs: Properly recurse delete volumes
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/storage/drivers/driver_zfs_utils.go   | 45 +++++++++++++++++++++++
 lxd/storage/drivers/driver_zfs_volumes.go | 37 +------------------
 2 files changed, 46 insertions(+), 36 deletions(-)

diff --git a/lxd/storage/drivers/driver_zfs_utils.go b/lxd/storage/drivers/driver_zfs_utils.go
index edc01f2dbb..13e59cb80f 100644
--- a/lxd/storage/drivers/driver_zfs_utils.go
+++ b/lxd/storage/drivers/driver_zfs_utils.go
@@ -81,6 +81,51 @@ func (d *zfs) checkDataset(dataset string) bool {
 	return strings.TrimSpace(out) == dataset
 }
 
+func (d *zfs) deleteDatasetRecursive(dataset string) error {
+	// Locate the origin snapshot (if any).
+	origin, err := d.getDatasetProperty(dataset, "origin")
+	if err != nil {
+		return err
+	}
+
+	// Delete the dataset (and any snapshots left).
+	_, err = shared.RunCommand("zfs", "destroy", "-r", dataset)
+	if err != nil {
+		return err
+	}
+
+	// Check if the origin can now be deleted.
+	if origin != "" && origin != "-" {
+		if strings.HasPrefix(origin, filepath.Join(d.config["zfs.pool_name"], "deleted")) {
+			// Strip the snapshot name when dealing with a deleted volume.
+			dataset = strings.SplitN(origin, "@", 2)[0]
+		} else if strings.Contains(origin, "@deleted-") || strings.Contains(origin, "@copy-") {
+			// Handle deleted snapshots.
+			dataset = origin
+		} else {
+			// Origin is still active.
+			dataset = ""
+		}
+
+		if dataset != "" {
+			// Get all clones.
+			clones, err := d.getClones(dataset)
+			if err != nil {
+				return err
+			}
+
+			if len(clones) == 0 {
+				// Delete the origin.
+				err = d.deleteDatasetRecursive(dataset)
+				if err != nil {
+					return err
+				}
+			}
+		}
+	}
+	return nil
+}
+
 func (d *zfs) getClones(dataset string) ([]string, error) {
 	out, err := shared.RunCommand("zfs", "get", "-H", "-p", "-r", "-o", "value", "clones", dataset)
 	if err != nil {
diff --git a/lxd/storage/drivers/driver_zfs_volumes.go b/lxd/storage/drivers/driver_zfs_volumes.go
index 57103887cf..0f06215306 100644
--- a/lxd/storage/drivers/driver_zfs_volumes.go
+++ b/lxd/storage/drivers/driver_zfs_volumes.go
@@ -736,45 +736,10 @@ func (d *zfs) DeleteVolume(vol Volume, op *operations.Operation) error {
 				return err
 			}
 		} else {
-			// Locate the origin snapshot (if any).
-			origin, err := d.getDatasetProperty(d.dataset(vol, false), "origin")
+			err := d.deleteDatasetRecursive(d.dataset(vol, false))
 			if err != nil {
 				return err
 			}
-
-			// Delete the dataset (and any snapshots left).
-			_, err = shared.RunCommand("zfs", "destroy", "-r", d.dataset(vol, false))
-			if err != nil {
-				return err
-			}
-
-			// Check if the origin can now be deleted.
-			if origin != "" && origin != "-" {
-				dataset := ""
-				if strings.HasPrefix(origin, filepath.Join(d.config["zfs.pool_name"], "deleted")) {
-					// Strip the snapshot name when dealing with a deleted volume.
-					dataset = strings.SplitN(origin, "@", 2)[0]
-				} else if strings.Contains(origin, "@deleted-") || strings.Contains(origin, "@copy-") {
-					// Handle deleted snapshots.
-					dataset = origin
-				}
-
-				if dataset != "" {
-					// Get all clones.
-					clones, err := d.getClones(dataset)
-					if err != nil {
-						return err
-					}
-
-					if len(clones) == 0 {
-						// Delete the origin.
-						_, err := shared.RunCommand("zfs", "destroy", "-r", dataset)
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
 		}
 	}
 

From a4bc53da158f25e442f6c165c78ca3bf77494ef8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 20 Oct 2020 18:37:53 -0400
Subject: [PATCH 3/3] tests: Fix cleanup in backup
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>
---
 test/suites/backup.sh | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/test/suites/backup.sh b/test/suites/backup.sh
index 11b79c10cd..0392aca437 100644
--- a/test/suites/backup.sh
+++ b/test/suites/backup.sh
@@ -622,9 +622,11 @@ test_backup_volume_export_with_project() {
   rmdir "${LXD_DIR}/non-optimized"
 
   if [ "$#" -ne 0 ]; then
-    lxc image rm testimage
     lxc project switch default
+    lxc image rm testimage --project "$project"
+    lxc image rm testimage --project "$project-b"
     lxc project delete "$project"
+    lxc project delete "$project-b"
   fi
 }
 


More information about the lxc-devel mailing list