[16/17] iotests: add dirty bitmap migration test
diff mbox

Message ID 1479837270-79005-17-git-send-email-vsementsov@virtuozzo.com
State New
Headers show

Commit Message

Vladimir Sementsov-Ogievskiy Nov. 22, 2016, 5:54 p.m. UTC
The test starts two vms (vm_a, vm_b), create dirty bitmap in
the first one, do several writes to corresponding device and
then migrate vm_a to vm_b with dirty bitmaps.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 tests/qemu-iotests/169     | 86 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/169.out |  5 +++
 tests/qemu-iotests/group   |  1 +
 3 files changed, 92 insertions(+)
 create mode 100755 tests/qemu-iotests/169
 create mode 100644 tests/qemu-iotests/169.out

Comments

Max Reitz Feb. 1, 2017, 11:12 p.m. UTC | #1
On 22.11.2016 18:54, Vladimir Sementsov-Ogievskiy wrote:
> The test starts two vms (vm_a, vm_b), create dirty bitmap in
> the first one, do several writes to corresponding device and
> then migrate vm_a to vm_b with dirty bitmaps.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  tests/qemu-iotests/169     | 86 ++++++++++++++++++++++++++++++++++++++++++++++
>  tests/qemu-iotests/169.out |  5 +++
>  tests/qemu-iotests/group   |  1 +
>  3 files changed, 92 insertions(+)
>  create mode 100755 tests/qemu-iotests/169
>  create mode 100644 tests/qemu-iotests/169.out
> 
> diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
> new file mode 100755
> index 0000000..58b1ab1
> --- /dev/null
> +++ b/tests/qemu-iotests/169
> @@ -0,0 +1,86 @@
> +#!/usr/bin/env python
> +#
> +# Tests for dirty bitmaps migration.
> +#
> +# Copyright (C) Vladimir Sementsov-Ogievskiy 2015-2016
> +#
> +# 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')
> +fifo = os.path.join(iotests.test_dir, 'mig_fifo')
> +
> +class TestDirtyBitmapMigration(iotests.QMPTestCase):
> +
> +    def setUp(self):
> +        size = 0x400000000 # 1G

I can already see someone on macOS complaining that this test eats their
hard drive when running it for raw images... But we can still amend it
once somebody complains. O:-)

I think 1 GB is not overly large, but it's reasonable to use such a
rather large value for this test.

