All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	qemu-devel@nongnu.org, qemu-block@nongnu.org
Subject: Re: [PATCH v4 18/19] iotests: Add tests for invalid Quorum @replaces
Date: Tue, 18 Feb 2020 13:38:27 +0100	[thread overview]
Message-ID: <20200218123827.GC6157@linux.fritz.box> (raw)
In-Reply-To: <20200218103454.296704-19-mreitz@redhat.com>

Am 18.02.2020 um 11:34 hat Max Reitz geschrieben:
> 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>
> ---
>  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..53c8671969 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'^qemu-system-[^:]*: ', '', log)

I would have applied the series, but:

+.........................F....................................................................
+======================================================================
+FAIL: test_with_other_parents_after_mirror_start (__main__.TestRepairQuorum)
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "041", line 1099, in test_with_other_parents_after_mirror_start
+    "it can no longer be guaranteed that doing so would " +
+AssertionError: "qemu: Can no longer replace 'img1' by 're[107 chars]data" != "Can no longer replace 'img1' by 'repair0'[101 chars]data"
+- qemu: 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
+? ------
++ 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
+
+

If you agree, I can just change this line while applying into:

    log = re.sub(r'^qemu[^:]*: ', '', log)

Kevin



  reply	other threads:[~2020-02-18 12:39 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-18 10:34 [PATCH v4 00/19] block: Fix check_to_replace_node() Max Reitz
2020-02-18 10:34 ` [PATCH v4 01/19] blockdev: Allow external snapshots everywhere Max Reitz
2020-02-18 10:34 ` [PATCH v4 02/19] blockdev: Allow resizing everywhere Max Reitz
2020-02-18 10:34 ` [PATCH v4 03/19] block: Drop bdrv_is_first_non_filter() Max Reitz
2020-02-18 10:34 ` [PATCH v4 04/19] iotests: Let 041 use -blockdev for quorum children Max Reitz
2020-02-18 10:34 ` [PATCH v4 05/19] quorum: Fix child permissions Max Reitz
2020-02-18 10:34 ` [PATCH v4 06/19] block: Add bdrv_recurse_can_replace() Max Reitz
2020-02-18 10:34 ` [PATCH v4 07/19] blkverify: Implement .bdrv_recurse_can_replace() Max Reitz
2020-02-18 10:34 ` [PATCH v4 08/19] quorum: " Max Reitz
2020-02-18 10:34 ` [PATCH v4 09/19] block: Use bdrv_recurse_can_replace() Max Reitz
2020-02-18 10:34 ` [PATCH v4 10/19] block: Remove bdrv_recurse_is_first_non_filter() Max Reitz
2020-02-18 10:34 ` [PATCH v4 11/19] mirror: Double-check immediately before replacing Max Reitz
2020-02-18 10:34 ` [PATCH v4 12/19] quorum: Stop marking it as a filter Max Reitz
2020-02-18 10:34 ` [PATCH v4 13/19] iotests: Use complete_and_wait() in 155 Max Reitz
2020-02-18 10:34 ` [PATCH v4 14/19] iotests: Add VM.assert_block_path() Max Reitz
2020-02-18 10:34 ` [PATCH v4 15/19] iotests/041: Drop superfluous shutdowns Max Reitz
2020-02-18 10:34 ` [PATCH v4 16/19] iotests: Resolve TODOs in 041 Max Reitz
2020-02-18 10:34 ` [PATCH v4 17/19] iotests: Use self.image_len in TestRepairQuorum Max Reitz
2020-02-18 10:34 ` [PATCH v4 18/19] iotests: Add tests for invalid Quorum @replaces Max Reitz
2020-02-18 12:38   ` Kevin Wolf [this message]
2020-02-18 12:49     ` Max Reitz
2020-02-18 13:29       ` Kevin Wolf
2020-02-18 10:34 ` [PATCH v4 19/19] iotests: Check that @replaces can replace filters Max Reitz
2020-02-18 13:53 ` [PATCH v4 00/19] block: Fix check_to_replace_node() Kevin Wolf

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=20200218123827.GC6157@linux.fritz.box \
    --to=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vsementsov@virtuozzo.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.