iotests/image-fleecing: add test-case for copy-before-write filter

New fleecing method becomes available: copy-before-write filter.

Actually we don't need backup job to setup image fleecing. Add test
for new recommended way of image fleecing.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20210824083856.17408-34-vsementsov@virtuozzo.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2021-08-24 11:38:55 +03:00 committed by Hanna Reitz
parent 32f84b40ab
commit c060598569
2 changed files with 107 additions and 15 deletions

View File

@ -48,7 +48,7 @@ remainder = [('0xd5', '0x108000', '32k'), # Right-end of partial-left [1]
('0xdc', '32M', '32k'), # Left-end of partial-right [2]
('0xcd', '0x3ff0000', '64k')] # patterns[3]
def do_test(base_img_path, fleece_img_path, nbd_sock_path, vm):
def do_test(use_cbw, base_img_path, fleece_img_path, nbd_sock_path, vm):
log('--- Setting up images ---')
log('')
@ -67,6 +67,7 @@ def do_test(base_img_path, fleece_img_path, nbd_sock_path, vm):
src_node = 'source'
tmp_node = 'temp'
qom_path = '/machine/peripheral/sda'
vm.add_blockdev(f'driver={iotests.imgfmt},file.driver=file,'
f'file.filename={base_img_path},node-name={src_node}')
vm.add_device('virtio-scsi')
@ -90,12 +91,22 @@ def do_test(base_img_path, fleece_img_path, nbd_sock_path, vm):
'backing': src_node,
}))
# Establish COW from source to fleecing node
log(vm.qmp('blockdev-backup',
job_id='fleecing',
device=src_node,
target=tmp_node,
sync='none'))
# Establish CBW from source to fleecing node
if use_cbw:
log(vm.qmp('blockdev-add', {
'driver': 'copy-before-write',
'node-name': 'fl-cbw',
'file': src_node,
'target': tmp_node
}))
log(vm.qmp('qom-set', path=qom_path, property='drive', value='fl-cbw'))
else:
log(vm.qmp('blockdev-backup',
job_id='fleecing',
device=src_node,
target=tmp_node,
sync='none'))
log('')
log('--- Setting up NBD Export ---')
@ -124,7 +135,7 @@ def do_test(base_img_path, fleece_img_path, nbd_sock_path, vm):
for p in overwrite:
cmd = 'write -P%s %s %s' % p
log(cmd)
log(vm.hmp_qemu_io('/machine/peripheral/sda', cmd, qdev=True))
log(vm.hmp_qemu_io(qom_path, cmd, qdev=True))
log('')
log('--- Verifying Data ---')
@ -139,10 +150,15 @@ def do_test(base_img_path, fleece_img_path, nbd_sock_path, vm):
log('--- Cleanup ---')
log('')
log(vm.qmp('block-job-cancel', device='fleecing'))
e = vm.event_wait('BLOCK_JOB_CANCELLED')
assert e is not None
log(e, filters=[iotests.filter_qmp_event])
if use_cbw:
log(vm.qmp('qom-set', path=qom_path, property='drive', value=src_node))
log(vm.qmp('blockdev-del', node_name='fl-cbw'))
else:
log(vm.qmp('block-job-cancel', device='fleecing'))
e = vm.event_wait('BLOCK_JOB_CANCELLED')
assert e is not None
log(e, filters=[iotests.filter_qmp_event])
log(vm.qmp('nbd-server-stop'))
log(vm.qmp('blockdev-del', node_name=tmp_node))
vm.shutdown()
@ -160,13 +176,17 @@ def do_test(base_img_path, fleece_img_path, nbd_sock_path, vm):
log('Done')
def test():
def test(use_cbw):
with iotests.FilePath('base.img') as base_img_path, \
iotests.FilePath('fleece.img') as fleece_img_path, \
iotests.FilePath('nbd.sock',
base_dir=iotests.sock_dir) as nbd_sock_path, \
iotests.VM() as vm:
do_test(base_img_path, fleece_img_path, nbd_sock_path, vm)
do_test(use_cbw, base_img_path, fleece_img_path, nbd_sock_path, vm)
test()
log('=== Test backup(sync=none) based fleecing ===\n')
test(False)
log('=== Test filter based fleecing ===\n')
test(True)

View File

@ -1,3 +1,5 @@
=== Test backup(sync=none) based fleecing ===
--- Setting up images ---
Done
@ -65,3 +67,73 @@ read -P0xdc 32M 32k
read -P0xcd 0x3ff0000 64k
Done
=== Test filter based fleecing ===
--- Setting up images ---
Done
--- Launching VM ---
Done
--- Setting up Fleecing Graph ---
{"return": {}}
{"return": {}}
{"return": {}}
--- Setting up NBD Export ---
{"return": {}}
{"return": {}}
--- Sanity Check ---
read -P0x5d 0 64k
read -P0xd5 1M 64k
read -P0xdc 32M 64k
read -P0xcd 0x3ff0000 64k
read -P0 0x00f8000 32k
read -P0 0x2010000 32k
read -P0 0x3fe0000 64k
--- Testing COW ---
write -P0xab 0 64k
{"return": ""}
write -P0xad 0x00f8000 64k
{"return": ""}
write -P0x1d 0x2008000 64k
{"return": ""}
write -P0xea 0x3fe0000 64k
{"return": ""}
--- Verifying Data ---
read -P0x5d 0 64k
read -P0xd5 1M 64k
read -P0xdc 32M 64k
read -P0xcd 0x3ff0000 64k
read -P0 0x00f8000 32k
read -P0 0x2010000 32k
read -P0 0x3fe0000 64k
--- Cleanup ---
{"return": {}}
{"return": {}}
{"return": {}}
{"return": {}}
--- Confirming writes ---
read -P0xab 0 64k
read -P0xad 0x00f8000 64k
read -P0x1d 0x2008000 64k
read -P0xea 0x3fe0000 64k
read -P0xd5 0x108000 32k
read -P0xdc 32M 32k
read -P0xcd 0x3ff0000 64k
Done