Hi,

We unregister qemu monitor after sending QEMU_PROCESS_EVENT_MONITOR_EOF to 
workerPool:

static void
qemuProcessHandleMonitorEOF(qemuMonitorPtr mon,
                            virDomainObjPtr vm,
                            void *opaque)
{
    virQEMUDriverPtr driver = opaque;
    qemuDomainObjPrivatePtr priv;
struct qemuProcessEvent *processEvent;
...
processEvent->eventType = QEMU_PROCESS_EVENT_MONITOR_EOF;
    processEvent->vm = vm;

    virObjectRef(vm);
    if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) {
        ignore_value(virObjectUnref(vm));
        VIR_FREE(processEvent);
        goto cleanup;
    }

    /* We don't want this EOF handler to be called over and over while the
     * thread is waiting for a job.
     */
qemuMonitorUnregister(mon);
...
}

Then we handle QEMU_PROCESS_EVENT_MONITOR_EOF in processMonitorEOFEvent 
function:

static void
processMonitorEOFEvent(virQEMUDriverPtr driver,
                       virDomainObjPtr vm)
{
      ...
      if (qemuProcessBeginStopJob(driver, vm, QEMU_JOB_DESTROY, true) < 0)
        return;
      ...
}

Here,  libvirt will show that the vm state is running all the time if 
qemuProcessBeginStopJob return -1
even though qemu may terminate or be killed later.

So, may be we should re-register the monitor when qemuProcessBeginStopJob 
failed?


Thanks,
Zongyong Wu

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to