[lxc-devel] [lxd/master] Ensure consistent container copies on dir/ceph

stgraber on Github lxc-bot at linuxcontainers.org
Mon Oct 26 23:08:19 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20201026/c0667c76/attachment.bin>
-------------- next part --------------
From d5fe43aa567c9684bedffc051478f17ee8b11d5d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 26 Oct 2020 19:07:40 -0400
Subject: [PATCH 1/2] lxd/storage: Rename RunningSnapshotFreeze to
 RunningCopyFreeze
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/storage/backend_lxd.go           |  3 ++-
 lxd/storage/drivers/driver_btrfs.go  |  2 +-
 lxd/storage/drivers/driver_ceph.go   | 22 +++++++++++-----------
 lxd/storage/drivers/driver_cephfs.go | 22 +++++++++++-----------
 lxd/storage/drivers/driver_dir.go    | 22 +++++++++++-----------
 lxd/storage/drivers/driver_lvm.go    | 22 +++++++++++-----------
 lxd/storage/drivers/driver_types.go  |  2 +-
 lxd/storage/drivers/driver_zfs.go    | 24 ++++++++++++------------
 lxd/storage/drivers/drivers_mock.go  | 22 +++++++++++-----------
 9 files changed, 71 insertions(+), 70 deletions(-)

diff --git a/lxd/storage/backend_lxd.go b/lxd/storage/backend_lxd.go
index e14f911692..4a6aa5619f 100644
--- a/lxd/storage/backend_lxd.go
+++ b/lxd/storage/backend_lxd.go
@@ -1709,11 +1709,12 @@ func (b *lxdBackend) CreateInstanceSnapshot(inst instance.Instance, src instance
 	}
 
 	// Some driver backing stores require that running instances be frozen during snapshot.
