xref: /qemu/tests/qemu-iotests/tests/stream-unaligned-prefetch (revision 5107022a616247216a7f7338bd7c62b4399d89eb)
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