| 1 | #!/usr/bin/env python3 |
| 2 | # group: rw quick |
| 3 | # |
| 4 | # Tests that "bdrv_drain_all" doesn't drain block jobs |
| 5 | # |
| 6 | # Copyright (C) 2015 Red Hat, Inc. |
| 7 | # |
| 8 | # This program is free software; you can redistribute it and/or modify |
| 9 | # it under the terms of the GNU General Public License as published by |
| 10 | # the Free Software Foundation; either version 2 of the License, or |
| 11 | # (at your option) any later version. |
| 12 | # |
| 13 | # This program is distributed in the hope that it will be useful, |
| 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | # GNU General Public License for more details. |
| 17 | # |
| 18 | # You should have received a copy of the GNU General Public License |
| 19 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 20 | # |
| 21 | |
| 22 | import os |
| 23 | import iotests |
| 24 | |
| 25 | class TestStopWithBlockJob(iotests.QMPTestCase): |
| 26 | test_img = os.path.join(iotests.test_dir, 'test.img') |
| 27 | target_img = os.path.join(iotests.test_dir, 'target.img') |
| 28 | base_img = os.path.join(iotests.test_dir, 'base.img') |
| 29 | overlay_img = os.path.join(iotests.test_dir, 'overlay.img') |
| 30 | |
| 31 | def setUp(self): |
| 32 | iotests.qemu_img('create', '-f', iotests.imgfmt, self.base_img, "1G") |
| 33 | iotests.qemu_img('create', '-f', iotests.imgfmt, self.test_img, |
| 34 | "-b", self.base_img, '-F', iotests.imgfmt) |
| 35 | iotests.qemu_io('-f', iotests.imgfmt, '-c', 'write -P0x5d 1M 128M', |
| 36 | self.test_img) |
| 37 | self.vm = iotests.VM() |
| 38 | self.vm.add_object('throttle-group,id=tg0,x-bps-total=1024') |
| 39 | |
| 40 | source_drive = 'driver=throttle,' \ |
| 41 | 'node-name=source,' \ |
| 42 | 'throttle-group=tg0,' \ |
| 43 | f'file.driver={iotests.imgfmt},' \ |
| 44 | f'file.file.filename={self.test_img}' |
| 45 | |
| 46 | self.vm.add_drive(None, source_drive) |
| 47 | self.vm.launch() |
| 48 | |
| 49 | def tearDown(self): |
| 50 | self.vm.shutdown() |
| 51 | for img in (self.test_img, self.target_img, self.base_img, |
| 52 | self.overlay_img): |
| 53 | iotests.try_remove(img) |
| 54 | |
| 55 | def do_test_stop(self, cmd, **args): |
| 56 | """Test 'stop' while block job is running on a throttled drive. |
| 57 | The 'stop' command shouldn't drain the job""" |
| 58 | self.vm.cmd(cmd, **args) |
| 59 | |
| 60 | self.vm.cmd("stop") |
| 61 | result = self.vm.qmp("query-block-jobs") |
| 62 | |
| 63 | self.assert_qmp(result, 'return[0]/status', 'running') |
| 64 | self.assert_qmp(result, 'return[0]/ready', False) |
| 65 | |
| 66 | def test_drive_mirror(self): |
| 67 | self.do_test_stop("drive-mirror", device="drive0", |
| 68 | target=self.target_img, format=iotests.imgfmt, |
| 69 | sync="full", buf_size=65536) |
| 70 | |
| 71 | def test_drive_backup(self): |
| 72 | # Limit max-chunk and max-workers so that block-copy will not |
| 73 | # launch so many workers working on so much data each that |
| 74 | # stop's bdrv_drain_all() would finish the job |
| 75 | self.do_test_stop("drive-backup", device="drive0", |
| 76 | target=self.target_img, format=iotests.imgfmt, |
| 77 | sync="full", |
| 78 | x_perf={'max-chunk': 65536, |
| 79 | 'max-workers': 8}) |
| 80 | |
| 81 | def test_block_commit(self): |
| 82 | # Add overlay above the source node so that we actually use a |
| 83 | # commit job instead of a mirror job |
| 84 | |
| 85 | iotests.qemu_img('create', '-f', iotests.imgfmt, self.overlay_img, |
| 86 | '1G') |
| 87 | |
| 88 | self.vm.cmd('blockdev-add', { |
| 89 | 'node-name': 'overlay', |
| 90 | 'driver': iotests.imgfmt, |
| 91 | 'file': { |
| 92 | 'driver': 'file', |
| 93 | 'filename': self.overlay_img |
| 94 | } |
| 95 | }) |
| 96 | |
| 97 | self.vm.cmd('blockdev-snapshot', |
| 98 | node='source', overlay='overlay') |
| 99 | |
| 100 | self.do_test_stop('block-commit', device='drive0', top_node='source') |
| 101 | |
| 102 | if __name__ == '__main__': |
| 103 | iotests.main(supported_fmts=["qcow2"], |
| 104 | supported_protocols=["file"]) |