[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 05/13] iotests: Test mirror with temporarily disabled target backi
From: |
Kevin Wolf |
Subject: |
[PULL 05/13] iotests: Test mirror with temporarily disabled target backing file |
Date: |
Wed, 11 Mar 2020 16:42:10 +0100 |
The newly tested scenario is a common live storage migration scenario:
The target node is opened without a backing file so that the active
layer is mirrored while its backing chain can be copied in the
background.
The backing chain should be attached to the mirror target node when
finalising the job, just before switching the users of the source node
to the new copy (at which point the mirror job still has a reference to
the node). drive-mirror did this automatically, but with blockdev-mirror
this is the job of the QMP client.
This patch adds test cases for two ways to achieve the desired result,
using either x-blockdev-reopen or blockdev-snapshot.
Signed-off-by: Kevin Wolf <address@hidden>
Message-Id: <address@hidden>
Reviewed-by: Peter Krempa <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
tests/qemu-iotests/155 | 56 ++++++++++++++++++++++++++++++++++----
tests/qemu-iotests/155.out | 4 +--
2 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/tests/qemu-iotests/155 b/tests/qemu-iotests/155
index f237868710..74ddefc849 100755
--- a/tests/qemu-iotests/155
+++ b/tests/qemu-iotests/155
@@ -45,10 +45,15 @@ target_img = os.path.join(iotests.test_dir, 'target.' +
iotests.imgfmt)
# image during runtime, only makes sense if
# target_blockdev_backing is not None
# (None: same as target_backing)
+# target_open_with_backing: If True, the target image is added with its backing
+# chain opened right away. If False, blockdev-add
+# opens it without a backing file and job completion
+# is supposed to open the backing chain.
class BaseClass(iotests.QMPTestCase):
target_blockdev_backing = None
target_real_backing = None
+ target_open_with_backing = True
def setUp(self):
qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
@@ -80,9 +85,13 @@ class BaseClass(iotests.QMPTestCase):
options = { 'node-name': 'target',
'driver': iotests.imgfmt,
'file': { 'driver': 'file',
+ 'node-name': 'target-file',
'filename': target_img } }
- if self.target_blockdev_backing:
- options['backing'] = self.target_blockdev_backing
+
+ if not self.target_open_with_backing:
+ options['backing'] = None
+ elif self.target_blockdev_backing:
+ options['backing'] = self.target_blockdev_backing
result = self.vm.qmp('blockdev-add', **options)
self.assert_qmp(result, 'return', {})
@@ -147,10 +156,14 @@ class BaseClass(iotests.QMPTestCase):
# cmd: Mirroring command to execute, either drive-mirror or blockdev-mirror
class MirrorBaseClass(BaseClass):
+ def openBacking(self):
+ pass
+
def runMirror(self, sync):
if self.cmd == 'blockdev-mirror':
result = self.vm.qmp(self.cmd, job_id='mirror-job',
device='source',
- sync=sync, target='target')
+ sync=sync, target='target',
+ auto_finalize=False)
else:
if self.existing:
mode = 'existing'
@@ -159,11 +172,12 @@ class MirrorBaseClass(BaseClass):
result = self.vm.qmp(self.cmd, job_id='mirror-job',
device='source',
sync=sync, target=target_img,
format=iotests.imgfmt, mode=mode,
- node_name='target')
+ node_name='target', auto_finalize=False)
self.assert_qmp(result, 'return', {})
- self.complete_and_wait('mirror-job')
+ self.vm.run_job('mirror-job', use_log=False, auto_finalize=False,
+ pre_finalize=self.openBacking, auto_dismiss=True)
def testFull(self):
self.runMirror('full')
@@ -221,6 +235,38 @@ class TestBlockdevMirrorForcedBacking(MirrorBaseClass):
target_blockdev_backing = { 'driver': 'null-co' }
target_real_backing = 'null-co://'
+# Attach the backing chain only during completion, with blockdev-reopen
+class TestBlockdevMirrorReopen(MirrorBaseClass):
+ cmd = 'blockdev-mirror'
+ existing = True
+ target_backing = 'null-co://'
+ target_open_with_backing = False
+
+ def openBacking(self):
+ if not self.target_open_with_backing:
+ result = self.vm.qmp('blockdev-add', node_name="backing",
+ driver="null-co")
+ self.assert_qmp(result, 'return', {})
+ result = self.vm.qmp('x-blockdev-reopen', node_name="target",
+ driver=iotests.imgfmt, file="target-file",
+ backing="backing")
+ self.assert_qmp(result, 'return', {})
+
+# Attach the backing chain only during completion, with blockdev-snapshot
+class TestBlockdevMirrorSnapshot(MirrorBaseClass):
+ cmd = 'blockdev-mirror'
+ existing = True
+ target_backing = 'null-co://'
+ target_open_with_backing = False
+
+ def openBacking(self):
+ if not self.target_open_with_backing:
+ result = self.vm.qmp('blockdev-add', node_name="backing",
+ driver="null-co")
+ self.assert_qmp(result, 'return', {})
+ result = self.vm.qmp('blockdev-snapshot', node="backing",
+ overlay="target")
+ self.assert_qmp(result, 'return', {})
class TestCommit(BaseClass):
existing = False
diff --git a/tests/qemu-iotests/155.out b/tests/qemu-iotests/155.out
index 4176bb9402..4fd1c2dcd2 100644
--- a/tests/qemu-iotests/155.out
+++ b/tests/qemu-iotests/155.out
@@ -1,5 +1,5 @@
-...................
+.........................
----------------------------------------------------------------------
-Ran 19 tests
+Ran 25 tests
OK
--
2.20.1
- [PULL 00/13] Block layer patches, Kevin Wolf, 2020/03/11
- [PULL 01/13] qom-qmp-cmds: fix two memleaks in qmp_object_add, Kevin Wolf, 2020/03/11
- [PULL 04/13] iotests: Fix run_job() with use_log=False, Kevin Wolf, 2020/03/11
- [PULL 03/13] block: Relax restrictions for blockdev-snapshot, Kevin Wolf, 2020/03/11
- [PULL 05/13] iotests: Test mirror with temporarily disabled target backing file,
Kevin Wolf <=
- [PULL 06/13] block: Fix cross-AioContext blockdev-snapshot, Kevin Wolf, 2020/03/11
- [PULL 02/13] block: Make bdrv_get_cumulative_perm() public, Kevin Wolf, 2020/03/11
- [PULL 08/13] qapi: Add '@allow-write-only-overlay' feature for 'blockdev-snapshot', Kevin Wolf, 2020/03/11
- [PULL 07/13] iotests: Add iothread cases to 155, Kevin Wolf, 2020/03/11
- [PULL 09/13] tests/qemu-iotests: Fix socket_scm_helper build path, Kevin Wolf, 2020/03/11
- [PULL 12/13] crypto.c: cleanup created file when block_crypto_co_create_opts_luks fails, Kevin Wolf, 2020/03/11
- [PULL 10/13] block: introducing 'bdrv_co_delete_file' interface, Kevin Wolf, 2020/03/11
- [PULL 13/13] qemu-iotests: adding LUKS cleanup for non-UTF8 secret error, Kevin Wolf, 2020/03/11
- [PULL 11/13] block.c: adding bdrv_co_delete_file, Kevin Wolf, 2020/03/11
- Re: [PULL 00/13] Block layer patches, Peter Maydell, 2020/03/12