The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7117

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) ===
Ceph and LVM do regeneration of filesystem UUIDs differently so this PR aims to unify their approaches taking the best bits of each.

Also partially undoes https://github.com/lxc/lxd/pull/7071 as this was causing filesystem UUIDs to be regenerated when generating a backup.yaml file which is done when taking new snapshots, which ultimately was slowing down taking new snapshots. A fix for this will be followed in a separate PR.


From 57a6c1941419b29b611cd90f4254390c417eb0e5 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 1 Apr 2020 14:08:10 +0100
Subject: [PATCH 1/2] lxd/storage/drivers/driver/lvm/volumes: Mount xfs
 snapshot with nouuid option

Avoids regeneration of UUID expense when just mounting the snapshot.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/driver_lvm_volumes.go | 26 ++++++++++++++++-------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/lxd/storage/drivers/driver_lvm_volumes.go 
b/lxd/storage/drivers/driver_lvm_volumes.go
index aa15f5b73c..49cc983ed7 100644
--- a/lxd/storage/drivers/driver_lvm_volumes.go
+++ b/lxd/storage/drivers/driver_lvm_volumes.go
@@ -418,7 +418,7 @@ func (d *lvm) MountVolume(vol Volume, op 
*operations.Operation) (bool, error) {
                if err != nil {
                        return false, errors.Wrapf(err, "Failed to mount LVM 
logical volume")
                }
-               d.logger.Debug("Mounted logical volume", log.Ctx{"dev": 
volDevPath, "path": mountPath})
+               d.logger.Debug("Mounted logical volume", log.Ctx{"dev": 
volDevPath, "path": mountPath, "options": mountOptions})
 
                return true, nil
        }
@@ -641,6 +641,7 @@ func (d *lvm) MountVolumeSnapshot(snapVol Volume, op 
*operations.Operation) (boo
                // Default to mounting the original snapshot directly. This may 
be changed below if a temporary
                // snapshot needs to be taken.
                mountVol := snapVol
+               mountFlags, mountOptions := 
resolveMountOptions(d.volumeMountOptions(mountVol))
 
                // Regenerate filesystem UUID if needed. This is because some 
filesystems do not allow mounting
                // multiple volumes that share the same UUID. As snapshotting a 
volume will copy its UUID we need
@@ -666,11 +667,21 @@ func (d *lvm) MountVolumeSnapshot(snapVol Volume, op 
*operations.Operation) (boo
                        })
 
                        tmpVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], 
tmpVol.volType, tmpVol.contentType, tmpVol.name)
-
-                       d.logger.Debug("Regenerating filesystem UUID", 
log.Ctx{"dev": tmpVolDevPath, "fs": d.volumeFilesystem(tmpVol)})
-                       err = 
regenerateFilesystemUUID(d.volumeFilesystem(tmpVol), tmpVolDevPath)
-                       if err != nil {
-                               return false, err
+                       tmpVolFsType := d.volumeFilesystem(tmpVol)
+
+                       // When mounting XFS filesystems temporarily we can use 
the nouuid option rather than fully
+                       // regenerating the filesystem UUID.
+                       if tmpVolFsType == "xfs" {
+                               idx := strings.Index(mountOptions, "nouuid")
+                               if idx < 0 {
+                                       mountOptions += ",nouuid"
+                               }
+                       } else {
+                               d.logger.Debug("Regenerating filesystem UUID", 
log.Ctx{"dev": tmpVolDevPath, "fs": d.volumeFilesystem(tmpVol)})
+                               err = 
regenerateFilesystemUUID(d.volumeFilesystem(tmpVol), tmpVolDevPath)
+                               if err != nil {
+                                       return false, err
+                               }
                        }
 
                        // We are going to mount the temporary volume instead.
@@ -679,12 +690,11 @@ func (d *lvm) MountVolumeSnapshot(snapVol Volume, op 
*operations.Operation) (boo
 
                // Finally attempt to mount the volume that needs mounting.
                volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], 
mountVol.volType, mountVol.contentType, mountVol.name)
-               mountFlags, mountOptions := 
resolveMountOptions(d.volumeMountOptions(snapVol))
                err := TryMount(volDevPath, mountPath, 
d.volumeFilesystem(mountVol), mountFlags|unix.MS_RDONLY, mountOptions)
                if err != nil {
                        return false, errors.Wrapf(err, "Failed to mount LVM 
snapshot volume")
                }
-               d.logger.Debug("Mounted logical volume snapshot", 
log.Ctx{"dev": volDevPath, "path": mountPath})
+               d.logger.Debug("Mounted logical volume snapshot", 
log.Ctx{"dev": volDevPath, "path": mountPath, "options": mountOptions})
 
                revert.Success()
                return true, nil

From 3e5da664456da36397e57bb12a145c209eb069ef Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 1 Apr 2020 14:13:22 +0100
Subject: [PATCH 2/2] lxd/storage/drivers/driver/ceph/volumes: Adds mounting
 logging

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/driver_ceph_volumes.go | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/lxd/storage/drivers/driver_ceph_volumes.go 
b/lxd/storage/drivers/driver_ceph_volumes.go
index 2e4e34d416..08f588df9a 100644
--- a/lxd/storage/drivers/driver_ceph_volumes.go
+++ b/lxd/storage/drivers/driver_ceph_volumes.go
@@ -18,6 +18,7 @@ import (
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/instancewriter"
        "github.com/lxc/lxd/shared/ioprogress"
+       log "github.com/lxc/lxd/shared/log15"
        "github.com/lxc/lxd/shared/units"
 )
 
@@ -824,6 +825,7 @@ func (d *ceph) MountVolume(vol Volume, op 
*operations.Operation) (bool, error) {
                if err != nil {
                        return false, err
                }
+               d.logger.Debug("Mounted RBD volume", log.Ctx{"dev": RBDDevPath, 
"path": mountPath, "options": mountOptions})
 
                return true, nil
        }
@@ -1208,6 +1210,7 @@ func (d *ceph) MountVolumeSnapshot(snapVol Volume, op 
*operations.Operation) (bo
                if err != nil {
                        return false, err
                }
+               d.logger.Debug("Mounted RBD volume snapshot", log.Ctx{"dev": 
rbdDevPath, "path": mountPath, "options": mountOptions})
 
                revert.Success()
 
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to