Two options for making progress on this bug:
1. Debug bdrv_drain_all() and find out whether there are any I/O
requests remaining.
Yes, there is one request pending on active layer of disk that is being
commited (on bs->tracked_requests list). IO threads die off because they
have nothing to do... it seems that requests are somehow not commited
into threads.
I tried hard (and will continue to try) to debug this, but documentation
is limited :-) so ANY tips where to look are welcome.
2. Post steps for reproducing this problem (exact command-lines or virsh
commands used).
I'm using application that talks with libvirt via API, so I describe
what it does.
1. Create a VM, boot a system. I'm using iso from http://www.sysresccd.org
2. VM has a mounted QCOW2 disk with following hierarchy:
[file1] -> [file2 (active)]
Both are qcow2 files.
3. Open console. Start command:
while true; do dd if=/dev/zero of=/dev/vdX bs=512k oflag=direct; done;
Where vdX is of course qcow2 disk described above.
4. Create snapshot of file2 (virDomainSnapshotCreateXML). So now we have:
[file1] -> [file2] -> [file3 (active)] -
5. Wait couple of seconds (so snapshot fills up).
6. Commit file2 into file1 (virDomainBlockCommit).
7. During commit, another threads is using virDomainGetBlockJobInfo() to
query its progress.
Note - it doesn't always happen. I have about 1 per 10 failure rate with
this procedure.
Do you want me to reproduce it manually with pure virsh?
--
mg