Test mirror with a non-root node as a source. This restriction was dropped with commit "blockdev: mirror: do not require a root block node".
Signed-off-by: Fiona Ebner <[email protected]> --- No changes in v2. tests/qemu-iotests/041 | 40 ++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/041.out | 4 ++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041 index 2552388690..abc070435d 100755 --- a/tests/qemu-iotests/041 +++ b/tests/qemu-iotests/041 @@ -1434,10 +1434,19 @@ class TestThrottle(iotests.QMPTestCase): bus='vio-scsi.0', drive='throttle') + self.drive_qdev = '/machine/peripheral/virtio' + def tearDown(self): os.remove(test_img) os.remove(target_img) + def blockstats(self, device): + result = self.vm.qmp("query-blockstats") + for r in result['return']: + if r['node-name'] == device: + return r['stats'] + raise Exception(f'Device {device} not found when querying blockstats') + def test_throttled(self): self.mirror_command('throttle') @@ -1451,6 +1460,37 @@ class TestThrottle(iotests.QMPTestCase): self.assertTrue(iotests.compare_images(test_img, target_img), 'target image does not match source after mirroring') + def test_below_throttle(self): + self.mirror_command('source') + + # The throttling above should not block the mirror from completing. + self.complete_and_wait('mirror') + self.vm.shutdown() + self.assertTrue(iotests.compare_images(test_img, target_img), + 'target image does not match source after mirroring') + + def test_below_throttle_with_io_on_throttle(self): + self.mirror_command('source') + + reqs = 3 + req_len = 1 * 1024 + + for i in range(0, reqs): + req = f'aio_write -P 7 {i}M {req_len}' + self.vm.hmp_qemu_io(self.drive_qdev, req, qdev=True) + + self.wait_ready('mirror') + # The throttle node above should still have in-flight requests. + assert self.blockstats('throttle')['wr_bytes'] <= 1 * req_len + + self.complete_and_wait('mirror', wait_ready=False) + assert self.blockstats('throttle')['wr_bytes'] == reqs * req_len + self.vm.shutdown() + # The throttle node above is drained too when the mirror finishes, so + # the images should match. + self.assertTrue(iotests.compare_images(test_img, target_img), + 'target image does not match source after mirroring') + class TestThrottleDriveMirror(TestThrottle): attachTargetImage = False diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out index 96a0752f44..ec055a9915 100644 --- a/tests/qemu-iotests/041.out +++ b/tests/qemu-iotests/041.out @@ -1,5 +1,5 @@ -............................................................................................................. +................................................................................................................. ---------------------------------------------------------------------- -Ran 109 tests +Ran 113 tests OK -- 2.47.3
