[Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test

Vladimir Sementsov-Ogievskiy posted 13 patches 8 years, 1 month ago
There is a newer version of this series
[Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by Vladimir Sementsov-Ogievskiy 8 years, 1 month ago
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 <vsementsov@virtuozzo.com>
---
 tests/qemu-iotests/199        | 105 ++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/199.out    |   5 ++
 tests/qemu-iotests/group      |   1 +
 tests/qemu-iotests/iotests.py |   7 ++-
 4 files changed, 117 insertions(+), 1 deletion(-)
 create mode 100755 tests/qemu-iotests/199
 create mode 100644 tests/qemu-iotests/199.out

diff --git a/tests/qemu-iotests/199 b/tests/qemu-iotests/199
new file mode 100755
index 0000000000..f872040a81
--- /dev/null
+++ b/tests/qemu-iotests/199
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+#
+# Tests for dirty bitmaps postcopy migration.
+#
+# Copyright (c) 2016-2017 Virtuozzo International GmbH. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import os
+import iotests
+import time
+from iotests import qemu_img
+
+disk_a = os.path.join(iotests.test_dir, 'disk_a')
+disk_b = os.path.join(iotests.test_dir, 'disk_b')
+size = '256G'
+fifo = os.path.join(iotests.test_dir, 'mig_fifo')
+
+class TestDirtyBitmapPostcopyMigration(iotests.QMPTestCase):
+
+    def tearDown(self):
+        self.vm_a.shutdown()
+        self.vm_b.shutdown()
+        os.remove(disk_a)
+        os.remove(disk_b)
+        os.remove(fifo)
+
+    def setUp(self):
+        os.mkfifo(fifo)
+        qemu_img('create', '-f', iotests.imgfmt, disk_a, size)
+        qemu_img('create', '-f', iotests.imgfmt, disk_b, size)
+        self.vm_a = iotests.VM(path_suffix='a').add_drive(disk_a)
+        self.vm_b = iotests.VM(path_suffix='b').add_drive(disk_b)
+        self.vm_b.add_incoming("exec: cat '" + fifo + "'")
+        self.vm_a.launch()
+        self.vm_b.launch()
+
+    def test_postcopy(self):
+        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(supported_fmts=['qcow2'], supported_cache_modes=['none'])
diff --git a/tests/qemu-iotests/199.out b/tests/qemu-iotests/199.out
new file mode 100644
index 0000000000..ae1213e6f8
--- /dev/null
+++ b/tests/qemu-iotests/199.out
@@ -0,0 +1,5 @@
+.
+----------------------------------------------------------------------
+Ran 1 tests
+
+OK
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index e879c7ebc7..7c1f499802 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -197,4 +197,5 @@
 196 rw auto quick
 197 rw auto quick
 198 rw auto
+199 rw auto
 200 rw auto
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 95454c1893..88f73d6441 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -432,6 +432,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')
 
@@ -440,7 +444,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
@@ -457,6 +461,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.
-- 
2.11.1


Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by Fam Zheng 8 years, 1 month ago
On Wed, 12/20 18:49, Vladimir Sementsov-Ogievskiy wrote:
> 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 <vsementsov@virtuozzo.com>
> ---
>  tests/qemu-iotests/199        | 105 ++++++++++++++++++++++++++++++++++++++++++
>  tests/qemu-iotests/199.out    |   5 ++
>  tests/qemu-iotests/group      |   1 +
>  tests/qemu-iotests/iotests.py |   7 ++-
>  4 files changed, 117 insertions(+), 1 deletion(-)
>  create mode 100755 tests/qemu-iotests/199
>  create mode 100644 tests/qemu-iotests/199.out
> 
> diff --git a/tests/qemu-iotests/199 b/tests/qemu-iotests/199
> new file mode 100755
> index 0000000000..f872040a81
> --- /dev/null
> +++ b/tests/qemu-iotests/199
> @@ -0,0 +1,105 @@
> +#!/usr/bin/env python
> +#
> +# Tests for dirty bitmaps postcopy migration.
> +#
> +# Copyright (c) 2016-2017 Virtuozzo International GmbH. All rights reserved.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +#
> +
> +import os
> +import iotests
> +import time
> +from iotests import qemu_img
> +
> +disk_a = os.path.join(iotests.test_dir, 'disk_a')
> +disk_b = os.path.join(iotests.test_dir, 'disk_b')
> +size = '256G'
> +fifo = os.path.join(iotests.test_dir, 'mig_fifo')
> +
> +class TestDirtyBitmapPostcopyMigration(iotests.QMPTestCase):
> +
> +    def tearDown(self):
> +        self.vm_a.shutdown()
> +        self.vm_b.shutdown()
> +        os.remove(disk_a)
> +        os.remove(disk_b)
> +        os.remove(fifo)
> +
> +    def setUp(self):
> +        os.mkfifo(fifo)
> +        qemu_img('create', '-f', iotests.imgfmt, disk_a, size)
> +        qemu_img('create', '-f', iotests.imgfmt, disk_b, size)
> +        self.vm_a = iotests.VM(path_suffix='a').add_drive(disk_a)
> +        self.vm_b = iotests.VM(path_suffix='b').add_drive(disk_b)
> +        self.vm_b.add_incoming("exec: cat '" + fifo + "'")
> +        self.vm_a.launch()
> +        self.vm_b.launch()
> +
> +    def test_postcopy(self):
> +        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);
> +

Reviewed-by: Fam Zheng <famz@redhat.com>

Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by Vladimir Sementsov-Ogievskiy 8 years, 1 month ago
Thank you for reviewing my code!

-- 
Best regards,
Vladimir


Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by John Snow 8 years ago

On 12/28/2017 06:49 AM, Vladimir Sementsov-Ogievskiy wrote:
> Thank you for reviewing my code!
> 

Time for the re-spin? There's pretty good pressure to get this into 2.12
and say the non-nbd workflow model is feature complete.

Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by Vladimir Sementsov-Ogievskiy 8 years ago
17.01.2018 21:30, John Snow wrote:
>
> On 12/28/2017 06:49 AM, Vladimir Sementsov-Ogievskiy wrote:
>> Thank you for reviewing my code!
>>
> Time for the re-spin? There's pretty good pressure to get this into 2.12
> and say the non-nbd workflow model is feature complete.

Yes, you are right. Hope to do it today or tomorrow.

-- 
Best regards,
Vladimir


Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by Vladimir Sementsov-Ogievskiy 8 years ago
18.01.2018 12:57, Vladimir Sementsov-Ogievskiy wrote:
> 17.01.2018 21:30, John Snow wrote:
>>
>> On 12/28/2017 06:49 AM, Vladimir Sementsov-Ogievskiy wrote:
>>> Thank you for reviewing my code!
>>>
>> Time for the re-spin? There's pretty good pressure to get this into 2.12
>> and say the non-nbd workflow model is feature complete.
>
> Yes, you are right. Hope to do it today or tomorrow.
>

I've rebased, applied comments from review, and even one some new fixes, 
but now I understand that it is too early for re-spin.

Now this series depends on
1. [PATCH v2 0/3] fix bitmaps migration through shared storage
   - we need to decide, how to fix it. May be, we just do not need 
bitmaps in inactive state, and should not load them in do_qcow2_open in 
this case
   [I can ignore it, just dropping one test case from new iotest, and 
fix it later, but..
2. [PATCH v2 0/6] qmp dirty bitmap API
  - here autoload is dropped, and migration should be rebased on it.

so, I'll re-spin migration after these two questions are resolved.

-- 
Best regards,
Vladimir


Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by John Snow 8 years ago

On 01/19/2018 01:08 PM, Vladimir Sementsov-Ogievskiy wrote:
> 18.01.2018 12:57, Vladimir Sementsov-Ogievskiy wrote:
>> 17.01.2018 21:30, John Snow wrote:
>>>
>>> On 12/28/2017 06:49 AM, Vladimir Sementsov-Ogievskiy wrote:
>>>> Thank you for reviewing my code!
>>>>
>>> Time for the re-spin? There's pretty good pressure to get this into 2.12
>>> and say the non-nbd workflow model is feature complete.
>>
>> Yes, you are right. Hope to do it today or tomorrow.
>>
> 
> I've rebased, applied comments from review, and even one some new fixes,
> but now I understand that it is too early for re-spin.
> 
> Now this series depends on
> 1. [PATCH v2 0/3] fix bitmaps migration through shared storage
>   - we need to decide, how to fix it. May be, we just do not need
> bitmaps in inactive state, and should not load them in do_qcow2_open in
> this case
>   [I can ignore it, just dropping one test case from new iotest, and fix
> it later, but..
> 2. [PATCH v2 0/6] qmp dirty bitmap API
>  - here autoload is dropped, and migration should be rebased on it.
> 
> so, I'll re-spin migration after these two questions are resolved.
> 

You got it, thanks.

Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by John Snow 8 years ago

On 01/19/2018 01:08 PM, Vladimir Sementsov-Ogievskiy wrote:
> 18.01.2018 12:57, Vladimir Sementsov-Ogievskiy wrote:
>> 17.01.2018 21:30, John Snow wrote:
>>>
>>> On 12/28/2017 06:49 AM, Vladimir Sementsov-Ogievskiy wrote:
>>>> Thank you for reviewing my code!
>>>>
>>> Time for the re-spin? There's pretty good pressure to get this into 2.12
>>> and say the non-nbd workflow model is feature complete.
>>
>> Yes, you are right. Hope to do it today or tomorrow.
>>
> 
> I've rebased, applied comments from review, and even one some new fixes,
> but now I understand that it is too early for re-spin.
> 
> Now this series depends on
> 1. [PATCH v2 0/3] fix bitmaps migration through shared storage
>   - we need to decide, how to fix it. May be, we just do not need
> bitmaps in inactive state, and should not load them in do_qcow2_open in
> this case
>   [I can ignore it, just dropping one test case from new iotest, and fix
> it later, but..

I'll look at this next.

> 2. [PATCH v2 0/6] qmp dirty bitmap API
>  - here autoload is dropped, and migration should be rebased on it.
> 

For (2) I really want to see a test case showing the utility for enable,
disable and merge to be added to the API, *or* add an x- prefix to them
for now.

I want to see some use-case tests that demonstrate how they are to be
safely used, basically. You might want to expand test 124 for this.

I'm not sure we need this entire series for migration, but I don't want
to make you re-order absolutely everything. Can we merge patch one by
itself for the purposes of the migration patchset?

> so, I'll re-spin migration after these two questions are resolved.
> 

Thanks for your patience, as always. Please send me pings every day on
whatever you have to in order to get migration in to 2.12 -- I'm going
to try to stay focused too, but I've got the attention span of a
goldfish. If I miss something, please speak up.

--js

Re: [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test
Posted by Vladimir Sementsov-Ogievskiy 8 years ago
20.01.2018 03:37, John Snow wrote:
>
> On 01/19/2018 01:08 PM, Vladimir Sementsov-Ogievskiy wrote:
>> 18.01.2018 12:57, Vladimir Sementsov-Ogievskiy wrote:
>>> 17.01.2018 21:30, John Snow wrote:
>>>> On 12/28/2017 06:49 AM, Vladimir Sementsov-Ogievskiy wrote:
>>>>> Thank you for reviewing my code!
>>>>>
>>>> Time for the re-spin? There's pretty good pressure to get this into 2.12
>>>> and say the non-nbd workflow model is feature complete.
>>> Yes, you are right. Hope to do it today or tomorrow.
>>>
>> I've rebased, applied comments from review, and even one some new fixes,
>> but now I understand that it is too early for re-spin.
>>
>> Now this series depends on
>> 1. [PATCH v2 0/3] fix bitmaps migration through shared storage
>>    - we need to decide, how to fix it. May be, we just do not need
>> bitmaps in inactive state, and should not load them in do_qcow2_open in
>> this case
>>    [I can ignore it, just dropping one test case from new iotest, and fix
>> it later, but..
> I'll look at this next.
>
>> 2. [PATCH v2 0/6] qmp dirty bitmap API
>>   - here autoload is dropped, and migration should be rebased on it.
>>
> For (2) I really want to see a test case showing the utility for enable,
> disable and merge to be added to the API, *or* add an x- prefix to them
> for now.

tests are inevitable, I'll make them)

>
> I want to see some use-case tests that demonstrate how they are to be
> safely used, basically. You might want to expand test 124 for this.
>
> I'm not sure we need this entire series for migration, but I don't want
> to make you re-order absolutely everything. Can we merge patch one by
> itself for the purposes of the migration patchset?

I think yes, will try.

>> so, I'll re-spin migration after these two questions are resolved.
>>
> Thanks for your patience, as always. Please send me pings every day on
> whatever you have to in order to get migration in to 2.12 -- I'm going
> to try to stay focused too, but I've got the attention span of a
> goldfish. If I miss something, please speak up.
>
> --js


-- 
Best regards,
Vladimir