All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 18/29] qemu-iotests: Test block-stream operations in parallel
Date: Mon, 31 Oct 2016 18:25:47 +0100	[thread overview]
Message-ID: <1477934758-29332-19-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1477934758-29332-1-git-send-email-kwolf@redhat.com>

From: Alberto Garcia <berto@igalia.com>

This test case checks that it's possible to launch several stream
operations in parallel in the same snapshot chain, each one involving
a different set of nodes.

Signed-off-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 tests/qemu-iotests/030     | 80 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/030.out |  4 +--
 2 files changed, 82 insertions(+), 2 deletions(-)

diff --git a/tests/qemu-iotests/030 b/tests/qemu-iotests/030
index 8b0212c..ba9a541 100755
--- a/tests/qemu-iotests/030
+++ b/tests/qemu-iotests/030
@@ -148,6 +148,86 @@ class TestSingleDrive(iotests.QMPTestCase):
         self.assert_qmp(result, 'error/class', 'GenericError')
 
 
+class TestParallelOps(iotests.QMPTestCase):
+    num_ops = 4 # Number of parallel block-stream operations
+    num_imgs = num_ops * 2 + 1
+    image_len = num_ops * 1024 * 1024
+    imgs = []
+
+    def setUp(self):
+        opts = []
+        self.imgs = []
+
+        # Initialize file names and command-line options
+        for i in range(self.num_imgs):
+            img_depth = self.num_imgs - i - 1
+            opts.append("backing." * img_depth + "node-name=node%d" % i)
+            self.imgs.append(os.path.join(iotests.test_dir, 'img-%d.img' % i))
+
+        # Create all images
+        iotests.create_image(self.imgs[0], self.image_len)
+        for i in range(1, self.num_imgs):
+            qemu_img('create', '-f', iotests.imgfmt,
+                     '-o', 'backing_file=%s' % self.imgs[i-1], self.imgs[i])
+
+        # Put data into the images we are copying data from
+        for i in range(self.num_imgs / 2):
+            img_index = i * 2 + 1
+            # Alternate between 512k and 1M.
+            # This way jobs will not finish in the same order they were created
+            num_kb = 512 + 512 * (i % 2)
+            qemu_io('-f', iotests.imgfmt,
+                    '-c', 'write -P %d %d %d' % (i, i*1024*1024, num_kb * 1024),
+                    self.imgs[img_index])
+
+        # Attach the drive to the VM
+        self.vm = iotests.VM()
+        self.vm.add_drive(self.imgs[-1], ','.join(opts))
+        self.vm.launch()
+
+    def tearDown(self):
+        self.vm.shutdown()
+        for img in self.imgs:
+            os.remove(img)
+
+    # Test that it's possible to run several block-stream operations
+    # in parallel in the same snapshot chain
+    def test_stream_parallel(self):
+        self.assert_no_active_block_jobs()
+
+        # Check that the maps don't match before the streaming operations
+        for i in range(2, self.num_imgs, 2):
+            self.assertNotEqual(qemu_io('-f', iotests.imgfmt, '-c', 'map', self.imgs[i]),
+                                qemu_io('-f', iotests.imgfmt, '-c', 'map', self.imgs[i-1]),
+                                'image file map matches backing file before streaming')
+
+        # Create all streaming jobs
+        pending_jobs = []
+        for i in range(2, self.num_imgs, 2):
+            node_name = 'node%d' % i
+            job_id = 'stream-%s' % node_name
+            pending_jobs.append(job_id)
+            result = self.vm.qmp('block-stream', device=node_name, job_id=job_id, base=self.imgs[i-2], speed=512*1024)
+            self.assert_qmp(result, 'return', {})
+
+        # Wait for all jobs to be finished.
+        while len(pending_jobs) > 0:
+            for event in self.vm.get_qmp_events(wait=True):
+                if event['event'] == 'BLOCK_JOB_COMPLETED':
+                    job_id = self.dictpath(event, 'data/device')
+                    self.assertTrue(job_id in pending_jobs)
+                    self.assert_qmp_absent(event, 'data/error')
+                    pending_jobs.remove(job_id)
+
+        self.assert_no_active_block_jobs()
+        self.vm.shutdown()
+
+        # Check that all maps match now
+        for i in range(2, self.num_imgs, 2):
+            self.assertEqual(qemu_io('-f', iotests.imgfmt, '-c', 'map', self.imgs[i]),
+                             qemu_io('-f', iotests.imgfmt, '-c', 'map', self.imgs[i-1]),
+                             'image file map does not match backing file after streaming')
+
 class TestSmallerBackingFile(iotests.QMPTestCase):
     backing_len = 1 * 1024 * 1024 # MB
     image_len = 2 * backing_len
diff --git a/tests/qemu-iotests/030.out b/tests/qemu-iotests/030.out
index 96961ed..b6f2576 100644
--- a/tests/qemu-iotests/030.out
+++ b/tests/qemu-iotests/030.out
@@ -1,5 +1,5 @@
-...............
+................
 ----------------------------------------------------------------------
-Ran 15 tests
+Ran 16 tests
 
 OK
-- 
1.8.3.1

  parent reply	other threads:[~2016-10-31 17:26 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-31 17:25 [Qemu-devel] [PULL 00/29] Block layer patches Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 01/29] block/ssh: Add ssh_has_filename_options_conflict() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 02/29] util/qemu-sockets: Make inet_connect_saddr() public Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 03/29] block/ssh: Add InetSocketAddress and accept it Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 04/29] block/ssh: Use InetSocketAddress options Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 05/29] qapi: allow blockdev-add for ssh Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 06/29] block: Add bdrv_drain_all_{begin,end}() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 07/29] block: Pause all jobs during bdrv_reopen_multiple() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 08/29] block: Add block_job_add_bdrv() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 09/29] block: Use block_job_add_bdrv() in mirror_start_job() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 10/29] block: Use block_job_add_bdrv() in backup_start() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 11/29] block: Check blockers in all nodes involved in a block-commit job Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 12/29] block: Block all nodes involved in the block-commit operation Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 13/29] block: Block all intermediate nodes in commit_active_start() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 14/29] block: Support streaming to an intermediate layer Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 15/29] block: Add QMP support for " Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 16/29] docs: Document how to stream " Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 17/29] qemu-iotests: Test streaming " Kevin Wolf
2016-10-31 17:25 ` Kevin Wolf [this message]
2016-10-31 17:25 ` [Qemu-devel] [PULL 19/29] qemu-iotests: Test overlapping stream and commit operations Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 20/29] qemu-iotests: Test block-stream and block-commit in parallel Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 21/29] qemu-iotests: Add iotests.supports_quorum() Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 22/29] qemu-iotests: Test streaming to a Quorum child Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 23/29] block: Add 'base-node' parameter to the 'block-stream' command Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 24/29] qemu-iotests: Test the 'base-node' parameter of 'block-stream' Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 25/29] raw_bsd: add offset and size options Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 26/29] qemu-iotests: test 'offset' and 'size' options in raw driver Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 27/29] block: Mention replication in BlockdevDriver enum docs Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 28/29] block/nfs: Introduce runtime_opts in NFS Kevin Wolf
2016-10-31 17:25 ` [Qemu-devel] [PULL 29/29] qapi: allow blockdev-add for NFS Kevin Wolf
2016-10-31 18:18 ` [Qemu-devel] [PULL 00/29] Block layer patches Peter Maydell

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=1477934758-29332-19-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /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.