On Mon, Jun 22, 2015 at 17:06:45 -0600, Eric Blake wrote: > With this patch, block write threshold events delivered by qemu > are converted into libvirt events. > > This patch takes the easy road, and only reports events if > the node name is still cached by libvirtd (true in the common > case when libvirtd is not restarted, since you can't get an > event if you didn't register a threshold). A followup patch > will be needed to properly handle grabbing the job lock and > getting the node name when the cache lookup fails, using code > similar to how we update domain XML after a block job > completes. But for getting the initial API in place, I > figured this was a good enough start. > > * src/qemu/qemu_monitor_json.c > (qemuMonitorJSONHandleBlockWriteThreshold): New function. > * src/qemu/qemu_monitor.c (qemuMonitorEmitBlockThreshold): > Likewise. > * src/qemu/qemu_monitor.h (qemuMonitorEmitBlockThreshold): > Likewise. > * src/qemu/qemu_process.c (qemuProcessHandleBlockThreshold): > Likewise. > > Signed-off-by: Eric Blake <eblake@xxxxxxxxxx> > --- > src/qemu/qemu_monitor.c | 14 ++++++++++++++ > src/qemu/qemu_monitor.h | 11 +++++++++++ > src/qemu/qemu_monitor_json.c | 31 +++++++++++++++++++++++++++++++ > src/qemu/qemu_process.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 100 insertions(+) ... > > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index ba84182..5f582e5 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -1037,6 +1037,49 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED, > > > static int > +qemuProcessHandleBlockThreshold(qemuMonitorPtr mon ATTRIBUTE_UNUSED, > + virDomainObjPtr vm, > + const char *node, > + unsigned long long threshold, > + unsigned long long length, > + void *opaque) > +{ > + virQEMUDriverPtr driver = opaque; > + virDomainDiskDefPtr disk; > + virObjectEventPtr event = NULL; > + const char *path = NULL; > + > + virObjectLock(vm); > + > + VIR_DEBUG("Block threshold for node %s (domain: %p,%s) threshold %llu " > + "length %llu", node, vm, vm->def->name, threshold, length); > + > + /* TODO: If the node name is not found in the current domain XML, > + * we need to grab a job lock and query the monitor to repopulate > + * the node name cache. For now, if that happens, we just discard > + * the event. */ This duality of operations is why we should cache the node names upfront. > + if (!(disk = qemuDomainDiskResolveAllocationNode(driver, vm, node, > + false))) { > + VIR_WARN("failed to locate disk matching node '%s'", node); > + goto cleanup; > + } > + if (virStorageSourceIsLocalStorage(disk->src)) > + path = disk->src->path; > + > + /* TODO: Once we support node names for more than just the active > + * layer, we will need to map this into 'vda[1]' notation. */ > + event = virDomainEventWriteThresholdNewFromObj(vm, disk->dst, path, > + threshold, length); > + Peter
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list