[openstack-dev] RFC: Synchronizing hypervisor <-> nova state with event notifications
Daniel P. Berrange
berrange at redhat.com
Tue Feb 12 17:36:54 UTC 2013
On Tue, Jan 15, 2013 at 10:52:39AM +0000, Daniel P. Berrange wrote:
> This email is in relation to the following bug
>
> https://bugs.launchpad.net/nova/+bug/1099761
>
> If a guest administrator shuts down their VM from inside the guest
> OS using 'shutdown -h now' (or equivalent), it will take Nova upto
> 10 minutes to notice that the VM has stopped running
>
> The Nova<->hypervisor state synchronization is done in a periodic
> task (nova.compute.manager._sync_power_states) which only runs
> every 10 minutes. It used to be every 60 seconds until this bug
> was addressed:
>
> https://bugs.launchpad.net/nova/+bug/928910
>
> I put most of the blame for that bug's perforance issues in the use
> of the wrong libvirt APIs, but none the less I don't really want to
> put the periodic task frequency back down to 60 seconds.
>
> IMHO the key problem here is the design, not the implementation. In
> particular the use of polling by the manager to detect the state
> changes is inherantly inefficient. Libvirt provides an async event
> notification mechanism allowing applications to have a callback
> triggered whenever a guest changes lifecycle state. Other hypervisor
> APIs like ESX have similar notification mechanisms. Making use of
> this would allow state changes to be detected pretty much immediately.
>
> The question is how to structure the processing of events. I don't
> think that the hypervisor drivers should be directly processing events.
> Instead I believe they need to pass along the event notifications to
> the manager.py class. So my current thought is to introduce a new API
> to nova.virt.api
>
> register_event_notifier(self, callback)
>
> and have nova.compute.manager provide a callback impl to receive the
> events. Before I start coding on this, I want some kind of confirmation
> that this is an acceptable direction to go in, since there is no current
> callback based interactions between nova.compute.manager & nova.virt.api
>
> Even with the register_event_notifier() callacks, I figure we'd still
> run the periodic _sync_power_states() tasks at 10 minute intervals. It
> should merely not have an work todo when it runs. Alternatively we
> could disable this periodic tasks if-only-if register_event_notifier()
> was successful (ie didn't raise NotImplementedException)
Based on the discussions in this thread, I have done the work to
introduce an event mechanism from the compute drivers to the
compute manager
http://wiki.openstack.org/ComputeDriverEvents
https://blueprints.launchpad.net/nova/+spec/compute-driver-events
https://review.openstack.org/#/q/status:open+project:openstack/nova+branch:master+topic:bp/compute-driver-events,n,z
I have only implemented this for libvirt, and it should be a no-op
for other drivers.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the OpenStack-dev
mailing list