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

Reply via email to