Bug 1518738
Summary: | Add 'copy-on-read' filter driver for use with blockdev-add | ||
---|---|---|---|
Product: | Red Hat Enterprise Linux 7 | Reporter: | Peter Krempa <pkrempa> |
Component: | qemu-kvm-rhev | Assignee: | Hanna Czenczek <hreitz> |
Status: | CLOSED ERRATA | QA Contact: | CongLi <coli> |
Severity: | medium | Docs Contact: | |
Priority: | medium | ||
Version: | 7.4 | CC: | aliang, chayang, coli, hreitz, juzhang, knoel, michen, mrezanin, mtessun, ngu, qzhang, virt-maint, xuwei, yhong |
Target Milestone: | rc | Keywords: | FutureFeature |
Target Release: | --- | ||
Hardware: | Unspecified | ||
OS: | Unspecified | ||
Whiteboard: | |||
Fixed In Version: | qemu-kvm-rhev-2.12.0-6.el7 | Doc Type: | If docs needed, set a value |
Doc Text: | Story Points: | --- | |
Clone Of: | Environment: | ||
Last Closed: | 2018-11-01 11:01:10 UTC | Type: | Bug |
Regression: | --- | Mount Type: | --- |
Documentation: | --- | CRM: | |
Verified Versions: | Category: | --- | |
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
Cloudforms Team: | --- | Target Upstream Version: | |
Embargoed: | |||
Bug Depends On: | 1572856 | ||
Bug Blocks: | 760547, 1519617, 1527085, 1558125 |
Description
Peter Krempa
2017-11-29 14:25:28 UTC
This is going to be implemented as a filter driver rather than a blockdev-add option. But thanks for creating the BZ, this does need to be tracked. Fix included in qemu-kvm-rhev-2.12.0-5.el7 Fix included in qemu-kvm-rhev-2.12.0-6.el7 Verified this bug on: qemu-kvm-rhev-2.12.0-6.el7.x86_64 Scenario 1: 1. copying data (a guest) from a remote address to a local image. $ qemu-img create -f qcow2 local.qcow2 -b 'json: {"file.driver":"ssh", "file.host":"10.73.**.**","file.path":"/home/coli/rhel76-64-virtio-scsi.qcow2","file.host_key_check":"no" }' 2. $ qemu-img map local.qcow2 (only have backing file info, no about local.qcow2) 0x4ffde0000 0x20000 0xd30000 json:{"host": "10.73.**.**", "host_key_check": "no", "driver": "ssh", "path": "/home/coli/rhel76-64-virtio-scsi.qcow2"} 0x4ffff0000 0x10000 0x70000 json:{"host": "10.73.**.**", "host_key_check": "no", "driver": "ssh", "path": "/home/coli/rhel76-64-virtio-scsi.qcow2"} 3. boot up the local.qcow2 which has a OS. -device virtio-scsi-pci,id=virtio_scsi_pci0,bus=pci.0,addr=0x4 \ -drive id=drive_image1,if=none,snapshot=off,aio=threads,cache=none,format=qcow2,file=/home/local.qcow2 \ -device scsi-hd,id=image1,drive=drive_image1 \ 4. $ qemu-img map local.qcow2 (have local.qcow2 info via copy-on-read) 0x100000 0x10000 0x26a0000 local.qcow2 0x9b50000 0x10000 0x26b0000 local.qcow2 0x202d0000 0x90000 0x280000 local.qcow2 0x20360000 0x60000 0x3c0000 local.qcow2 Scenario 2: 1. copying data from a remote address to a local image. $ qemu-img create -f qcow2 local.qcow2 -b 'json: {"file.driver":"ssh", "file.host":"10.66.10.121","file.path":"/root/remote.img","file.host_key_check":"no" }' 2. $ qemu-img map local.qcow2 --output=json [{ "start": 0, "length": 10737418240, "depth": 1, "zero": true, "data": false}] 3. read image for the 1st time $ qemu-io --image-opts driver=copy-on-read,file.driver=qcow2,file.file.driver=file,file.file.filename=local.qcow2 -c 'read 0 1M' 4. $ qemu-img map local.qcow2 --output=json [{ "start": 0, "length": 1048576, "depth": 0, "zero": true, "data": false}, { "start": 1048576, "length": 10736369664, "depth": 1, "zero": true, "data": false}] 5. read image for the 2nd time $ qemu-io --image-opts driver=copy-on-read,file.driver=qcow2,file.file.driver=file,file.file.filename=local.qcow2 -c 'read 0 1M' read 1048576/1048576 bytes at offset 0 1 MiB, 1 ops; 0.0001 sec (5.034 GiB/sec and 5154.6392 ops/sec) Scenario 3: qemu-iotests 216: ./check 216 -qcow2 QEMU -- "/usr/libexec/qemu-kvm" -nodefaults -machine accel=qtest QEMU_IMG -- "/usr/bin/qemu-img" QEMU_IO -- "/usr/bin/qemu-io" --cache writeback -f qcow2 QEMU_NBD -- "/usr/bin/qemu-nbd" IMGFMT -- qcow2 (compat=1.1) IMGPROTO -- file PLATFORM -- Linux/x86_64 hp-dl385pg8-04 3.10.0-862.6.1.el7.x86_64 TEST_DIR -- /root/rpmbuild/BUILD/qemu-2.12.0/tests/qemu-iotests/scratch SOCKET_SCM_HELPER -- 216 Passed all 1 tests Thanks. (In reply to CongLi from comment #12) > Verified this bug on: qemu-kvm-rhev-2.12.0-6.el7.x86_64 > > Scenario 2: > 1. copying data from a remote address to a local image. > $ qemu-img create -f qcow2 local.qcow2 -b 'json: {"file.driver":"ssh", > "file.host":"10.66.10.121","file.path":"/root/remote.img","file. > host_key_check":"no" }' > > 2. $ qemu-img map local.qcow2 --output=json > [{ "start": 0, "length": 10737418240, "depth": 1, "zero": true, "data": > false}] > > 3. read image for the 1st time > $ qemu-io --image-opts > driver=copy-on-read,file.driver=qcow2,file.file.driver=file,file.file. > filename=local.qcow2 -c 'read 0 1M' read 1048576/1048576 bytes at offset 0 1 MiB, 1 ops; 0.0029 sec (339.789 MiB/sec and 339.7893 ops/sec) > > 4. $ qemu-img map local.qcow2 --output=json > [{ "start": 0, "length": 1048576, "depth": 0, "zero": true, "data": false}, > { "start": 1048576, "length": 10736369664, "depth": 1, "zero": true, "data": > false}] > > 5. read image for the 2nd time > $ qemu-io --image-opts > driver=copy-on-read,file.driver=qcow2,file.file.driver=file,file.file. > filename=local.qcow2 -c 'read 0 1M' > read 1048576/1048576 bytes at offset 0 > 1 MiB, 1 ops; 0.0001 sec (5.034 GiB/sec and 5154.6392 ops/sec) The 2nd time(0.0001 sec) read is faster than the 1st time(0.0029sec) which is as expected. (In reply to CongLi from comment #12) > Verified this bug on: qemu-kvm-rhev-2.12.0-6.el7.x86_64 > > Scenario 1: > 1. copying data (a guest) from a remote address to a local image. > $ qemu-img create -f qcow2 local.qcow2 -b 'json: {"file.driver":"ssh", > "file.host":"10.73.**.**","file.path":"/home/coli/rhel76-64-virtio-scsi. > qcow2","file.host_key_check":"no" }' > > 2. $ qemu-img map local.qcow2 (only have backing file info, no about > local.qcow2) > 0x4ffde0000 0x20000 0xd30000 json:{"host": "10.73.**.**", > "host_key_check": "no", "driver": "ssh", "path": > "/home/coli/rhel76-64-virtio-scsi.qcow2"} > 0x4ffff0000 0x10000 0x70000 json:{"host": "10.73.**.**", > "host_key_check": "no", "driver": "ssh", "path": > "/home/coli/rhel76-64-virtio-scsi.qcow2"} > > 3. boot up the local.qcow2 which has a OS. > -device virtio-scsi-pci,id=virtio_scsi_pci0,bus=pci.0,addr=0x4 \ > -drive > id=drive_image1,if=none,snapshot=off,aio=threads,cache=none,format=qcow2, > file=/home/local.qcow2 \ > -device scsi-hd,id=image1,drive=drive_image1 \ > > 4. $ qemu-img map local.qcow2 (have local.qcow2 info via copy-on-read) > 0x100000 0x10000 0x26a0000 local.qcow2 > 0x9b50000 0x10000 0x26b0000 local.qcow2 > 0x202d0000 0x90000 0x280000 local.qcow2 > 0x20360000 0x60000 0x3c0000 local.qcow2 Sorry, please ignore the invalid test scenario. Hi Max, QE would like to confirm if 'copy-on-read' is ready in -blockdev and blockdev-add now. QE met some errors when test 'copy-on-read', could you please help confirm if the usage is wrong ? 1. -blockdev: qemu-kvm: -blockdev driver=raw,cache.direct=off,cache.no-flush=on,file.filename=/root/test.raw,node-name=my_file,file.driver=file,copy-on-read=on: Parameter 'copy-on-read' is unexpected 2. blockdev-add: {"execute": "blockdev-add","arguments": {"node-name": "drive2","driver": "raw", "file": {"driver":"file", "filename": "/root/test.raw","copy-on-read":"on"}}} {"error": {"class": "GenericError", "desc": "Parameter 'file.copy-on-read' is unexpected"}} Thanks. Hi, The copy-on-read filter driver basically supersedes the copy-on-read option we had for -drive (which is not available for -blockdev or blockdev-add, as you can see). It is instead a block driver, so you would use it like so: 1. -blockdev: -blockdev node-name=my_file,driver=copy-on-read,file.driver=raw,file.file.driver=file,file.file.filename=/root/test.raw 2. blockdev-add: { "execute": "blockdev-add", "arguments": { "node-name": "drive2", "driver": "copy-on-read", "file": { "driver": "raw", "file": { "driver": "file", "filename": "/root/test.raw" } } } } In practice, those test cases are not very useful, however, since copy-on-read is only useful with a backing file (which raw does not provide). So comparable useful test cases would look like this: Image preparation: $ qemu-img create -f qcow2 backing.qcow2 64M Formatting 'backing.qcow2', fmt=qcow2 size=67108864 cluster_size=65536 lazy_refcounts=off refcount_bits=16 $ qemu-img create -f qcow2 -b backing.qcow2 overlay.qcow2 64M Formatting 'overlay.qcow2', fmt=qcow2 size=67108864 backing_file=backing.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16 $ qemu-io -c 'write 0 64M' backing.qcow2 Check the overlay's allocation state: $ qemu-img map overlay.qcow2 Offset Length Mapped to File 0 0x4000000 0x50000 backing.qcow2 (Note the filename, so the data is still in the backing file.) 1. -blockdev: -blockdev "{'node-name':'node0','driver':'copy-on-read','file':{'driver':'qcow2','file':{'driver':'file','filename':'overlay.qcow2'}}}" 2. blockdev-add: {'execute':'blockdev-add','arguments':{'node-name':'node0','driver':'copy-on-read','file':{'driver':'qcow2','file':{'driver':'file','filename':'overlay.qcow2'}}}} In both cases, execute the following over QMP: {'execute':'human-monitor-command','arguments':{'command-line':'qemu-io node0 "read 0 64M"'}} Close the VM and check the overlay's allocation status again: $ qemu-img map overlay.qcow2 Offset Length Mapped to File 0 0x4000000 0x50000 overlay.qcow2 (The filename has changed, so the data is now allocated in the overlay.) Max (In reply to Max Reitz from comment #16) > Hi, > > The copy-on-read filter driver basically supersedes the copy-on-read option > we had for -drive (which is not available for -blockdev or blockdev-add, as > you can see). It is instead a block driver, so you would use it like so: > > 1. -blockdev: > -blockdev > node-name=my_file,driver=copy-on-read,file.driver=raw,file.file.driver=file, > file.file.filename=/root/test.raw > > 2. blockdev-add: > { "execute": "blockdev-add", > "arguments": { > "node-name": "drive2", > "driver": "copy-on-read", > "file": { > "driver": "raw", > "file": { > "driver": "file", > "filename": "/root/test.raw" > } > } > } } Thanks Max, it works. > > In practice, those test cases are not very useful, however, since > copy-on-read is only useful with a backing file (which raw does not provide). > So comparable useful test cases would look like this: > > Image preparation: > $ qemu-img create -f qcow2 backing.qcow2 64M > Formatting 'backing.qcow2', fmt=qcow2 size=67108864 cluster_size=65536 > lazy_refcounts=off refcount_bits=16 > $ qemu-img create -f qcow2 -b backing.qcow2 overlay.qcow2 64M > Formatting 'overlay.qcow2', fmt=qcow2 size=67108864 > backing_file=backing.qcow2 cluster_size=65536 lazy_refcounts=off > refcount_bits=16 > $ qemu-io -c 'write 0 64M' backing.qcow2 > > Check the overlay's allocation state: > $ qemu-img map overlay.qcow2 > Offset Length Mapped to File > 0 0x4000000 0x50000 backing.qcow2 > > (Note the filename, so the data is still in the backing file.) > > 1. -blockdev: > -blockdev > "{'node-name':'node0','driver':'copy-on-read','file':{'driver':'qcow2', > 'file':{'driver':'file','filename':'overlay.qcow2'}}}" > > 2. blockdev-add: > {'execute':'blockdev-add','arguments':{'node-name':'node0','driver':'copy-on- > read','file':{'driver':'qcow2','file':{'driver':'file','filename':'overlay. > qcow2'}}}} > > In both cases, execute the following over QMP: > {'execute':'human-monitor-command','arguments':{'command-line':'qemu-io > node0 "read 0 64M"'}} > > Close the VM and check the overlay's allocation status again: > $ qemu-img map overlay.qcow2 > Offset Length Mapped to File > 0 0x4000000 0x50000 overlay.qcow2 > > (The filename has changed, so the data is now allocated in the overlay.) > > Max This scenario is useful and reasonable for the feature, it's helpful in the testing, I have added this scenario as a test case. Tested the scenario above on qemu-kvm-rhev-2.12.0-7.el7.x86_64: 1. Image preparation: $ qemu-img create -f qcow2 backing.qcow2 64 Formatting 'backing.qcow2', fmt=qcow2 size=67108864 cluster_size=65536 lazy_refcounts=off refcount_bits=16 $ qemu-img create -f qcow2 -b backing.qcow2 overlay.qcow2 64 Formatting 'overlay.qcow2', fmt=qcow2 size=67108864 backing_file=backing.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16 2. Write sth into the backing file (0~64M) $ qemu-io -c 'write 0 64M' backing.qcow2 wrote 67108864/67108864 bytes at offset 0 64 MiB, 1 ops; 0.1065 sec (600.392 MiB/sec and 9.3811 ops/sec) 3. Check the overlay's allocation state: $ qemu-img map overlay.qcow2 Offset Length Mapped to File 0 0x4000000 0x50000 backing.qcow2 --> here is 'File' name is backing.qcow2 4. Boot up guest with the overlay file with copy-on-read. -blockdev driver=copy-on-read,file.file.driver=file,file.file.filename=/home/overlay.qcow2,node-name=node0,file.driver=qcow2 \ -device scsi-hd,id=image2,drive=node0 \ 5. Read the info written in 0~64M from overlay file via QMP: {'execute':'human-monitor-command','arguments':{'command-line':'qemu-io node0 "read 0 64M"'}} {"return": ""} 6. Shutdown the vm. 7. Check the overlay's allocation state again: $ qemu-img map overlay.qcow2 Offset Length Mapped to File 0 0x4000000 0x50000 overlay.qcow2 --> The filename has changed, so the data is now allocated in the overlay. ... It also works well with blockdev-add. {"execute":"blockdev-add","arguments":{"node-name":"node0","driver":"copy-on-read","file":{"driver":"qcow2","file":{"driver":"file","filename":"/home/overlay.qcow2"}}}} Max, thank you again. Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHBA-2018:3443 |