The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/5601
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) === This is rather ugly as there's no container struct around to pass to the normal delete functions, but this will hopefully do the trick for now. Once we get the new internal storage API, we should be able to change this to returning a lower level storage driver and can then call its delete function rather than ContainerDelete. Closes #5597 Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
From dab536190322adaeb10102fc5fd0e2aec23562bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Mon, 25 Mar 2019 17:08:19 -0400 Subject: [PATCH] lxd/backups: Attempt to delete storage on failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is rather ugly as there's no container struct around to pass to the normal delete functions, but this will hopefully do the trick for now. Once we get the new internal storage API, we should be able to change this to returning a lower level storage driver and can then call its delete function rather than ContainerDelete. Closes #5597 Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/container.go | 20 ++++++++++---------- lxd/containers_post.go | 4 +++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lxd/container.go b/lxd/container.go index 46aa085a95..89c94e95ac 100644 --- a/lxd/container.go +++ b/lxd/container.go @@ -705,7 +705,7 @@ func containerCreateAsEmpty(d *Daemon, args db.ContainerArgs) (container, error) } func containerCreateFromBackup(s *state.State, info backupInfo, data io.ReadSeeker, - customPool bool) error { + customPool bool) (storage, error) { var pool storage var fixBackupFile = false @@ -713,31 +713,31 @@ func containerCreateFromBackup(s *state.State, info backupInfo, data io.ReadSeek pool, storageErr := storagePoolInit(s, info.Pool) if storageErr != nil && errors.Cause(storageErr) != db.ErrNoSuchObject { // Unexpected error - return storageErr + return nil, storageErr } if errors.Cause(storageErr) == db.ErrNoSuchObject { // The pool doesn't exist, and the backup is in binary format so we // cannot alter the backup.yaml. if info.HasBinaryFormat { - return storageErr + return nil, storageErr } // Get the default profile _, profile, err := s.Cluster.ProfileGet(info.Project, "default") if err != nil { - return errors.Wrap(err, "Failed to get default profile") + return nil, errors.Wrap(err, "Failed to get default profile") } _, v, err := shared.GetRootDiskDevice(profile.Devices) if err != nil { - return errors.Wrap(err, "Failed to get root disk device") + return nil, errors.Wrap(err, "Failed to get root disk device") } // Use the default-profile's root pool pool, err = storagePoolInit(s, v["pool"]) if err != nil { - return errors.Wrap(err, "Failed to initialize storage pool") + return nil, errors.Wrap(err, "Failed to initialize storage pool") } fixBackupFile = true @@ -746,25 +746,25 @@ func containerCreateFromBackup(s *state.State, info backupInfo, data io.ReadSeek // Find the compression algorithm tarArgs, _, _, err := shared.DetectCompressionFile(data) if err != nil { - return err + return nil, err } data.Seek(0, 0) // Unpack tarball err = pool.ContainerBackupLoad(info, data, tarArgs) if err != nil { - return err + return nil, err } if fixBackupFile || customPool { // Update the pool err = backupFixStoragePool(s.Cluster, info, !customPool) if err != nil { - return err + return nil, err } } - return nil + return pool, nil } func containerCreateEmptySnapshot(s *state.State, args db.ContainerArgs) (container, error) { diff --git a/lxd/containers_post.go b/lxd/containers_post.go index 34bc7bb0bc..3411aa2ca6 100644 --- a/lxd/containers_post.go +++ b/lxd/containers_post.go @@ -617,7 +617,7 @@ func createFromBackup(d *Daemon, project string, data io.Reader, pool string) Re // Dump tarball to storage f.Seek(0, 0) - err = containerCreateFromBackup(d.State(), *bInfo, f, pool != "") + cPool, err := containerCreateFromBackup(d.State(), *bInfo, f, pool != "") if err != nil { return errors.Wrap(err, "Create container from backup") } @@ -627,6 +627,7 @@ func createFromBackup(d *Daemon, project string, data io.Reader, pool string) Re Force: true, }) if err != nil { + cPool.ContainerDelete(&containerLXC{name: bInfo.Name, project: project}) return errors.Wrap(err, "Marshal internal import request") } @@ -639,6 +640,7 @@ func createFromBackup(d *Daemon, project string, data io.Reader, pool string) Re resp := internalImport(d, req) if resp.String() != "success" { + cPool.ContainerDelete(&containerLXC{name: bInfo.Name, project: project}) return fmt.Errorf("Internal import request: %v", resp.String()) }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel