[libvirt] Use of 'detach' flag with QMP command `migrate` in qemuMonitorJSONMigrate()

Daniel P. Berrange berrange at redhat.com
Mon Sep 28 09:02:48 UTC 2015

On Sun, Sep 27, 2015 at 06:23:15PM +0200, Kashyap Chamarthy wrote:
> The qmp-commands.hx file from QEMU says[1]:
>     "The user Monitor's "detach" argument is invalid in QMP and should
>     not be used"

That does not exactly reflect reality. The QMP parser permits
"detach", but the qmp_migrate() method ignores it, and operates
as if it were always set to 'true', which is what libvirt
wants anyway.

> However, when live block migration is performed, I still see that
> libvirt sets the 'detach' boolean to 'true':
>     [. . .]
>     2015-04-09 11:20:54.160+0000: 12152: debug : qemuMonitorJSONCommandWithFd:290 : Send command '{"execute":"migrate","arguments":{"detach":true,"blk":true,"inc":false,"uri":"fd:migrate"},"id":"libvirt-18"}' for write with FD -1
>     [. . .]
> Where 'detach' means: "not wait for completion" (reading hmp-commands.hx
> qemuMonitorJSONMigrate() from qemu_monitor_json.c in libvirt source).
> Two questions:
>   - Should the 'detach' flag be not passed in this case, because the
>     documentation says it's not valid in QMP case?
>   - _What_ exactly is setting the 'detach' flag explicitly in this case?
>     Or is it default when using 'inc' flag ('--copy-storage-inc' in
>     `virsh` parlance)?

In HMP, the monitor would block until migration was completed. Passing
detach=true means the monitor command completes immediately migration
has started. Libvirt passes detach=true because it wants the latter
behaviour which was not the default with HMP. We've just inherited
that when we ported to QMP, even though it is redundant.

> Contextual libvirtd.log from source, with log_filter for 'qemu' set[2].
> Note that in the above case, live block migration _did_ succeed, I'm
> just asking this to educate myself.
> PS: If you're wondering why am I not using the new 'drive-mirror' based
>     approach above, I performed this block migration via OpenStack Nova.
>     Currently in Nova's case, live block migration falls back to the old
>     approach of QMP `migrate` command (with 'inc' flag set to true -- it
>     explicitly set by OpenStack Nova) via  qemuMonitorJsonMigrate(), and
>     not the new way of qemuMonitorJSONDriveMirror().
> I was testing with:
>   - libvirt-daemon-driver-qemu-
>   - qemu-system-x86-2.3.1-1.fc22.x86_64
> [1] http://git.qemu.org/?p=qemu.git;a=blob;f=qmp-commands.hx#l643
> [2] https://kashyapc.fedorapeople.org/virt/temp/live-blk-migration-libvirt-debug-log-on-src.txt

|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

More information about the libvir-list mailing list