[prev in list] [next in list] [prev in thread] [next in thread] 

List:       lxc-devel
Subject:    [lxc-devel] [lxd/master] Fix storage quota re-application issue
From:       stgraber on Github <lxc-bot () linuxcontainers ! org>
Date:       2018-08-23 23:41:47
Message-ID: 20180823234147.D598D5DFDA () mailman01 ! srv ! dcmtl ! stgraber ! net
[Download RAW message or body]

[Attachment #2 (text/x-mailbox)]

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

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


[Attachment #3 (text/plain)]

From 2e2414d83eb3af2e555362d9c48a5431739bb0f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stéphane Graber?= <stgraber@ubuntu.com>
Date: Thu, 23 Aug 2018 17:06:51 -0400
Subject: [PATCH 1/2] lxd/containers: Also use apply_quota for CEPH
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #4960

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

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 0beed0e234..9280c3cec2 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -4088,7 +4088,7 @@ func (c *containerLXC) Update(args db.ContainerArgs, \
userRequested bool) error {  if newRootDiskDeviceSize != oldRootDiskDeviceSize {
 		storageTypeName := c.storage.GetStorageTypeName()
 		storageIsReady := c.storage.ContainerStorageReady(c.Name())
-		if storageTypeName == "lvm" && isRunning || !storageIsReady {
+		if (storageTypeName == "lvm" || storageTypeName == "ceph") && isRunning || \
!storageIsReady {  c.localConfig["volatile.apply_quota"] = newRootDiskDeviceSize
 		} else {
 			size, err := shared.ParseByteSizeString(newRootDiskDeviceSize)

From a2d0e291076c39cba55a40e2318cb6bf614bbec9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stéphane Graber?= <stgraber@ubuntu.com>
Date: Thu, 23 Aug 2018 17:22:55 -0400
Subject: [PATCH 2/2] lxd/containers: Simplify and fix pool update logic
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #4960

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

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 9280c3cec2..02deecd97c 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -4021,65 +4021,32 @@ func (c *containerLXC) Update(args db.ContainerArgs, \
userRequested bool) error {  c.idmapset = nil
 	}

-	// Retrieve old root disk devices.
-	oldLocalRootDiskDeviceKey, oldLocalRootDiskDevice, _ := \
                shared.GetRootDiskDevice(oldLocalDevices)
-	var oldProfileRootDiskDevices []string
-	for k, v := range oldExpandedDevices {
-		if shared.IsRootDiskDevice(v) && k != oldLocalRootDiskDeviceKey && \
                !shared.StringInSlice(k, oldProfileRootDiskDevices) {
-			oldProfileRootDiskDevices = append(oldProfileRootDiskDevices, k)
-		}
-	}
-
-	// Retrieve new root disk devices.
-	newLocalRootDiskDeviceKey, newLocalRootDiskDevice, _ := \
                shared.GetRootDiskDevice(c.localDevices)
-	var newProfileRootDiskDevices []string
+	// Make sure we have a valid root disk device (and only one)
+	newRootDiskDeviceKey := ""
 	for k, v := range c.expandedDevices {
-		if shared.IsRootDiskDevice(v) && k != newLocalRootDiskDeviceKey && \
                !shared.StringInSlice(k, newProfileRootDiskDevices) {
-			newProfileRootDiskDevices = append(newProfileRootDiskDevices, k)
+		if v["type"] == "disk" && v["path"] == "/" && v["pool"] != "" {
+			if newRootDiskDeviceKey != "" {
+				return fmt.Errorf("Containers may only have one root disk device")
+			}
+
+			newRootDiskDeviceKey = k
 		}
 	}

-	// Verify root disk devices. (Be specific with error messages.)
-	var oldRootDiskDeviceKey string
-	var newRootDiskDeviceKey string
-	if oldLocalRootDiskDevice["pool"] != "" {
-		oldRootDiskDeviceKey = oldLocalRootDiskDeviceKey
-		newRootDiskDeviceKey = newLocalRootDiskDeviceKey
-
-		if newLocalRootDiskDevice["pool"] == "" {
-			if len(newProfileRootDiskDevices) == 0 {
-				return fmt.Errorf("Update will cause the container to rely on a profile's root \
                disk device but none was found")
-			} else if len(newProfileRootDiskDevices) > 1 {
-				return fmt.Errorf("Update will cause the container to rely on a profile's root \
                disk device but conflicting devices were found")
-			} else if c.expandedDevices[newProfileRootDiskDevices[0]]["pool"] != \
                oldLocalRootDiskDevice["pool"] {
-				newRootDiskDeviceKey = newProfileRootDiskDevices[0]
-				return fmt.Errorf("Using the profile's root disk device would change the storage \
                pool of the container")
-			}
-		}
-	} else {
-		// This branch should allow us to cover cases where a container
-		// didn't have root disk device before for whatever reason. As
-		// long as there is a root disk device in one of the local or
-		// profile devices we're good.
-		if newLocalRootDiskDevice["pool"] != "" {
-			newRootDiskDeviceKey = newLocalRootDiskDeviceKey
+	if newRootDiskDeviceKey == "" {
+		return fmt.Errorf("Containers must have a root disk device (directly or \
inherited)") +	}

-			if len(oldProfileRootDiskDevices) > 0 {
-				oldRootDiskDeviceKey = oldProfileRootDiskDevices[0]
-				if oldExpandedDevices[oldRootDiskDeviceKey]["pool"] != \
                newLocalRootDiskDevice["pool"] {
-					return fmt.Errorf("The new local root disk device would change the storage pool \
                of the container")
-				}
-			}
-		} else {
-			if len(newProfileRootDiskDevices) == 0 {
-				return fmt.Errorf("Update will cause the container to rely on a profile's root \
                disk device but none was found")
-			} else if len(newProfileRootDiskDevices) > 1 {
-				return fmt.Errorf("Using the profile's root disk device would change the storage \
                pool of the container")
-			}
-			newRootDiskDeviceKey = newProfileRootDiskDevices[0]
+	// Retrieve the old root disk device
+	oldRootDiskDeviceKey := ""
+	for k, v := range c.expandedDevices {
+		if v["type"] == "disk" && v["path"] == "/" && v["pool"] != "" {
+			oldRootDiskDeviceKey = k
+			break
 		}
 	}

+	// Deal with quota changes
 	oldRootDiskDeviceSize := oldExpandedDevices[oldRootDiskDeviceKey]["size"]
 	newRootDiskDeviceSize := c.expandedDevices[newRootDiskDeviceKey]["size"]


[Attachment #4 (text/plain)]

_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic