Bug 1069784
Summary: | block commit/pull support for disks using libgfapi volumes | |||
---|---|---|---|---|
Product: | Red Hat Enterprise Linux 7 | Reporter: | Peter Krempa <pkrempa> | |
Component: | libvirt | Assignee: | Peter Krempa <pkrempa> | |
Status: | CLOSED ERRATA | QA Contact: | Virtualization Bugs <virt-bugs> | |
Severity: | unspecified | Docs Contact: | ||
Priority: | unspecified | |||
Version: | 7.0 | CC: | dyuan, mzhan, rbalakri, shyu | |
Target Milestone: | rc | |||
Target Release: | --- | |||
Hardware: | Unspecified | |||
OS: | Unspecified | |||
Whiteboard: | ||||
Fixed In Version: | libvirt-1.2.7-1.el7 | Doc Type: | Bug Fix | |
Doc Text: |
Cause:
libvirt's internal structures didn't store enough information to allow block operations (commit, pull) on networked storage and libvirt also lacked a way to represent network storage paths to these APIs
Consequence:
A user wasn't able to start block operations if a disk was backed by a backing chain containing networked storage.
Fix:
libvirt now provides a way to choose networked storage images in the backing chain and allows to start the block operations on them.
Result:
users are now able to use block commit and block pull with disks backed by gluster, rbd and such.
|
Story Points: | --- | |
Clone Of: | ||||
: | 1069791 (view as bug list) | Environment: | ||
Last Closed: | 2015-03-05 07:30:41 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: | ||||
Bug Blocks: | 1045196, 1069791 |
Description
Peter Krempa
2014-02-25 16:29:20 UTC
Relevant upstream discussion: http://www.redhat.com/archives/libvir-list/2014-February/msg01226.html Fixed upstream: commit c6bf2f0ffc5d51f03eeb83103c323ff7949e8b59 Author: Peter Krempa <pkrempa> Date: Mon Apr 28 15:39:19 2014 +0200 qemu: Add support for networked disks for block pull/block rebase Now that we are able to select images from the backing chain via indexed access we should also convert possible network sources to qemu-compatible strings before passing them to qemu. commit 60244b56afb3438080b55ac838766af3a0037e03 Author: Peter Krempa <pkrempa> Date: Mon Apr 28 15:39:19 2014 +0200 qemu: Add support for networked disks for block commit Now that we are able to select images from the backing chain via indexed access we should also convert possible network sources to qemu-compatible strings before passing them to qemu. commit 37183e5db83fd476be552fd889edc74d82927981 Author: Peter Krempa <pkrempa> Date: Fri May 16 15:40:06 2014 +0200 lib: Introduce flag VIR_DOMAIN_BLOCK_REBASE_RELATIVE Introduce flag for the block rebase API to allow the rebase operation to leave the chain relatively addressed. Also adds a virsh switch to enable this behavior. commit bda44ca2ca5bf06721df07b09df4e102d929bd7c Author: Peter Krempa <pkrempa> Date: Tue May 13 17:59:32 2014 +0200 lib: Introduce flag VIR_DOMAIN_BLOCK_COMMIT_RELATIVE Introduce flag for the block commit API to allow the commit operation to leave the chain relatively addressed. Also adds a virsh switch to enable this behavior. v1.2.6-67-gc6bf2f0 Verify this bug with libvirt-1.2.8-11.el7.x86_64 Steps as below Scenario I Block commit 1. Both source file and new snapshot file based on glusterfs 1.1 Prepare a running domain with source file based on glusterfs # virsh dumpxml rh7 |grep disk -A 6 <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> 1.2 Create three snapshot, new snapshot file based on glusterfs # cat s1.xml <domainsnapshot> <name>SNAP</name> <disks> <disk name='vda' type='network'> <driver type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-raw.SNAP'> <host name='10.66.5.38'/> </source> </disk> </disks> </domainsnapshot> # for i in s1 s2 s3;do sed -e s/SNAP/$i/g s1.xml >$i-snap.xml;virsh snapshot-create rh7 $i-snap.xml --disk-only;done Domain snapshot s1 created from 's1-snap.xml' Domain snapshot s2 created from 's2-snap.xml' Domain snapshot s3 created from 's3-snap.xml' # virsh dumpxml rh7|grep disk -A 24 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s3'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='1'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s2'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='2'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s1'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='3'> <format type='raw'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> </backingStore> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 1.3 Do blockcommit on inactive layer # virsh blockcommit rh7 vda --base vda[2] --top vda[1] --verbose --wait Block Commit: [100 %] Now in synchronized phase # virsh dumpxml rh7|grep disk -A 18 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s3'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='1'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s1'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='2'> <format type='raw'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 1.4 Do blockcommit on active layer # virsh blockcommit rh7 vda --active --pivot --verbose --wait Block Commit: [100 %] Successfully pivoted # virsh dumpxml rh7|grep disk -A 6 <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> 2. Source file based on glusterfs while new snapshot file based on local 2.1 Prepare a running domain with source file based on glusterfs # virsh dumpxml rh7|grep disk -A 6 <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> 2.2 Create three external disk snapshot with new snapshot file based on local # for i in 1 2 3;do virsh snapshot-create-as rh7 s$i --disk-only --diskspec vda,snapshot=external,file=/var/lib/libvirt/images/rh7-raw.s$i --atomic;done # virsh dumpxml rh7|grep disk -A 18 <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/libvirt/images/rh7-raw.s3'/> <backingStore type='file' index='1'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/rh7-raw.s2'/> <backingStore type='file' index='2'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/rh7-raw.s1'/> <backingStore type='network' index='3'> <format type='raw'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> </backingStore> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 2.3 Do blockcommit on inactive layer # virsh blockcommit rh7 vda --base vda[2] --top vda[1] --verbose --wait Block Commit: [100 %] Now in synchronized phase # virsh dumpxml rh7|grep disk -A 16 <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/libvirt/images/rh7-raw.s3'/> <backingStore type='file' index='1'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/rh7-raw.s1'/> <backingStore type='network' index='2'> <format type='raw'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 2.4 Do blockcommit on active layer # virsh blockcommit rh7 vda --active --pivot --verbose --wait Block Commit: [100 %] Successfully pivoted # virsh dumpxml rh7|grep disk -A 6 <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> 3. Source file based on local while new snapshot file based on glusterfs 3.1 Prepare a running domain with source file based on local # virsh dumpxml rhel7|grep disk -A 6 <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/libvirt/images/r7-qcow2.img'/> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> 3.2 Create three external disk snapshot with new snapshot file baesd on glusterfs # for i in s1 s2 s3;do sed -e s/SNAP/$i/g snap.xml >$i-snap.xml;virsh snapshot-create rhel7 $i-snap.xml --disk-only;done Domain snapshot s1 created from 's1-snap.xml' Domain snapshot s2 created from 's2-snap.xml' Domain snapshot s3 created from 's3-snap.xml' # cat snap.xml <domainsnapshot> <name>SNAP</name> <disks> <disk name='vda' type='network'> <driver type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.SNAP'> <host name='10.66.5.38'/> </source> </disk> </disks> </domainsnapshot> # virsh dumpxml rhel7|grep disk -A 24 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s3'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='1'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s2'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='2'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s1'> <host name='10.66.5.38'/> </source> <backingStore type='file' index='3'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/r7-qcow2.img'/> <backingStore/> </backingStore> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 3.3 Do blockcommit on inactive layer # virsh blockcommit rhel7 vda --base vda[2] --top vda[1] --verbose --wait Block Commit: [100 %] Now in synchronized phase # virsh dumpxml rhel7|grep disk -A 16 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s3'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='1'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s1'> <host name='10.66.5.38'/> </source> <backingStore type='file' index='2'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/r7-qcow2.img'/> <backingStore/> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 3.4 Do blockcommit on active layer # virsh blockcommit rhel7 vda --active --pivot --verbose --wait Block Commit: [100 %] Successfully pivoted # virsh dumpxml rhel7|grep disk -A 6 <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/libvirt/images/r7-qcow2.img'/> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> Scenario II Block pull 1. Both source file and new snapshot file based on glusterfs NB:Step 1.1 1.2 is same like step 1.1 and 1.2 in Scenario I 1.1 1.2 # virsh dumpxml rh7|grep disk -A 24 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s3'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='1'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s2'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='2'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s1'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='3'> <format type='raw'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> </backingStore> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 1.3 Do blockpull # virsh blockpull rh7 vda --base vda[2] --verbose --wait Block Pull: [100 %] Pull complete # virsh dumpxml rh7|grep disk -A 24 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s3'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='1'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s1'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='2'> <format type='raw'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> # virsh blockpull rh7 vda --verbose --wait Block Pull: [100 %] Pull complete # virsh dumpxml rh7|grep disk -A 6 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-raw.s3'> <host name='10.66.5.38'/> </source> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> 2. Source file based on glusterfs while new snapshot file based on local NB: Step 2.1 2.2 is same like step 2.1 and 2.2 in Scenario I 2.1 2.2 # virsh dumpxml rh7 |grep disk -A 24 <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/libvirt/images/rh7-raw.s3'/> <backingStore type='file' index='1'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/rh7-raw.s2'/> <backingStore type='file' index='2'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/rh7-raw.s1'/> <backingStore type='network' index='3'> <format type='raw'/> <source protocol='gluster' name='gluster-vol1/r7-raw.img'> <host name='10.66.5.38'/> </source> <backingStore/> </backingStore> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 2.3 Do blockpull # virsh blockpull rh7 vda --verbose --wait Block Pull: [100 %] Pull complete # virsh dumpxml rhel7|grep disk -A 6 <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/libvirt/images/r7-qcow2.img'/> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> 3. Source file based on local while new snapshot file based on glusterfs NB: Step 3.1 3.2 is same like step 3.1 and 3.2 in Scenario I 3.1 3.2 # virsh dumpxml rhel7|grep disk -A 22 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s3'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='1'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s2'> <host name='10.66.5.38'/> </source> <backingStore type='network' index='2'> <format type='qcow2'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s1'> <host name='10.66.5.38'/> </source> <backingStore type='file' index='3'> <format type='qcow2'/> <source file='/var/lib/libvirt/images/r7-qcow2.img'/> <backingStore/> </backingStore> </backingStore> </backingStore> <target dev='vda' bus='virtio'/> 3.3 Do blockpull # virsh blockpull rhel7 vda --verbose --wait Block Pull: [100 %] Pull complete # virsh dumpxml rhel7|grep disk -A 6 <disk type='network' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source protocol='gluster' name='gluster-vol1/r7-qcow2.s3'> <host name='10.66.5.38'/> </source> <backingStore/> <target dev='vda' bus='virtio'/> <alias name='virtio-disk0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> Given above test, I'd like change this bug to VERIFIED status 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://rhn.redhat.com/errata/RHSA-2015-0323.html |