On Thu, Jul 05, 2018 at 09:44:36 +0200, Michal Privoznik wrote: > This event is emitted on the monitor if one of pr-managers lost > connection to its pr-helper process. What libvirt needs to do is > restart the pr-helper process iff it corresponds to managed > pr-manager. > > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > src/qemu/qemu_domain.c | 1 + > src/qemu/qemu_domain.h | 1 + > src/qemu/qemu_driver.c | 17 ++++++++++++++ > src/qemu/qemu_monitor.c | 15 ++++++++++++ > src/qemu/qemu_monitor.h | 11 +++++++++ > src/qemu/qemu_monitor_json.c | 23 ++++++++++++++++++ > src/qemu/qemu_process.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ > 7 files changed, 123 insertions(+) [...] > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index f200729cb1..ac2f73c99e 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -1615,6 +1615,60 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon ATTRIBUTE_UNUSED, > } > > > +static int > +qemuProcessHandlePRManagerStatusChanged(qemuMonitorPtr mon ATTRIBUTE_UNUSED, > + virDomainObjPtr vm, > + const char *prManager, > + bool connected, > + void *opaque) > +{ > + virQEMUDriverPtr driver = opaque; > + qemuDomainObjPrivatePtr priv; > + struct qemuProcessEvent *processEvent = NULL; > + const char *managedAlias = qemuDomainGetManagedPRAlias(); > + int ret = -1; > + > + virObjectLock(vm); > + > + VIR_DEBUG("pr-manager %s status changed for domain %p %s connected=%d", > + prManager, vm, vm->def->name, connected); > + > + if (connected) { > + /* Connect events are boring. */ > + ret = 0; > + goto cleanup; > + } > + /* Disconnect events are more interesting. */ > + > + if (STRNEQ(prManager, managedAlias)) { > + VIR_DEBUG("pr-manager %s not managed, ignoring event", > + prManager); > + ret = 0; > + goto cleanup; > + } > + > + priv = vm->privateData; > + priv->prDaemonRunning = false; > + > + if (VIR_ALLOC(processEvent) < 0) > + goto cleanup; > + > + processEvent->eventType = QEMU_PROCESS_EVENT_PR_DISCONNECT; > + processEvent->vm = virObjectRef(vm); > + > + if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) { > + qemuProcessEventFree(processEvent); > + ignore_value(virObjectUnref(vm)); We usually don't ignore value of this. > + goto cleanup; > + } > + > + ret = 0; > + cleanup: > + virObjectUnlock(vm); > + return ret; ACK
Attachment:
signature.asc
Description: PGP signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list