I have read libvirt code, specifically:

tools/virsh-domain.c
src/libvirt-domain.c
src/qemu_driver.c

In the execution path of the block commit logic:

vshcommandrun() -> cmdblockcommit() -> virtdomainblockcommit() ->
domain->driver(qemu)->domainblockcommit() -> qemudomainblockcommit()

As explained in libvirt git logs, QEMU changed its behavior in 2.0 for
committing active layer. After the block layer was merged, QEMU has to
wait for what to do: Keep using the actual block layer OR pivot into the
merged one (invalidating all subsequent layers).

Best commit explaining this is:

https://gitorious.org/libvirt/libvirt/commit/b2980250631d6bf12a8e5b05f0bdfcb9456dea3c

Unfortunately this logic first appeared in 1.6 and was heavily changed
until recent versions.

In order to have an usable (decently) block commit logic I would have to
backport the majority of the following commits:

tools/virsh-domain.c

e557bd28a26 virsh: blockcommit: Support --bytes and scaled integers
ceec58ac9ea virsh: fix report of non-active commit completion
78d4c184403 virsh: Fix types for option bandwidth in block*
d8415b54695 virsh: Improve the job type reported of virsh cmd blockcommit
f182da20b09 virsh: expose new active commit controls
b2980250631 blockcommit: document semantics of committing active layer

src/qemu_driver.c

eae59247c59 qemu: Update state of block job to READY only if it actually is 
ready
f9ea3d60119 qemu: read backing chain names from qemu
ee744b5b387 qemu: block-commit: Mark disk in block jobs only on successful 
command
e1125cebfc0 qemu: forbid second blockcommit during active commit
3937ef9cf4f getstats: crawl backing chain for qemu
cfb16b8ed7b blockcommit: turn on active commit
232a31bea3b blockcommit: track job type in xml
c29b6529123 qemu: monitor: Add argument for specifying backing name for block 
commit
40ad7160a2e blockjob: turn on qemu capability bit for active commit
3e3c6ff10fd blockcommit: require base below top
278c51af3a7 blockcommit: update error messages related to block jobs
519181d932f blockcommit: fix regression with explicit top argument
b2980250631 blockcommit: document semantics of committing active layer

AND some of them are even adding arguments to cmdline that don't exist
today (like commit: f182da20b09, specifically adding flags to
differentiate the merge type - active with pivot).

Per SRU guidelines: https://wiki.ubuntu.com/StableReleaseUpdates, the
SRU proposal wouldn't probably not be accepted by our core team.
Instead, I'll do what was done upstream right after 1.2.0 release:

e6bcbcd32c70 qemu: reject rather than hang on blockcommit of active
layer

Reject block commit for active layers. This means that the merge will
either be offline OR by using other merging method: Block Streaming
(comment #10).

I'll prepare the debdiff and propose the patch for the SRU.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1317491

Title:
  virsh blockcommit hangs at 100%

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/1317491/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to