[libvirt] [PATCH 02/13] Move daemon-related parts of virNetServer to virNetDaemon
Martin Kletzander
mkletzan at redhat.com
Thu May 21 17:20:13 UTC 2015
On Wed, May 20, 2015 at 06:11:14PM +0200, Michal Privoznik wrote:
>On 20.05.2015 07:19, Martin Kletzander wrote:
>> This allows to have more servers in one daemon which helps isolating
>> some resources.
>>
>> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>> ---
>> daemon/libvirtd.c | 101 ++---
>> docs/internals.html.in | 4 +-
>> docs/internals/rpc.html.in | 7 +
>> po/POTFILES.in | 1 +
>> src/Makefile.am | 1 +
>> src/libvirt_remote.syms | 28 +-
>> src/locking/lock_daemon.c | 63 ++--
>> src/locking/lock_daemon_config.c | 2 +-
>> src/locking/lock_daemon_dispatch.c | 4 +-
>> src/lxc/lxc_controller.c | 65 ++--
>> src/rpc/virnetdaemon.c | 746 +++++++++++++++++++++++++++++++++++++
>> src/rpc/virnetdaemon.h | 82 ++++
>> src/rpc/virnetserver.c | 526 ++++----------------------
>> src/rpc/virnetserver.h | 46 +--
>> src/rpc/virnetserverprogram.h | 3 +
>> 15 files changed, 1074 insertions(+), 605 deletions(-)
>> create mode 100644 src/rpc/virnetdaemon.c
>> create mode 100644 src/rpc/virnetdaemon.h
>>
>
>> diff --git a/src/rpc/virnetdaemon.c b/src/rpc/virnetdaemon.c
>> new file mode 100644
>> index 0000000..8d42638
>> --- /dev/null
>> +++ b/src/rpc/virnetdaemon.c
>
>> +
>> +
>> +static virClassPtr virNetDaemonClass;
>> +
>> +void
>
>static
>
>> +virNetDaemonDispose(void *obj)
>> +{
>> + virNetDaemonPtr dmn = obj;
>> + size_t i;
>> +
>> + VIR_FORCE_CLOSE(dmn->autoShutdownInhibitFd);
>> +
>> + for (i = 0; i < dmn->nsignals; i++) {
>> + sigaction(dmn->signals[i]->signum, &dmn->signals[i]->oldaction, NULL);
>> + VIR_FREE(dmn->signals[i]);
>> + }
>> + VIR_FREE(dmn->signals);
>> + VIR_FORCE_CLOSE(dmn->sigread);
>> + VIR_FORCE_CLOSE(dmn->sigwrite);
>> + if (dmn->sigwatch > 0)
>> + virEventRemoveHandle(dmn->sigwatch);
>> +
>> + for (i = 0; i < dmn->nservers; i++)
>> + virObjectUnref(dmn->servers[i]);
>> + VIR_FREE(dmn->servers);
>> +
>> + virJSONValueFree(dmn->srvObject);
>> +}
>> +
>> +static int
>> +virNetDaemonOnceInit(void)
>> +{
>> + if (!(virNetDaemonClass = virClassNew(virClassForObjectLockable(),
>> + "virNetDaemon",
>> + sizeof(virNetDaemon),
>> + virNetDaemonDispose)))
>> + return -1;
>> +
>> + return 0;
>> +}
>
>
>> +/*
>> + * Separate function merely for the purpose of unified error
>> + * reporting.
>> + */
>> +static virNetServerPtr
>> +virNetDaemonGetServerInternal(virNetDaemonPtr dmn,
>> + int subServerID)
>> +{
>> + if (subServerID < 0 || subServerID >= dmn->nservers) {
>> + virReportError(VIR_ERR_INVALID_ARG,
>> + _("Invalid server ID: %d"),
>> + subServerID);
>> + return NULL;
>> + }
>> +
>> + return virObjectRef(dmn->servers[subServerID]);
>> +}
>> +
>> +/*
>> + * The server is locked after this function.
>
>No, it's not.
>
I see I forgot to reply on few things here.
You're right, that's a leftover.
>> + */
>> +virNetServerPtr
>> +virNetDaemonGetServer(virNetDaemonPtr dmn,
>> + int subServerID)
>> +{
>> + virNetServerPtr srv = NULL;
>> +
>> + virObjectLock(dmn);
>> + srv = virNetDaemonGetServerInternal(dmn, subServerID);
>
>Did you forget virObjectLock(srv) here?
>
Nope, the beauty of this is that just refs up the server and returns
it. Similarly to virQEMUDriverGetCapabilities().
>> + virObjectUnlock(dmn);
>> +
>> + return srv;
>> +}
>> +
>
>> +void
>> +virNetDaemonUpdateServices(virNetDaemonPtr dmn,
>> + bool enabled)
>> +{
>> + size_t i;
>> +
>> + virObjectLock(dmn);
>> + for (i = 0; i < dmn->nservers; i++)
>> + virNetServerUpdateServices(dmn->servers[i], enabled);
>> + virObjectUnlock(dmn);
>
>Hm... I guess we need something slightly different. While we may want
>one service to stop accepting new clients, we may want the other one to
>still accept new ones. But since this is a big split, and so far a
>daemon will have only one server, it can be saved for a follow up patch.
>
What you describe is still possible, you can call
virNetServerUpdateServices() on one server, nobody is saying you
cannot. This function just abstracts starting all servers together
into one function.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150521/008ec67f/attachment-0001.sig>
More information about the libvir-list
mailing list