[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 17/17] iotests: add dirty bitmap postcopy test
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-block] [PATCH 17/17] iotests: add dirty bitmap postcopy test |
Date: |
Mon, 13 Feb 2017 12:54:49 +0300 |
Test
- start two vms (vm_a, vm_b)
- in a
- do writes from set A
- do writes from set B
- fix bitmap sha256
- clear bitmap
- do writes from set A
- start migration
- than, in b
- wait vm start (postcopy should start)
- do writes from set B
- check bitmap sha256
The test should verify postcopy migration and then merging with delta
(changes in target, during postcopy process).
Reduce supported cache modes to only 'none', because with cache on time
from source.STOP to target.RESUME is unpredictable and we can fail with
timout while waiting for target.RESUME.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
tests/qemu-iotests/169 | 74 +++++++++++++++++++++++++++++++++++++------
tests/qemu-iotests/169.out | 4 +--
tests/qemu-iotests/iotests.py | 7 +++-
3 files changed, 72 insertions(+), 13 deletions(-)
diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
index ec6cd46..333df58 100755
--- a/tests/qemu-iotests/169
+++ b/tests/qemu-iotests/169
@@ -29,8 +29,14 @@ fifo = os.path.join(iotests.test_dir, 'mig_fifo')
class TestDirtyBitmapMigration(iotests.QMPTestCase):
- def setUp(self):
- size = 0x400000000 # 1G
+ def tearDown(self):
+ self.vm_a.shutdown()
+ self.vm_b.shutdown()
+ os.remove(disk_a)
+ os.remove(disk_b)
+ os.remove(fifo)
+
+ def init(self, size):
os.mkfifo(fifo)
qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
qemu_img('create', '-f', iotests.imgfmt, disk_b, str(size))
@@ -40,14 +46,8 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
self.vm_a.launch()
self.vm_b.launch()
- def tearDown(self):
- self.vm_a.shutdown()
- self.vm_b.shutdown()
- os.remove(disk_a)
- os.remove(disk_b)
- os.remove(fifo)
-
def test_migration(self):
+ self.init(0x400000000) # 1G
granularity = 512
regions = [
{ 'start': 0, 'count': 0x100000 },
@@ -81,6 +81,60 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
node='drive0', name='bitmap')
self.assert_qmp(result, 'return/sha256', sha256);
+ def test_postcopy(self):
+ self.init(0x4000000000) # 256G
+ write_size = 0x40000000
+ granularity = 512
+ chunk = 4096
+
+ result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
+ name='bitmap', granularity=granularity)
+ self.assert_qmp(result, 'return', {});
+
+ s = 0
+ while s < write_size:
+ self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+ s += 0x10000
+ s = 0x8000
+ while s < write_size:
+ self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+ s += 0x10000
+
+ result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
+ node='drive0', name='bitmap')
+ sha256 = result['return']['sha256']
+
+ result = self.vm_a.qmp('block-dirty-bitmap-clear', node='drive0',
+ name='bitmap')
+ self.assert_qmp(result, 'return', {});
+ s = 0
+ while s < write_size:
+ self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+ s += 0x10000
+
+ result = self.vm_a.qmp('migrate-set-capabilities',
+ capabilities=[{'capability': 'dirty-bitmaps',
+ 'state': True}])
+ self.assert_qmp(result, 'return', {})
+
+ result = self.vm_a.qmp('migrate', uri='exec:cat>' + fifo)
+ self.assertNotEqual(self.vm_a.event_wait("STOP"), None)
+ self.assertNotEqual(self.vm_b.event_wait("RESUME"), None)
+
+ s = 0x8000
+ while s < write_size:
+ self.vm_b.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
+ s += 0x10000
+
+ result = self.vm_b.qmp('query-block');
+ while len(result['return'][0]['dirty-bitmaps']) > 1:
+ time.sleep(2)
+ result = self.vm_b.qmp('query-block');
+
+ result = self.vm_b.qmp('x-debug-block-dirty-bitmap-sha256',
+ node='drive0', name='bitmap')
+
+ self.assert_qmp(result, 'return/sha256', sha256);
if __name__ == '__main__':
- iotests.main()
+ iotests.main(supported_fmts=['qcow2'], supported_cache_modes=['none'])
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
index ae1213e..fbc63e6 100644
--- a/tests/qemu-iotests/169.out
+++ b/tests/qemu-iotests/169.out
@@ -1,5 +1,5 @@
-.
+..
----------------------------------------------------------------------
-Ran 1 tests
+Ran 2 tests
OK
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index e110c90..7b64411 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -356,6 +356,10 @@ def verify_platform(supported_oses=['linux']):
if True not in [sys.platform.startswith(x) for x in supported_oses]:
notrun('not suitable for this OS: %s' % sys.platform)
+def verify_cache_mode(supported_cache_modes=[]):
+ if supported_cache_modes and (cachemode not in supported_cache_modes):
+ notrun('not suitable for this cache mode: %s' % cachemode)
+
def supports_quorum():
return 'quorum' in qemu_img_pipe('--help')
@@ -364,7 +368,7 @@ def verify_quorum():
if not supports_quorum():
notrun('quorum support missing')
-def main(supported_fmts=[], supported_oses=['linux']):
+def main(supported_fmts=[], supported_oses=['linux'],
supported_cache_modes=[]):
'''Run tests'''
global debug
@@ -381,6 +385,7 @@ def main(supported_fmts=[], supported_oses=['linux']):
verbosity = 1
verify_image_format(supported_fmts)
verify_platform(supported_oses)
+ verify_cache_mode(supported_cache_modes)
# We need to filter out the time taken from the output so that qemu-iotest
# can reliably diff the results against master output.
--
1.8.3.1
- Re: [Qemu-block] [Qemu-devel] [PATCH 15/17] iotests: add default node-name, (continued)
- Re: [Qemu-block] [Qemu-devel] [PATCH 15/17] iotests: add default node-name, Fam Zheng, 2017/02/16
- Re: [Qemu-block] [Qemu-devel] [PATCH 15/17] iotests: add default node-name, Vladimir Sementsov-Ogievskiy, 2017/02/17
- Re: [Qemu-block] [Qemu-devel] [PATCH 15/17] iotests: add default node-name, Fam Zheng, 2017/02/17
- Re: [Qemu-block] [Qemu-devel] [PATCH 15/17] iotests: add default node-name, Vladimir Sementsov-Ogievskiy, 2017/02/17
- Re: [Qemu-block] [Qemu-devel] [PATCH 15/17] iotests: add default node-name, Fam Zheng, 2017/02/17
- Re: [Qemu-block] [Qemu-devel] [PATCH 15/17] iotests: add default node-name, Dr. David Alan Gilbert, 2017/02/17
[Qemu-block] [PATCH 01/17] migration: add has_postcopy savevm handler, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 14/17] qmp: add x-debug-block-dirty-bitmap-sha256, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 17/17] iotests: add dirty bitmap postcopy test,
Vladimir Sementsov-Ogievskiy <=
[Qemu-block] [PATCH 03/17] migration: split common postcopy out of ram postcopy, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 09/17] migration: include migrate_dirty_bitmaps in migrate_postcopy, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 06/17] block: add bdrv_dirty_bitmap_enable_successor(), Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 05/17] block: add bdrv_next_dirty_bitmap(), Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 10/17] migration/qemu-file: add qemu_put_counted_string(), Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 13/17] iotests: add add_incoming_migration to VM class, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 16/17] iotests: add dirty bitmap migration test, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 08/17] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 04/17] migration: introduce postcopy-only pending, Vladimir Sementsov-Ogievskiy, 2017/02/13
[Qemu-block] [PATCH 12/17] migration: add postcopy migration of dirty bitmaps, Vladimir Sementsov-Ogievskiy, 2017/02/13