1*12d7b3bbSFiona Ebner#!/usr/bin/env python3 2*12d7b3bbSFiona Ebner# group: rw quick 3*12d7b3bbSFiona Ebner# 4*12d7b3bbSFiona Ebner# Test what happens when a stream job does an unaligned prefetch read 5*12d7b3bbSFiona Ebner# which requires padding while having a NULL qiov. 6*12d7b3bbSFiona Ebner# 7*12d7b3bbSFiona Ebner# Copyright (C) Proxmox Server Solutions GmbH 8*12d7b3bbSFiona Ebner# 9*12d7b3bbSFiona Ebner# This program is free software; you can redistribute it and/or modify 10*12d7b3bbSFiona Ebner# it under the terms of the GNU General Public License as published by 11*12d7b3bbSFiona Ebner# the Free Software Foundation; either version 2 of the License, or 12*12d7b3bbSFiona Ebner# (at your option) any later version. 13*12d7b3bbSFiona Ebner# 14*12d7b3bbSFiona Ebner# This program is distributed in the hope that it will be useful, 15*12d7b3bbSFiona Ebner# but WITHOUT ANY WARRANTY; without even the implied warranty of 16*12d7b3bbSFiona Ebner# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*12d7b3bbSFiona Ebner# GNU General Public License for more details. 18*12d7b3bbSFiona Ebner# 19*12d7b3bbSFiona Ebner# You should have received a copy of the GNU General Public License 20*12d7b3bbSFiona Ebner# along with this program. If not, see <http://www.gnu.org/licenses/>. 21*12d7b3bbSFiona Ebner# 22*12d7b3bbSFiona Ebner 23*12d7b3bbSFiona Ebnerimport os 24*12d7b3bbSFiona Ebnerimport iotests 25*12d7b3bbSFiona Ebnerfrom iotests import imgfmt, qemu_img_create, qemu_io, QMPTestCase 26*12d7b3bbSFiona Ebner 27*12d7b3bbSFiona Ebnerimage_size = 1 * 1024 * 1024 28*12d7b3bbSFiona Ebnercluster_size = 64 * 1024 29*12d7b3bbSFiona Ebnerbase = os.path.join(iotests.test_dir, 'base.img') 30*12d7b3bbSFiona Ebnertop = os.path.join(iotests.test_dir, 'top.img') 31*12d7b3bbSFiona Ebner 32*12d7b3bbSFiona Ebnerclass TestStreamUnalignedPrefetch(QMPTestCase): 33*12d7b3bbSFiona Ebner def setUp(self) -> None: 34*12d7b3bbSFiona Ebner """ 35*12d7b3bbSFiona Ebner Create two images: 36*12d7b3bbSFiona Ebner - base image {base} with {cluster_size // 2} bytes allocated 37*12d7b3bbSFiona Ebner - top image {top} without any data allocated and coarser 38*12d7b3bbSFiona Ebner cluster size 39*12d7b3bbSFiona Ebner 40*12d7b3bbSFiona Ebner Attach a compress filter for the top image, because that 41*12d7b3bbSFiona Ebner requires that the request alignment is the top image's cluster 42*12d7b3bbSFiona Ebner size. 43*12d7b3bbSFiona Ebner """ 44*12d7b3bbSFiona Ebner qemu_img_create('-f', imgfmt, 45*12d7b3bbSFiona Ebner '-o', 'cluster_size={}'.format(cluster_size // 2), 46*12d7b3bbSFiona Ebner base, str(image_size)) 47*12d7b3bbSFiona Ebner qemu_io('-c', f'write 0 {cluster_size // 2}', base) 48*12d7b3bbSFiona Ebner qemu_img_create('-f', imgfmt, 49*12d7b3bbSFiona Ebner '-o', 'cluster_size={}'.format(cluster_size), 50*12d7b3bbSFiona Ebner top, str(image_size)) 51*12d7b3bbSFiona Ebner 52*12d7b3bbSFiona Ebner self.vm = iotests.VM() 53*12d7b3bbSFiona Ebner self.vm.add_blockdev(self.vm.qmp_to_opts({ 54*12d7b3bbSFiona Ebner 'driver': imgfmt, 55*12d7b3bbSFiona Ebner 'node-name': 'base', 56*12d7b3bbSFiona Ebner 'file': { 57*12d7b3bbSFiona Ebner 'driver': 'file', 58*12d7b3bbSFiona Ebner 'filename': base 59*12d7b3bbSFiona Ebner } 60*12d7b3bbSFiona Ebner })) 61*12d7b3bbSFiona Ebner self.vm.add_blockdev(self.vm.qmp_to_opts({ 62*12d7b3bbSFiona Ebner 'driver': 'compress', 63*12d7b3bbSFiona Ebner 'node-name': 'compress-top', 64*12d7b3bbSFiona Ebner 'file': { 65*12d7b3bbSFiona Ebner 'driver': imgfmt, 66*12d7b3bbSFiona Ebner 'node-name': 'top', 67*12d7b3bbSFiona Ebner 'file': { 68*12d7b3bbSFiona Ebner 'driver': 'file', 69*12d7b3bbSFiona Ebner 'filename': top 70*12d7b3bbSFiona Ebner }, 71*12d7b3bbSFiona Ebner 'backing': 'base' 72*12d7b3bbSFiona Ebner } 73*12d7b3bbSFiona Ebner })) 74*12d7b3bbSFiona Ebner self.vm.launch() 75*12d7b3bbSFiona Ebner 76*12d7b3bbSFiona Ebner def tearDown(self) -> None: 77*12d7b3bbSFiona Ebner self.vm.shutdown() 78*12d7b3bbSFiona Ebner os.remove(top) 79*12d7b3bbSFiona Ebner os.remove(base) 80*12d7b3bbSFiona Ebner 81*12d7b3bbSFiona Ebner def test_stream_unaligned_prefetch(self) -> None: 82*12d7b3bbSFiona Ebner self.vm.cmd('block-stream', job_id='stream', device='compress-top') 83*12d7b3bbSFiona Ebner 84*12d7b3bbSFiona Ebner 85*12d7b3bbSFiona Ebnerif __name__ == '__main__': 86*12d7b3bbSFiona Ebner iotests.main(supported_fmts=['qcow2'], supported_protocols=['file']) 87