[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