iotests: add iotest 256 for testing blockdev-backup across iothread contexts
Signed-off-by: John Snow <jsnow@redhat.com> Message-id: 20190523170643.20794-6-jsnow@redhat.com Reviewed-by: Max Reitz <mreitz@redhat.com> [mreitz: Moved from 250 to 256] Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
d6a79af0e6
commit
ba7704f222
122
tests/qemu-iotests/256
Executable file
122
tests/qemu-iotests/256
Executable file
@ -0,0 +1,122 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Test incremental/backup across iothread contexts
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019 John Snow for Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# owner=jsnow@redhat.com
|
||||||
|
|
||||||
|
import os
|
||||||
|
import iotests
|
||||||
|
from iotests import log
|
||||||
|
|
||||||
|
iotests.verify_image_format(supported_fmts=['qcow2'])
|
||||||
|
size = 64 * 1024 * 1024
|
||||||
|
|
||||||
|
with iotests.FilePath('img0') as img0_path, \
|
||||||
|
iotests.FilePath('img1') as img1_path, \
|
||||||
|
iotests.FilePath('img0-full') as img0_full_path, \
|
||||||
|
iotests.FilePath('img1-full') as img1_full_path, \
|
||||||
|
iotests.FilePath('img0-incr') as img0_incr_path, \
|
||||||
|
iotests.FilePath('img1-incr') as img1_incr_path, \
|
||||||
|
iotests.VM() as vm:
|
||||||
|
|
||||||
|
def create_target(filepath, name, size):
|
||||||
|
basename = os.path.basename(filepath)
|
||||||
|
nodename = "file_{}".format(basename)
|
||||||
|
log(vm.command('blockdev-create', job_id='job1',
|
||||||
|
options={
|
||||||
|
'driver': 'file',
|
||||||
|
'filename': filepath,
|
||||||
|
'size': 0,
|
||||||
|
}))
|
||||||
|
vm.run_job('job1')
|
||||||
|
log(vm.command('blockdev-add', driver='file',
|
||||||
|
node_name=nodename, filename=filepath))
|
||||||
|
log(vm.command('blockdev-create', job_id='job2',
|
||||||
|
options={
|
||||||
|
'driver': iotests.imgfmt,
|
||||||
|
'file': nodename,
|
||||||
|
'size': size,
|
||||||
|
}))
|
||||||
|
vm.run_job('job2')
|
||||||
|
log(vm.command('blockdev-add', driver=iotests.imgfmt,
|
||||||
|
node_name=name,
|
||||||
|
file=nodename))
|
||||||
|
|
||||||
|
log('--- Preparing images & VM ---\n')
|
||||||
|
vm.add_object('iothread,id=iothread0')
|
||||||
|
vm.add_object('iothread,id=iothread1')
|
||||||
|
vm.add_device('virtio-scsi-pci,id=scsi0,iothread=iothread0')
|
||||||
|
vm.add_device('virtio-scsi-pci,id=scsi1,iothread=iothread1')
|
||||||
|
iotests.qemu_img_create('-f', iotests.imgfmt, img0_path, str(size))
|
||||||
|
iotests.qemu_img_create('-f', iotests.imgfmt, img1_path, str(size))
|
||||||
|
vm.add_drive(img0_path, interface='none')
|
||||||
|
vm.add_device('scsi-hd,id=device0,drive=drive0,bus=scsi0.0')
|
||||||
|
vm.add_drive(img1_path, interface='none')
|
||||||
|
vm.add_device('scsi-hd,id=device1,drive=drive1,bus=scsi1.0')
|
||||||
|
|
||||||
|
log('--- Starting VM ---\n')
|
||||||
|
vm.launch()
|
||||||
|
|
||||||
|
log('--- Create Targets & Full Backups ---\n')
|
||||||
|
create_target(img0_full_path, 'img0-full', size)
|
||||||
|
create_target(img1_full_path, 'img1-full', size)
|
||||||
|
ret = vm.qmp_log('transaction', indent=2, actions=[
|
||||||
|
{ 'type': 'block-dirty-bitmap-add',
|
||||||
|
'data': { 'node': 'drive0', 'name': 'bitmap0' }},
|
||||||
|
{ 'type': 'block-dirty-bitmap-add',
|
||||||
|
'data': { 'node': 'drive1', 'name': 'bitmap1' }},
|
||||||
|
{ 'type': 'blockdev-backup',
|
||||||
|
'data': { 'device': 'drive0',
|
||||||
|
'target': 'img0-full',
|
||||||
|
'sync': 'full',
|
||||||
|
'job-id': 'j0' }},
|
||||||
|
{ 'type': 'blockdev-backup',
|
||||||
|
'data': { 'device': 'drive1',
|
||||||
|
'target': 'img1-full',
|
||||||
|
'sync': 'full',
|
||||||
|
'job-id': 'j1' }}
|
||||||
|
])
|
||||||
|
if "error" in ret:
|
||||||
|
raise Exception(ret['error']['desc'])
|
||||||
|
vm.run_job('j0', auto_dismiss=True)
|
||||||
|
vm.run_job('j1', auto_dismiss=True)
|
||||||
|
|
||||||
|
log('\n--- Create Targets & Incremental Backups ---\n')
|
||||||
|
create_target(img0_incr_path, 'img0-incr', size)
|
||||||
|
create_target(img1_incr_path, 'img1-incr', size)
|
||||||
|
ret = vm.qmp_log('transaction', indent=2, actions=[
|
||||||
|
{ 'type': 'blockdev-backup',
|
||||||
|
'data': { 'device': 'drive0',
|
||||||
|
'target': 'img0-incr',
|
||||||
|
'sync': 'incremental',
|
||||||
|
'bitmap': 'bitmap0',
|
||||||
|
'job-id': 'j2' }},
|
||||||
|
{ 'type': 'blockdev-backup',
|
||||||
|
'data': { 'device': 'drive1',
|
||||||
|
'target': 'img1-incr',
|
||||||
|
'sync': 'incremental',
|
||||||
|
'bitmap': 'bitmap1',
|
||||||
|
'job-id': 'j3' }}
|
||||||
|
])
|
||||||
|
if "error" in ret:
|
||||||
|
raise Exception(ret['error']['desc'])
|
||||||
|
vm.run_job('j2', auto_dismiss=True)
|
||||||
|
vm.run_job('j3', auto_dismiss=True)
|
||||||
|
|
||||||
|
log('\n--- Done ---')
|
||||||
|
vm.shutdown()
|
119
tests/qemu-iotests/256.out
Normal file
119
tests/qemu-iotests/256.out
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
--- Preparing images & VM ---
|
||||||
|
|
||||||
|
--- Starting VM ---
|
||||||
|
|
||||||
|
--- Create Targets & Full Backups ---
|
||||||
|
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job1"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job2"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job1"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job2"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{
|
||||||
|
"execute": "transaction",
|
||||||
|
"arguments": {
|
||||||
|
"actions": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"name": "bitmap0",
|
||||||
|
"node": "drive0"
|
||||||
|
},
|
||||||
|
"type": "block-dirty-bitmap-add"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"name": "bitmap1",
|
||||||
|
"node": "drive1"
|
||||||
|
},
|
||||||
|
"type": "block-dirty-bitmap-add"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"device": "drive0",
|
||||||
|
"job-id": "j0",
|
||||||
|
"sync": "full",
|
||||||
|
"target": "img0-full"
|
||||||
|
},
|
||||||
|
"type": "blockdev-backup"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"device": "drive1",
|
||||||
|
"job-id": "j1",
|
||||||
|
"sync": "full",
|
||||||
|
"target": "img1-full"
|
||||||
|
},
|
||||||
|
"type": "blockdev-backup"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"return": {}
|
||||||
|
}
|
||||||
|
{"data": {"device": "j0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||||
|
{"data": {"device": "j1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||||
|
|
||||||
|
--- Create Targets & Incremental Backups ---
|
||||||
|
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job1"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job2"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job1"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
{"execute": "job-dismiss", "arguments": {"id": "job2"}}
|
||||||
|
{"return": {}}
|
||||||
|
{}
|
||||||
|
{
|
||||||
|
"execute": "transaction",
|
||||||
|
"arguments": {
|
||||||
|
"actions": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"bitmap": "bitmap0",
|
||||||
|
"device": "drive0",
|
||||||
|
"job-id": "j2",
|
||||||
|
"sync": "incremental",
|
||||||
|
"target": "img0-incr"
|
||||||
|
},
|
||||||
|
"type": "blockdev-backup"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"bitmap": "bitmap1",
|
||||||
|
"device": "drive1",
|
||||||
|
"job-id": "j3",
|
||||||
|
"sync": "incremental",
|
||||||
|
"target": "img1-incr"
|
||||||
|
},
|
||||||
|
"type": "blockdev-backup"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"return": {}
|
||||||
|
}
|
||||||
|
{"data": {"device": "j2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||||
|
{"data": {"device": "j3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
|
||||||
|
|
||||||
|
--- Done ---
|
@ -267,3 +267,4 @@
|
|||||||
253 rw auto quick
|
253 rw auto quick
|
||||||
254 rw auto backing quick
|
254 rw auto backing quick
|
||||||
255 rw auto quick
|
255 rw auto quick
|
||||||
|
256 rw auto quick
|
||||||
|
Loading…
Reference in New Issue
Block a user