Commit 6a5f6403 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

iotests: Add iothread cases to 155



This patch adds test cases for attaching the backing chain to a mirror
job target right before finalising the job, where the image is in a
non-mainloop AioContext (i.e. the backing chain needs to be moved to the
AioContext of the mirror target).

This requires switching the test case from virtio-blk to virtio-scsi
because virtio-blk only actually starts using the iothreads when the
guest driver initialises the device (which never happens in a test case
without a guest OS). virtio-scsi always keeps its block nodes in the
AioContext of the the requested iothread without guest interaction.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Message-Id: <20200310113831.27293-7-kwolf@redhat.com>
Reviewed-by: default avatarPeter Krempa <pkrempa@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 30dd65f3
Loading
Loading
Loading
Loading
+23 −9
Original line number Diff line number Diff line
@@ -49,11 +49,14 @@ target_img = os.path.join(iotests.test_dir, 'target.' + iotests.imgfmt)
#                           chain opened right away. If False, blockdev-add
#                           opens it without a backing file and job completion
#                           is supposed to open the backing chain.
# use_iothread: If True, an iothread is configured for the virtio-blk device
#               that uses the image being mirrored

class BaseClass(iotests.QMPTestCase):
    target_blockdev_backing = None
    target_real_backing = None
    target_open_with_backing = True
    use_iothread = False

    def setUp(self):
        qemu_img('create', '-f', iotests.imgfmt, back0_img, '1440K')
@@ -69,7 +72,16 @@ class BaseClass(iotests.QMPTestCase):
                    'file': {'driver': 'file',
                             'filename': source_img}}
        self.vm.add_blockdev(self.vm.qmp_to_opts(blockdev))
        self.vm.add_device('virtio-blk,id=qdev0,drive=source')

        if self.use_iothread:
            self.vm.add_object('iothread,id=iothread0')
            iothread = ",iothread=iothread0"
        else:
            iothread = ""

        self.vm.add_device('virtio-scsi%s' % iothread)
        self.vm.add_device('scsi-hd,id=qdev0,drive=source')

        self.vm.launch()

        self.assertIntactSourceBackingChain()
@@ -182,24 +194,21 @@ class MirrorBaseClass(BaseClass):
    def testFull(self):
        self.runMirror('full')

        node = self.findBlockNode('target',
                                  '/machine/peripheral/qdev0/virtio-backend')
        node = self.findBlockNode('target', 'qdev0')
        self.assertCorrectBackingImage(node, None)
        self.assertIntactSourceBackingChain()

    def testTop(self):
        self.runMirror('top')

        node = self.findBlockNode('target',
                                  '/machine/peripheral/qdev0/virtio-backend')
        node = self.findBlockNode('target', 'qdev0')
        self.assertCorrectBackingImage(node, back2_img)
        self.assertIntactSourceBackingChain()

    def testNone(self):
        self.runMirror('none')

        node = self.findBlockNode('target',
                                  '/machine/peripheral/qdev0/virtio-backend')
        node = self.findBlockNode('target', 'qdev0')
        self.assertCorrectBackingImage(node, source_img)
        self.assertIntactSourceBackingChain()

@@ -252,6 +261,9 @@ class TestBlockdevMirrorReopen(MirrorBaseClass):
                                 backing="backing")
            self.assert_qmp(result, 'return', {})

class TestBlockdevMirrorReopenIothread(TestBlockdevMirrorReopen):
    use_iothread = True

# Attach the backing chain only during completion, with blockdev-snapshot
class TestBlockdevMirrorSnapshot(MirrorBaseClass):
    cmd = 'blockdev-mirror'
@@ -268,6 +280,9 @@ class TestBlockdevMirrorSnapshot(MirrorBaseClass):
                                 overlay="target")
            self.assert_qmp(result, 'return', {})

class TestBlockdevMirrorSnapshotIothread(TestBlockdevMirrorSnapshot):
    use_iothread = True

class TestCommit(BaseClass):
    existing = False

@@ -283,8 +298,7 @@ class TestCommit(BaseClass):

        self.vm.event_wait('BLOCK_JOB_COMPLETED')

        node = self.findBlockNode(None,
                                  '/machine/peripheral/qdev0/virtio-backend')
        node = self.findBlockNode(None, 'qdev0')
        self.assert_qmp(node, 'image' + '/backing-image' * 0 + '/filename',
                        back1_img)
        self.assert_qmp(node, 'image' + '/backing-image' * 1 + '/filename',
+2 −2
Original line number Diff line number Diff line
.........................
...............................
----------------------------------------------------------------------
Ran 25 tests
Ran 31 tests

OK