I'm trying to wire up libvirt to do event reporting based on qemu 2.3's BLOCK_WRITE_THRESHOLD event. Doing this will allow management applications to do event-based notification on when to enlarge LVM (or other) storage underlying a qcow2 volume, rather than their current requirement to frequently poll block statistics. But I'm stuck on the best way to expose the new parameter: One idea is to treat it as part of the domain XML, and have virDomainSetBlockIoTune add one more typed parameter for a disk's current write threshold. Doing this could allow setting a threshold even for an offline domain (although the threshold is only meaningful for a running domain), but might get weird because qemu's event is one-shot (you have to re-arm a new threshold every time an existing threshold fires - so every time it fires, the domain XML is rewritten, even though it is not guest-visible ABI that was changing). At least with this approach, it is also easy for a client to poll the current setting of the threshold, via virDomainGetBlockIoTune. But the threshold isn't quite a tuning parameter (it isn't throttling how fast the guest can write to the block device, only how full the host side can get in order to allow transparent resizing of the host storage prior to running out of space). Another idea is to add a completely new API, maybe named virDomainBlockSetWriteThreshold(virDomainPtr dom, const char *disk, long long int threshold, unsigned int flags) (with threshold in bytes). Here, virDomainBlockStatsFlags() could be a way to query the current threshold. And if desired, we could add a flag value to treat threshold as a percentage instead of a byte value (but is 1% too large of granularity, and how would you scale the percentage to anything finer while still keeping the parameter as long long int rather than double?) Of course, I'd want virConnectGetAllDomainStats() to list the current threshold setting (0 if no threshold or if the event has already fired, non-zero if the threshold is still set waiting to fire), so that clients can query thresholds for multiple domains and multiple disks per domain in one API call. But I don't know if we have any good way to set multiple thresholds in one call (at least virDomainSetBlockIoTune must be called once per disk; it might be possible for my proposed virDomainBlockStatsFlags() to set a threshold for multiple disks if the disk name is passed as NULL - but then we're back to the question of what happens if the guest has multiple disks of different sizes; it's better to set per-disk thresholds than to assume all disks must be at the same byte or percentage threshold). I'm also worried about what happens across libvirtd restarts - if the qemu event fires while libvirtd is unconnected, should libvirt be tracking that a threshold was registered in the XML, and upon reconnection check if qemu still has the threshold? If qemu no longer has a threshold, then libvirt can assume it missed the event, and generate one as part of reconnecting to the domain. Thoughts? If I don't hear anything, I'll base my first implementation on adding a new API, rather than reusing virDomainSetBlockIoTune. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list