Message ID | 20230525180213.902012-3-andrey.drobyshev@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qemu-img: fix getting stuck in infinite loop on in-chain rebase | expand |
On 5/25/23 20:02, Andrey Drobyshev wrote: > Before previous commit, rebase was getting infitely stuck in case of > rebasing within the same backing chain and when overlay_size > backing_size. > Let's add this case to the rebasing test 024 to make sure it doesn't > break again. > > Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> > --- > tests/qemu-iotests/024 | 57 ++++++++++++++++++++++++++++++++++++++ > tests/qemu-iotests/024.out | 30 ++++++++++++++++++++ > 2 files changed, 87 insertions(+) > > diff --git a/tests/qemu-iotests/024 b/tests/qemu-iotests/024 > index 25a564a150..98a7c8fd65 100755 > --- a/tests/qemu-iotests/024 > +++ b/tests/qemu-iotests/024 > @@ -199,6 +199,63 @@ echo > # $BASE_OLD and $BASE_NEW) > $QEMU_IMG map "$OVERLAY" | _filter_qemu_img_map > > +# Check that rebase within the chain is working when > +# overlay_size > old_backing_size > +# > +# base_new <-- base_old <-- overlay > +# > +# Backing (new): 11 11 11 11 11 > +# Backing (old): 22 22 22 22 > +# Overlay: -- -- -- -- -- > +# > +# As a result, overlay should contain data identical to base_old, with the > +# last cluster remaining unallocated. > + > +echo > +echo "=== Test rebase within one backing chain ===" > +echo > + > +echo "Creating backing chain" > +echo > + > +TEST_IMG=$BASE_NEW _make_test_img $(( CLUSTER_SIZE * 5 )) > +TEST_IMG=$BASE_OLD _make_test_img -b "$BASE_NEW" -F $IMGFMT \ > + $(( CLUSTER_SIZE * 4 )) > +TEST_IMG=$OVERLAY _make_test_img -b "$BASE_OLD" -F $IMGFMT \ > + $(( CLUSTER_SIZE * 5 )) > + > +echo > +echo "Fill backing files with data" > +echo > + > +$QEMU_IO "$BASE_NEW" -c "write -P 0x11 0 $(( CLUSTER_SIZE * 5 ))" \ > + | _filter_qemu_io > +$QEMU_IO "$BASE_OLD" -c "write -P 0x22 0 $(( CLUSTER_SIZE * 4 ))" \ > + | _filter_qemu_io > + > +echo > +echo "Check the last cluster is zeroed in overlay before the rebase" > +echo > +$QEMU_IO "$OVERLAY" -c "read -P 0x00 $(( CLUSTER_SIZE * 4 )) $CLUSTER_SIZE" \ > + | _filter_qemu_io > + > +echo > +echo "Rebase onto another image in the same chain" > +echo > + > +$QEMU_IMG rebase -b "$BASE_NEW" -F $IMGFMT "$OVERLAY" > + > +echo "Verify that data is read the same before and after rebase" > +echo > + > +# Verify the first 4 clusters are still read the same as in the old base > +$QEMU_IO "$OVERLAY" -c "read -P 0x22 0 $(( CLUSTER_SIZE * 4 ))" \ > + | _filter_qemu_io > +# Verify the last cluster still reads as zeroes > +$QEMU_IO "$OVERLAY" -c "read -P 0x00 $(( CLUSTER_SIZE * 4 )) $CLUSTER_SIZE" \ > + | _filter_qemu_io > + > +echo > > # success, all done > echo "*** done" > diff --git a/tests/qemu-iotests/024.out b/tests/qemu-iotests/024.out > index 973a5a3711..245fe8b1d1 100644 > --- a/tests/qemu-iotests/024.out > +++ b/tests/qemu-iotests/024.out > @@ -171,4 +171,34 @@ read 65536/65536 bytes at offset 196608 > Offset Length File > 0 0x30000 TEST_DIR/subdir/t.IMGFMT > 0x30000 0x10000 TEST_DIR/subdir/t.IMGFMT.base_new > + > +=== Test rebase within one backing chain === > + > +Creating backing chain > + > +Formatting 'TEST_DIR/subdir/t.IMGFMT.base_new', fmt=IMGFMT size=327680 > +Formatting 'TEST_DIR/subdir/t.IMGFMT.base_old', fmt=IMGFMT size=262144 backing_file=TEST_DIR/subdir/t.IMGFMT.base_new backing_fmt=IMGFMT > +Formatting 'TEST_DIR/subdir/t.IMGFMT', fmt=IMGFMT size=327680 backing_file=TEST_DIR/subdir/t.IMGFMT.base_old backing_fmt=IMGFMT > + > +Fill backing files with data > + > +wrote 327680/327680 bytes at offset 0 > +320 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +wrote 262144/262144 bytes at offset 0 > +256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > + > +Check the last cluster is zeroed in overlay before the rebase > + > +read 65536/65536 bytes at offset 262144 > +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > + > +Rebase onto another image in the same chain > + > +Verify that data is read the same before and after rebase > + > +read 262144/262144 bytes at offset 0 > +256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +read 65536/65536 bytes at offset 262144 > +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > + > *** done Reviewed-by: Denis V. Lunev <den@openvz.org>
diff --git a/tests/qemu-iotests/024 b/tests/qemu-iotests/024 index 25a564a150..98a7c8fd65 100755 --- a/tests/qemu-iotests/024 +++ b/tests/qemu-iotests/024 @@ -199,6 +199,63 @@ echo # $BASE_OLD and $BASE_NEW) $QEMU_IMG map "$OVERLAY" | _filter_qemu_img_map +# Check that rebase within the chain is working when +# overlay_size > old_backing_size +# +# base_new <-- base_old <-- overlay +# +# Backing (new): 11 11 11 11 11 +# Backing (old): 22 22 22 22 +# Overlay: -- -- -- -- -- +# +# As a result, overlay should contain data identical to base_old, with the +# last cluster remaining unallocated. + +echo +echo "=== Test rebase within one backing chain ===" +echo + +echo "Creating backing chain" +echo + +TEST_IMG=$BASE_NEW _make_test_img $(( CLUSTER_SIZE * 5 )) +TEST_IMG=$BASE_OLD _make_test_img -b "$BASE_NEW" -F $IMGFMT \ + $(( CLUSTER_SIZE * 4 )) +TEST_IMG=$OVERLAY _make_test_img -b "$BASE_OLD" -F $IMGFMT \ + $(( CLUSTER_SIZE * 5 )) + +echo +echo "Fill backing files with data" +echo + +$QEMU_IO "$BASE_NEW" -c "write -P 0x11 0 $(( CLUSTER_SIZE * 5 ))" \ + | _filter_qemu_io +$QEMU_IO "$BASE_OLD" -c "write -P 0x22 0 $(( CLUSTER_SIZE * 4 ))" \ + | _filter_qemu_io + +echo +echo "Check the last cluster is zeroed in overlay before the rebase" +echo +$QEMU_IO "$OVERLAY" -c "read -P 0x00 $(( CLUSTER_SIZE * 4 )) $CLUSTER_SIZE" \ + | _filter_qemu_io + +echo +echo "Rebase onto another image in the same chain" +echo + +$QEMU_IMG rebase -b "$BASE_NEW" -F $IMGFMT "$OVERLAY" + +echo "Verify that data is read the same before and after rebase" +echo + +# Verify the first 4 clusters are still read the same as in the old base +$QEMU_IO "$OVERLAY" -c "read -P 0x22 0 $(( CLUSTER_SIZE * 4 ))" \ + | _filter_qemu_io +# Verify the last cluster still reads as zeroes +$QEMU_IO "$OVERLAY" -c "read -P 0x00 $(( CLUSTER_SIZE * 4 )) $CLUSTER_SIZE" \ + | _filter_qemu_io + +echo # success, all done echo "*** done" diff --git a/tests/qemu-iotests/024.out b/tests/qemu-iotests/024.out index 973a5a3711..245fe8b1d1 100644 --- a/tests/qemu-iotests/024.out +++ b/tests/qemu-iotests/024.out @@ -171,4 +171,34 @@ read 65536/65536 bytes at offset 196608 Offset Length File 0 0x30000 TEST_DIR/subdir/t.IMGFMT 0x30000 0x10000 TEST_DIR/subdir/t.IMGFMT.base_new + +=== Test rebase within one backing chain === + +Creating backing chain + +Formatting 'TEST_DIR/subdir/t.IMGFMT.base_new', fmt=IMGFMT size=327680 +Formatting 'TEST_DIR/subdir/t.IMGFMT.base_old', fmt=IMGFMT size=262144 backing_file=TEST_DIR/subdir/t.IMGFMT.base_new backing_fmt=IMGFMT +Formatting 'TEST_DIR/subdir/t.IMGFMT', fmt=IMGFMT size=327680 backing_file=TEST_DIR/subdir/t.IMGFMT.base_old backing_fmt=IMGFMT + +Fill backing files with data + +wrote 327680/327680 bytes at offset 0 +320 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 262144/262144 bytes at offset 0 +256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +Check the last cluster is zeroed in overlay before the rebase + +read 65536/65536 bytes at offset 262144 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +Rebase onto another image in the same chain + +Verify that data is read the same before and after rebase + +read 262144/262144 bytes at offset 0 +256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 65536/65536 bytes at offset 262144 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + *** done
Before previous commit, rebase was getting infitely stuck in case of rebasing within the same backing chain and when overlay_size > backing_size. Let's add this case to the rebasing test 024 to make sure it doesn't break again. Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> --- tests/qemu-iotests/024 | 57 ++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/024.out | 30 ++++++++++++++++++++ 2 files changed, 87 insertions(+)