On 08.04.19 18:26, Vladimir Sementsov-Ogievskiy wrote: > drv_co_block_status digs bs->file for additional, more accurate search > for hole inside region, reported as DATA by bs since 5daa74a6ebc. > > This accuracy is not free: assume we have qcow2 disk. Actually, qcow2 > knows, where are holes and where is data. But every block_status > request calls lseek additionally. Assume a big disk, full of > data, in any iterative copying block job (or img convert) we'll call > lseek(HOLE) on every iteration, and each of these lseeks will have to > iterate through all metadata up to the end of file. It's obviously > ineffective behavior. And for many scenarios we don't need this lseek > at all. > > However, lseek is needed when we have metadata-preallocated image. > > So, let's detect metadata-preallocation case and don't dig qcow2's > protocol file in other cases. > > The idea is to compare allocation size in POV of filesystem with > allocations size in POV of Qcow2 (by refcounts). If allocation in fs is > significantly lower, consider it as metadata-preallocation case. > > 102 iotest changed, as our detector can't detect shrinked file as > metadata-preallocation, which don't seem to be wrong, as with metadata > preallocation we always have valid file length. > > Other two iotests tiny changed QMP output sequence, which should be > exactly because skipped lseek at mirror beginning. > > Suggested-by: Denis V. Lunev <d...@openvz.org> > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> > --- > block/qcow2.h | 4 ++++ > include/block/block.h | 8 +++++++- > block/io.c | 9 ++++++++- > block/qcow2-refcount.c | 32 ++++++++++++++++++++++++++++++++ > block/qcow2.c | 11 +++++++++++ > tests/qemu-iotests/102 | 2 +- > tests/qemu-iotests/102.out | 3 ++- > tests/qemu-iotests/141.out | 2 +- > tests/qemu-iotests/144.out | 2 +- > 9 files changed, 67 insertions(+), 6 deletions(-)
For me, this patch breaks iotests 141 (for qed) and 211 (for vdi): > 141 1s ... [17:11:53] [17:11:53] - output mismatch (see 141.out.bad) > --- tests/qemu-iotests/141.out 2019-05-27 17:11:43.327664282 +0200 > +++ build/tests/qemu-iotests/141.out.bad 2019-05-27 17:11:53.949439880 > +0200 > @@ -42,9 +42,9 @@ > {"return": {}} > {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}} > {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} > -{"return": {}} > {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "job0"}} > {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "BLOCK_JOB_READY", "data": {"device": "job0", "len": 0, "offset": 0, "speed": > 0, "type": "commit"}} > +{"return": {}} > {"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: block > device is in use by block job: commit"}} > {"return": {}} > {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": > "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "job0"}} and > 211 5s ... [17:11:54] [17:11:58] - output mismatch (see 211.out.bad) > --- tests/qemu-iotests/211.out 2019-05-22 19:58:34.870273427 +0200 > +++ build/tests/qemu-iotests/211.out.bad 2019-05-27 17:11:58.259348827 > +0200 > @@ -55,8 +55,7 @@ > virtual size: 32 MiB (33554432 bytes) > cluster_size: 1048576 > > -[{ "start": 0, "length": 3072, "depth": 0, "zero": false, "data": true, > "offset": 1024}, > -{ "start": 3072, "length": 33551360, "depth": 0, "zero": true, "data": true, > "offset": 4096}] > +[{ "start": 0, "length": 33554432, "depth": 0, "zero": false, "data": true, > "offset": 1024}] > > === Invalid BlockdevRef === Doesn’t look too bad, but still, broken iotests are broken iotests. :/ Max
signature.asc
Description: OpenPGP digital signature