[lxc-devel] [lxd/master] lxd/storage/backend/lxd: Adds same pool optimisation to CreateCustomVolumeFromCopy
tomponline on Github
lxc-bot at linuxcontainers.org
Tue Nov 19 17:07:47 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 519 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20191119/926dd95d/attachment.bin>
-------------- next part --------------
From 9de95a95fe97257b74209e0728de4eae44926ff0 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 19 Nov 2019 17:06:18 +0000
Subject: [PATCH] lxd/storage/backend/lxd: Adds same pool optimisation to
CreateCustomVolumeFromCopy
If source volume and target volume are on the same storage pool then don't use migration system, and instead use driver's CreateVolumeFromCopy() directly.
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/storage/backend_lxd.go | 54 ++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/lxd/storage/backend_lxd.go b/lxd/storage/backend_lxd.go
index 3a82bf6ea2..2c58d69dea 100644
--- a/lxd/storage/backend_lxd.go
+++ b/lxd/storage/backend_lxd.go
@@ -1006,6 +1006,60 @@ func (b *lxdBackend) CreateCustomVolumeFromCopy(volName, desc string, config map
}
}
+ // If the source and target are in the same pool then use CreateVolumeFromCopy rather than
+ // migration system as it will be quicker.
+ if srcPool == b {
+ // Create slice to record DB volumes created if revert needed later.
+ revertDBVolumes := []string{}
+ defer func() {
+ // Remove any DB volume rows created if we are reverting.
+ for _, volName := range revertDBVolumes {
+ b.state.Cluster.StoragePoolVolumeDelete("default", volName, db.StoragePoolVolumeTypeCustom, b.ID())
+ }
+ }()
+
+ vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, volName, config)
+ srcVol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, srcVolName, srcVolRow.Config)
+
+ // Check the supplied config and remove any fields not relevant for pool type.
+ err := b.driver.ValidateVolume(vol, true)
+ if err != nil {
+ return err
+ }
+
+ // Create database entry for new storage volume.
+ err = VolumeDBCreate(b.state, b.name, volName, desc, db.StoragePoolVolumeTypeNameCustom, false, config)
+ if err != nil {
+ return err
+ }
+
+ revertDBVolumes = append(revertDBVolumes, volName)
+
+ if len(snapshotNames) > 0 {
+ for _, snapName := range snapshotNames {
+ newSnapshotName := drivers.GetSnapshotVolumeName(volName, snapName)
+
+ // Create database entry for new storage volume snapshot.
+ err = VolumeDBCreate(b.state, b.name, newSnapshotName, desc, db.StoragePoolVolumeTypeNameCustom, true, config)
+ if err != nil {
+ return err
+ }
+
+ revertDBVolumes = append(revertDBVolumes, newSnapshotName)
+ }
+ }
+
+ err = b.driver.CreateVolumeFromCopy(vol, srcVol, !srcVolOnly, op)
+ if err != nil {
+ return err
+ }
+
+ revertDBVolumes = nil
+ return nil
+ }
+
+ // We are copying volumes between storage pools so use migration system as it will be able
+ // to negotiate a common transfer method between pool types.
// Create in-memory pipe pair to simulate a connection between the sender and receiver.
aEnd, bEnd := memorypipe.NewPipePair()
More information about the lxc-devel
mailing list