The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2704
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 70e9034cc9159a7f486caed81b0f6bfd9e55d3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 8 Dec 2016 10:26:44 +0100 Subject: [PATCH 1/3] Make it easier to grep for the backup functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/api_internal.go | 6 +++--- lxd/container.go | 4 ++-- lxd/container_lxc.go | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lxd/api_internal.go b/lxd/api_internal.go index 11ca5aa..6723535 100644 --- a/lxd/api_internal.go +++ b/lxd/api_internal.go @@ -100,13 +100,13 @@ var internalReadyCmd = Command{name: "ready", put: internalReady, get: internalW var internalContainerOnStartCmd = Command{name: "containers/{id}/onstart", get: internalContainerOnStart} var internalContainerOnStopCmd = Command{name: "containers/{id}/onstop", get: internalContainerOnStop} -func slurpSlurpFile(path string) (*slurpFile, error) { +func slurpBackupFile(path string) (*backupFile, error) { data, err := ioutil.ReadFile(path) if err != nil { return nil, err } - sf := slurpFile{} + sf := backupFile{} if err := yaml.Unmarshal(data, &sf); err != nil { return nil, err @@ -129,7 +129,7 @@ func internalImport(d *Daemon, r *http.Request) Response { defer d.Storage.ContainerStop(name, path) - sf, err := slurpSlurpFile(shared.VarPath("containers", name, "backup.yaml")) + sf, err := slurpBackupFile(shared.VarPath("containers", name, "backup.yaml")) if err != nil { return SmartError(err) } diff --git a/lxd/container.go b/lxd/container.go index 373b1bd..fdd3223 100644 --- a/lxd/container.go +++ b/lxd/container.go @@ -566,7 +566,7 @@ func containerCreateAsSnapshot(d *Daemon, args containerArgs, sourceContainer co return nil, err } - err = writeSlurpFile(sourceContainer) + err = writeBackupFile(sourceContainer) if err != nil { c.Delete() return nil, err @@ -694,7 +694,7 @@ func containerConfigureInternal(c container) error { break } - err := writeSlurpFile(c) + err := writeBackupFile(c) if err != nil { return err } diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index e13e43d..cac6b4b 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -2511,10 +2511,10 @@ func (c *containerLXC) Restore(sourceContainer container) error { return err } - // The old slurp file may be out of date (e.g. it doesn't have all the + // The old backup file may be out of date (e.g. it doesn't have all the // current snapshots of the container listed); let's write a new one to // be safe. - err = writeSlurpFile(c) + err = writeBackupFile(c) if err != nil { return err } @@ -2746,13 +2746,13 @@ func (c *containerLXC) ConfigKeySet(key string, value string) error { return c.Update(args, false) } -type slurpFile struct { +type backupFile struct { Container *shared.ContainerInfo `yaml:"container"` Snapshots []*shared.SnapshotInfo `yaml:"snapshots"` } -func writeSlurpFile(c container) error { - /* we only write slurp files out for actual containers */ +func writeBackupFile(c container) error { + /* we only write backup files out for actual containers */ if c.IsSnapshot() { return nil } @@ -2778,7 +2778,7 @@ func writeSlurpFile(c container) error { sis = append(sis, si.(*shared.SnapshotInfo)) } - data, err := yaml.Marshal(&slurpFile{ + data, err := yaml.Marshal(&backupFile{ Container: ci.(*shared.ContainerInfo), Snapshots: sis, }) @@ -3555,9 +3555,9 @@ func (c *containerLXC) Update(args containerArgs, userRequested bool) error { /* we can call Update in some cases when the directory doesn't exist * yet before container creation; this is okay, because at the end of - * container creation we write the slurp file, so let's not worry about + * container creation we write the backup file, so let's not worry about * ENOENT. */ - if err := writeSlurpFile(c); err != nil && !os.IsNotExist(err) { + if err := writeBackupFile(c); err != nil && !os.IsNotExist(err) { return err } From b5864b712071f884350e2651b6ca757d2b2e6b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 8 Dec 2016 10:50:42 +0100 Subject: [PATCH 2/3] Don't write backup.yaml if container isn't mounted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #2691 Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/container_lxc.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index cac6b4b..40f8c3f 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -1789,6 +1789,23 @@ func (c *containerLXC) startCommon() (string, error) { return "", err } + // Update the backup.yaml file (as storage is guaranteed to be mountable now) + err = c.StorageStart() + if err != nil { + return "", err + } + + err = writeBackupFile(c) + if err != nil { + c.StorageStop() + return "", err + } + + err = c.StorageStop() + if err != nil { + return "", err + } + // Update time container was last started err = dbContainerLastUsedUpdate(c.daemon.db, c.id, time.Now().UTC()) if err != nil { @@ -2757,6 +2774,17 @@ func writeBackupFile(c container) error { return nil } + /* immediately return if the container directory doesn't exist yet */ + if !shared.PathExists(c.Path()) { + return os.ErrNotExist + } + + /* deal with the container occasionaly not being monuted */ + if !shared.PathExists(c.RootfsPath()) { + shared.LogWarn("Unable to update backup.yaml at this time.", log.Ctx{"name": c.Name()}) + return nil + } + ci, _, err := c.Render() if err != nil { return err From 55ece48b6a5f0419a352669b4ca09ea5c9ad68e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 8 Dec 2016 11:31:07 +0100 Subject: [PATCH 3/3] Don't record last_state.power twice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Saves us from a full Update() run for every container at every daemon startup. Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/containers.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lxd/containers.go b/lxd/containers.go index a002c8e..46b74b1 100644 --- a/lxd/containers.go +++ b/lxd/containers.go @@ -128,19 +128,6 @@ func containersRestart(d *Daemon) error { } } - // Reset the recorded state (to ensure it's up to date) - _, err = dbExec(d.db, "DELETE FROM containers_config WHERE key='volatile.last_state.power'") - if err != nil { - return err - } - - for _, c := range containers { - err = c.ConfigKeySet("volatile.last_state.power", c.State()) - if err != nil { - return err - } - } - return nil }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel