The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6392
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) === - Renames `CreateImage` to `EnsureImage` to indicate that it can (and will) be called multiple times but that it will only actually do something (create an optimized image volume in the storage pool) if needed. - Removes duplicated `HasVolume` check in `CreateInstanceFromImage`. - Adds some more comments.
From 08471dc07a5c30491f0ea86722613e3681ade5a5 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 4 Nov 2019 08:09:37 +0000 Subject: [PATCH 1/5] lxd/images: Updates imageCreateInPool to use EnsureImage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/images.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lxd/images.go b/lxd/images.go index e413d52846..6600d8d623 100644 --- a/lxd/images.go +++ b/lxd/images.go @@ -634,7 +634,7 @@ func imageCreateInPool(d *Daemon, info *api.Image, storagePool string) error { return err } - err = pool.CreateImage(info.Fingerprint, nil) + err = pool.EnsureImage(info.Fingerprint, nil) if err != nil { return err } From 30dd5468fa31f8c06761e62a017f353ab2d08bec Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 4 Nov 2019 08:10:24 +0000 Subject: [PATCH 2/5] lxd/storage/backend/lxd: Updates EnsureImage usage and adds more comments Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/backend_lxd.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lxd/storage/backend_lxd.go b/lxd/storage/backend_lxd.go index cc65a07531..c0cd4bd96c 100644 --- a/lxd/storage/backend_lxd.go +++ b/lxd/storage/backend_lxd.go @@ -186,6 +186,8 @@ func (b *lxdBackend) createInstanceSymlink(inst Instance, mountPath string) erro return nil } +// imageFiller returns a function that can be used as a filler function with CreateVolume(). This +// function will unpack the specified image archive into the specified mount path of the volume. func (b *lxdBackend) imageFiller(fingerprint string, op *operations.Operation) func(mountPath string) error { return func(instanceMountPath string) error { var tracker *ioprogress.ProgressTracker @@ -224,21 +226,25 @@ func (b *lxdBackend) CreateInstanceFromImage(inst Instance, fingerprint string, }() vol := b.newVolume(volType, drivers.ContentTypeFS, project.Prefix(inst.Project(), inst.Name()), nil) + + // If the driver doesn't support optimized image volumes then create a new empty volume and + // populate it with the contents of the image archive. if !b.driver.Info().OptimizedImages { err = b.driver.CreateVolume(vol, b.imageFiller(fingerprint, op), op) if err != nil { return err } } else { - if !b.driver.HasVolume(drivers.VolumeTypeImage, fingerprint) { - err := b.CreateImage(fingerprint, op) - if err != nil { - return err - } + // If the driver does support optimized images then ensure the optimized image + // volume has been created for the archive's fingerprint and then proceed to create + // a new volume by copying the optimized image volume. + err := b.EnsureImage(fingerprint, op) + if err != nil { + return err } imgVol := b.newVolume(drivers.VolumeTypeImage, drivers.ContentTypeFS, fingerprint, nil) - err := b.driver.CreateVolumeFromCopy(vol, imgVol, false, op) + err = b.driver.CreateVolumeFromCopy(vol, imgVol, false, op) if err != nil { return err } @@ -339,8 +345,9 @@ func (b *lxdBackend) UnmountInstanceSnapshot(inst Instance) (bool, error) { return true, ErrNotImplemented } -// CreateImage creates an optimized volume of the image if supported by the storage pool driver. -func (b *lxdBackend) CreateImage(fingerprint string, op *operations.Operation) error { +// EnsureImage creates an optimized volume of the image if supported by the storage pool driver and +// the volume doesn't already exist. +func (b *lxdBackend) EnsureImage(fingerprint string, op *operations.Operation) error { logger := logging.AddContext(b.logger, log.Ctx{"fingerprint": fingerprint}) logger.Debug("CreateImage started") defer logger.Debug("CreateImage finished") @@ -349,12 +356,12 @@ func (b *lxdBackend) CreateImage(fingerprint string, op *operations.Operation) e return nil // Nothing to do for drivers that don't support optimized images volumes. } - // Check if we already have a suitable volume + // Check if we already have a suitable volume. if b.driver.HasVolume(drivers.VolumeTypeImage, fingerprint) { return nil } - // Create the new image volume + // Create the new image volume. vol := b.newVolume(drivers.VolumeTypeImage, drivers.ContentTypeFS, fingerprint, nil) err := b.driver.CreateVolume(vol, b.imageFiller(fingerprint, op), op) if err != nil { From fd4c3e55cc62e1d329851697a0ac7da6f460baf8 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 4 Nov 2019 08:10:44 +0000 Subject: [PATCH 3/5] lxd/storage/backend/mock: Updates with EnsureImage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/backend_mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lxd/storage/backend_mock.go b/lxd/storage/backend_mock.go index 5cbab80ec3..9f20fc1b55 100644 --- a/lxd/storage/backend_mock.go +++ b/lxd/storage/backend_mock.go @@ -142,7 +142,7 @@ func (b *mockBackend) UnmountInstanceSnapshot(i Instance) (bool, error) { return true, nil } -func (b *mockBackend) CreateImage(fingerprint string, op *operations.Operation) error { +func (b *mockBackend) EnsureImage(fingerprint string, op *operations.Operation) error { return nil } From d2fa3779e816a02ce6f327105f2e11553c5a3317 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 4 Nov 2019 08:11:01 +0000 Subject: [PATCH 4/5] lxd/storage/interfaces: Renames CreateImage to EnsureImage - This indicates that the function will return nil if the optimized image volume already exists or is not needed on the storage pool. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/interfaces.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lxd/storage/interfaces.go b/lxd/storage/interfaces.go index d8853c0096..592b28b14f 100644 --- a/lxd/storage/interfaces.go +++ b/lxd/storage/interfaces.go @@ -67,7 +67,7 @@ type Pool interface { UnmountInstanceSnapshot(i Instance) (bool, error) // Images. - CreateImage(fingerprint string, op *operations.Operation) error + EnsureImage(fingerprint string, op *operations.Operation) error DeleteImage(fingerprint string, op *operations.Operation) error // Custom volumes. From 9932a14c6012ebe1689cef2c16a48827abfe1158 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 4 Nov 2019 08:25:28 +0000 Subject: [PATCH 5/5] lxd/storage/load: Adds comments Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/load.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lxd/storage/load.go b/lxd/storage/load.go index 4cb903baff..d2f1e24072 100644 --- a/lxd/storage/load.go +++ b/lxd/storage/load.go @@ -34,6 +34,10 @@ func volIDFuncMake(state *state.State, poolID int64) func(volType drivers.Volume // encoding format, so if there is no underscore in the volume name then we assume // the project is default. project := "default" + + // Currently only Containers and VMs support project level volumes. + // This means that other volume types may have underscores in their names that don't + // indicate the project name. if volType == drivers.VolumeTypeContainer || volType == drivers.VolumeTypeVM { volParts := strings.SplitN(volName, "_", 2) if len(volParts) > 1 {
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel