3 # Test commit job graph modifications while requests are active
5 # Copyright (C) 2019 Red Hat, Inc.
7 # Creator/Owner: Kevin Wolf <kwolf@redhat.com>
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 2 of the License, or
12 # (at your option) any later version.
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 from iotests
import imgfmt
26 iotests
.verify_image_format(supported_fmts
=['qcow2'])
28 def blockdev_create(vm
, options
):
29 result
= vm
.qmp_log('blockdev-create',
30 filters
=[iotests
.filter_qmp_testfiles
],
31 job_id
='job0', options
=options
)
33 if 'return' in result
:
34 assert result
['return'] == {}
38 iotests
.log('Finishing a commit job with background reads')
39 iotests
.log('============================================')
42 with iotests
.FilePath('t.qcow2') as disk_path
, \
43 iotests
.FilePath('t.qcow2.mid') as mid_path
, \
44 iotests
.FilePath('t.qcow2.base') as base_path
, \
47 iotests
.log("=== Create backing chain and start VM ===")
50 size
= 128 * 1024 * 1024
53 iotests
.create_image(base_path
, size
)
54 iotests
.qemu_img_log('create', '-f', iotests
.imgfmt
, mid_path
, size_str
)
55 iotests
.qemu_img_log('create', '-f', iotests
.imgfmt
, disk_path
, size_str
)
57 # Create a backing chain like this:
58 # base <- [throttled: bps-read=4096] <- mid <- overlay
60 vm
.add_object('throttle-group,x-bps-read=4096,id=throttle0')
61 vm
.add_blockdev('file,filename=%s,node-name=base' % (base_path
))
62 vm
.add_blockdev('throttle,throttle-group=throttle0,file=base,node-name=throttled')
63 vm
.add_blockdev('file,filename=%s,node-name=mid-file' % (mid_path
))
64 vm
.add_blockdev('qcow2,file=mid-file,node-name=mid,backing=throttled')
65 vm
.add_drive_raw('if=none,id=overlay,driver=qcow2,file=%s,backing=mid' % (disk_path
))
69 iotests
.log("=== Start background read requests ===")
73 vm
.hmp_qemu_io('overlay', 'aio_read 0 4k')
74 vm
.hmp_qemu_io('overlay', 'aio_read 0 4k')
78 iotests
.log("=== Run a commit job ===")
81 result
= vm
.qmp_log('block-commit', job_id
='job0', auto_finalize
=False,
82 device
='overlay', top_node
='mid')
84 vm
.run_job('job0', auto_finalize
=False, pre_finalize
=start_requests
,
90 iotests
.log('Closing the VM while a job is being cancelled')
91 iotests
.log('=============================================')
94 with iotests
.FilePath('src.qcow2') as src_path
, \
95 iotests
.FilePath('dst.qcow2') as dst_path
, \
98 iotests
.log('=== Create images and start VM ===')
101 size
= 128 * 1024 * 1024
104 iotests
.qemu_img_log('create', '-f', iotests
.imgfmt
, src_path
, size_str
)
105 iotests
.qemu_img_log('create', '-f', iotests
.imgfmt
, dst_path
, size_str
)
107 iotests
.log(iotests
.qemu_io('-f', iotests
.imgfmt
, '-c', 'write 0 1M',
109 filters
=[iotests
.filter_test_dir
, iotests
.filter_qemu_io
])
111 vm
.add_object('throttle-group,x-bps-read=4096,id=throttle0')
113 vm
.add_blockdev('file,node-name=src-file,filename=%s' % (src_path
))
114 vm
.add_blockdev('%s,node-name=src,file=src-file' % (iotests
.imgfmt
))
116 vm
.add_blockdev('file,node-name=dst-file,filename=%s' % (dst_path
))
117 vm
.add_blockdev('%s,node-name=dst,file=dst-file' % (iotests
.imgfmt
))
119 vm
.add_blockdev('throttle,node-name=src-throttled,' +
120 'throttle-group=throttle0,file=src')
122 vm
.add_device('virtio-blk,drive=src-throttled')
126 iotests
.log('=== Start a mirror job ===')
129 vm
.qmp_log('blockdev-mirror', job_id
='job0', device
='src-throttled',
130 target
='dst', sync
='full')
132 vm
.qmp_log('block-job-cancel', device
='job0')
135 vm
.shutdown(has_quit
=True)