qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Kevin Wolf <kwolf@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>
Subject: [Qemu-devel] [PULL 12/29] iotests: Repairing error during snapshot deletion
Date: Mon, 11 Jun 2018 16:25:54 +0200	[thread overview]
Message-ID: <20180611142611.6609-13-mreitz@redhat.com> (raw)
In-Reply-To: <20180611142611.6609-1-mreitz@redhat.com>

This adds a test for an I/O error during snapshot deletion, and maybe
more importantly, for how to repair the resulting image.  If the
snapshot has been deleted before the error occurs, the only negative
result will be leaked clusters -- and those should be repairable with
qemu-img check -r leaks.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-id: 20180509200059.31125-3-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 tests/qemu-iotests/217     | 90 ++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/217.out | 42 ++++++++++++++++++
 tests/qemu-iotests/group   |  1 +
 3 files changed, 133 insertions(+)
 create mode 100755 tests/qemu-iotests/217
 create mode 100644 tests/qemu-iotests/217.out

diff --git a/tests/qemu-iotests/217 b/tests/qemu-iotests/217
new file mode 100755
index 0000000000..d3ab5d72be
--- /dev/null
+++ b/tests/qemu-iotests/217
@@ -0,0 +1,90 @@
+#!/bin/bash
+#
+# I/O errors when working with internal qcow2 snapshots, and repairing
+# the result
+#
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# 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/>.
+
+seq=$(basename $0)
+echo "QA output created by $seq"
+
+status=1	# failure is the default!
+
+_cleanup()
+{
+    _cleanup_test_img
+    rm -f "$TEST_DIR/blkdebug.conf"
+}
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+# This test is specific to qcow2
+_supported_fmt qcow2
+_supported_proto file
+_supported_os Linux
+
+# This test needs clusters with at least a refcount of 2 so that
+# OFLAG_COPIED is not set.  refcount_bits=1 is therefore unsupported.
+_unsupported_imgopts 'refcount_bits=1[^0-9]'
+
+echo
+echo '=== Simulating an I/O error during snapshot deletion ==='
+echo
+
+_make_test_img 64M
+$QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io
+
+# Create the snapshot
+$QEMU_IMG snapshot -c foo "$TEST_IMG"
+
+# Verify the snapshot is there
+echo
+_img_info | grep 'Snapshot list'
+echo '(Snapshot filtered)'
+echo
+
+# Try to delete the snapshot (with an error happening when freeing the
+# then leaked clusters)
+cat > "$TEST_DIR/blkdebug.conf" <<EOF
+[inject-error]
+event = "cluster_free"
+errno = "5"
+EOF
+$QEMU_IMG snapshot -d foo "blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG"
+
+# Verify the snapshot is gone
+echo
+_img_info | grep 'Snapshot list'
+
+# Should only show leaks
+echo '--- Checking test image ---'
+_check_test_img
+
+echo
+
+# As there are only leaks, this should be able to fully repair the
+# image
+echo '--- Repairing test image ---'
+_check_test_img -r leaks
+
+
+# success, all done
+echo '*** done'
+rm -f $seq.full
+status=0
diff --git a/tests/qemu-iotests/217.out b/tests/qemu-iotests/217.out
new file mode 100644
index 0000000000..e3fc40a8c7
--- /dev/null
+++ b/tests/qemu-iotests/217.out
@@ -0,0 +1,42 @@
+QA output created by 217
+
+=== Simulating an I/O error during snapshot deletion ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+wrote 65536/65536 bytes at offset 0
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+
+Snapshot list:
+(Snapshot filtered)
+
+qcow2_free_clusters failed: Input/output error
+qemu-img: Could not delete snapshot 'foo': Failed to free the cluster and L1 table: Input/output error
+
+--- Checking test image ---
+Leaked cluster 4 refcount=2 reference=1
+Leaked cluster 5 refcount=2 reference=1
+Leaked cluster 6 refcount=1 reference=0
+Leaked cluster 7 refcount=1 reference=0
+
+4 leaked clusters were found on the image.
+This means waste of disk space, but no harm to data.
+
+--- Repairing test image ---
+Leaked cluster 4 refcount=2 reference=1
+Leaked cluster 5 refcount=2 reference=1
+Leaked cluster 6 refcount=1 reference=0
+Leaked cluster 7 refcount=1 reference=0
+Repairing cluster 4 refcount=2 reference=1
+Repairing cluster 5 refcount=2 reference=1
+Repairing cluster 6 refcount=1 reference=0
+Repairing cluster 7 refcount=1 reference=0
+Repairing OFLAG_COPIED L2 cluster: l1_index=0 l1_entry=40000 refcount=1
+Repairing OFLAG_COPIED data cluster: l2_entry=50000 refcount=1
+The following inconsistencies were found and repaired:
+
+    4 leaked clusters
+    2 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
+*** done
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index 93f93d71ba..0914c922d7 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -215,5 +215,6 @@
 214 rw auto
 215 rw auto quick
 216 rw auto quick
+217 rw auto quick
 218 rw auto quick
 219 rw auto
-- 
2.17.1

  parent reply	other threads:[~2018-06-11 14:26 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-11 14:25 [Qemu-devel] [PULL 00/29] Block patches Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 01/29] block/file-posix: Pass FD to locking helpers Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 02/29] block/file-posix: File locking during creation Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 03/29] iotests: Add creation test to 153 Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 04/29] qemu-img: Amendment support implies create_opts Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 05/29] block: Add Error parameter to bdrv_amend_options Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 06/29] qemu-option: Pull out "Supported options" print Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 07/29] qemu-img: Add print_amend_option_help() Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 08/29] qemu-img: Recognize no creation support in -o help Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 09/29] iotests: Test help option for unsupporting formats Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 10/29] iotests: Rework 113 Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 11/29] qcow2: Repair OFLAG_COPIED when fixing leaks Max Reitz
2018-06-11 14:25 ` Max Reitz [this message]
2018-06-11 14:25 ` [Qemu-devel] [PULL 13/29] qemu-io: Drop command functions' return values Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 14/29] qemu-io: Let command functions return error code Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 15/29] qemu-io: Exit with error when a command failed Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 16/29] iotests.py: Add qemu_io_silent Max Reitz
2018-06-11 14:25 ` [Qemu-devel] [PULL 17/29] iotests: Let 216 make use of qemu-io's exit code Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 18/29] qemu-img: Resolve relative backing paths in rebase Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 19/29] iotests: Add test for rebasing with relative paths Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 20/29] qemu-img: Special post-backing convert handling Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 21/29] iotests: Test post-backing convert target behavior Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 22/29] iotests: improve pause_job Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 23/29] iotests: Fix 219's timing Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 24/29] qemu-img: Remove deprecated -s snapshot_id_or_name option Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 25/29] block/qcow2-bitmap: fix free_bitmap_clusters Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 26/29] throttle: Fix crash on reopen Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 27/29] block: Make bdrv_is_writable() public Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 28/29] qcow2: Do not mark inactive images corrupt Max Reitz
2018-06-11 14:26 ` [Qemu-devel] [PULL 29/29] iotests: Add case for a corrupted inactive image Max Reitz
2018-06-11 15:20 ` [Qemu-devel] [PULL 00/29] Block 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=20180611142611.6609-13-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).