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, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [PULL 35/36] iotests: Add tests for invalid Quorum @replaces
Date: Tue, 18 Feb 2020 15:07:21 +0100	[thread overview]
Message-ID: <20200218140722.23876-36-kwolf@redhat.com> (raw)
In-Reply-To: <20200218140722.23876-1-kwolf@redhat.com>

From: Max Reitz <mreitz@redhat.com>

Add two tests to see that you cannot replace a Quorum child with the
mirror job while the child is in use by a different parent.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20200218103454.296704-19-mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 tests/qemu-iotests/041     | 70 +++++++++++++++++++++++++++++++++++++-
 tests/qemu-iotests/041.out |  4 +--
 2 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
index 1d9e64ff6d..7af6de9124 100755
--- a/tests/qemu-iotests/041
+++ b/tests/qemu-iotests/041
@@ -20,6 +20,7 @@
 
 import time
 import os
+import re
 import iotests
 from iotests import qemu_img, qemu_io
 
@@ -34,6 +35,8 @@ quorum_img3 = os.path.join(iotests.test_dir, 'quorum3.img')
 quorum_repair_img = os.path.join(iotests.test_dir, 'quorum_repair.img')
 quorum_snapshot_file = os.path.join(iotests.test_dir, 'quorum_snapshot.img')
 
+nbd_sock_path = os.path.join(iotests.test_dir, 'nbd.sock')
+
 class TestSingleDrive(iotests.QMPTestCase):
     image_len = 1 * 1024 * 1024 # MB
     qmp_cmd = 'drive-mirror'
@@ -892,7 +895,8 @@ class TestRepairQuorum(iotests.QMPTestCase):
 
     def tearDown(self):
         self.vm.shutdown()
-        for i in self.IMAGES + [ quorum_repair_img, quorum_snapshot_file ]:
+        for i in self.IMAGES + [ quorum_repair_img, quorum_snapshot_file,
+                                 nbd_sock_path ]:
             # Do a try/except because the test may have deleted some images
             try:
                 os.remove(i)
@@ -1032,6 +1036,70 @@ class TestRepairQuorum(iotests.QMPTestCase):
         self.assert_has_block_node("repair0", quorum_repair_img)
         self.vm.assert_block_path('quorum0', '/children.1', 'repair0')
 
+    def test_with_other_parent(self):
+        """
+        Check that we cannot replace a Quorum child when it has other
+        parents.
+        """
+        result = self.vm.qmp('nbd-server-start',
+                             addr={
+                                 'type': 'unix',
+                                 'data': {'path': nbd_sock_path}
+                             })
+        self.assert_qmp(result, 'return', {})
+
+        result = self.vm.qmp('nbd-server-add', device='img1')
+        self.assert_qmp(result, 'return', {})
+
+        result = self.vm.qmp('drive-mirror', job_id='mirror', device='quorum0',
+                             sync='full', node_name='repair0', replaces='img1',
+                             target=quorum_repair_img, format=iotests.imgfmt)
+        self.assert_qmp(result, 'error/desc',
+                        "Cannot replace 'img1' by a node mirrored from "
+                        "'quorum0', because it cannot be guaranteed that doing "
+                        "so would not lead to an abrupt change of visible data")
+
+    def test_with_other_parents_after_mirror_start(self):
+        """
+        The same as test_with_other_parent(), but add the NBD server
+        only when the mirror job is already running.
+        """
+        result = self.vm.qmp('nbd-server-start',
+                             addr={
+                                 'type': 'unix',
+                                 'data': {'path': nbd_sock_path}
+                             })
+        self.assert_qmp(result, 'return', {})
+
+        result = self.vm.qmp('drive-mirror', job_id='mirror', device='quorum0',
+                             sync='full', node_name='repair0', replaces='img1',
+                             target=quorum_repair_img, format=iotests.imgfmt)
+        self.assert_qmp(result, 'return', {})
+
+        result = self.vm.qmp('nbd-server-add', device='img1')
+        self.assert_qmp(result, 'return', {})
+
+        # The full error message goes to stderr, we will check it later
+        self.complete_and_wait('mirror',
+                               completion_error='Operation not permitted')
+
+        # Should not have been replaced
+        self.vm.assert_block_path('quorum0', '/children.1', 'img1')
+
+        # Check the full error message now
+        self.vm.shutdown()
+        log = self.vm.get_log()
+        log = re.sub(r'^\[I \d+\.\d+\] OPENED\n', '', log)
+        log = re.sub(r'^Formatting.*\n', '', log)
+        log = re.sub(r'\n\[I \+\d+\.\d+\] CLOSED\n?$', '', log)
+        log = re.sub(r'^%s: ' % os.path.basename(iotests.qemu_prog), '', log)
+
+        self.assertEqual(log,
+                         "Can no longer replace 'img1' by 'repair0', because " +
+                         "it can no longer be guaranteed that doing so would " +
+                         "not lead to an abrupt change of visible data")
+
+
 # Test mirroring with a source that does not have any parents (not even a
 # BlockBackend)
 class TestOrphanedSource(iotests.QMPTestCase):
diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
index f496be9197..ffc779b4d1 100644
--- a/tests/qemu-iotests/041.out
+++ b/tests/qemu-iotests/041.out
@@ -1,5 +1,5 @@
-...........................................................................................
+.............................................................................................
 ----------------------------------------------------------------------
-Ran 91 tests
+Ran 93 tests
 
 OK
-- 
2.20.1



  parent reply	other threads:[~2020-02-18 14:28 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-18 14:06 [PULL 00/36] Block layer patches Kevin Wolf
2020-02-18 14:06 ` [PULL 01/36] mirror: Store MirrorOp.co for debuggability Kevin Wolf
2020-02-18 14:06 ` [PULL 02/36] mirror: Don't let an operation wait for itself Kevin Wolf
2020-02-18 14:06 ` [PULL 03/36] qcow2: Fix alignment checks in encrypted images Kevin Wolf
2020-02-18 14:06 ` [PULL 04/36] block/vvfat: Do not unref qcow on closing backing bdrv Kevin Wolf
2020-02-18 14:06 ` [PULL 05/36] qcow2: update_refcount(): Reset old_table_index after qcow2_cache_put() Kevin Wolf
2020-02-18 14:06 ` [PULL 06/36] qcow2: Fix qcow2_alloc_cluster_abort() for external data file Kevin Wolf
2020-02-18 14:06 ` [PULL 07/36] iotests: Test copy offloading with " Kevin Wolf
2020-02-18 14:06 ` [PULL 08/36] block/qcow2-bitmap: Remove unneeded variable assignment Kevin Wolf
2020-02-18 14:06 ` [PULL 09/36] qapi: Document meaning of 'ignore' BlockdevOnError for jobs Kevin Wolf
2020-02-18 14:06 ` [PULL 10/36] commit: Remove unused bytes_written Kevin Wolf
2020-02-18 14:06 ` [PULL 11/36] commit: Fix argument order for block_job_error_action() Kevin Wolf
2020-02-18 14:06 ` [PULL 12/36] commit: Inline commit_populate() Kevin Wolf
2020-02-18 14:06 ` [PULL 13/36] commit: Fix is_read for block_job_error_action() Kevin Wolf
2020-02-18 14:07 ` [PULL 14/36] commit: Expose on-error option in QMP Kevin Wolf
2020-02-18 14:07 ` [PULL 15/36] iotests: Test error handling policies with block-commit Kevin Wolf
2020-02-18 14:07 ` [PULL 16/36] block: Remove superfluous semicolons Kevin Wolf
2020-02-18 14:07 ` [PULL 17/36] block/io_uring: Remove superfluous semicolon Kevin Wolf
2020-02-18 14:07 ` [PULL 18/36] blockdev: Allow external snapshots everywhere Kevin Wolf
2020-02-18 14:07 ` [PULL 19/36] blockdev: Allow resizing everywhere Kevin Wolf
2020-02-18 14:07 ` [PULL 20/36] block: Drop bdrv_is_first_non_filter() Kevin Wolf
2020-02-18 14:07 ` [PULL 21/36] iotests: Let 041 use -blockdev for quorum children Kevin Wolf
2020-02-18 14:07 ` [PULL 22/36] quorum: Fix child permissions Kevin Wolf
2020-02-18 14:07 ` [PULL 23/36] block: Add bdrv_recurse_can_replace() Kevin Wolf
2020-02-18 14:07 ` [PULL 24/36] blkverify: Implement .bdrv_recurse_can_replace() Kevin Wolf
2020-02-18 14:07 ` [PULL 25/36] quorum: " Kevin Wolf
2020-02-18 14:07 ` [PULL 26/36] block: Use bdrv_recurse_can_replace() Kevin Wolf
2020-02-18 14:07 ` [PULL 27/36] block: Remove bdrv_recurse_is_first_non_filter() Kevin Wolf
2020-02-18 14:07 ` [PULL 28/36] mirror: Double-check immediately before replacing Kevin Wolf
2020-02-18 14:07 ` [PULL 29/36] quorum: Stop marking it as a filter Kevin Wolf
2020-02-18 14:07 ` [PULL 30/36] iotests: Use complete_and_wait() in 155 Kevin Wolf
2020-02-18 14:07 ` [PULL 31/36] iotests: Add VM.assert_block_path() Kevin Wolf
2020-02-18 14:07 ` [PULL 32/36] iotests/041: Drop superfluous shutdowns Kevin Wolf
2020-02-18 14:07 ` [PULL 33/36] iotests: Resolve TODOs in 041 Kevin Wolf
2020-02-18 14:07 ` [PULL 34/36] iotests: Use self.image_len in TestRepairQuorum Kevin Wolf
2020-02-18 14:07 ` Kevin Wolf [this message]
2020-02-18 14:07 ` [PULL 36/36] iotests: Check that @replaces can replace filters Kevin Wolf
2020-02-20 14:04 ` [PULL 00/36] 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=20200218140722.23876-36-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --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.