[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