2014-10-22 16:09:43 +04:00
|
|
|
QA output created by 108
|
|
|
|
|
|
|
|
=== Repairing an image without any refcount table ===
|
|
|
|
|
2014-12-09 10:38:03 +03:00
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
2014-10-22 16:09:43 +04:00
|
|
|
wrote 65536/65536 bytes at offset 0
|
|
|
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
ERROR cluster 0 refcount=0 reference=1
|
|
|
|
ERROR cluster 3 refcount=0 reference=1
|
|
|
|
ERROR cluster 4 refcount=0 reference=1
|
|
|
|
ERROR cluster 5 refcount=0 reference=1
|
|
|
|
Rebuilding refcount structure
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
4 corruptions
|
|
|
|
|
|
|
|
Double checking the fixed image now...
|
|
|
|
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)
|
|
|
|
|
|
|
|
=== Repairing unreferenced data cluster in new refblock area ===
|
|
|
|
|
2014-12-09 10:38:03 +03:00
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
2014-10-22 16:09:43 +04:00
|
|
|
wrote 111104/111104 bytes at offset 0
|
|
|
|
108.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
131072
|
|
|
|
wrote 512/512 bytes at offset 131072
|
|
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
read 512/512 bytes at offset 111104
|
|
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
ERROR cluster 256 refcount=0 reference=1
|
|
|
|
Rebuilding refcount structure
|
|
|
|
Repairing cluster 1 refcount=1 reference=0
|
|
|
|
Repairing cluster 2 refcount=1 reference=0
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
1 corruptions
|
|
|
|
|
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
read 512/512 bytes at offset 111104
|
|
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
|
|
|
|
=== Repairing refblock beyond the image end ===
|
|
|
|
|
|
|
|
|
|
|
|
--- Otherwise clean ---
|
|
|
|
|
2014-12-09 10:38:03 +03:00
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
2014-10-22 16:09:43 +04:00
|
|
|
Repairing refcount block 1 is outside image
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
1 corruptions
|
|
|
|
|
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
|
|
|
|
--- Refblock is unallocated ---
|
|
|
|
|
2014-12-09 10:38:03 +03:00
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
2014-10-22 16:09:43 +04:00
|
|
|
Repairing refcount block 1 is outside image
|
|
|
|
ERROR cluster 16 refcount=0 reference=1
|
|
|
|
Rebuilding refcount structure
|
|
|
|
Repairing cluster 1 refcount=1 reference=0
|
|
|
|
Repairing cluster 2 refcount=1 reference=0
|
|
|
|
Repairing cluster 16 refcount=1 reference=0
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
2 corruptions
|
|
|
|
|
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
|
|
|
|
--- Signed overflow after the refblock ---
|
|
|
|
|
2014-12-09 10:38:03 +03:00
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
2014-10-22 16:09:43 +04:00
|
|
|
Repairing refcount block 1 is outside image
|
|
|
|
ERROR could not resize image: Invalid argument
|
|
|
|
Rebuilding refcount structure
|
|
|
|
Repairing cluster 1 refcount=1 reference=0
|
|
|
|
Repairing cluster 2 refcount=1 reference=0
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
1 corruptions
|
|
|
|
|
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
|
|
|
|
--- Unsigned overflow after the refblock ---
|
|
|
|
|
2014-12-09 10:38:03 +03:00
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
2014-10-22 16:09:43 +04:00
|
|
|
Repairing refcount block 1 is outside image
|
|
|
|
ERROR could not resize image: Invalid argument
|
|
|
|
Rebuilding refcount structure
|
|
|
|
Repairing cluster 1 refcount=1 reference=0
|
|
|
|
Repairing cluster 2 refcount=1 reference=0
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
1 corruptions
|
|
|
|
|
iotests/108: Test new refcount rebuild algorithm
One clear problem with how qcow2's refcount structure rebuild algorithm
used to be before "qcow2: Improve refcount structure rebuilding" was
that it is prone to failure for qcow2 images on block devices: There is
generally unused space after the actual image, and if that exceeds what
one refblock covers, the old algorithm would invariably write the
reftable past the block device's end, which cannot work. The new
algorithm does not have this problem.
Test it with three tests:
(1) Create an image with more empty space at the end than what one
refblock covers, see whether rebuilding the refcount structures
results in a change in the image file length. (It should not.)
(2) Leave precisely enough space somewhere at the beginning of the image
for the new reftable (and the refblock for that place), see whether
the new algorithm puts the reftable there. (It should.)
(3) Test the original problem: Create (something like) a block device
with a fixed size, then create a qcow2 image in there, write some
data, and then have qemu-img check rebuild the refcount structures.
Before HEAD^, the reftable would have been written past the image
file end, i.e. outside of what the block device provides, which
cannot work. HEAD^ should have fixed that.
("Something like a block device" means a loop device if we can use
one ("sudo -n losetup" works), or a FUSE block export with
growable=false otherwise.)
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220405134652.19278-3-hreitz@redhat.com>
2022-04-05 16:46:51 +03:00
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
|
|
|
|
=== Check rebuilt reftable location ===
|
|
|
|
|
|
|
|
--- Does the image size increase? ---
|
|
|
|
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576
|
|
|
|
wrote 65536/65536 bytes at offset 0
|
|
|
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
|
|
|
|
ERROR cluster 0 refcount=0 reference=1
|
|
|
|
Rebuilding refcount structure
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
1 corruptions
|
|
|
|
|
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
|
|
|
|
OK: Image size did not change
|
|
|
|
|
|
|
|
--- Will the reftable occupy a hole specifically left for it? ---
|
|
|
|
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=9437184
|
|
|
|
wrote 8388608/8388608 bytes at offset 0
|
|
|
|
8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
discard 512/512 bytes at offset 0
|
|
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
discard 1024/1024 bytes at offset 4096
|
|
|
|
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
|
|
|
|
ERROR cluster 0 refcount=0 reference=1
|
|
|
|
Rebuilding refcount structure
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
1 corruptions
|
|
|
|
|
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
|
|
|
|
OK: Reftable is where we expect it
|
|
|
|
|
|
|
|
--- Rebuilding refcount structures on block devices ---
|
|
|
|
|
|
|
|
{ "execute": "qmp_capabilities" }
|
|
|
|
{"return": {}}
|
|
|
|
{ "execute": "blockdev-create",
|
|
|
|
"arguments": {
|
|
|
|
"job-id": "create",
|
|
|
|
"options": {
|
|
|
|
"driver": "IMGFMT",
|
|
|
|
"file": "file",
|
|
|
|
"size": 67108864,
|
|
|
|
"cluster-size": 512
|
|
|
|
} } }
|
|
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "create"}}
|
|
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "create"}}
|
|
|
|
{"return": {}}
|
|
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "create"}}
|
|
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "create"}}
|
|
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "create"}}
|
|
|
|
{ "execute": "job-dismiss", "arguments": { "id": "create" } }
|
|
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "create"}}
|
|
|
|
{"return": {}}
|
|
|
|
{ "execute": "quit" }
|
|
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
2024-01-18 17:48:23 +03:00
|
|
|
{"return": {}}
|
iotests/108: Test new refcount rebuild algorithm
One clear problem with how qcow2's refcount structure rebuild algorithm
used to be before "qcow2: Improve refcount structure rebuilding" was
that it is prone to failure for qcow2 images on block devices: There is
generally unused space after the actual image, and if that exceeds what
one refblock covers, the old algorithm would invariably write the
reftable past the block device's end, which cannot work. The new
algorithm does not have this problem.
Test it with three tests:
(1) Create an image with more empty space at the end than what one
refblock covers, see whether rebuilding the refcount structures
results in a change in the image file length. (It should not.)
(2) Leave precisely enough space somewhere at the beginning of the image
for the new reftable (and the refblock for that place), see whether
the new algorithm puts the reftable there. (It should.)
(3) Test the original problem: Create (something like) a block device
with a fixed size, then create a qcow2 image in there, write some
data, and then have qemu-img check rebuild the refcount structures.
Before HEAD^, the reftable would have been written past the image
file end, i.e. outside of what the block device provides, which
cannot work. HEAD^ should have fixed that.
("Something like a block device" means a loop device if we can use
one ("sudo -n losetup" works), or a FUSE block export with
growable=false otherwise.)
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220405134652.19278-3-hreitz@redhat.com>
2022-04-05 16:46:51 +03:00
|
|
|
|
|
|
|
wrote 65536/65536 bytes at offset 0
|
|
|
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
|
|
|
|
ERROR cluster 0 refcount=0 reference=1
|
|
|
|
Rebuilding refcount structure
|
|
|
|
The following inconsistencies were found and repaired:
|
|
|
|
|
|
|
|
0 leaked clusters
|
|
|
|
1 corruptions
|
|
|
|
|
2014-10-22 16:09:43 +04:00
|
|
|
Double checking the fixed image now...
|
|
|
|
No errors were found on the image.
|
|
|
|
*** done
|