[lxc-devel] [lxd/master] Make stateful snapshot restores work again
stgraber on Github
lxc-bot at linuxcontainers.org
Tue Aug 8 21:06:25 UTC 2017
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 354 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170808/c7fc6908/attachment.bin>
-------------- next part --------------
From 7dcf1049334336ed5821437ff8047f233845645f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 8 Aug 2017 17:05:37 -0400
Subject: [PATCH] Make stateful snapshot restores work again
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/container.go | 2 +-
lxd/container_lxc.go | 9 +++++++--
lxd/container_put.go | 20 +++-----------------
3 files changed, 11 insertions(+), 20 deletions(-)
diff --git a/lxd/container.go b/lxd/container.go
index ec6c656f3..a601c5270 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -425,7 +425,7 @@ type container interface {
Unfreeze() error
// Snapshots & migration
- Restore(sourceContainer container) error
+ Restore(sourceContainer container, stateful bool) error
/* actionScript here is a script called action.sh in the stateDir, to
* be passed to CRIU as --action-script
*/
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index f0bc405b6..62356543d 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -2655,7 +2655,7 @@ func (c *containerLXC) Snapshots() ([]container, error) {
return containers, nil
}
-func (c *containerLXC) Restore(sourceContainer container) error {
+func (c *containerLXC) Restore(sourceContainer container, stateful bool) error {
var ctxMap log.Ctx
// Initialize storage interface for the container.
@@ -2749,8 +2749,13 @@ func (c *containerLXC) Restore(sourceContainer container) error {
// If the container wasn't running but was stateful, should we restore
// it as running?
- if shared.PathExists(c.StatePath()) {
+ if stateful == true {
+ if !shared.PathExists(c.StatePath()) {
+ return fmt.Errorf("Stateful snapshot restore requested by snapshot is stateless")
+ }
+
logger.Debug("Performing stateful restore", ctxMap)
+ c.stateful = true
err := c.Migrate(lxc.MIGRATE_RESTORE, c.StatePath(), "snapshot", false, false)
if err != nil {
return err
diff --git a/lxd/container_put.go b/lxd/container_put.go
index 29ae21db2..5ad47c6b5 100644
--- a/lxd/container_put.go
+++ b/lxd/container_put.go
@@ -10,10 +10,7 @@ import (
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
- "github.com/lxc/lxd/shared/logger"
"github.com/lxc/lxd/shared/osarch"
-
- log "gopkg.in/inconshreveable/log15.v2"
)
/*
@@ -69,7 +66,7 @@ func containerPut(d *Daemon, r *http.Request) Response {
} else {
// Snapshot Restore
do = func(op *operation) error {
- return containerSnapRestore(d, name, configRaw.Restore)
+ return containerSnapRestore(d, name, configRaw.Restore, configRaw.Stateful)
}
}
@@ -84,25 +81,14 @@ func containerPut(d *Daemon, r *http.Request) Response {
return OperationResponse(op)
}
-func containerSnapRestore(d *Daemon, name string, snap string) error {
+func containerSnapRestore(d *Daemon, name string, snap string, stateful bool) error {
// normalize snapshot name
if !shared.IsSnapshot(snap) {
snap = name + shared.SnapshotDelimiter + snap
}
- logger.Info(
- "RESTORE => Restoring snapshot",
- log.Ctx{
- "snapshot": snap,
- "container": name})
-
c, err := containerLoadByName(d, name)
if err != nil {
- logger.Error(
- "RESTORE => loadcontainerLXD() failed",
- log.Ctx{
- "container": name,
- "err": err})
return err
}
@@ -116,7 +102,7 @@ func containerSnapRestore(d *Daemon, name string, snap string) error {
}
}
- err = c.Restore(source)
+ err = c.Restore(source, stateful)
if err != nil {
return err
}
More information about the lxc-devel
mailing list