We create an image, write and discard some data in it, and then create a snapshot. In the snapshot we write and discard again some data. Then we measure the images with 'for_commit' option to calculate the merged image size. Finally we commit the image and check it's size.
This scenario is executed for discard-no-unref enabled and disabled. Signed-off-by: Jean-Louis Dupond <jean-lo...@dupond.be> --- tests/qemu-iotests/290 | 45 ++++++++++++++++++++++++++++ tests/qemu-iotests/290.out | 61 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/tests/qemu-iotests/290 b/tests/qemu-iotests/290 index 776b59de1b..1d6608ad13 100755 --- a/tests/qemu-iotests/290 +++ b/tests/qemu-iotests/290 @@ -92,6 +92,51 @@ for qcow2_compat in 0.10 1.1; do $QEMU_IMG map "$TEST_IMG" | _filter_testdir done +echo +echo "### Test qemu-img measure for commit differences with 'discard-no-unref' option enabled" +echo + +for DISCARD_NO_UNREF in true false; do + echo "# Create a base image and fill it with data" + TEST_IMG="$TEST_IMG.base" _make_test_img 128M + + $QEMU_IO -c 'write 0 8M' "$TEST_IMG.base" | _filter_qemu_io + $QEMU_IO -c 'write 10M 8M' "$TEST_IMG.base" | _filter_qemu_io + $QEMU_IO -c 'write 24M 32M' "$TEST_IMG.base" | _filter_qemu_io + $QEMU_IO -c 'write 56M 20M' "$TEST_IMG.base" | _filter_qemu_io + $QEMU_IO -c "reopen -o discard=unmap,discard-no-unref=$DISCARD_NO_UNREF" \ + -c 'discard 32M 10M' "$TEST_IMG.base" | _filter_qemu_io + + echo "# Create a top image and do some writes and discards" + TEST_IMG="$TEST_IMG.top" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT 128M + + $QEMU_IO -c "reopen -o discard=unmap,discard-no-unref=$DISCARD_NO_UNREF" -c 'write 16M 8M' \ + -c 'discard 60M 20M' -c 'write 84M 10M' "$TEST_IMG.top" | _filter_qemu_io + + FILE_JSON="json:{ + 'file': { + 'driver': 'file', + 'filename': '$TEST_IMG.top' + }, + 'driver': 'qcow2', + 'discard': 'unmap', + 'discard-no-unref': '$DISCARD_NO_UNREF', + 'backing': { + 'driver': 'qcow2', + 'discard-no-unref': '$DISCARD_NO_UNREF', + 'file': { + 'driver': 'file', + 'filename': '$TEST_IMG.base' + }, + 'backing': null + }}" + echo "# Measure size with discard-no-unref=$DISCARD_NO_UNREF" + $QEMU_IMG measure --output=json -ofor_commit=on -O qcow2 "${FILE_JSON}" + echo "# Merging the top image into the base image" + $QEMU_IMG commit -t none -f qcow2 "${FILE_JSON}" + stat -c"base disk image file size in bytes: %s" "$TEST_IMG.base" +done + # 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..4207572118 100644 --- a/tests/qemu-iotests/290.out +++ b/tests/qemu-iotests/290.out @@ -58,4 +58,65 @@ 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-img measure for commit differences with 'discard-no-unref' option enabled + +# Create a base image and fill it with data +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728 +wrote 8388608/8388608 bytes at offset 0 +8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 8388608/8388608 bytes at offset 10485760 +8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 33554432/33554432 bytes at offset 25165824 +32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 20971520/20971520 bytes at offset 58720256 +20 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 10485760/10485760 bytes at offset 33554432 +10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Create a top image and do some writes and discards +Formatting 'TEST_DIR/t.IMGFMT.top', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT +wrote 8388608/8388608 bytes at offset 16777216 +8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 20971520/20971520 bytes at offset 62914560 +20 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 10485760/10485760 bytes at offset 88080384 +10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Measure size with discard-no-unref=true +{ + "bitmaps": 0, + "required": 88670208, + "fully-allocated": 134545408 +} +# Merging the top image into the base image +Image committed. +base disk image file size in bytes: 88408064 +# Create a base image and fill it with data +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728 +wrote 8388608/8388608 bytes at offset 0 +8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 8388608/8388608 bytes at offset 10485760 +8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 33554432/33554432 bytes at offset 25165824 +32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 20971520/20971520 bytes at offset 58720256 +20 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 10485760/10485760 bytes at offset 33554432 +10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Create a top image and do some writes and discards +Formatting 'TEST_DIR/t.IMGFMT.top', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT +wrote 8388608/8388608 bytes at offset 16777216 +8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 20971520/20971520 bytes at offset 62914560 +20 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 10485760/10485760 bytes at offset 88080384 +10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Measure size with discard-no-unref=false +{ + "bitmaps": 0, + "required": 71892992, + "fully-allocated": 134545408 +} +# Merging the top image into the base image +Image committed. +base disk image file size in bytes: 71630848 *** done -- 2.49.0