This is something we really need. Right now the 10-minute interval is really annoying. It's unclear to me how much support we get this event notification from the underlying virt drivers, but we'll at least play with it with libvirt.<div>
<br></div><div>I recall libvirt binding doesn't use eventlet, hence no green threads. The callback would happen in another OS thread instead. Currently libvirt calls are also executed within a OS thread pool to prevent blocking behavior. This will probably make implementation. For example, you can never call logger in another OS threads otherwise eventlet would puke. So far the only thing that seems to work is to use a pipe to communicate among OS threads with eventlet presence as we did in python-evzookeeper package.</div>
<div><br></div><div>Thanks,</div><div>Yun</div><br><div class="gmail_quote">On Tue, Jan 15, 2013 at 8:24 AM, Daniel P. Berrange <span dir="ltr"><<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Tue, Jan 15, 2013 at 12:04:31PM +0000, Mark McLoughlin wrote:<br>
> On Tue, 2013-01-15 at 10:52 +0000, Daniel P. Berrange wrote:<br>
</div><div class="im">> > The question is how to structure the processing of events. I don't<br>
> > think that the hypervisor drivers should be directly processing events.<br>
> > Instead I believe they need to pass along the event notifications to<br>
> > the manager.py class. So my current thought is to introduce a new API<br>
> > to nova.virt.api<br>
> ><br>
> >   register_event_notifier(self, callback)<br>
> ><br>
> > and have nova.compute.manager provide a callback impl to receive the<br>
> > events. Before I start coding on this, I want some kind of confirmation<br>
> > that this is an acceptable direction to go in, since there is no current<br>
> > callback based interactions between nova.compute.manager & nova.virt.api<br>
><br>
> That all sounds good to me, but can you go into more details about how<br>
> the event dispatching would work?<br>
><br>
> We don't have a mainloop to integrate this with, so presumably you're<br>
> talking about spawning a greenthread which would poll for events (using<br>
> virEventRunDefaultImpl()?) and then invoke the callbacks? Does this<br>
> greenthread need its own libvirt connection?<br>
><br>
> Does this new thread introduce any new concurrency issues? I guess not<br>
> since processing each RPC message and running periodic timers all happen<br>
> in different threads, so this wouldn't be much different.<br>
<br>
</div>Yes, thanks to eventlet awfulness, we'd need to have a greenthread running<br>
the libvirt event loop.  The event notification callbacks from libvirt<br>
would thus obviously execute in the greenthread. What I'm not sure about<br>
is how to switch control back to the main eventlet thread before we call<br>
out into the manager.py's callback.<br>
<br>
I imagine a queue of events in the nova.virt.libvirt.driver object which<br>
is fed back the libvirt greenthread callbacks. Something in the main<br>
eventlet thread would then have to process the queue to dispatch to the<br>
manager. With a regular mainloop the way you'd do this is to schedule a<br>
timer to fire after zero seconds. I'm not familiar enough with eventlet<br>
yet to know how you'd do this.<br>
<div class="im HOEnZb"><br>
Daniel<br>
--<br>
|: <a href="http://berrange.com" target="_blank">http://berrange.com</a>      -o-    <a href="http://www.flickr.com/photos/dberrange/" target="_blank">http://www.flickr.com/photos/dberrange/</a> :|<br>
|: <a href="http://libvirt.org" target="_blank">http://libvirt.org</a>              -o-             <a href="http://virt-manager.org" target="_blank">http://virt-manager.org</a> :|<br>
|: <a href="http://autobuild.org" target="_blank">http://autobuild.org</a>       -o-         <a href="http://search.cpan.org/~danberr/" target="_blank">http://search.cpan.org/~danberr/</a> :|<br>
|: <a href="http://entangle-photo.org" target="_blank">http://entangle-photo.org</a>       -o-       <a href="http://live.gnome.org/gtk-vnc" target="_blank">http://live.gnome.org/gtk-vnc</a> :|<br>
<br>
</div><div class="HOEnZb"><div class="h5">_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
</div></div></blockquote></div><br>