Bug 1110212
Summary: | The error info is not correct when do blockcommit with --base and --top point to same source | ||
---|---|---|---|
Product: | Red Hat Enterprise Linux 7 | Reporter: | Shanzhi Yu <shyu> |
Component: | libvirt | Assignee: | Eric Blake <eblake> |
Status: | CLOSED ERRATA | QA Contact: | Virtualization Bugs <virt-bugs> |
Severity: | medium | Docs Contact: | |
Priority: | medium | ||
Version: | 7.0 | CC: | dyuan, eblake, mzhan, pkrempa, rbalakri, xuzhang, yanyang |
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: | Story Points: | --- | |
Clone Of: | Environment: | ||
Last Closed: | 2015-03-05 07:37:44 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: |
Description
Shanzhi Yu
2014-06-17 09:09:26 UTC
Solved upstream with: commit 3e3c6ff10fdb0bb086d61629d75bcad9169152b9 Author: Eric Blake <eblake> Date: Wed Jun 11 16:22:57 2014 -0600 blockcommit: require base below top The block commit code looks for an explicit base file relative to the discovered top file; so for a chain of: base <- snap1 <- snap2 <- snap3 and a command of: virsh blockcommit $dom vda --base snap2 --top snap1 we got a sane message (here from libvirt 1.0.5): error: invalid argument: could not find base 'snap2' below 'snap1' in chain for 'vda' Meanwhile, recent refactoring has slightly reduced the quality of the libvirt error messages, by losing the phrase 'below xyz': error: invalid argument: could not find image 'snap2' in chain for 'snap3' But we had a one-off, where we were not excluding the top file itself in searching for the base; thankfully qemu still reports the error, but the quality is worse: virsh blockcommit $dom vda --base snap2 --top snap2 error: internal error unable to execute QEMU command 'block-commit': Base '/snap2' not found Fix the one-off in blockcommit by changing the semantics of name lookup - if a starting point is specified, then the result must be below that point, rather than including that point. The only other call to chain lookup was blockpull code, which was already forcing the lookup to omit the active layer and only needs a tweak to use the new semantics. This also fixes the bug exposed in the testsuite, where when doing a lookup pinned to an intermediate point in the chain, we were unable to return the name of the parent also in the chain. * src/util/virstoragefile.c (virStorageFileChainLookup): Change semantics for non-NULL startFrom. * src/qemu/qemu_driver.c (qemuDomainBlockJobImpl): Adjust caller, to keep existing semantics. * tests/virstoragetest.c (mymain): Adjust to expose new semantics. Signed-off-by: Eric Blake <eblake> Attepmted to verify it with the following component libvirt-1.2.8-10.el7.x86_64 qemu-kvm-rhev-2.1.2-16.el7.x86_64 kernel-3.10.0-212.el7.x86_64 Steps: 1. create 4 external disk-only snapshots # for i in {1..4}; do virsh snapshot-create-as vm2 s$i --disk-only --diskspec hda,file=/tmp/vm2.s$i; done Domain snapshot s1 created Domain snapshot s2 created Domain snapshot s3 created Domain snapshot s4 created # virsh domblklist vm2 Target Source ------------------------------------------------ hda /tmp/vm2.s4 2. blockcommit using absolute path # virsh blockcommit vm2 hda --base /tmp/vm2.s4 --top /tmp/vm2.s4 --wait --verbose --active error: invalid argument: could not find image '/tmp/vm2.s4' beneath '/tmp/vm2.s4' in chain for '/tmp/vm2.s4' # virsh blockcommit vm2 hda --base /tmp/vm2.s2 --top /tmp/vm2.s2 --wait --verbose error: invalid argument: could not find image '/tmp/vm2.s2' beneath '/tmp/vm2.s2' in chain for '/tmp/vm2.s4' # virsh blockcommit vm2 hda --base /var/lib/libvirt/images/vm2.qcow2 --top /var/lib/libvirt/images/vm2.qcow2 --wait --verbose error: invalid argument: top '/var/lib/libvirt/images/vm2.qcow2' in chain for 'hda' has no backing file # virsh blockcommit vm2 hda --base /tmp/vm2.s4 --top /tmp/vm2.s2 --wait --verbose error: invalid argument: could not find image '/tmp/vm2.s4' beneath '/tmp/vm2.s2' in chain for '/tmp/vm2.s4' 3. blockcommit passing hda[x] # virsh blockcommit vm2 hda --base hda[4] --top hda[4] --wait --verbose error: invalid argument: top '/var/lib/libvirt/images/vm2.qcow2' in chain for 'hda' has no backing file # virsh blockcommit vm2 hda --base hda --top hda --wait --verbose error: invalid argument: could not find image 'hda' in chain for '/tmp/vm2.s4' # virsh blockcommit vm2 hda --base /tmp/vm2.s4 --top hda[2] --wait --verbose error: invalid argument: could not find image '/tmp/vm2.s4' beneath '/tmp/vm2.s2' in chain for '/tmp/vm2.s4' Hi Eric, The error shows that 'could not find backing store X in chain...' when passing hda[X] to base. However, hda[X] is a backing store in chain. Does it deserve a fix ? # virsh blockcommit vm2 hda --base hda[2] --top hda[2] --wait --verbose error: invalid argument: could not find backing store 2 in chain for '/tmp/vm2.s4' # virsh blockcommit vm2 hda --base hda[1] --top hda[2] --wait --verbose error: invalid argument: could not find backing store 1 in chain for '/tmp/vm2.s4' # virsh blockcommit vm2 hda --base hda[1] --top /tmp/vm2.s1 --wait --verbose error: invalid argument: could not find backing store 1 in chain for '/tmp/vm2.s4' (In reply to yangyang from comment #3) > Attepmted to verify it with the following component > libvirt-1.2.8-10.el7.x86_64 > qemu-kvm-rhev-2.1.2-16.el7.x86_64 > kernel-3.10.0-212.el7.x86_64 > > # virsh blockcommit vm2 hda --base hda[4] --top hda[4] --wait --verbose > error: invalid argument: top '/var/lib/libvirt/images/vm2.qcow2' in chain > for 'hda' has no backing file Through here, the messages make sense. > > # virsh blockcommit vm2 hda --base hda --top hda --wait --verbose > error: invalid argument: could not find image 'hda' in chain for > '/tmp/vm2.s4' This message is slightly awkward, but still tolerable (it would be better if --base hda turned into /tmp/vm2.s4 in the same way that --top hda did). > > # virsh blockcommit vm2 hda --base /tmp/vm2.s4 --top hda[2] --wait --verbose > error: invalid argument: could not find image '/tmp/vm2.s4' beneath > '/tmp/vm2.s2' in chain for '/tmp/vm2.s4' Fine. > > Hi Eric, > The error shows that 'could not find backing store X in chain...' when > passing hda[X] to base. However, hda[X] is a backing store in chain. Does it > deserve a fix ? > > # virsh blockcommit vm2 hda --base hda[2] --top hda[2] --wait --verbose > error: invalid argument: could not find backing store 2 in chain for > '/tmp/vm2.s4' Awkward message, but correct that the attempt failed. > > # virsh blockcommit vm2 hda --base hda[1] --top hda[2] --wait --verbose > error: invalid argument: could not find backing store 1 in chain for > '/tmp/vm2.s4' Awkward message, but correct that the attempt failed. > > > # virsh blockcommit vm2 hda --base hda[1] --top /tmp/vm2.s1 --wait --verbose > error: invalid argument: could not find backing store 1 in chain for > '/tmp/vm2.s4' Awkward message, but correct that the attempt failed. So at this point, the behavior is correct in all cases (we fail when we are supposed to), and the only thing remaining is that the error message is not as high quality as it could be. I would suggest filing that as a separate bug, since it is lower priority and should not hold up a release, while this bug appears to be validated by your testing. Thanks Eric. Filed a separate low priority bug. https://bugzilla.redhat.com/show_bug.cgi?id=1177062 Mark this one as verified. 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 |