iotests/backup-discard-source: don't use actual-size

Relying on disk usage is bad thing, and test just doesn't work on XFS.

Let's instead add a dirty bitmap to track writes to test image.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Message-ID: <20240620144402.65896-3-vsementsov@yandex-team.ru>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Tested-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2024-06-20 17:44:02 +03:00 committed by Kevin Wolf
parent b4bc6ad1d7
commit 526c4a90c4

View File

@ -31,12 +31,6 @@ target_img = os.path.join(iotests.test_dir, 'target')
size = 1024 * 1024
def get_actual_size(vm, node_name):
nodes = vm.cmd('query-named-block-nodes', flat=True)
node = next(n for n in nodes if n['node-name'] == node_name)
return node['image']['actual-size']
class TestBackup(iotests.QMPTestCase):
def setUp(self):
qemu_img_create('-f', iotests.imgfmt, source_img, str(size))
@ -84,7 +78,12 @@ class TestBackup(iotests.QMPTestCase):
}
})
self.assertLess(get_actual_size(self.vm, 'temp'), 512 * 1024)
self.bitmap = {
'node': 'temp',
'name': 'bitmap0'
}
self.vm.cmd('block-dirty-bitmap-add', self.bitmap)
def tearDown(self):
# That should fail, because region is discarded
@ -113,6 +112,13 @@ class TestBackup(iotests.QMPTestCase):
self.vm.event_wait(name='BLOCK_JOB_COMPLETED')
def get_bitmap_count(self):
nodes = self.vm.cmd('query-named-block-nodes', flat=True)
temp = next(n for n in nodes if n['node-name'] == 'temp')
bitmap = temp['dirty-bitmaps'][0]
assert bitmap['name'] == self.bitmap['name']
return bitmap['count']
def test_discard_written(self):
"""
1. Guest writes
@ -125,7 +131,7 @@ class TestBackup(iotests.QMPTestCase):
self.assert_qmp(result, 'return', '')
# Check that data is written to temporary image
self.assertGreater(get_actual_size(self.vm, 'temp'), size)
self.assertEqual(self.get_bitmap_count(), size)
self.do_backup()
@ -138,13 +144,18 @@ class TestBackup(iotests.QMPTestCase):
"""
self.do_backup()
# backup job did discard operation and pollute the bitmap,
# we have to clean the bitmap, to check next write
self.assertEqual(self.get_bitmap_count(), size)
self.vm.cmd('block-dirty-bitmap-clear', self.bitmap)
# Try trigger copy-before-write operation
result = self.vm.hmp_qemu_io('cbw', 'write 0 1M')
self.assert_qmp(result, 'return', '')
# Check that data is not written to temporary image, as region
# is discarded from copy-before-write process
self.assertLess(get_actual_size(self.vm, 'temp'), 512 * 1024)
self.assertEqual(self.get_bitmap_count(), 0)
if __name__ == '__main__':