The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6624
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) ===
From 53d0ae9e500d5ea559848978fdced6d4666c96e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Sat, 14 Dec 2019 21:32:16 -0500 Subject: [PATCH 1/5] lxd/storage/dir: Use MountPath MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/storage/drivers/driver_dir.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go index a879d16f7c..693c495ab5 100644 --- a/lxd/storage/drivers/driver_dir.go +++ b/lxd/storage/drivers/driver_dir.go @@ -139,7 +139,7 @@ func (d *dir) GetResources() (*api.ResourcesStoragePool, error) { // GetVolumeUsage returns the disk space used by the volume. func (d *dir) GetVolumeUsage(vol Volume) (int64, error) { - volPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + volPath := vol.MountPath() ok, err := quota.Supported(volPath) if err != nil || !ok { return 0, nil @@ -169,7 +169,7 @@ func (d *dir) ValidateVolume(vol Volume, removeUnknownKeys bool) error { // HasVolume indicates whether a specific volume exists on the storage pool. func (d *dir) HasVolume(vol Volume) bool { - if shared.PathExists(GetVolumeMountPath(d.name, vol.volType, vol.name)) { + if shared.PathExists(vol.MountPath()) { return true } @@ -178,7 +178,7 @@ func (d *dir) HasVolume(vol Volume) bool { // GetVolumeDiskPath returns the location of a disk volume. func (d *dir) GetVolumeDiskPath(vol Volume) (string, error) { - return filepath.Join(GetVolumeMountPath(d.name, vol.volType, vol.name), "root.img"), nil + return filepath.Join(vol.MountPath(), "root.img"), nil } // setupInitialQuota enables quota on a new volume and sets with an initial quota from config. @@ -757,7 +757,7 @@ func (d *dir) DeleteVolume(vol Volume, op *operations.Operation) error { return fmt.Errorf("Cannot remove a volume that has snapshots") } - volPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + volPath := vol.MountPath() // If the volume doesn't exist, then nothing more to do. if !shared.PathExists(volPath) { @@ -818,7 +818,7 @@ func (d *dir) UnmountVolumeSnapshot(snapVol Volume, op *operations.Operation) (b // SetVolumeQuota sets the quota on the volume. func (d *dir) SetVolumeQuota(vol Volume, size string, op *operations.Operation) error { - volPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + volPath := vol.MountPath() volID, err := d.getVolID(vol.volType, vol.name) if err != nil { return err From 8afc53cee9d12c38cd3be58c7ca19b8625b37c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Sat, 14 Dec 2019 21:34:44 -0500 Subject: [PATCH 2/5] lxd/storage/dir: Move vfsResources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/storage/drivers/driver_cephfs.go | 3 +-- lxd/storage/drivers/driver_common.go | 25 +++++++++++++++++++++++++ lxd/storage/drivers/driver_dir.go | 3 +-- lxd/storage/drivers/utils.go | 23 ----------------------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lxd/storage/drivers/driver_cephfs.go b/lxd/storage/drivers/driver_cephfs.go index c13bfbd1be..7049a0568c 100644 --- a/lxd/storage/drivers/driver_cephfs.go +++ b/lxd/storage/drivers/driver_cephfs.go @@ -280,8 +280,7 @@ func (d *cephfs) Unmount() (bool, error) { } func (d *cephfs) GetResources() (*api.ResourcesStoragePool, error) { - // Use the generic VFS resources. - return vfsResources(GetPoolMountPath(d.name)) + return d.vfsGetResources() } func (d *cephfs) ValidateVolume(vol Volume, removeUnknownKeys bool) error { diff --git a/lxd/storage/drivers/driver_common.go b/lxd/storage/drivers/driver_common.go index 1b022472d2..f87a350a3f 100644 --- a/lxd/storage/drivers/driver_common.go +++ b/lxd/storage/drivers/driver_common.go @@ -6,6 +6,8 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/lxd/state" + "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/logger" ) @@ -108,3 +110,26 @@ func (d *common) Config() map[string]string { return confCopy } + +// vfsGetResources is a generic GetResources implementation for VFS-only drivers. +func (d *common) vfsGetResources() (*api.ResourcesStoragePool, error) { + // Get the VFS information + st, err := shared.Statvfs(GetPoolMountPath(d.name)) + if err != nil { + return nil, err + } + + // Fill in the struct + res := api.ResourcesStoragePool{} + res.Space.Total = st.Blocks * uint64(st.Bsize) + res.Space.Used = (st.Blocks - st.Bfree) * uint64(st.Bsize) + + // Some filesystems don't report inodes since they allocate them + // dynamically e.g. btrfs. + if st.Files > 0 { + res.Inodes.Total = st.Files + res.Inodes.Used = st.Files - st.Ffree + } + + return &res, nil +} diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go index 693c495ab5..13c038c792 100644 --- a/lxd/storage/drivers/driver_dir.go +++ b/lxd/storage/drivers/driver_dir.go @@ -133,8 +133,7 @@ func (d *dir) Unmount() (bool, error) { } func (d *dir) GetResources() (*api.ResourcesStoragePool, error) { - // Use the generic VFS resources. - return vfsResources(GetPoolMountPath(d.name)) + return d.vfsGetResources() } // GetVolumeUsage returns the disk space used by the volume. diff --git a/lxd/storage/drivers/utils.go b/lxd/storage/drivers/utils.go index 7f065aa97b..d3606a28a3 100644 --- a/lxd/storage/drivers/utils.go +++ b/lxd/storage/drivers/utils.go @@ -12,7 +12,6 @@ import ( "github.com/lxc/lxd/lxd/project" "github.com/lxc/lxd/shared" - "github.com/lxc/lxd/shared/api" ) // MkfsOptions represents options for filesystem creation. @@ -148,28 +147,6 @@ func tryMount(src string, dst string, fs string, flags uintptr, options string) return nil } -func vfsResources(path string) (*api.ResourcesStoragePool, error) { - // Get the VFS information - st, err := shared.Statvfs(path) - if err != nil { - return nil, err - } - - // Fill in the struct - res := api.ResourcesStoragePool{} - res.Space.Total = st.Blocks * uint64(st.Bsize) - res.Space.Used = (st.Blocks - st.Bfree) * uint64(st.Bsize) - - // Some filesystems don't report inodes since they allocate them - // dynamically e.g. btrfs. - if st.Files > 0 { - res.Inodes.Total = st.Files - res.Inodes.Used = st.Files - st.Ffree - } - - return &res, nil -} - // GetPoolMountPath returns the mountpoint of the given pool. // {LXD_DIR}/storage-pools/<pool> func GetPoolMountPath(poolName string) string { From 71ac6e1e9b0317c037352ee288c098359a81b0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Sat, 14 Dec 2019 21:37:40 -0500 Subject: [PATCH 3/5] lxd/storage/common: Add vfsRenameVolume MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/storage/drivers/driver_common.go | 77 ++++++++++++++++++++++++++++ lxd/storage/drivers/driver_dir.go | 72 +------------------------- 2 files changed, 78 insertions(+), 71 deletions(-) diff --git a/lxd/storage/drivers/driver_common.go b/lxd/storage/drivers/driver_common.go index f87a350a3f..8b41f98a93 100644 --- a/lxd/storage/drivers/driver_common.go +++ b/lxd/storage/drivers/driver_common.go @@ -2,9 +2,11 @@ package drivers import ( "fmt" + "os" "strings" "github.com/lxc/lxd/lxd/migration" + "github.com/lxc/lxd/lxd/operations" "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" @@ -133,3 +135,78 @@ func (d *common) vfsGetResources() (*api.ResourcesStoragePool, error) { return &res, nil } + +// vfsRenameVolume is a generic RenameVolume implementation for VFS-only drivers. +func (d *common) vfsRenameVolume(vol Volume, newVolName string, op *operations.Operation) error { + // Create new snapshots directory. + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, newVolName) + + err := os.MkdirAll(snapshotDir, 0711) + if err != nil { + return err + } + + type volRevert struct { + oldPath string + newPath string + } + + // Create slice to record paths renamed if revert needed later. + revertPaths := []volRevert{} + defer func() { + // Remove any paths rename if we are reverting. + for _, vol := range revertPaths { + os.Rename(vol.newPath, vol.oldPath) + } + + // Remove the new snapshot directory if we are reverting. + if len(revertPaths) > 0 { + err = os.RemoveAll(snapshotDir) + } + }() + + // Rename any snapshots of the volume too. + snapshots, err := vol.Snapshots(op) + if err != nil { + return err + } + + for _, snapshot := range snapshots { + oldPath := snapshot.MountPath() + _, snapName, _ := shared.InstanceGetParentAndSnapshotName(snapshot.name) + newPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(newVolName, snapName)) + + err := os.Rename(oldPath, newPath) + if err != nil { + return err + } + + revertPaths = append(revertPaths, volRevert{ + oldPath: oldPath, + newPath: newPath, + }) + } + + oldPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + newPath := GetVolumeMountPath(d.name, vol.volType, newVolName) + err = os.Rename(oldPath, newPath) + if err != nil { + return err + } + + revertPaths = append(revertPaths, volRevert{ + oldPath: oldPath, + newPath: newPath, + }) + + // Remove old snapshots directory. + oldSnapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) + + err = os.RemoveAll(oldSnapshotDir) + if err != nil { + return err + } + + revertPaths = nil + return nil +} diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go index 13c038c792..da5acafb6d 100644 --- a/lxd/storage/drivers/driver_dir.go +++ b/lxd/storage/drivers/driver_dir.go @@ -652,77 +652,7 @@ func (d *dir) UpdateVolume(vol Volume, changedConfig map[string]string) error { // RenameVolume renames a volume and its snapshots. func (d *dir) RenameVolume(vol Volume, newVolName string, op *operations.Operation) error { - // Create new snapshots directory. - snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, newVolName) - - err := os.MkdirAll(snapshotDir, 0711) - if err != nil { - return err - } - - type volRevert struct { - oldPath string - newPath string - } - - // Create slice to record paths renamed if revert needed later. - revertPaths := []volRevert{} - defer func() { - // Remove any paths rename if we are reverting. - for _, vol := range revertPaths { - os.Rename(vol.newPath, vol.oldPath) - } - - // Remove the new snapshot directory if we are reverting. - if len(revertPaths) > 0 { - err = os.RemoveAll(snapshotDir) - } - }() - - // Rename any snapshots of the volume too. - snapshots, err := vol.Snapshots(op) - if err != nil { - return err - } - - for _, snapshot := range snapshots { - oldPath := snapshot.MountPath() - _, snapName, _ := shared.InstanceGetParentAndSnapshotName(snapshot.name) - newPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(newVolName, snapName)) - - err := os.Rename(oldPath, newPath) - if err != nil { - return err - } - - revertPaths = append(revertPaths, volRevert{ - oldPath: oldPath, - newPath: newPath, - }) - } - - oldPath := GetVolumeMountPath(d.name, vol.volType, vol.name) - newPath := GetVolumeMountPath(d.name, vol.volType, newVolName) - err = os.Rename(oldPath, newPath) - if err != nil { - return err - } - - revertPaths = append(revertPaths, volRevert{ - oldPath: oldPath, - newPath: newPath, - }) - - // Remove old snapshots directory. - oldSnapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) - - err = os.RemoveAll(oldSnapshotDir) - if err != nil { - return err - } - - revertPaths = nil - return nil + return d.vfsRenameVolume(vol, newVolName, op) } // RestoreVolume restores a volume from a snapshot. From 7bc4ff0604a08056c718ff30864a626213c1b274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Sat, 14 Dec 2019 21:43:04 -0500 Subject: [PATCH 4/5] lxd/storage/common: Add vfsVolumeSnapshots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/storage/drivers/driver_common.go | 33 ++++++++++++++++++++++++++++ lxd/storage/drivers/driver_dir.go | 29 +----------------------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/lxd/storage/drivers/driver_common.go b/lxd/storage/drivers/driver_common.go index 8b41f98a93..92ce8c71a3 100644 --- a/lxd/storage/drivers/driver_common.go +++ b/lxd/storage/drivers/driver_common.go @@ -2,7 +2,9 @@ package drivers import ( "fmt" + "io/ioutil" "os" + "path/filepath" "strings" "github.com/lxc/lxd/lxd/migration" @@ -210,3 +212,34 @@ func (d *common) vfsRenameVolume(vol Volume, newVolName string, op *operations.O revertPaths = nil return nil } + +// vfsVolumeSnapshots is a generic VolumeSnapshots implementation for VFS-only drivers. +func (d *common) vfsVolumeSnapshots(vol Volume, op *operations.Operation) ([]string, error) { + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) + snapshots := []string{} + + ents, err := ioutil.ReadDir(snapshotDir) + if err != nil { + // If the snapshots directory doesn't exist, there are no snapshots. + if os.IsNotExist(err) { + return snapshots, nil + } + + return nil, err + } + + for _, ent := range ents { + fileInfo, err := os.Stat(filepath.Join(snapshotDir, ent.Name())) + if err != nil { + return nil, err + } + + if !fileInfo.IsDir() { + continue + } + + snapshots = append(snapshots, ent.Name()) + } + + return snapshots, nil +} diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go index da5acafb6d..02fb1c8406 100644 --- a/lxd/storage/drivers/driver_dir.go +++ b/lxd/storage/drivers/driver_dir.go @@ -3,7 +3,6 @@ package drivers import ( "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -599,33 +598,7 @@ func (d *dir) copyVolume(vol Volume, srcVol Volume, srcSnapshots []Volume, op *o // VolumeSnapshots returns a list of snapshots for the volume. func (d *dir) VolumeSnapshots(vol Volume, op *operations.Operation) ([]string, error) { - snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) - snapshots := []string{} - - ents, err := ioutil.ReadDir(snapshotDir) - if err != nil { - // If the snapshots directory doesn't exist, there are no snapshots. - if os.IsNotExist(err) { - return snapshots, nil - } - - return nil, err - } - - for _, ent := range ents { - fileInfo, err := os.Stat(filepath.Join(snapshotDir, ent.Name())) - if err != nil { - return nil, err - } - - if !fileInfo.IsDir() { - continue - } - - snapshots = append(snapshots, ent.Name()) - } - - return snapshots, nil + return d.vfsVolumeSnapshots(vol, op) } // UpdateVolume applies config changes to the volume. From 8a0d596f2c49ecc8bedb5c160451363f89094270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Sat, 14 Dec 2019 21:55:45 -0500 Subject: [PATCH 5/5] lxd/storage/common: Add vfsRenameVolumeSnapshot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/storage/drivers/driver_common.go | 14 ++++++++++++++ lxd/storage/drivers/driver_dir.go | 11 +---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lxd/storage/drivers/driver_common.go b/lxd/storage/drivers/driver_common.go index 92ce8c71a3..b71309d7b9 100644 --- a/lxd/storage/drivers/driver_common.go +++ b/lxd/storage/drivers/driver_common.go @@ -243,3 +243,17 @@ func (d *common) vfsVolumeSnapshots(vol Volume, op *operations.Operation) ([]str return snapshots, nil } + +// vfsRenameVolumeSnapshot is a generic RenameVolumeSnapshot implementation for VFS-only drivers. +func (d *common) vfsRenameVolumeSnapshot(snapVol Volume, newSnapshotName string, op *operations.Operation) error { + parentName, _, _ := shared.InstanceGetParentAndSnapshotName(snapVol.name) + oldPath := snapVol.MountPath() + newPath := GetVolumeMountPath(d.name, snapVol.volType, GetSnapshotVolumeName(parentName, newSnapshotName)) + + err := os.Rename(oldPath, newPath) + if err != nil { + return err + } + + return nil +} diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go index 02fb1c8406..5e3788dd9e 100644 --- a/lxd/storage/drivers/driver_dir.go +++ b/lxd/storage/drivers/driver_dir.go @@ -867,16 +867,7 @@ func (d *dir) DeleteVolumeSnapshot(snapVol Volume, op *operations.Operation) err // RenameVolumeSnapshot renames a volume snapshot. func (d *dir) RenameVolumeSnapshot(snapVol Volume, newSnapshotName string, op *operations.Operation) error { - parentName, _, _ := shared.InstanceGetParentAndSnapshotName(snapVol.name) - oldPath := snapVol.MountPath() - newPath := GetVolumeMountPath(d.name, snapVol.volType, GetSnapshotVolumeName(parentName, newSnapshotName)) - - err := os.Rename(oldPath, newPath) - if err != nil { - return err - } - - return nil + return d.vfsRenameVolumeSnapshot(snapVol, newSnapshotName, op) } // BackupVolume copies a volume (and optionally its snapshots) to a specified target path.
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel