[lxc-devel] [lxd/master] Storage: Snapshot usage

tomponline on Github lxc-bot at linuxcontainers.org
Mon Apr 6 13:03:58 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 454 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200406/450d0da1/attachment.bin>
-------------- next part --------------
From b82245272be3e0f4b853e61ca70f8c097b556841 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Fri, 3 Apr 2020 17:57:51 +0100
Subject: [PATCH 1/6] lxd/storage/drivers/driver/zfs/volumes: Comment

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_zfs_volumes.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/storage/drivers/driver_zfs_volumes.go b/lxd/storage/drivers/driver_zfs_volumes.go
index b8f1426b7e..864b293675 100644
--- a/lxd/storage/drivers/driver_zfs_volumes.go
+++ b/lxd/storage/drivers/driver_zfs_volumes.go
@@ -778,7 +778,7 @@ func (d *zfs) GetVolumeUsage(vol Volume) (int64, error) {
 		key = "referenced"
 	}
 
-	// Shortcut for refquota filesystems.
+	// Shortcut for mounted refquota filesystems.
 	if key == "referenced" && vol.contentType == ContentTypeFS && shared.IsMountPoint(vol.MountPath()) {
 		var stat unix.Statfs_t
 		err := unix.Statfs(vol.MountPath(), &stat)

From 32b3587b439d0378eb397c14119589f97a582b7b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 6 Apr 2020 13:24:59 +0100
Subject: [PATCH 2/6] lxd/storage/drivers/driver/lvm/volumes: Always return
 -1/ErrNotSupported for snapshot usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_lvm_volumes.go | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lxd/storage/drivers/driver_lvm_volumes.go b/lxd/storage/drivers/driver_lvm_volumes.go
index 49cc983ed7..710abebbc9 100644
--- a/lxd/storage/drivers/driver_lvm_volumes.go
+++ b/lxd/storage/drivers/driver_lvm_volumes.go
@@ -283,6 +283,11 @@ func (d *lvm) UpdateVolume(vol Volume, changedConfig map[string]string) error {
 
 // GetVolumeUsage returns the disk space used by the volume (this is not currently supported).
 func (d *lvm) GetVolumeUsage(vol Volume) (int64, error) {
+	// Snapshot usage not supported for LVM.
+	if vol.IsSnapshot() {
+		return -1, ErrNotSupported
+	}
+
 	// If volume has a filesystem and is mounted we can ask the filesystem for usage.
 	if vol.contentType == ContentTypeFS && shared.IsMountPoint(vol.MountPath()) {
 		var stat unix.Statfs_t

From abd6e41a87fefe68c811837cf53cbfa6535612ea Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 6 Apr 2020 13:35:04 +0100
Subject: [PATCH 3/6] lxd/storage/drivers/driver/dir/volumes: Always return
 -1/ErrNotSupported for snapshot usage

Also if project quotas not supported return ErrNotSupported.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_dir_volumes.go | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/lxd/storage/drivers/driver_dir_volumes.go b/lxd/storage/drivers/driver_dir_volumes.go
index d79ce2b155..acdae14e59 100644
--- a/lxd/storage/drivers/driver_dir_volumes.go
+++ b/lxd/storage/drivers/driver_dir_volumes.go
@@ -213,10 +213,15 @@ func (d *dir) UpdateVolume(vol Volume, changedConfig map[string]string) error {
 
 // GetVolumeUsage returns the disk space used by the volume.
 func (d *dir) GetVolumeUsage(vol Volume) (int64, error) {
+	// Snapshot usage not supported for Dir.
+	if vol.IsSnapshot() {
+		return -1, ErrNotSupported
+	}
+
 	volPath := vol.MountPath()
 	ok, err := quota.Supported(volPath)
 	if err != nil || !ok {
-		return 0, nil
+		return -1, ErrNotSupported
 	}
 
 	// Get the volume ID for the volume to access quota.

From 1adea3bb753bebef2a5045a3b9087b7552902423 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 6 Apr 2020 13:44:19 +0100
Subject: [PATCH 4/6] lxd/storage/drivers/driver/zfs/volumes: Always used
 'used' property for ZFS snapshot usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_zfs_volumes.go | 26 ++++++++++++++---------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/lxd/storage/drivers/driver_zfs_volumes.go b/lxd/storage/drivers/driver_zfs_volumes.go
index 864b293675..14dbcd7453 100644
--- a/lxd/storage/drivers/driver_zfs_volumes.go
+++ b/lxd/storage/drivers/driver_zfs_volumes.go
@@ -774,19 +774,25 @@ func (d *zfs) UpdateVolume(vol Volume, changedConfig map[string]string) error {
 func (d *zfs) GetVolumeUsage(vol Volume) (int64, error) {
 	// Determine what key to use.
 	key := "used"
-	if shared.IsTrue(vol.ExpandedConfig("zfs.use_refquota")) {
-		key = "referenced"
-	}
 
-	// Shortcut for mounted refquota filesystems.
-	if key == "referenced" && vol.contentType == ContentTypeFS && shared.IsMountPoint(vol.MountPath()) {
-		var stat unix.Statfs_t
-		err := unix.Statfs(vol.MountPath(), &stat)
-		if err != nil {
-			return -1, err
+	// If volume isn't snapshot then we can take into account the zfs.use_refquota setting.
+	// Snapshots should also use the "used" ZFS property because the snapshot usage size represents the CoW
+	// usage not the size of the snapshot volume.
+	if !vol.IsSnapshot() {
+		if shared.IsTrue(vol.ExpandedConfig("zfs.use_refquota")) {
+			key = "referenced"
 		}
 
-		return int64(stat.Blocks-stat.Bfree) * int64(stat.Bsize), nil
+		// Shortcut for mounted refquota filesystems.
+		if key == "referenced" && vol.contentType == ContentTypeFS && shared.IsMountPoint(vol.MountPath()) {
+			var stat unix.Statfs_t
+			err := unix.Statfs(vol.MountPath(), &stat)
+			if err != nil {
+				return -1, err
+			}
+
+			return int64(stat.Blocks-stat.Bfree) * int64(stat.Bsize), nil
+		}
 	}
 
 	// Get the current value.

From 7eb513c6a88783821ce16d3f8f0b33ff3271b263 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 6 Apr 2020 13:48:28 +0100
Subject: [PATCH 5/6] lxd/storage/drivers/driver/cephfs/volumes: Always return
 -1/ErrNotSupported for snapshot usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_cephfs_volumes.go | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lxd/storage/drivers/driver_cephfs_volumes.go b/lxd/storage/drivers/driver_cephfs_volumes.go
index 0e5b720c62..f3337d84e8 100644
--- a/lxd/storage/drivers/driver_cephfs_volumes.go
+++ b/lxd/storage/drivers/driver_cephfs_volumes.go
@@ -288,6 +288,11 @@ func (d *cephfs) UpdateVolume(vol Volume, changedConfig map[string]string) error
 
 // GetVolumeUsage returns the disk space usage of a volume.
 func (d *cephfs) GetVolumeUsage(vol Volume) (int64, error) {
+	// Snapshot usage not supported for CephFS.
+	if vol.IsSnapshot() {
+		return -1, ErrNotSupported
+	}
+
 	out, err := shared.RunCommand("getfattr", "-n", "ceph.quota.max_bytes", "--only-values", GetVolumeMountPath(d.name, vol.volType, vol.name))
 	if err != nil {
 		return -1, err

From b4f57af0ceee29efe71a3ee72080ce90dd06f187 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 6 Apr 2020 13:55:33 +0100
Subject: [PATCH 6/6] lxd/storage/drivers/driver/btrfs/volumes: Return
 -1/ErrNotSupported when no quota available

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_btrfs_volumes.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/storage/drivers/driver_btrfs_volumes.go b/lxd/storage/drivers/driver_btrfs_volumes.go
index 4841be48e3..123df4c106 100644
--- a/lxd/storage/drivers/driver_btrfs_volumes.go
+++ b/lxd/storage/drivers/driver_btrfs_volumes.go
@@ -419,7 +419,7 @@ func (d *btrfs) GetVolumeUsage(vol Volume) (int64, error) {
 	_, usage, err := d.getQGroup(vol.MountPath())
 	if err != nil {
 		if err == errBtrfsNoQuota {
-			return 0, nil
+			return -1, ErrNotSupported
 		}
 
 		return -1, err


More information about the lxc-devel mailing list