@@ -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
@@ -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
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-louis@dupond.be> --- tests/qemu-iotests/290 | 45 ++++++++++++++++++++++++++++ tests/qemu-iotests/290.out | 61 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+)