The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7353
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 cbefe0cc283a4ec3b0fe04424922b0eb94b2dd85 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 12 May 2020 10:08:19 +0100 Subject: [PATCH 1/4] lxd/storage/drivers/driver/btrfs/utils: Renames metadatHeader to restorationHeader And updates comments clarifying the role of this function. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/drivers/driver_btrfs_utils.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lxd/storage/drivers/driver_btrfs_utils.go b/lxd/storage/drivers/driver_btrfs_utils.go index 6ce0fbac91..0586da3cd6 100644 --- a/lxd/storage/drivers/driver_btrfs_utils.go +++ b/lxd/storage/drivers/driver_btrfs_utils.go @@ -461,8 +461,13 @@ type BTRFSMetaDataHeader struct { Subvolumes []BTRFSSubVolume // Sub volumes inside the volume (including the top level ones). } -// metadataHeader scans the volume and any specified snapshots, returning a header containing subvolume meta data. -func (d *btrfs) metadataHeader(vol Volume, snapshots []string) (*BTRFSMetaDataHeader, error) { +// restorationHeader scans the volume and any specified snapshots, returning a header containing subvolume metadata +// for use in restoring a volume and its snapshots onto another system. The metadata returned represents how the +// subvolumes should be restored, not necessarily how they are on disk now. Most of the time this is the same, +// however in circumstances where the volume being scanned is itself a snapshot, the returned metadata will +// not report the volume as readonly or as being a snapshot, as the expectation is that this volume will be +// restored on the target system as a normal volume and not a snapshot. +func (d *btrfs) restorationHeader(vol Volume, snapshots []string) (*BTRFSMetaDataHeader, error) { var migrationHeader BTRFSMetaDataHeader // Add snapshots to volumes list. @@ -484,7 +489,9 @@ func (d *btrfs) metadataHeader(vol Volume, snapshots []string) (*BTRFSMetaDataHe return nil, err } - // If vol is a snapshot itself, we need to fixup the metadata. + // If vol is a snapshot itself, we force the volume as writable (even if it isn't on disk) and remove the + // snapshot name indicator as the expectation is that this volume is going to be restored on the target + // system as a normal (non-snapshot) writable volume. if vol.IsSnapshot() { subVols[0].Readonly = false for i := range subVols { From 8620268a8a882377a93d6b18a7f356dfc7b4fe52 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 12 May 2020 10:08:53 +0100 Subject: [PATCH 2/4] lxd/storage/drivers/driver/btrfs/volumes: d.restorationHeader usage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/drivers/driver_btrfs_volumes.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lxd/storage/drivers/driver_btrfs_volumes.go b/lxd/storage/drivers/driver_btrfs_volumes.go index bdac8afacc..b6b3ca1264 100644 --- a/lxd/storage/drivers/driver_btrfs_volumes.go +++ b/lxd/storage/drivers/driver_btrfs_volumes.go @@ -689,8 +689,8 @@ func (d *btrfs) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs *m return nil } - // Generate migration header, containing subvolume info. - migrationHeader, err := d.metadataHeader(vol, volSrcArgs.Snapshots) + // Generate restoration header, containing info on the subvolumes and how they should be restored. + migrationHeader, err := d.restorationHeader(vol, volSrcArgs.Snapshots) if err != nil { return err } From 919f4754e631d4d1ab40236cb6af3e71b16ac5da Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 12 May 2020 10:25:12 +0100 Subject: [PATCH 3/4] lxd/storage/drivers/driver/btrfs/volumes: Clarifies comments in MigrateVolume Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/drivers/driver_btrfs_volumes.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lxd/storage/drivers/driver_btrfs_volumes.go b/lxd/storage/drivers/driver_btrfs_volumes.go index b6b3ca1264..6a7cdaac23 100644 --- a/lxd/storage/drivers/driver_btrfs_volumes.go +++ b/lxd/storage/drivers/driver_btrfs_volumes.go @@ -727,11 +727,11 @@ func (d *btrfs) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs *m // sendVolume sends a volume and its subvolumes (if negotiated subvolumes feature) to recipient. sendVolume := func(v Volume, sourcePrefix string, parentPrefix string) error { - snapName := "" // Default to empty if volume isn't a snapshot and is main volume. + snapName := "" // Default to empty (sending main volume) from migrationHeader.Subvolumes. - // Detect snapshot by comparing to main volume. - // We can't use IsSnapshot() as the main vol may itself be a snapshot. - if v.name != vol.name { + // Detect if we are sending a snapshot by comparing to main volume name. + // We can't only use IsSnapshot() as the main vol may itself be a snapshot. + if v.IsSnapshot() && v.name != vol.name { _, snapName, _ = shared.InstanceGetParentAndSnapshotName(v.name) } From a09f194d9827fc5fef747786fb8a69b4039d54a4 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Tue, 12 May 2020 10:30:35 +0100 Subject: [PATCH 4/4] lxd/storage/drivers/driver/btrfs/volumes: Adds safety net against failed matching of subvolumes Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/drivers/driver_btrfs_volumes.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lxd/storage/drivers/driver_btrfs_volumes.go b/lxd/storage/drivers/driver_btrfs_volumes.go index 6a7cdaac23..4e08660345 100644 --- a/lxd/storage/drivers/driver_btrfs_volumes.go +++ b/lxd/storage/drivers/driver_btrfs_volumes.go @@ -741,6 +741,8 @@ func (d *btrfs) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs *m wrapper = migration.ProgressTracker(op, "fs_progress", v.name) } + sentVols := 0 + // Send volume (and any subvolumes if supported) to target. for _, subVolume := range migrationHeader.Subvolumes { if subVolume.Snapshot != snapName { @@ -781,6 +783,12 @@ func (d *btrfs) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs *m if err != nil { return errors.Wrapf(err, "Failed sending volume %v:%s", v.name, subVolume.Path) } + sentVols++ + } + + // Ensure we found and sent at least root subvolume of the volume requested. + if sentVols < 1 { + return fmt.Errorf("No matching subvolume(s) for %q found in subvolumes list", v.name) } return nil
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel