diff mbox series

[v2,1/2] iotest 033: add misaligned write-zeroes test via truncate

Message ID 1518441241-32557-2-git-send-email-anton.nefedov@virtuozzo.com
State New
Headers show
Series block: fix write with zero flag set and iovector provided | expand

Commit Message

Anton Nefedov Feb. 12, 2018, 1:14 p.m. UTC
This new test case only makes sense for qcow2 while iotest 033 is generic;
however it matches the test purpose perfectly and also 033 contains those
do_test() tricks to pass the alignment, which won't look nice being
duplicated in other tests or moved to the common code.

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
---
 tests/qemu-iotests/033     | 28 ++++++++++++++++++++++++++++
 tests/qemu-iotests/033.out | 13 +++++++++++++
 2 files changed, 41 insertions(+)

Comments

Alberto Garcia Feb. 12, 2018, 3:54 p.m. UTC | #1
On Mon 12 Feb 2018 02:14:00 PM CET, Anton Nefedov wrote:
> +# Trigger truncate that would shrink qcow2 L1 table, which is done by
> +#   clearing one entry (8 bytes) with bdrv_co_pwrite_zeroes()
> +
> +echo
> +echo "=== Test misaligned write zeroes via truncate ==="
> +echo
> +
> +CLUSTER_SIZE=$((64 * 1024))
> +L2_COVERAGE=$(($CLUSTER_SIZE * $CLUSTER_SIZE / 8))
> +_make_test_img $(($L2_COVERAGE * 2))

If my numbers are correct, that's a 1GB image. For qcow2 this is not a
problem but I wonder if it's ok to create such large images for other
formats (for raw they should be sparse by default, but still).

Berto
Anton Nefedov Feb. 12, 2018, 4:16 p.m. UTC | #2
On 12/2/2018 6:54 PM, Alberto Garcia wrote:
> On Mon 12 Feb 2018 02:14:00 PM CET, Anton Nefedov wrote:
>> +# Trigger truncate that would shrink qcow2 L1 table, which is done by
>> +#   clearing one entry (8 bytes) with bdrv_co_pwrite_zeroes()
>> +
>> +echo
>> +echo "=== Test misaligned write zeroes via truncate ==="
>> +echo
>> +
>> +CLUSTER_SIZE=$((64 * 1024))
>> +L2_COVERAGE=$(($CLUSTER_SIZE * $CLUSTER_SIZE / 8))
>> +_make_test_img $(($L2_COVERAGE * 2))
> 
> If my numbers are correct, that's a 1GB image. For qcow2 this is not a
> problem but I wonder if it's ok to create such large images for other
> formats (for raw they should be sparse by default, but still).
> 
> Berto
> 

Good point. Actually even 512 byte clusters will work here, resulting
in a just 64k image.
Max Reitz Feb. 23, 2018, 1:34 p.m. UTC | #3
On 2018-02-12 14:14, Anton Nefedov wrote:
> This new test case only makes sense for qcow2 while iotest 033 is generic;
> however it matches the test purpose perfectly and also 033 contains those
> do_test() tricks to pass the alignment, which won't look nice being
> duplicated in other tests or moved to the common code.
> 
> Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
> ---
>  tests/qemu-iotests/033     | 28 ++++++++++++++++++++++++++++
>  tests/qemu-iotests/033.out | 13 +++++++++++++
>  2 files changed, 41 insertions(+)
> 
> diff --git a/tests/qemu-iotests/033 b/tests/qemu-iotests/033
> index 2cdfd13..5fa3983 100755
> --- a/tests/qemu-iotests/033
> +++ b/tests/qemu-iotests/033
> @@ -64,6 +64,9 @@ do_test()
>  	} | $QEMU_IO $IO_EXTRA_ARGS
>  }
>  
> +echo
> +echo "=== Test aligned and misaligned write zeroes operations ==="
> +
>  for write_zero_cmd in "write -z" "aio_write -z"; do
>  for align in 512 4k; do
>  	echo
> @@ -102,7 +105,32 @@ for align in 512 4k; do
>  done
>  done
>  
> +
> +# Trigger truncate that would shrink qcow2 L1 table, which is done by
> +#   clearing one entry (8 bytes) with bdrv_co_pwrite_zeroes()
> +
> +echo
> +echo "=== Test misaligned write zeroes via truncate ==="
> +echo
> +
> +CLUSTER_SIZE=$((64 * 1024))
> +L2_COVERAGE=$(($CLUSTER_SIZE * $CLUSTER_SIZE / 8))
> +_make_test_img $(($L2_COVERAGE * 2))

