Message ID | 20240513063203.113911-7-andrey.drobyshev@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qcow2: make subclusters discardable | expand |
On 5/13/24 08:31, Andrey Drobyshev wrote: > We basically fill 2 images with identical data and perform discard > operations with and without 'discard-no-unref' enabled. Then we check > that images still read identically, that their disk usage is the same > (i.e. fallocate(FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE) is called for > both) and that with the option enabled cluster is still marked as > allocated in "qemu-img map" output. We also check that the option > doesn't work with qcow2 v2 images. > > Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> > --- > tests/qemu-iotests/290 | 34 ++++++++++++++++++++++++++++++++++ > tests/qemu-iotests/290.out | 28 ++++++++++++++++++++++++++++ > 2 files changed, 62 insertions(+) > > diff --git a/tests/qemu-iotests/290 b/tests/qemu-iotests/290 > index 776b59de1b..4eb929d15f 100755 > --- a/tests/qemu-iotests/290 > +++ b/tests/qemu-iotests/290 > @@ -92,6 +92,40 @@ for qcow2_compat in 0.10 1.1; do > $QEMU_IMG map "$TEST_IMG" | _filter_testdir > done > > +echo > +echo "### Test 'qemu-io -c discard' with 'discard-no-unref' option enabled" > +echo > + > +echo "# Check that qcow2 v2 images don't support 'discard-no-unref' option" > +NOUNREF_IMG="$TEST_IMG.nounref" > +TEST_IMG="$NOUNREF_IMG" _make_test_img -o "compat=0.10" 128k > +# This should immediately fail with an error > +$QEMU_IO -c 'reopen -o discard-no-unref=on' "$NOUNREF_IMG" | _filter_qemu_io > + > +echo "# Create two compat=1.1 images and fill them with identical data" > +_make_test_img -o "compat=1.1" 128k > +TEST_IMG="$NOUNREF_IMG" _make_test_img -o "compat=1.1" 128k > +$QEMU_IO -c 'write -P 0xaa 0 128k' "$TEST_IMG" | _filter_qemu_io > +$QEMU_IO -c 'write -P 0xaa 0 128k' "$NOUNREF_IMG" | _filter_qemu_io > + > +echo "# Enable 'discard-no-unref' in one of them, discard 2nd cluster in both" > +$QEMU_IO -c 'discard 64k 64k' "$TEST_IMG" | _filter_qemu_io > +$QEMU_IO -c 'reopen -o discard-no-unref=on' \ > + -c 'discard 64k 64k' "$NOUNREF_IMG" | _filter_qemu_io > + > +echo "# Compare disk usage of the 2 images" > +# Don't check the exact disk usage values but rather that they're equal > +echo "disk_usage(`basename $TEST_IMG`) - disk_usage(`basename $NOUNREF_IMG`)" \ > + "= $(( `disk_usage $TEST_IMG` - `disk_usage $NOUNREF_IMG`))" > + > +echo "# Check that images are still identical" > +$QEMU_IMG compare "$TEST_IMG" "$NOUNREF_IMG" > + > +echo "# Output of qemu-img map for the image with dropped reference" > +$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map > +echo "# Output of qemu-img map for the image with kept reference" > +$QEMU_IMG map --output=json "$NOUNREF_IMG" | _filter_qemu_img_map > + > # success, all done > echo "*** done" > rm -f $seq.full > diff --git a/tests/qemu-iotests/290.out b/tests/qemu-iotests/290.out > index 22b476594f..f790feae81 100644 > --- a/tests/qemu-iotests/290.out > +++ b/tests/qemu-iotests/290.out > @@ -58,4 +58,32 @@ read 131072/131072 bytes at offset 0 > 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > # Output of qemu-img map > Offset Length Mapped to File > + > +### Test 'qemu-io -c discard' with 'discard-no-unref' option enabled > + > +# Check that qcow2 v2 images don't support 'discard-no-unref' option > +Formatting 'TEST_DIR/t.IMGFMT.nounref', fmt=IMGFMT size=131072 > +qemu-io: discard-no-unref is only supported since qcow2 version 3 > +# Create two compat=1.1 images and fill them with identical data > +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072 > +Formatting 'TEST_DIR/t.IMGFMT.nounref', fmt=IMGFMT size=131072 > +wrote 131072/131072 bytes at offset 0 > +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +wrote 131072/131072 bytes at offset 0 > +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +# Enable 'discard-no-unref' in one of them, discard 2nd cluster in both > +discard 65536/65536 bytes at offset 65536 > +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +discard 65536/65536 bytes at offset 65536 > +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +# Compare disk usage of the 2 images > +disk_usage(t.qcow2) - disk_usage(t.qcow2.nounref) = 0 > +# Check that images are still identical > +Images are identical. > +# Output of qemu-img map for the image with dropped reference > +[{ "start": 0, "length": 65536, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, > +{ "start": 65536, "length": 65536, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false}] > +# Output of qemu-img map for the image with kept reference > +[{ "start": 0, "length": 65536, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, > +{ "start": 65536, "length": 65536, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false, "offset": OFFSET}] > *** done Reviewed-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
On Mon 13 May 2024 09:31:58 AM +03, Andrey Drobyshev wrote: > We basically fill 2 images with identical data and perform discard > operations with and without 'discard-no-unref' enabled. Then we check > that images still read identically, that their disk usage is the same > (i.e. fallocate(FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE) is called for > both) and that with the option enabled cluster is still marked as > allocated in "qemu-img map" output. We also check that the option > doesn't work with qcow2 v2 images. > > Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Berto
diff --git a/tests/qemu-iotests/290 b/tests/qemu-iotests/290 index 776b59de1b..4eb929d15f 100755 --- a/tests/qemu-iotests/290 +++ b/tests/qemu-iotests/290 @@ -92,6 +92,40 @@ for qcow2_compat in 0.10 1.1; do $QEMU_IMG map "$TEST_IMG" | _filter_testdir done +echo +echo "### Test 'qemu-io -c discard' with 'discard-no-unref' option enabled" +echo + +echo "# Check that qcow2 v2 images don't support 'discard-no-unref' option" +NOUNREF_IMG="$TEST_IMG.nounref" +TEST_IMG="$NOUNREF_IMG" _make_test_img -o "compat=0.10" 128k +# This should immediately fail with an error +$QEMU_IO -c 'reopen -o discard-no-unref=on' "$NOUNREF_IMG" | _filter_qemu_io + +echo "# Create two compat=1.1 images and fill them with identical data" +_make_test_img -o "compat=1.1" 128k +TEST_IMG="$NOUNREF_IMG" _make_test_img -o "compat=1.1" 128k +$QEMU_IO -c 'write -P 0xaa 0 128k' "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c 'write -P 0xaa 0 128k' "$NOUNREF_IMG" | _filter_qemu_io + +echo "# Enable 'discard-no-unref' in one of them, discard 2nd cluster in both" +$QEMU_IO -c 'discard 64k 64k' "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c 'reopen -o discard-no-unref=on' \ + -c 'discard 64k 64k' "$NOUNREF_IMG" | _filter_qemu_io + +echo "# Compare disk usage of the 2 images" +# Don't check the exact disk usage values but rather that they're equal +echo "disk_usage(`basename $TEST_IMG`) - disk_usage(`basename $NOUNREF_IMG`)" \ + "= $(( `disk_usage $TEST_IMG` - `disk_usage $NOUNREF_IMG`))" + +echo "# Check that images are still identical" +$QEMU_IMG compare "$TEST_IMG" "$NOUNREF_IMG" + +echo "# Output of qemu-img map for the image with dropped reference" +$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map +echo "# Output of qemu-img map for the image with kept reference" +$QEMU_IMG map --output=json "$NOUNREF_IMG" | _filter_qemu_img_map + # success, all done echo "*** done" rm -f $seq.full diff --git a/tests/qemu-iotests/290.out b/tests/qemu-iotests/290.out index 22b476594f..f790feae81 100644 --- a/tests/qemu-iotests/290.out +++ b/tests/qemu-iotests/290.out @@ -58,4 +58,32 @@ read 131072/131072 bytes at offset 0 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) # Output of qemu-img map Offset Length Mapped to File + +### Test 'qemu-io -c discard' with 'discard-no-unref' option enabled + +# Check that qcow2 v2 images don't support 'discard-no-unref' option +Formatting 'TEST_DIR/t.IMGFMT.nounref', fmt=IMGFMT size=131072 +qemu-io: discard-no-unref is only supported since qcow2 version 3 +# Create two compat=1.1 images and fill them with identical data +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072 +Formatting 'TEST_DIR/t.IMGFMT.nounref', fmt=IMGFMT size=131072 +wrote 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Enable 'discard-no-unref' in one of them, discard 2nd cluster in both +discard 65536/65536 bytes at offset 65536 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 65536/65536 bytes at offset 65536 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Compare disk usage of the 2 images +disk_usage(t.qcow2) - disk_usage(t.qcow2.nounref) = 0 +# Check that images are still identical +Images are identical. +# Output of qemu-img map for the image with dropped reference +[{ "start": 0, "length": 65536, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, +{ "start": 65536, "length": 65536, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false}] +# Output of qemu-img map for the image with kept reference +[{ "start": 0, "length": 65536, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, +{ "start": 65536, "length": 65536, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false, "offset": OFFSET}] *** done
We basically fill 2 images with identical data and perform discard operations with and without 'discard-no-unref' enabled. Then we check that images still read identically, that their disk usage is the same (i.e. fallocate(FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE) is called for both) and that with the option enabled cluster is still marked as allocated in "qemu-img map" output. We also check that the option doesn't work with qcow2 v2 images. Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> --- tests/qemu-iotests/290 | 34 ++++++++++++++++++++++++++++++++++ tests/qemu-iotests/290.out | 28 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+)