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@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@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(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list