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:
parent
b4bc6ad1d7
commit
526c4a90c4
@ -31,12 +31,6 @@ target_img = os.path.join(iotests.test_dir, 'target')
|
|||||||
size = 1024 * 1024
|
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):
|
class TestBackup(iotests.QMPTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
qemu_img_create('-f', iotests.imgfmt, source_img, str(size))
|
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):
|
def tearDown(self):
|
||||||
# That should fail, because region is discarded
|
# That should fail, because region is discarded
|
||||||
@ -113,6 +112,13 @@ class TestBackup(iotests.QMPTestCase):
|
|||||||
|
|
||||||
self.vm.event_wait(name='BLOCK_JOB_COMPLETED')
|
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):
|
def test_discard_written(self):
|
||||||
"""
|
"""
|
||||||
1. Guest writes
|
1. Guest writes
|
||||||
@ -125,7 +131,7 @@ class TestBackup(iotests.QMPTestCase):
|
|||||||
self.assert_qmp(result, 'return', '')
|
self.assert_qmp(result, 'return', '')
|
||||||
|
|
||||||
# Check that data is written to temporary image
|
# 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()
|
self.do_backup()
|
||||||
|
|
||||||
@ -138,13 +144,18 @@ class TestBackup(iotests.QMPTestCase):
|
|||||||
"""
|
"""
|
||||||
self.do_backup()
|
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
|
# Try trigger copy-before-write operation
|
||||||
result = self.vm.hmp_qemu_io('cbw', 'write 0 1M')
|
result = self.vm.hmp_qemu_io('cbw', 'write 0 1M')
|
||||||
self.assert_qmp(result, 'return', '')
|
self.assert_qmp(result, 'return', '')
|
||||||
|
|
||||||
# Check that data is not written to temporary image, as region
|
# Check that data is not written to temporary image, as region
|
||||||
# is discarded from copy-before-write process
|
# 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__':
|
if __name__ == '__main__':
|
||||||
|
Loading…
Reference in New Issue
Block a user