[libvirt] [PATCH 09/11] Run an RPC protocol over the LXC controller monitor

Daniel P. Berrange berrange at redhat.com
Fri Jul 27 08:48:42 UTC 2012


On Fri, Jul 27, 2012 at 09:41:29AM +0200, Jiri Denemark wrote:
> On Tue, Jul 24, 2012 at 14:22:51 +0100, Daniel P. Berrange wrote:
> > From: "Daniel P. Berrange" <berrange at redhat.com>
> > 
> > This defines a new RPC protocol to be used between the LXC
> > controller and the libvirtd LXC driver. There is only a
> > single RPC message defined thus far, an asynchronous "EXIT"
> > event that is emitted just before the LXC controller process
> > exits. This provides the LXC driver with details about how
> > the container shutdown - normally, or abnormally (crashed),
> > thus allowing the driver to emit better libvirt events.
> > 
> > Emitting the event in the LXC controller requires a few
> > little tricks with the RPC service. Simply calling the
> > virNetServiceClientSendMessage does not work, since this
> > merely queues the message for asynchronous processing.
> > In addition the main event loop is no longer running at
> > the point the event is emitted, so no I/O is processed.
> > 
> > Thus after invoking virNetServiceClientSendMessage it is
> > necessary to mark the client as being in "delayed close"
> > mode. Then the event loop is run again, until the client
> > completes its close - this happens only after the queued
> > message has been fully transmitted. The final complexity
> > is that it is not safe to run virNetServerQuit() from the
> > client close callback, since that is invoked from a
> > context where the server is locked. Thus a zero-second
> > timer is used to trigger shutdown of the event loop,
> > causing the controller to finally exit.
> > 
> > * src/Makefile.am: Add rules for generating RPC protocol
> >   files and dispatch methods
> > * src/lxc/lxc_controller.c: Emit an RPC event immediately
> >   before exiting
> > * src/lxc/lxc_domain.h: Record the shutdown reason
> >   given by the controller
> > * src/lxc/lxc_monitor.c, src/lxc/lxc_monitor.h: Register
> >   RPC program and event handler. Add callback to let
> >   driver receive EXIT event.
> > * src/lxc/lxc_process.c: Use monitor exit event to decide
> >   what kind of domain event to emit
> > * src/lxc/lxc_protocol.x: Define wire protocol for LXC
> >   controller monitor.
> > 
> > Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> > ---
> >  .gitignore               |    4 ++
> >  src/Makefile.am          |   50 +++++++++++++++++++
> >  src/lxc/lxc_controller.c |  125 +++++++++++++++++++++++++++++++++++++++++++++-
> >  src/lxc/lxc_domain.h     |    1 +
> >  src/lxc/lxc_monitor.c    |   41 +++++++++++++++
> >  src/lxc/lxc_monitor.h    |    6 +++
> >  src/lxc/lxc_process.c    |   27 ++++++++++
> >  src/lxc/lxc_protocol.x   |   21 ++++++++
> >  8 files changed, 274 insertions(+), 1 deletion(-)
> >  create mode 100644 src/lxc/lxc_protocol.x
> > 
> > diff --git a/.gitignore b/.gitignore
> > index b4cbb5f..e4b3932 100644
> > --- a/.gitignore
> > +++ b/.gitignore
> > @@ -105,6 +105,10 @@
> >  /src/locking/qemu-sanlock.conf
> >  /src/locking/test_libvirt_sanlock.aug
> >  /src/lxc/test_libvirtd_lxc.aug
> > +/src/lxc/lxc_controller_dispatch.h
> > +/src/lxc/lxc_monitor_dispatch.h
> > +/src/lxc/lxc_protocol.c
> > +/src/lxc/lxc_protocol.h
> >  /src/qemu/test_libvirtd_qemu.aug
> >  /src/remote/*_client_bodies.h
> >  /src/remote/*_protocol.[ch]
> > diff --git a/src/Makefile.am b/src/Makefile.am
> > index 492ce73..44da1fa 100644
> > --- a/src/Makefile.am
> > +++ b/src/Makefile.am
> > @@ -347,7 +347,55 @@ if WITH_XEN_INOTIFY
> >  XEN_DRIVER_SOURCES += xen/xen_inotify.c xen/xen_inotify.h
> >  endif
> >  
> > +EXTRA_DIST += \
> > +	dtrace2systemtap.pl \
> > +	rpc/gendispatch.pl \
> > +	rpc/genprotocol.pl \
> > +	rpc/gensystemtap.pl \
> > +	rpc/virnetprotocol.x \
> > +	rpc/virkeepaliveprotocol.x
> 
> Did you want to move this EXTRA_DIST part and copied it instead? I don't see
> the corresponding - lines.

Hmm, not sure what went wrong here.

> 
> > +
> > +LXC_PROTOCOL_GENERATED = \
> > +	$(srcdir)/lxc/lxc_protocol.h \
> > +	$(srcdir)/lxc/lxc_protocol.c \
> > +	$(NULL)
> 
> Did you add $(NULL) because you want to be able to add new entries here
> without the need append '\' to the last line or is there another reason for
> it?

Yes, it means when you add new entries you only get a 1-line
diff, instead of a 2-line diff from adding '\'. We should in
fact make this change across all our makefiles some time.


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 libvir-list mailing list