All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: qemu-block@nongnu.org, qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, armbru@redhat.com, eblake@redhat.com,
	famz@redhat.com, stefanha@redhat.com, amit.shah@redhat.com,
	quintela@redhat.com, mreitz@redhat.com, kwolf@redhat.com,
	peter.maydell@linaro.org, dgilbert@redhat.com, den@openvz.org,
	jsnow@redhat.com, vsementsov@virtuozzo.com, lirans@il.ibm.com
Subject: [Qemu-devel] [PATCH v9 12/13] iotests: add dirty bitmap migration test
Date: Wed, 20 Dec 2017 18:49:44 +0300	[thread overview]
Message-ID: <20171220154945.88410-13-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20171220154945.88410-1-vsementsov@virtuozzo.com>

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.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 tests/qemu-iotests/169     | 139 +++++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/169.out |   5 ++
 tests/qemu-iotests/group   |   1 +
 3 files changed, 145 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 0000000000..4b82399591
--- /dev/null
+++ b/tests/qemu-iotests/169
@@ -0,0 +1,139 @@
+#!/usr/bin/env python
+#
+# Tests for dirty bitmaps 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
+import itertools
+import operator
+import new
+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 = '1M'
+mig_file = os.path.join(iotests.test_dir, 'mig_file')
+
+
+class TestDirtyBitmapMigration(iotests.QMPTestCase):
+    def tearDown(self):
+        self.vm_a.shutdown()
+        self.vm_b.shutdown()
+        os.remove(disk_a)
+        os.remove(disk_b)
+        os.remove(mig_file)
+
+    def setUp(self):
+        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_a.launch()
+
+        self.vm_b = iotests.VM(path_suffix='b')
+        self.vm_b.add_incoming("exec: cat '" + mig_file + "'")
+
+    def add_bitmap(self, vm, granularity, persistent):
+        params = {'node': 'drive0',
+                  'name': 'bitmap0',
+                  'granularity': granularity}
+        if persistent:
+            params['persistent'] = True
+            params['autoload'] = True
+
+        result = vm.qmp('block-dirty-bitmap-add', **params)
+        self.assert_qmp(result, 'return', {});
+
+    def get_bitmap_hash(self, vm):
+        result = vm.qmp('x-debug-block-dirty-bitmap-sha256',
+                        node='drive0', name='bitmap0')
+        return result['return']['sha256']
+
+    def check_bitmap(self, vm, sha256):
+        result = vm.qmp('x-debug-block-dirty-bitmap-sha256',
+                        node='drive0', name='bitmap0')
+        if sha256:
+            self.assert_qmp(result, 'return/sha256', sha256);
+        else:
+            self.assert_qmp(result, 'error/desc',
+                            "Dirty bitmap 'bitmap0' not found");
+
+    def do_test_migration(self, persistent=False, shared_storage=False,
+                          migrate_bitmaps=True, online=True):
+        granularity = 512
+
+        # regions = ((start, count), ...)
+        regions = ((0, 0x10000),
+                   (0xf0000, 0x10000),
+                   (0xa0201, 0x1000))
+
+        should_migrate = migrate_bitmaps or persistent and shared_storage
+
+        self.vm_b.add_drive(disk_a if shared_storage else disk_b)
+
+        if online:
+            os.mkfifo(mig_file)
+            self.vm_b.launch()
+
+        self.add_bitmap(self.vm_a, granularity, persistent)
+        for r in regions:
+            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % r)
+        sha256 = self.get_bitmap_hash(self.vm_a)
+
+        if migrate_bitmaps:
+            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>' + mig_file)
+        self.vm_a.event_wait("STOP")
+
+        if not online:
+            self.vm_a.shutdown()
+            self.vm_b.launch()
+
+        self.vm_b.event_wait("RESUME", timeout=10.0)
+
+        self.check_bitmap(self.vm_b, sha256 if should_migrate else False)
+
+        if should_migrate:
+            self.vm_b.shutdown()
+            self.vm_b.launch()
+            self.check_bitmap(self.vm_b, sha256 if persistent else False)
+
+
+def inject_test_case(klass, name, method, *args, **kwargs):
+    mc = operator.methodcaller(method, *args, **kwargs)
+    setattr(klass, 'test_' + name, new.instancemethod(mc, None, klass))
+
+
+for cmb in list(itertools.product((True, False), repeat=4)):
+    name = ('_' if cmb[0] else '_not_') + 'persistent_'
+    name += ('_' if cmb[1] else '_not_') + 'shared_'
+    name += ('_' if cmb[2] else '_not_') + 'migbitmap_'
+    name += '_online' if cmb[3] else '_offline'
+
+    inject_test_case(TestDirtyBitmapMigration, name, 'do_test_migration', *cmb)
+
+
+if __name__ == '__main__':
+    iotests.main(supported_fmts=['qcow2'])
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
new file mode 100644
index 0000000000..b6f257674e
--- /dev/null
+++ b/tests/qemu-iotests/169.out
@@ -0,0 +1,5 @@
+................
+----------------------------------------------------------------------
+Ran 16 tests
+
+OK
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index 3e688678dd..e879c7ebc7 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -169,6 +169,7 @@
 162 auto quick
 163 rw auto quick
 165 rw auto quick