There should be a _cleanup_test_img before this or this test will fail
with nbd.

Max
Eric Blake March 12, 2018, 10:01 p.m. UTC | #4
On 02/23/2018 07:34 AM, Max Reitz wrote:
> On 2018-02-12 14:14, Anton Nefedov wrote:
>> This new test case only makes sense for qcow2 while iotest 033 is generic;
>> however it matches the test purpose perfectly and also 033 contains those
>> do_test() tricks to pass the alignment, which won't look nice being
>> duplicated in other tests or moved to the common code.
>>
>> Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
>> ---

> 
> There should be a _cleanup_test_img before this or this test will fail
> with nbd.

Thanks for spotting that; patch posted:
https://lists.gnu.org/archive/html/qemu-devel/2018-03/msg03688.html
diff mbox series

Patch

diff --git a/tests/qemu-iotests/033 b/tests/qemu-iotests/033
index 2cdfd13..5fa3983 100755
--- a/tests/qemu-iotests/033
+++ b/tests/qemu-iotests/033
@@ -64,6 +64,9 @@  do_test()
 	} | $QEMU_IO $IO_EXTRA_ARGS
 }
 
+echo
+echo "=== Test aligned and misaligned write zeroes operations ==="
+
 for write_zero_cmd in "write -z" "aio_write -z"; do
 for align in 512 4k; do
 	echo
@@ -102,7 +105,32 @@  for align in 512 4k; do
 done
 done
 
+
+# Trigger truncate that would shrink qcow2 L1 table, which is done by
+#   clearing one entry (8 bytes) with bdrv_co_pwrite_zeroes()
+
+echo
+echo "=== Test misaligned write zeroes via truncate ==="
+echo
+
+CLUSTER_SIZE=$((64 * 1024))
+L2_COVERAGE=$(($CLUSTER_SIZE * $CLUSTER_SIZE / 8))
+_make_test_img $(($L2_COVERAGE * 2))
+
+do_test 512 "write -P 1 0 0x200" "$TEST_IMG" | _filter_qemu_io
+# next L2 table
+do_test 512 "write -P 1 $L2_COVERAGE 0x200" "$TEST_IMG" | _filter_qemu_io
+
+# only interested in qcow2 here; also other formats might respond with
+#  "not supported" error message
+if [ $IMGFMT = "qcow2" ]; then
+    do_test 512 "truncate $L2_COVERAGE" "$TEST_IMG" | _filter_qemu_io
+fi
+
+do_test 512 "read -P 1 0 0x200" "$TEST_IMG" | _filter_qemu_io
+
 # success, all done
+echo
 echo "*** done"
 rm -f $seq.full
 status=0
diff --git a/tests/qemu-iotests/033.out b/tests/qemu-iotests/033.out
index 95929ef..57799cb 100644
--- a/tests/qemu-iotests/033.out
+++ b/tests/qemu-iotests/033.out
@@ -1,6 +1,8 @@ 
 QA output created by 033
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 
+=== Test aligned and misaligned write zeroes operations ===
+
 == preparing image ==
 wrote 1024/1024 bytes at offset 512
 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
@@ -164,4 +166,15 @@  read 512/512 bytes at offset 512
 read 3072/3072 bytes at offset 1024
 3 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 
+
+=== Test misaligned write zeroes via truncate ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
+wrote 512/512 bytes at offset 0
+512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 512/512 bytes at offset 536870912
+512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 512/512 bytes at offset 0
+512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+
 *** done