Skip to content

Commit

Permalink
iotests: Extend test 066
Browse files Browse the repository at this point in the history
066 was supposed to be a test "for discarding preallocated zero
clusters", but it did so incompletely: While it did check the image
file's integrity after the operation, it did not confirm that the
clusters are indeed freed. This patch adds this test.

In addition, new cases for writing to preallocated zero clusters are
added.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
XanClic authored and kevmw committed May 11, 2017
1 parent 293073a commit aa93c83
Show file tree
Hide file tree
Showing 2 changed files with 173 additions and 1 deletion.
128 changes: 127 additions & 1 deletion tests/qemu-iotests/066
@@ -1,6 +1,6 @@
#!/bin/bash
#
# Test case for discarding preallocated zero clusters in qcow2
# Test case for preallocated zero clusters in qcow2
#
# Copyright (C) 2013 Red Hat, Inc.
#
Expand Down Expand Up @@ -55,8 +55,134 @@ _make_test_img $IMG_SIZE
$QEMU_IO -c "write 0 256k" -c "write -z 0 256k" -c "write 64M 512" \
-c "discard 0 $IMG_SIZE" -c "read -P 0 0 $IMG_SIZE" "$TEST_IMG" \
| _filter_qemu_io

# Check the image (there shouldn't be any leaks)
_check_test_img
# Map the image (we want all clusters to be gone)
$QEMU_IMG map "$TEST_IMG"

_cleanup_test_img


echo
echo '=== Writing to preallocated zero clusters ==='
echo

_make_test_img $IMG_SIZE

# Create data clusters (not aligned to an L2 table)
$QEMU_IO -c 'write -P 42 1M 256k' "$TEST_IMG" | _filter_qemu_io
orig_map=$($QEMU_IMG map --output=json "$TEST_IMG")

# Convert the data clusters to preallocated zero clusters
$QEMU_IO -c 'write -z 1M 256k' "$TEST_IMG" | _filter_qemu_io

# Now write to them (with a COW needed for the head and tail)
$QEMU_IO -c "write -P 23 $(((1024 + 32) * 1024)) 192k" "$TEST_IMG" \
| _filter_qemu_io

# Check metadata correctness
_check_test_img

# Check data correctness
$QEMU_IO -c "read -P 0 $(( 1024 * 1024)) 32k" \
-c "read -P 23 $(((1024 + 32) * 1024)) 192k" \
-c "read -P 0 $(((1024 + 32 + 192) * 1024)) 32k" \
"$TEST_IMG" \
| _filter_qemu_io

# Check that we have actually reused the original area
new_map=$($QEMU_IMG map --output=json "$TEST_IMG")
if [ "$new_map" = "$orig_map" ]; then
echo 'Successfully reused original clusters.'
else
echo 'Failed to reuse original clusters.'
echo 'Original map:'
echo "$orig_map"
echo 'New map:'
echo "$new_map"
fi

_cleanup_test_img


echo
echo '=== Writing to a snapshotted preallocated zero cluster ==='
echo

_make_test_img 64k

# Create a preallocated zero cluster
$QEMU_IO -c 'write -P 42 0 64k' -c 'write -z 0 64k' "$TEST_IMG" \
| _filter_qemu_io

# Snapshot it
$QEMU_IMG snapshot -c foo "$TEST_IMG"

# Write to the cluster
$QEMU_IO -c 'write -P 23 0 64k' "$TEST_IMG" | _filter_qemu_io

# Check metadata correctness
_check_test_img

# Check data correctness
$QEMU_IO -c 'read -P 23 0 64k' "$TEST_IMG" | _filter_qemu_io
$QEMU_IMG snapshot -a foo "$TEST_IMG"
$QEMU_IO -c 'read -P 0 0 64k' "$TEST_IMG" | _filter_qemu_io

_cleanup_test_img


echo
echo '=== Consecutive write to a preallocated zero cluster ==='
echo

_make_test_img 192k

# Create three normal clusters
$QEMU_IO -c 'write -P 42 0 192k' "$TEST_IMG" | _filter_qemu_io
orig_map=$($QEMU_IMG map --output=json "$TEST_IMG")

# Make the middle cluster a preallocated zero cluster
$QEMU_IO -c 'write -z 64k 64k' "$TEST_IMG" | _filter_qemu_io

# Try to overwrite everything: This should reuse the whole range. To test that
# this only issues a single continuous write request, use blkdebug.
$QEMU_IO -c 'write -P 42 0 192k' \
"json:{
'driver': '$IMGFMT',
'file': {
'driver': 'blkdebug',
'image.filename': '$TEST_IMG',
'set-state': [{
'event': 'write_aio',
'new_state': 2
}],
'inject-error': [{
'event': 'write_aio',
'state': 2
}]
}
}" \
| _filter_qemu_io

# Check metadata correctness
_check_test_img

# Check that we have actually reused the original area
new_map=$($QEMU_IMG map --output=json "$TEST_IMG")
if [ "$new_map" = "$orig_map" ]; then
echo 'Successfully reused original clusters.'
else
echo 'Failed to reuse original clusters.'
echo 'Original map:'
echo "$orig_map"
echo 'New map:'
echo "$new_map"
fi

_cleanup_test_img


# success, all done
echo "*** done"
Expand Down
46 changes: 46 additions & 0 deletions tests/qemu-iotests/066.out
Expand Up @@ -14,4 +14,50 @@ discard 67109376/67109376 bytes at offset 0
read 67109376/67109376 bytes at offset 0
64 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
No errors were found on the image.
Offset Length Mapped to File

=== Writing to preallocated zero clusters ===

Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67109376
wrote 262144/262144 bytes at offset 1048576
256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 262144/262144 bytes at offset 1048576
256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 196608/196608 bytes at offset 1081344
192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
No errors were found on the image.
read 32768/32768 bytes at offset 1048576
32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 196608/196608 bytes at offset 1081344
192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 32768/32768 bytes at offset 1277952
32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
Successfully reused original clusters.

=== Writing to a snapshotted preallocated zero cluster ===

Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65536
wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
No errors were found on the image.
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)

=== Consecutive write to a preallocated zero cluster ===

Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=196608
wrote 196608/196608 bytes at offset 0
192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 65536/65536 bytes at offset 65536
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 196608/196608 bytes at offset 0
192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
No errors were found on the image.
Successfully reused original clusters.
*** done

0 comments on commit aa93c83

Please sign in to comment.