> +        os.mkfifo(fifo)
> +        qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
> +        qemu_img('create', '-f', iotests.imgfmt, disk_b, str(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_migration("exec: cat " + fifo)

I guess this will break if the path contains white space. Is there
something we can do about that?

(You don't need to protect against quotes or something, just white space.)

> +        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):
> +        granularity = 512
> +        regions = [
> +            { 'start': 0,           'count': 0x100000 },
> +            { 'start': 0x100000000, 'count': 0x200000  },
> +            { 'start': 0x399900000, 'count': 0x100000  }
> +            ]
> +
> +        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
> +                               name='bitmap', granularity=granularity)
> +        self.assert_qmp(result, 'return', {});
> +
> +        for r in regions:
> +          self.vm_a.hmp_qemu_io('drive0',

This line isn't aligned to four spaces.

With that fixed, and if you deem fixing the white space issue too
complicated:

Reviewed-by: Max Reitz <mreitz@redhat.com>

> +                                'write %d %d' % (r['start'], r['count']))
> +
> +        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
> +                               node='drive0', name='bitmap')
> +        sha256 = result['return']['sha256']
> +
> +        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)
> +        time.sleep(2)
> +
> +        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()
> diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
> new file mode 100644
> index 0000000..ae1213e
> --- /dev/null
> +++ b/tests/qemu-iotests/169.out
> @@ -0,0 +1,5 @@
> +.
> +----------------------------------------------------------------------
> +Ran 1 tests
> +
> +OK
> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
> index 866c1a0..5dc75ef 100644
> --- a/tests/qemu-iotests/group
> +++ b/tests/qemu-iotests/group
> @@ -162,6 +162,7 @@
>  159 rw auto quick
>  160 rw auto quick
>  162 auto quick
> +169 rw auto quick
>  170 rw auto quick
>  171 rw auto quick
>  172 auto
>
Vladimir Sementsov-Ogievskiy Feb. 3, 2017, 10:10 a.m. UTC | #2
02.02.2017 02:12, Max Reitz wrote:
> On 22.11.2016 18:54, Vladimir Sementsov-Ogievskiy wrote:
>> The test starts two vms (vm_a, vm_b), create dirty bitmap in
>> the first one, do several writes to corresponding device and
>> then migrate vm_a to vm_b with dirty bitmaps.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   tests/qemu-iotests/169     | 86 ++++++++++++++++++++++++++++++++++++++++++++++
>>   tests/qemu-iotests/169.out |  5 +++
>>   tests/qemu-iotests/group   |  1 +
>>   3 files changed, 92 insertions(+)
>>   create mode 100755 tests/qemu-iotests/169
>>   create mode 100644 tests/qemu-iotests/169.out
>>
>> diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
>> new file mode 100755
>> index 0000000..58b1ab1
>> --- /dev/null
>> +++ b/tests/qemu-iotests/169
>> @@ -0,0 +1,86 @@
>> +#!/usr/bin/env python
>> +#
>> +# Tests for dirty bitmaps migration.
>> +#
>> +# Copyright (C) Vladimir Sementsov-Ogievskiy 2015-2016
>> +#
>> +# 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')
>> +fifo = os.path.join(iotests.test_dir, 'mig_fifo')
>> +
>> +class TestDirtyBitmapMigration(iotests.QMPTestCase):
>> +
>> +    def setUp(self):
>> +        size = 0x400000000 # 1G
> I can already see someone on macOS complaining that this test eats their
> hard drive when running it for raw images... But we can still amend it
> once somebody complains. O:-)
>
> I think 1 GB is not overly large, but it's reasonable to use such a
> rather large value for this test.
>
>> +        os.mkfifo(fifo)
>> +        qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
>> +        qemu_img('create', '-f', iotests.imgfmt, disk_b, str(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_migration("exec: cat " + fifo)
> I guess this will break if the path contains white space. Is there
> something we can do about that?
>
> (You don't need to protect against quotes or something, just white space.)
>
>> +        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):
>> +        granularity = 512
>> +        regions = [
>> +            { 'start': 0,           'count': 0x100000 },
>> +            { 'start': 0x100000000, 'count': 0x200000  },
>> +            { 'start': 0x399900000, 'count': 0x100000  }
>> +            ]
>> +
>> +        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
>> +                               name='bitmap', granularity=granularity)
>> +        self.assert_qmp(result, 'return', {});
>> +
>> +        for r in regions:
>> +          self.vm_a.hmp_qemu_io('drive0',
> This line isn't aligned to four spaces.
>
> With that fixed, and if you deem fixing the white space issue too
> complicated:

may be, just add quotes, like

self.vm_b.add_incoming_migration("exec: cat '" + fifo + "'")


?

>
> Reviewed-by: Max Reitz <mreitz@redhat.com>
>
>> +                                'write %d %d' % (r['start'], r['count']))
>> +
>> +        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
>> +                               node='drive0', name='bitmap')
>> +        sha256 = result['return']['sha256']
>> +
>> +        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)
>> +        time.sleep(2)
>> +
>> +        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()
>> diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
>> new file mode 100644
>> index 0000000..ae1213e
>> --- /dev/null
>> +++ b/tests/qemu-iotests/169.out
>> @@ -0,0 +1,5 @@
>> +.
>> +----------------------------------------------------------------------
>> +Ran 1 tests
>> +
>> +OK
>> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
>> index 866c1a0..5dc75ef 100644
>> --- a/tests/qemu-iotests/group
>> +++ b/tests/qemu-iotests/group
>> @@ -162,6 +162,7 @@
>>   159 rw auto quick
>>   160 rw auto quick
>>   162 auto quick
>> +169 rw auto quick
>>   170 rw auto quick
>>   171 rw auto quick
>>   172 auto
>>
>
Vladimir Sementsov-Ogievskiy Feb. 3, 2017, 11:08 a.m. UTC | #3
03.02.2017 13:10, Vladimir Sementsov-Ogievskiy wrote:
> 02.02.2017 02:12, Max Reitz wrote:
>> On 22.11.2016 18:54, Vladimir Sementsov-Ogievskiy wrote:
>>> The test starts two vms (vm_a, vm_b), create dirty bitmap in
>>> the first one, do several writes to corresponding device and
>>> then migrate vm_a to vm_b with dirty bitmaps.
>>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>   tests/qemu-iotests/169     | 86 
>>> ++++++++++++++++++++++++++++++++++++++++++++++
>>>   tests/qemu-iotests/169.out |  5 +++
>>>   tests/qemu-iotests/group   |  1 +
>>>   3 files changed, 92 insertions(+)
>>>   create mode 100755 tests/qemu-iotests/169
>>>   create mode 100644 tests/qemu-iotests/169.out
>>>
>>> diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
>>> new file mode 100755
>>> index 0000000..58b1ab1
>>> --- /dev/null
>>> +++ b/tests/qemu-iotests/169
>>> @@ -0,0 +1,86 @@
>>> +#!/usr/bin/env python
>>> +#
>>> +# Tests for dirty bitmaps migration.
>>> +#
>>> +# Copyright (C) Vladimir Sementsov-Ogievskiy 2015-2016
>>> +#
>>> +# 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')
>>> +fifo = os.path.join(iotests.test_dir, 'mig_fifo')
>>> +
>>> +class TestDirtyBitmapMigration(iotests.QMPTestCase):
>>> +
>>> +    def setUp(self):
>>> +        size = 0x400000000 # 1G
>> I can already see someone on macOS complaining that this test eats their
>> hard drive when running it for raw images... But we can still amend it
>> once somebody complains. O:-)
>>
>> I think 1 GB is not overly large, but it's reasonable to use such a
>> rather large value for this test.
>>
>>> +        os.mkfifo(fifo)
>>> +        qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
>>> +        qemu_img('create', '-f', iotests.imgfmt, disk_b, str(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_migration("exec: cat " + fifo)
>> I guess this will break if the path contains white space. Is there
>> something we can do about that?
>>
>> (You don't need to protect against quotes or something, just white 
>> space.)
>>
>>> +        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):
>>> +        granularity = 512
>>> +        regions = [
>>> +            { 'start': 0,           'count': 0x100000 },
>>> +            { 'start': 0x100000000, 'count': 0x200000  },
>>> +            { 'start': 0x399900000, 'count': 0x100000  }
>>> +            ]
>>> +
>>> +        result = self.vm_a.qmp('block-dirty-bitmap-add', 
>>> node='drive0',
>>> +                               name='bitmap', granularity=granularity)
>>> +        self.assert_qmp(result, 'return', {});
>>> +
>>> +        for r in regions:
>>> +          self.vm_a.hmp_qemu_io('drive0',
>> This line isn't aligned to four spaces.
>>
>> With that fixed, and if you deem fixing the white space issue too
>> complicated:
>
> may be, just add quotes, like
>
> self.vm_b.add_incoming_migration("exec: cat '" + fifo + "'")
>
>
> ?

looks like ./check doesn't work with spaces anyway:

[root@kvm qemu-iotests]# ./check -qcow2 -nocache 169
QEMU          -- "/work/src/post 
copy/tests/qemu-iotests/../../x86_64-softmmu/qemu-system-x86_64" 
-nodefaults -machine accel=qtest
QEMU_IMG      -- "/work/src/post copy/tests/qemu-iotests/../../qemu-img"
QEMU_IO       -- "/work/src/post copy/tests/qemu-iotests/../../qemu-io"  
-f qcow2 --cache none
QEMU_NBD      -- "/work/src/post copy/tests/qemu-iotests/../../qemu-nbd"
IMGFMT        -- qcow2 (compat=1.1)
IMGPROTO      -- file
PLATFORM      -- Linux/x86_64 kvm 3.10.0-327.36.1.vz7.20.9
TEST_DIR      -- /work/src/post copy/tests/qemu-iotests/scratch
SOCKET_SCM_HELPER -- /work/src/post 
copy/tests/qemu-iotests/socket_scm_helper

169 33s ..../check: line 306: $tmp.out: ambiguous redirect
  [failed, exit status 1] - output mismatch (see 169.out.bad)
mv: target '169.out.bad' is not a directory
diff: 169.out.bad: No such file or directory
./check: line 158: [: too many arguments
./check: line 171: [: /work/src/post: binary operator expected
Failures: 169
Failed 1 of 1 tests
[root@kvm qemu-iotests]# pwd
/work/src/post copy/tests/qemu-iotests

>
>>
>> Reviewed-by: Max Reitz <mreitz@redhat.com>
>>
>>> +                                'write %d %d' % (r['start'], 
>>> r['count']))
>>> +
>>> +        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
>>> +                               node='drive0', name='bitmap')
>>> +        sha256 = result['return']['sha256']
>>> +
>>> +        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)
>>> +        time.sleep(2)
>>> +
>>> +        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()
>>> diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
>>> new file mode 100644
>>> index 0000000..ae1213e
>>> --- /dev/null
>>> +++ b/tests/qemu-iotests/169.out
>>> @@ -0,0 +1,5 @@
>>> +.
>>> +----------------------------------------------------------------------
>>> +Ran 1 tests
>>> +
>>> +OK
>>> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
>>> index 866c1a0..5dc75ef 100644
>>> --- a/tests/qemu-iotests/group
>>> +++ b/tests/qemu-iotests/group
>>> @@ -162,6 +162,7 @@
>>>   159 rw auto quick
>>>   160 rw auto quick
>>>   162 auto quick
>>> +169 rw auto quick
>>>   170 rw auto quick
>>>   171 rw auto quick
>>>   172 auto
>>>
>>
>
>
Max Reitz Feb. 3, 2017, 7:06 p.m. UTC | #4
On 03.02.2017 11:10, Vladimir Sementsov-Ogievskiy wrote:
> 02.02.2017 02:12, Max Reitz wrote:
>> On 22.11.2016 18:54, Vladimir Sementsov-Ogievskiy wrote:
>>> The test starts two vms (vm_a, vm_b), create dirty bitmap in
>>> the first one, do several writes to corresponding device and
>>> then migrate vm_a to vm_b with dirty bitmaps.
>>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>   tests/qemu-iotests/169     | 86
>>> ++++++++++++++++++++++++++++++++++++++++++++++
>>>   tests/qemu-iotests/169.out |  5 +++
>>>   tests/qemu-iotests/group   |  1 +
>>>   3 files changed, 92 insertions(+)
>>>   create mode 100755 tests/qemu-iotests/169
>>>   create mode 100644 tests/qemu-iotests/169.out
>>>
>>> diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
>>> new file mode 100755
>>> index 0000000..58b1ab1
>>> --- /dev/null
>>> +++ b/tests/qemu-iotests/169
>>> @@ -0,0 +1,86 @@
>>> +#!/usr/bin/env python
>>> +#
>>> +# Tests for dirty bitmaps migration.
>>> +#
>>> +# Copyright (C) Vladimir Sementsov-Ogievskiy 2015-2016
>>> +#
>>> +# 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')
>>> +fifo = os.path.join(iotests.test_dir, 'mig_fifo')
>>> +
>>> +class TestDirtyBitmapMigration(iotests.QMPTestCase):
>>> +
>>> +    def setUp(self):
>>> +        size = 0x400000000 # 1G
>> I can already see someone on macOS complaining that this test eats their
>> hard drive when running it for raw images... But we can still amend it
>> once somebody complains. O:-)
>>
>> I think 1 GB is not overly large, but it's reasonable to use such a
>> rather large value for this test.
>>
>>> +        os.mkfifo(fifo)
>>> +        qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
>>> +        qemu_img('create', '-f', iotests.imgfmt, disk_b, str(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_migration("exec: cat " + fifo)
>> I guess this will break if the path contains white space. Is there
>> something we can do about that?
>>
>> (You don't need to protect against quotes or something, just white
>> space.)
>>
>>> +        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):
>>> +        granularity = 512
>>> +        regions = [
>>> +            { 'start': 0,           'count': 0x100000 },
>>> +            { 'start': 0x100000000, 'count': 0x200000  },
>>> +            { 'start': 0x399900000, 'count': 0x100000  }
>>> +            ]
>>> +
>>> +        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
>>> +                               name='bitmap', granularity=granularity)
>>> +        self.assert_qmp(result, 'return', {});
>>> +
>>> +        for r in regions:
>>> +          self.vm_a.hmp_qemu_io('drive0',
>> This line isn't aligned to four spaces.
>>
>> With that fixed, and if you deem fixing the white space issue too
>> complicated:
> 
> may be, just add quotes, like
> 
> self.vm_b.add_incoming_migration("exec: cat '" + fifo + "'")

Yep, that would be fine with me.

Max

> 
> 
> ?
> 
>>
>> Reviewed-by: Max Reitz <mreitz@redhat.com>
>>
>>> +                                'write %d %d' % (r['start'],
>>> r['count']))
>>> +
>>> +        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
>>> +                               node='drive0', name='bitmap')
>>> +        sha256 = result['return']['sha256']
>>> +
>>> +        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)
>>> +        time.sleep(2)
>>> +
>>> +        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()
>>> diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
>>> new file mode 100644
>>> index 0000000..ae1213e
>>> --- /dev/null
>>> +++ b/tests/qemu-iotests/169.out
>>> @@ -0,0 +1,5 @@
>>> +.
>>> +----------------------------------------------------------------------
>>> +Ran 1 tests
>>> +
>>> +OK
>>> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
>>> index 866c1a0..5dc75ef 100644
>>> --- a/tests/qemu-iotests/group
>>> +++ b/tests/qemu-iotests/group
>>> @@ -162,6 +162,7 @@
>>>   159 rw auto quick
>>>   160 rw auto quick
>>>   162 auto quick
>>> +169 rw auto quick
>>>   170 rw auto quick
>>>   171 rw auto quick
>>>   172 auto
>>>
>>
> 
>
Max Reitz Feb. 3, 2017, 7:07 p.m. UTC | #5
On 03.02.2017 12:08, Vladimir Sementsov-Ogievskiy wrote:
> 03.02.2017 13:10, Vladimir Sementsov-Ogievskiy wrote:
>> 02.02.2017 02:12, Max Reitz wrote:
>>> On 22.11.2016 18:54, Vladimir Sementsov-Ogievskiy wrote:
>>>> The test starts two vms (vm_a, vm_b), create dirty bitmap in
>>>> the first one, do several writes to corresponding device and
>>>> then migrate vm_a to vm_b with dirty bitmaps.
>>>>
>>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>> ---
>>>>   tests/qemu-iotests/169     | 86
>>>> ++++++++++++++++++++++++++++++++++++++++++++++
>>>>   tests/qemu-iotests/169.out |  5 +++
>>>>   tests/qemu-iotests/group   |  1 +
>>>>   3 files changed, 92 insertions(+)
>>>>   create mode 100755 tests/qemu-iotests/169
>>>>   create mode 100644 tests/qemu-iotests/169.out
>>>>
>>>> diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
>>>> new file mode 100755
>>>> index 0000000..58b1ab1
>>>> --- /dev/null
>>>> +++ b/tests/qemu-iotests/169
>>>> @@ -0,0 +1,86 @@
>>>> +#!/usr/bin/env python
>>>> +#
>>>> +# Tests for dirty bitmaps migration.
>>>> +#
>>>> +# Copyright (C) Vladimir Sementsov-Ogievskiy 2015-2016
>>>> +#
>>>> +# 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')
>>>> +fifo = os.path.join(iotests.test_dir, 'mig_fifo')
>>>> +
>>>> +class TestDirtyBitmapMigration(iotests.QMPTestCase):
>>>> +
>>>> +    def setUp(self):
>>>> +        size = 0x400000000 # 1G
>>> I can already see someone on macOS complaining that this test eats their
>>> hard drive when running it for raw images... But we can still amend it
>>> once somebody complains. O:-)
>>>
>>> I think 1 GB is not overly large, but it's reasonable to use such a
>>> rather large value for this test.
>>>
>>>> +        os.mkfifo(fifo)
>>>> +        qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
>>>> +        qemu_img('create', '-f', iotests.imgfmt, disk_b, str(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_migration("exec: cat " + fifo)
>>> I guess this will break if the path contains white space. Is there
>>> something we can do about that?
>>>
>>> (You don't need to protect against quotes or something, just white
>>> space.)
>>>
>>>> +        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):
>>>> +        granularity = 512
>>>> +        regions = [
>>>> +            { 'start': 0,           'count': 0x100000 },
>>>> +            { 'start': 0x100000000, 'count': 0x200000  },
>>>> +            { 'start': 0x399900000, 'count': 0x100000  }
>>>> +            ]
>>>> +
>>>> +        result = self.vm_a.qmp('block-dirty-bitmap-add',
>>>> node='drive0',
>>>> +                               name='bitmap', granularity=granularity)
>>>> +        self.assert_qmp(result, 'return', {});
>>>> +
>>>> +        for r in regions:
>>>> +          self.vm_a.hmp_qemu_io('drive0',
>>> This line isn't aligned to four spaces.
>>>
>>> With that fixed, and if you deem fixing the white space issue too
>>> complicated:
>>
>> may be, just add quotes, like
>>
>> self.vm_b.add_incoming_migration("exec: cat '" + fifo + "'")
>>
>>
>> ?
> 
> looks like ./check doesn't work with spaces anyway:
> 
> [root@kvm qemu-iotests]# ./check -qcow2 -nocache 169
> QEMU          -- "/work/src/post
> copy/tests/qemu-iotests/../../x86_64-softmmu/qemu-system-x86_64"
> -nodefaults -machine accel=qtest
> QEMU_IMG      -- "/work/src/post copy/tests/qemu-iotests/../../qemu-img"
> QEMU_IO       -- "/work/src/post copy/tests/qemu-iotests/../../qemu-io" 
> -f qcow2 --cache none
> QEMU_NBD      -- "/work/src/post copy/tests/qemu-iotests/../../qemu-nbd"
> IMGFMT        -- qcow2 (compat=1.1)
> IMGPROTO      -- file
> PLATFORM      -- Linux/x86_64 kvm 3.10.0-327.36.1.vz7.20.9
> TEST_DIR      -- /work/src/post copy/tests/qemu-iotests/scratch
> SOCKET_SCM_HELPER -- /work/src/post
> copy/tests/qemu-iotests/socket_scm_helper
> 
> 169 33s ..../check: line 306: $tmp.out: ambiguous redirect
>  [failed, exit status 1] - output mismatch (see 169.out.bad)
> mv: target '169.out.bad' is not a directory
> diff: 169.out.bad: No such file or directory
> ./check: line 158: [: too many arguments
> ./check: line 171: [: /work/src/post: binary operator expected
> Failures: 169
> Failed 1 of 1 tests
> [root@kvm qemu-iotests]# pwd
> /work/src/post copy/tests/qemu-iotests

Hm, too bad. I remember someone once fixing everything, but apparently
it broke again...

Nonetheless, I'd rather not introduce new issues into newly added code.
Perhaps some day someone can once again fix all of the current issues...

Max

Patch
diff mbox

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
new file mode 100755
index 0000000..58b1ab1
--- /dev/null
+++ b/tests/qemu-iotests/169
@@ -0,0 +1,86 @@ 
+#!/usr/bin/env python
+#
+# Tests for dirty bitmaps migration.
+#
+# Copyright (C) Vladimir Sementsov-Ogievskiy 2015-2016
+#
+# 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')
+fifo = os.path.join(iotests.test_dir, 'mig_fifo')
+
+class TestDirtyBitmapMigration(iotests.QMPTestCase):
+
+    def setUp(self):
+        size = 0x400000000 # 1G
+        os.mkfifo(fifo)
+        qemu_img('create', '-f', iotests.imgfmt, disk_a, str(size))
+        qemu_img('create', '-f', iotests.imgfmt, disk_b, str(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_migration("exec: cat " + fifo)
+        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):
+        granularity = 512
+        regions = [
+            { 'start': 0,           'count': 0x100000 },
+            { 'start': 0x100000000, 'count': 0x200000  },
+            { 'start': 0x399900000, 'count': 0x100000  }
+            ]
+
+        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
+                               name='bitmap', granularity=granularity)
+        self.assert_qmp(result, 'return', {});
+
+        for r in regions:
+          self.vm_a.hmp_qemu_io('drive0',
+                                'write %d %d' % (r['start'], r['count']))
+
+        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
+                               node='drive0', name='bitmap')
+        sha256 = result['return']['sha256']
+
+        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)
+        time.sleep(2)
+
+        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()
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
new file mode 100644
index 0000000..ae1213e
--- /dev/null
+++ b/tests/qemu-iotests/169.out
@@ -0,0 +1,5 @@ 
+.
+----------------------------------------------------------------------
+Ran 1 tests
+
+OK
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index 866c1a0..5dc75ef 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -162,6 +162,7 @@ 
 159 rw auto quick
 160 rw auto quick
 162 auto quick
+169 rw auto quick
 170 rw auto quick
 171 rw auto quick
 172 auto