[libvirt] [BUG] duplicate suspend/resume lifecycle events with QEMU

Martin Kletzander mkletzan at redhat.com
Wed Jun 21 10:07:55 UTC 2017


On Tue, Jun 13, 2017 at 10:30:59AM +0200, Philipp Hahn wrote:
>Hello,
>
>Am 13.06.2017 um 06:13 schrieb Philipp Hahn:
>> I'm using the libvirt event mechanism and noticed, that several events
>> are reported twice:
>...
>>> $ virsh  event --loop --event lifecycle
>>> event 'lifecycle' for domain installer: Started Booted
>>> event 'lifecycle' for domain installer: Suspended Paused
>>> event 'lifecycle' for domain installer: Resumed Unpaused
>>> event 'lifecycle' for domain installer: Resumed Unpaused
>>> event 'lifecycle' for domain installer: Suspended Paused
>>> event 'lifecycle' for domain installer: Suspended Paused
>>> event 'lifecycle' for domain installer: Stopped Destroyed
>...
>> Looking at src/qemu/qemu_monitor_json.c:qemuMonitorJSONIOProcessEvent:
>
>That was not the cause. Using gdb shows the real duplicator:
>
>Breakpoint 9, virDomainEventLifecycleNew (id=10, name=0x7fffd825e700
>"win8", uuid=0x7fffd825e128 "o8r\204\344\372F\263\214oGF\325@=9",
>type=4, detail=0) at ../../../src/conf/domain_event.c:657
>657     }
>$13 = {parent = {parent = {parent = {u = {dummy_align1 = 7700611138,
>dummy_align2 = 0x1cafe0042, s = {magic = 3405643842, refs = 1}}, klass =
>0x5555558304e0}, eventID = 0, meta = {id = 10, name = 0x5555558304a0 "win8",
>        uuid = "o8r\204\344\372F\263\214oGF\325@=9", key =
>0x555555831270 "6f387284-e4fa-46b3-8c6f-4746d5403d39"}, remoteID = -1,
>dispatch = 0x7ffff77d85c0 <virDomainEventDispatchDefaultFunc>}, dummy =
>false}, type = 4, detail = 0}
>> (gdb) bt
>> #0  virDomainEventLifecycleNew (id=10, name=0x7fffd825e700 "win8", uuid=0x7fffd825e128 "o8r\204\344\372F\263\214oGF\325@=9", type=4, detail=0) at ../../../src/conf/domain_event.c:657
>> #1  0x00007fffe52fefef in qemuProcessHandleResume (mon=0x0, vm=0x7fffd825ec80, opaque=0x7fffd8101b90) at ../../../src/qemu/qemu_process.c:773
>> #2  0x00007fffe531c9c2 in qemuMonitorEmitResume (mon=0x7fffd0000ea0) at ../../../src/qemu/qemu_monitor.c:1330
>> #3  0x00007fffe532fd0b in qemuMonitorJSONIOProcessEvent (obj=<optimized out>, mon=<optimized out>) at ../../../src/qemu/qemu_monitor_json.c:178
>> #4  qemuMonitorJSONIOProcessLine (mon=0x0, line=0x7fffe55d50e0 <eventHandlers+224> "}\242\071\345\377\177", msg=0xe) at ../../../src/qemu/qemu_monitor_json.c:207
>> #5  0x00007fffe532fedb in qemuMonitorJSONIOProcess (mon=0x0, data=0x7ffff774f9b0 <virLogOnce> "H\203\354\bH\215=\245\315G", len=119, msg=0x0) at ../../../src/qemu/qemu_monitor_json.c:249
>> #6  0x00007fffe531b293 in qemuMonitorIOProcess (mon=<optimized out>) at ../../../src/qemu/qemu_monitor.c:432
>> #7  qemuMonitorIO (watch=18, fd=-134433088, events=1, opaque=0x7fffd0000ea0) at ../../../src/qemu/qemu_monitor.c:686
>> #8  0x00007ffff7735446 in virEventPollDispatchHandles (fds=<optimized out>, nfds=<optimized out>) at ../../../src/util/vireventpoll.c:508
>> #9  virEventPollRunOnce () at ../../../src/util/vireventpoll.c:657
>> #10 0x00007ffff7733b71 in virEventRunDefaultImpl () at ../../../src/util/virevent.c:314
>> #11 0x00007ffff788aced in virNetDaemonRun (dmn=0x555555807d60) at ../../../src/rpc/virnetdaemon.c:818
>> #12 0x000055555556e486 in main (argc=-10000, argv=0x0) at ../../../daemon/libvirtd.c:1547
>> (gdb) c
>
>This is the QEMU monitor event handler
>
>> Continuing.
>> [Switching to Thread 0x7fffeee05700 (LWP 11193)]
>>
>> Breakpoint 9, virDomainEventLifecycleNew (id=10, name=0x7fffd825e700 "win8", uuid=0x7fffd825e128 "o8r\204\344\372F\263\214oGF\325@=9", type=4, detail=0) at ../../../src/conf/domain_event.c:657
>> 657     }
>> $14 = {parent = {parent = {parent = {u = {dummy_align1 = 7700611138, dummy_align2 = 0x1cafe0042, s = {magic = 3405643842, refs = 1}}, klass = 0x5555558304e0}, eventID = 0, meta = {id = 10, name = 0x7fffbc000a30 "win8",
>>         uuid = "o8r\204\344\372F\263\214oGF\325@=9", key = 0x7fffbc000b70 "6f387284-e4fa-46b3-8c6f-4746d5403d39"}, remoteID = -1, dispatch = 0x7ffff77d85c0 <virDomainEventDispatchDefaultFunc>}, dummy = false}, type = 4, detail = 0}
>> (gdb) bt
>> #0  virDomainEventLifecycleNew (id=10, name=0x7fffd825e700 "win8", uuid=0x7fffd825e128 "o8r\204\344\372F\263\214oGF\325@=9", type=4, detail=0) at ../../../src/conf/domain_event.c:657
>> #1  0x00007fffe53579dc in qemuDomainResume (dom=0x7fffbc000930) at ../../../src/qemu/qemu_driver.c:1965
>> #2  0x00007ffff7818acf in virDomainResume (domain=0x7fffbc000930) at ../../../src/libvirt-domain.c:679
>> #3  0x0000555555595a3e in remoteDispatchDomainResume (server=<optimized out>, msg=<optimized out>, args=<optimized out>, rerr=<optimized out>, client=<optimized out>) at ../../../daemon/remote_dispatch.h:9132
>> #4  remoteDispatchDomainResumeHelper (server=0x555555806d30, client=0x555555832970, msg=0x555555837910, rerr=0x7fffeee04cc0, args=0x7fffbc000930, ret=0x7fffbc000fc0) at ../../../daemon/remote_dispatch.h:9108
>> #5  0x00007ffff7890939 in virNetServerProgramDispatchCall (msg=<optimized out>, client=<optimized out>, server=<optimized out>, prog=<optimized out>) at ../../../src/rpc/virnetserverprogram.c:437
>> #6  virNetServerProgramDispatch (prog=0x55555581be70, server=0x7ffff774f9b0 <virLogOnce>, server at entry=0x555555806d30, client=0x555555832970, msg=0x555555837910) at ../../../src/rpc/virnetserverprogram.c:307
>> #7  0x00005555555a7378 in virNetServerProcessMsg (msg=<optimized out>, prog=<optimized out>, client=<optimized out>, srv=0x555555806d30) at ../../../src/rpc/virnetserver.c:148
>> #8  virNetServerHandleJob (jobOpaque=<optimized out>, opaque=0x555555806d30) at ../../../src/rpc/virnetserver.c:169
>> #9  0x00007ffff7782c98 in virThreadPoolWorker (opaque=opaque at entry=0x5555557faa70) at ../../../src/util/virthreadpool.c:167
>> #10 0x00007ffff7782068 in virThreadHelper (data=<optimized out>) at ../../../src/util/virthread.c:206
>> #11 0x00007ffff45b4064 in start_thread (arg=0x7fffeee05700) at pthread_create.c:309
>> #12 0x00007ffff42e962d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
>
>this is the code from src/qemu/qemu_driver.c:qemuDomainResume()
>
>>  1903 static int qemuDomainResume(virDomainPtr dom)
>>  1904 {
>...
>>  1942         if (qemuProcessStartCPUs(driver, vm, dom->conn,
>>  1943                                  VIR_DOMAIN_RUNNING_UNPAUSED,
>>  1944                                  QEMU_ASYNC_JOB_NONE) < 0) {
>>  1945             if (virGetLastError() == NULL)
>>  1946                 virReportError(VIR_ERR_OPERATION_FAILED,
>>  1947                                "%s", _("resume operation failed"));
>>  1948             goto endjob;
>>  1949         }
>>  1950         event = virDomainEventLifecycleNewFromObj(vm,
>>  1951                                          VIR_DOMAIN_EVENT_RESUMED,
>>  1952                                          VIR_DOMAIN_EVENT_RESUMED_UNPAUSED);
>>  1953     }
>...
>>  1966  }
>
>My interpretation is this:
>This is the legacy code from the time libvirt was using HMP to talk to
>QEMU and did NOT get events back than.
>Nowadays QEMU emits an event itself over QMP and libvirt still
>duplicates that.
>
>Can we get rid of them or at least disable those Lifecycle events when
>QMP is used, so we get the real state from QEMU and not some desired
>state from libvirt?
>

Looks like you got the case precisely.  However, I'm not sure we can
disable the events based merely on the fact that we use QMP.  Please,
correct me if I'm wrong, that would make the fix very easy (just a
removal, actually) and we could do that for more events, probably.  But
I think older versions could've lacked that particular event.  It's not
listed in the output of query-events, so we can't check for the support
that way.  We can check somewhere that we sent the event and set it if
we do, but that seems like the last fallback as that just adds
unnecessary code.

>Philipp
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170621/6d23594e/attachment-0001.sig>


More information about the libvir-list mailing list