[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