-	if b.driver.Info().RunningSnapshotFreeze && src.IsRunning() {
+	if b.driver.Info().RunningCopyFreeze && src.IsRunning() {
 		err = src.Freeze()
 		if err != nil {
 			return err
 		}
+
 		defer src.Unfreeze()
 	}
 
diff --git a/lxd/storage/drivers/driver_btrfs.go b/lxd/storage/drivers/driver_btrfs.go
index c98b8409de..bbf1dd6280 100644
--- a/lxd/storage/drivers/driver_btrfs.go
+++ b/lxd/storage/drivers/driver_btrfs.go
@@ -81,7 +81,7 @@ func (d *btrfs) Info() Info {
 		VolumeTypes:           []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
 		BlockBacking:          false,
 		RunningQuotaResize:    true,
-		RunningSnapshotFreeze: false,
+		RunningCopyFreeze:     false,
 		DirectIO:              true,
 		MountedRoot:           true,
 	}
diff --git a/lxd/storage/drivers/driver_ceph.go b/lxd/storage/drivers/driver_ceph.go
index 2500bb94ac..111d44239c 100644
--- a/lxd/storage/drivers/driver_ceph.go
+++ b/lxd/storage/drivers/driver_ceph.go
@@ -72,17 +72,17 @@ func (d *ceph) isRemote() bool {
 // Info returns info about the driver and its environment.
 func (d *ceph) Info() Info {
 	return Info{
-		Name:                  "ceph",
-		Version:               cephVersion,
-		OptimizedImages:       true,
-		PreservesInodes:       false,
-		Remote:                d.isRemote(),
-		VolumeTypes:           []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
-		BlockBacking:          true,
-		RunningQuotaResize:    false,
-		RunningSnapshotFreeze: true,
-		DirectIO:              true,
-		MountedRoot:           false,
+		Name:               "ceph",
+		Version:            cephVersion,
+		OptimizedImages:    true,
+		PreservesInodes:    false,
+		Remote:             d.isRemote(),
+		VolumeTypes:        []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
+		BlockBacking:       true,
+		RunningQuotaResize: false,
+		RunningCopyFreeze:  true,
+		DirectIO:           true,
+		MountedRoot:        false,
 	}
 }
 
diff --git a/lxd/storage/drivers/driver_cephfs.go b/lxd/storage/drivers/driver_cephfs.go
index 015da2c949..b1c39ea348 100644
--- a/lxd/storage/drivers/driver_cephfs.go
+++ b/lxd/storage/drivers/driver_cephfs.go
@@ -71,17 +71,17 @@ func (d *cephfs) isRemote() bool {
 // Info returns the pool driver information.
 func (d *cephfs) Info() Info {
 	return Info{
-		Name:                  "cephfs",
-		Version:               cephfsVersion,
-		OptimizedImages:       false,
-		PreservesInodes:       false,
-		Remote:                d.isRemote(),
-		VolumeTypes:           []VolumeType{VolumeTypeCustom},
-		BlockBacking:          false,
-		RunningQuotaResize:    true,
-		RunningSnapshotFreeze: false,
-		DirectIO:              true,
-		MountedRoot:           true,
+		Name:               "cephfs",
+		Version:            cephfsVersion,
+		OptimizedImages:    false,
+		PreservesInodes:    false,
+		Remote:             d.isRemote(),
+		VolumeTypes:        []VolumeType{VolumeTypeCustom},
+		BlockBacking:       false,
+		RunningQuotaResize: true,
+		RunningCopyFreeze:  false,
+		DirectIO:           true,
+		MountedRoot:        true,
 	}
 }
 
diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go
index 906024f17b..df9023823e 100644
--- a/lxd/storage/drivers/driver_dir.go
+++ b/lxd/storage/drivers/driver_dir.go
@@ -34,17 +34,17 @@ func (d *dir) load() error {
 // Info returns info about the driver and its environment.
 func (d *dir) Info() Info {
 	return Info{
-		Name:                  "dir",
-		Version:               "1",
-		OptimizedImages:       false,
-		PreservesInodes:       false,
-		Remote:                d.isRemote(),
-		VolumeTypes:           []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
-		BlockBacking:          false,
-		RunningQuotaResize:    true,
-		RunningSnapshotFreeze: true,
-		DirectIO:              true,
-		MountedRoot:           true,
+		Name:               "dir",
+		Version:            "1",
+		OptimizedImages:    false,
+		PreservesInodes:    false,
+		Remote:             d.isRemote(),
+		VolumeTypes:        []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
+		BlockBacking:       false,
+		RunningQuotaResize: true,
+		RunningCopyFreeze:  true,
+		DirectIO:           true,
+		MountedRoot:        true,
 	}
 }
 
diff --git a/lxd/storage/drivers/driver_lvm.go b/lxd/storage/drivers/driver_lvm.go
index cda510284f..75fe9f0476 100644
--- a/lxd/storage/drivers/driver_lvm.go
+++ b/lxd/storage/drivers/driver_lvm.go
@@ -87,17 +87,17 @@ func (d *lvm) load() error {
 // Info returns info about the driver and its environment.
 func (d *lvm) Info() Info {
 	return Info{
-		Name:                  "lvm",
-		Version:               lvmVersion,
-		OptimizedImages:       d.usesThinpool(), // Only thinpool pools support optimized images.
-		PreservesInodes:       false,
-		Remote:                d.isRemote(),
-		VolumeTypes:           []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
-		BlockBacking:          true,
-		RunningQuotaResize:    false,
-		RunningSnapshotFreeze: false,
-		DirectIO:              true,
-		MountedRoot:           false,
+		Name:               "lvm",
+		Version:            lvmVersion,
+		OptimizedImages:    d.usesThinpool(), // Only thinpool pools support optimized images.
+		PreservesInodes:    false,
+		Remote:             d.isRemote(),
+		VolumeTypes:        []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
+		BlockBacking:       true,
+		RunningQuotaResize: false,
+		RunningCopyFreeze:  false,
+		DirectIO:           true,
+		MountedRoot:        false,
 	}
 }
 
diff --git a/lxd/storage/drivers/driver_types.go b/lxd/storage/drivers/driver_types.go
index bba7d4e01d..dbfd222a92 100644
--- a/lxd/storage/drivers/driver_types.go
+++ b/lxd/storage/drivers/driver_types.go
@@ -12,7 +12,7 @@ type Info struct {
 	PreservesInodes       bool         // Whether driver preserves inodes when volumes are moved hosts.
 	BlockBacking          bool         // Whether driver uses block devices as backing store.
 	RunningQuotaResize    bool         // Whether quota resize is supported whilst instance running.
-	RunningSnapshotFreeze bool         // Whether instance should be frozen during snapshot if running.
+	RunningCopyFreeze     bool         // Whether instance should be frozen during snapshot if running.
 	DirectIO              bool         // Whether the driver supports direct I/O.
 	MountedRoot           bool         // Whether the pool directory itself is a mount.
 }
diff --git a/lxd/storage/drivers/driver_zfs.go b/lxd/storage/drivers/driver_zfs.go
index 5e290af54f..956f8297fb 100644
--- a/lxd/storage/drivers/driver_zfs.go
+++ b/lxd/storage/drivers/driver_zfs.go
@@ -103,18 +103,18 @@ func (d *zfs) load() error {
 // Info returns info about the driver and its environment.
 func (d *zfs) Info() Info {
 	info := Info{
-		Name:                  "zfs",
-		Version:               zfsVersion,
-		OptimizedImages:       true,
-		OptimizedBackups:      true,
-		PreservesInodes:       true,
-		Remote:                d.isRemote(),
-		VolumeTypes:           []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
-		BlockBacking:          false,
-		RunningQuotaResize:    true,
-		RunningSnapshotFreeze: false,
-		DirectIO:              zfsDirectIO,
-		MountedRoot:           false,
+		Name:               "zfs",
+		Version:            zfsVersion,
+		OptimizedImages:    true,
+		OptimizedBackups:   true,
+		PreservesInodes:    true,
+		Remote:             d.isRemote(),
+		VolumeTypes:        []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
+		BlockBacking:       false,
+		RunningQuotaResize: true,
+		RunningCopyFreeze:  false,
+		DirectIO:           zfsDirectIO,
+		MountedRoot:        false,
 	}
 
 	return info
diff --git a/lxd/storage/drivers/drivers_mock.go b/lxd/storage/drivers/drivers_mock.go
index bc876b075d..b3967e5970 100644
--- a/lxd/storage/drivers/drivers_mock.go
+++ b/lxd/storage/drivers/drivers_mock.go
@@ -22,17 +22,17 @@ func (d *mock) load() error {
 // Info returns info about the driver and its environment.
 func (d *mock) Info() Info {
 	return Info{
-		Name:                  "mock",
-		Version:               "1",
-		OptimizedImages:       false,
-		PreservesInodes:       false,
-		Remote:                d.isRemote(),
-		VolumeTypes:           []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
-		BlockBacking:          false,
-		RunningQuotaResize:    true,
-		RunningSnapshotFreeze: true,
-		DirectIO:              true,
-		MountedRoot:           true,
+		Name:               "mock",
+		Version:            "1",
+		OptimizedImages:    false,
+		PreservesInodes:    false,
+		Remote:             d.isRemote(),
+		VolumeTypes:        []VolumeType{VolumeTypeCustom, VolumeTypeImage, VolumeTypeContainer, VolumeTypeVM},
+		BlockBacking:       false,
+		RunningQuotaResize: true,
+		RunningCopyFreeze:  true,
+		DirectIO:           true,
+		MountedRoot:        true,
 	}
 }
 

From 1cb7475c22a02f5317641c746c87430b0d561551 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 26 Oct 2020 19:07:52 -0400
Subject: [PATCH 2/2] lxd/storage: Ensure source is frozen during copy
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/storage/backend_lxd.go | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/lxd/storage/backend_lxd.go b/lxd/storage/backend_lxd.go
index 4a6aa5619f..b2c1272991 100644
--- a/lxd/storage/backend_lxd.go
+++ b/lxd/storage/backend_lxd.go
@@ -673,6 +673,16 @@ func (b *lxdBackend) CreateInstanceFromCopy(inst instance.Instance, src instance
 		return err
 	}
 
+	// Some driver backing stores require that running instances be frozen during copy.
+	if !src.IsSnapshot() && b.driver.Info().RunningCopyFreeze && src.IsRunning() {
+		err = src.Freeze()
+		if err != nil {
+			return err
+		}
+
+		defer src.Unfreeze()
+	}
+
 	if b.Name() == srcPool.Name() {
 		logger.Debug("CreateInstanceFromCopy same-pool mode detected")
 		err = b.driver.CreateVolumeFromCopy(vol, srcVol, snapshots, op)


More information about the lxc-devel mailing list