+169 rw auto quick
 170 rw auto quick
 171 rw auto quick
 172 auto
-- 
2.11.1

  parent reply	other threads:[~2017-12-20 15:50 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-20 15:49 [Qemu-devel] [PATCH v9 00/13] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 01/13] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
2017-12-28  5:16   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 02/13] block/dirty-bitmap: fix locking in bdrv_reclaim_dirty_bitmap Vladimir Sementsov-Ogievskiy
2017-12-28  5:20   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 03/13] block/dirty-bitmap: add _locked version of bdrv_reclaim_dirty_bitmap Vladimir Sementsov-Ogievskiy
2017-12-28  5:24   ` Fam Zheng
2017-12-28 11:16     ` Vladimir Sementsov-Ogievskiy
2017-12-29  1:31       ` Fam Zheng
2018-01-18  8:43         ` Paolo Bonzini
2018-01-18  9:55           ` Vladimir Sementsov-Ogievskiy
2018-01-18 10:09             ` Paolo Bonzini
2018-01-19 14:12               ` Vladimir Sementsov-Ogievskiy
2018-01-22 12:14                 ` Vladimir Sementsov-Ogievskiy
2018-01-22 17:50                   ` John Snow
2018-01-24 10:16                   ` Paolo Bonzini
2018-01-24 22:29                     ` John Snow
2018-02-06 14:53                     ` Vladimir Sementsov-Ogievskiy
2018-02-12 17:30               ` Vladimir Sementsov-Ogievskiy
2018-02-13  7:45                 ` Paolo Bonzini
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 04/13] dirty-bitmap: add locked state Vladimir Sementsov-Ogievskiy
2017-12-22  2:03   ` John Snow
2017-12-22  9:37     ` Vladimir Sementsov-Ogievskiy
2017-12-22  8:46   ` Vladimir Sementsov-Ogievskiy
2017-12-28  5:32   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 05/13] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 06/13] qapi: add dirty-bitmaps migration capability Vladimir Sementsov-Ogievskiy
2017-12-28  5:41   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 07/13] migration: include migrate_dirty_bitmaps in migrate_postcopy Vladimir Sementsov-Ogievskiy
2017-12-28  5:42   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 08/13] migration/qemu-file: add qemu_put_counted_string() Vladimir Sementsov-Ogievskiy
2017-12-28  5:48   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 09/13] migration: add is_active_iterate handler Vladimir Sementsov-Ogievskiy
2017-12-28  5:50   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 10/13] migration: add postcopy migration of dirty bitmaps Vladimir Sementsov-Ogievskiy
2017-12-28  6:14   ` Fam Zheng
2017-12-28 11:47     ` Vladimir Sementsov-Ogievskiy
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 11/13] iotests: add default node-name Vladimir Sementsov-Ogievskiy
2017-12-28  6:15   ` Fam Zheng
2017-12-20 15:49 ` Vladimir Sementsov-Ogievskiy [this message]
2017-12-28  6:28   ` [Qemu-devel] [PATCH v9 12/13] iotests: add dirty bitmap migration test Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test Vladimir Sementsov-Ogievskiy
2017-12-28  6:33   ` Fam Zheng
2017-12-28 11:49     ` Vladimir Sementsov-Ogievskiy
2018-01-17 18:30       ` John Snow
2018-01-18  9:57         ` Vladimir Sementsov-Ogievskiy
2018-01-19 18:08           ` Vladimir Sementsov-Ogievskiy
2018-01-19 18:20             ` John Snow
2018-01-20  0:37             ` John Snow
2018-01-22  9:06               ` Vladimir Sementsov-Ogievskiy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171220154945.88410-13-vsementsov@virtuozzo.com \
    --to=vsementsov@virtuozzo.com \
    --cc=amit.shah@redhat.com \
    --cc=armbru@redhat.com \
    --cc=den@openvz.org \
    --cc=dgilbert@redhat.com \
    --cc=eblake@redhat.com \
    --cc=famz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lirans@il.ibm.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.